1、引言

SLAM:Simultaneous Localization and Mapping 同时定位与地图构建

搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。

视觉SLAM:以相机为主要传感器的SLAM

问题:从图像中估计相机的运动以及环境的情况

应用:机器人、AR/VR、无人机、无人驾驶等等。

运动过程中把环境描述出来,这个描述不是唯一的,比如百度地图那种也叫做地图,还有就是三维空间中的点,把这些点用来定位,那么这些点组成的也叫地图等等

视觉SLAM主要的困难之处

三维空间的运动

受噪声影响

数据来源只有图像

人类看到的是图像,计算机看到的是数值矩阵

从学习角度来看

牵涉到理论太广

从理论到实现困难

资料缺乏

相关书籍和课程

The Bible:Multiple View Geometry in Computer Vision

State Estimation for Robotics: A Matrix-Lie-Group Approach

Probabilistic Robotics(主要将二维的激光的)

观念:只有亲自动手实现了算法,才能谈得上理解

预备知识

数学:高等数学、线性代数(矩阵论)、概率论

编程:C++、linux,了解语法和基本命令即可

阅读第一章习题作为自测

例如:

类是什么?STL是什么?

2、初始SLAM

本讲目标

理解一个视觉SLAM框架由哪几个模块组成,各模块的任务是什么。

搭建编程环境,为开发和实验做准备。

理解如何在Linux下编译并运行一个程序。如果它出了问题,我们又如何对它进行调试。

掌握cmake的基本使用方法。

以激光为传感器的SLAM研究得也比较完善了,而以相机为传感器的SLAM还有比较长的路要走。

相机为传感器的SLAM不能把相机遮挡,以及环境要有一定纹理,不能是全黑或者全白等

RGBD比较适合于室内,在室外还是用单目或者双目要好些

视觉里程计:它跟里程计很像,里程计知道这一步跟下一步之间的运动,下一步和下下部的运动,通过这种信息累加起来就知道轨迹了。而视觉里程计呢,它是根据两个图像或者图像之间的关系,这个时刻的图像跟下个时刻的图像,下个时刻和下下时刻的图像,通过比较两两之间的图像运动给估计出来,再把这些运动累叠起来,从而把运动估计出来。就是通过两个帧或者多个帧局部的几个帧的运动把轨迹给估计出来。里程计有噪声,会产生漂移,所以需要使用后端的全局优化。

第二讲的实践部分

演示内容

安装Ubuntu

理解一个程序由哪些部分构成

Hello SLAM

头文件和库文件

使用IDE

1、首先把代码git到ubuntu下,

git clone https://github.com/gaoxiang12/slambook

进入第二章ch2

mkdir ch2

cd ch2

touch main.cpp

#include <iostream>

using namespace std;

int main(int argc,char **argv)

{

  cout<<"Hello,SLAM!"<<endl;

  return 0;

}

它是一个c++程序,需要用c++的编译器把它使用起来gcc或者g++

g++ main.cpp

生成a.out

也可以g++ main.cpp -o helloSLAM

一个工程倒无所谓,当工程很大的时候,有很多.cpp文件,这时候都用gcc或者g++去编译这是一件很痛苦的事情,也有称为Makefile的工具,在这里我们使用CMake这样的工具。

首先,它是一个工程管理文件,CMake的每个目录下都有一个CMakeLists.txt(它是一个文本文件)的文件,我们要在CMakeLists.txt里面去声明这个工程是有哪些文件所组成的,CMakeLists.txt本身是有一套语法的,虽然它是文本文件,比如说,

首先我们要建立一个工程名字:

要先指定CMake的版本,

cmake_minimum_required(VERSION 2.8)

然后用project新建一个工程:

project(helloSLAM)

add_executable通过main.cpp把它编译成一个helloslam的可执行程序

add_executable(helloslam main.cpp)

通过这三句话就告诉了cmake这个工程是这样子组织的

那么这时候,这个目录下就有了CMakeLists.txt,它说明了这个目录下面的CMake工程怎样的,以及源程序是怎样子的,那么这时候就可以调用cmake来编译这个工程,这个CMake它需要指定一个目录,这个目录目前就是在当前目录下".",这时候cmake就产生了很多编译信息,

这些编译信息会告诉你它使用的编译工具,以及最主要会生成一个Makefile文件,这个Makefile是自动生成的,这时候调用make,就可以对整个工程进行编译了,这个过程比之前一行一行去写g++来编译要强,因为我们现在只需要去维护这个CMakeLists.txt文件就可以了。

CMakeLists.txt

main.cpp

然后就是,当我们调用了cmake .的时候会产生很多中间文件,那么怎么处理呢?

我们更常见的做法是新建一个文件夹,进入到这个文件夹里面,对上层文件进行编译,如下,

这样做的好处就是所有编译出来的东西都在新建的文件夹里面,而在上层文件夹是干净的,只有一个main.cpp和CMakeLists.txt,如果当不想要这些输出结果的时候,就可以直接删掉build这个文件夹,

下面处理另一个问题,

程序除了可执行程序之外,还有一大堆并一定可以直接执行的程序,但是这些程序里面提供了一堆函数或者类,你可以在可执行程序里面调用,这时候他们就不是通过add_executable去生成的,它是一种叫做库的东西,下面演示一下,首先去新建一个库叫做hello.cpp

vim hello.cpp它提供了一个简单的函数

#include<iostream>

using namespace std;

void printHello()

{

  cout<<"Hello,SLAM!!"<<endl;

}

这个函数还没有可执行程序去调用它,我们希望提供给其他程序用的,这时候怎么办呢,这时候需要一个库的概念,那么去CMakeLists.txt,里面添加add_library(hello hello.cpp)那么通过hello.cpp生成了一个库,这个库就叫做hello,这个库本身没有什么可以执行的东西,它只是向外提供了一个可以调用的函数,然后再对工程进行编译,可以看到除了生成了可执行程序helloslam之外,还生成了libhello.a的库文件,这个文件其实它本身是打了一个包,主要是对函数进行打了一个包,有了这个库之后,我们就可以去调用刚才那个hello.cpp文件里面的函数,为了调用它还需要一个hello.h的头文件来告诉它,我们的库里面有这样一个函数,

vim hello.h

#pragma once

void printHello();

把这个实现了的函数声明一下,那么这个hello.h和hello.cpp就构成了一个完整的库,这个库就可以在别的程序当中调用,

重新编写一个useHello.cpp来调用它,

#include "hello.h"

int main()

{

  printHello();

  return 0;

}

然后就在CMakeLists.txt下面去添加,

因为这个useHello是可执行的那么要加上

add_executable(useHello useHello.cpp)

而且还要把可执行文件链接到库上,使用如下

target_link_libraries(useHello hello)

然后进入到build进行cmake ..;然后执行make,就可以了,

那么去执行./useHello的时候就会去调用printHello()函数了。

那么从这个过程中,可以看出来,一个可执行的东西,可能链接了其他库里面很多可执行的东西,是别人实现好的东西,他打包成了一个头文件和一个库文件,那么有了这两个文件就可以对他进行调用,去使用它,

去实现这些东西,其实是分成了两步的,第一步就是,通过编译器来编译,第二步就是通过链接器来实现链接到相应库上面;

最后演示一下IDE的使用,使用KDevelop

先安装之sudo apt-get install kdevelop

它是直接支持cmake的c++,

如果在CMakeList.txt下加调试模式,如下

下面要去调试

要执行某个程序那么就要选择对该程序进行debug,

选择run->configure launches->然后选择useHello,

然后就可以单步调试等等

1.SJ-SLAM-14的更多相关文章

  1. JavaSE自学笔记

    ch03 [Thu Aug 18 2016 11:22:26 GMT+0800] 对象变量与对象之间是指代关系,对象变量并不能完全说明有无对象可用.这种指代关系是通过赋值运算建立起来的.对象变量保存的 ...

  2. (自用)专业排版套装:CTeX + TeXStudio

    \documentclass[UTF8,landscape]{ctexart}%UTF8,ctexart中文支持,landscape横向版面 \usepackage{tikz}%画图 \usepack ...

  3. SLAM Course - WS13/14 by Cyrill Stachniss (1) 课程资源汇总

    本帖是作者学习SLAM 课程笔记的资源帖,汇总了SLAM Course - WS13/14 by Cyrill Stachniss 的相关资源. 1. 课程网站,有相关课件作业和教学视频下载. htt ...

  4. SLAM+语音机器人DIY系列:(一)Linux基础——2.安装Linux发行版ubuntu系统

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  5. SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  6. 一颗躁动的心---下决心从SLAM开始,不钻研嵌入式底层了

    在写这个随笔时,北京的外面正在下2016的第一场雪.夜深人尽之时总会考虑一下自己的未来在何方. 长这么大了,我发现我这人始终不能坚定不移的朝着一个方向努力,总是朝三暮四,对学习更是朝令夕改,这造成了我 ...

  7. 一起做RGB-D SLAM 第二季 (一)

    小萝卜:师兄!过年啦!是不是很无聊啊!普通人的生活就是赚钱花钱,实在是很没意思啊! 师兄:是啊…… 小萝卜:他们都不懂搞科研和码代码的乐趣呀! 师兄:可不是嘛…… 小萝卜:所以今年过年,我们再做一个S ...

  8. SLAM拾萃(3):siftGPU

    前言 本周博客我们给大家介绍一下SiftGPU.由于特征匹配是SLAM中非常耗时间的一步,许多人都想把它的时间降至最短,因此目前ORB成了非常受欢迎的特征.而老牌SIFT,则一直给人一种“很严谨很精确 ...

  9. implement Google's Open Source Slam "Cartographer" demos in ROS/rviz

    Cartographer is a backpack equipped with Simultaneous Localization and Mapping (SLAM) technology. 1. ...

  10. (转) 实时SLAM的未来及与深度学习的比较

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     实时SLAM的未来及与深度学习的比较 The Future of Real-Time SLAM and “Deep Learni ...

随机推荐

  1. Arduino关于旋转编码器程序的介绍(Reading Rotary Encoders)--by Markdown

    介绍 旋转或编码器是一个角度測量装置. 他用作精确測量电机的旋转角度或者用来控制控制轮子(能够无限旋转,而电位器只能旋转到特定位置).其中有一些还安装了一个能够在轴上按的button,就像音乐播放器的 ...

  2. cocos2dx3.2 学习笔记(2)--ActionManagerTest

    前面看完了 CppTests的基本框架及流程.如今准备看看详细的每一个Test了 从哪里開始看呢. 额,就第一个吧(ActionManagerTest) 首先看看效果吧,执行了下.发现有几种效果.看不 ...

  3. Java泛型擦除

    Java泛型擦除: 什么是泛型擦除? 首先了解一下什么是泛型?我个人的理解:因为集合中能够存储随意类型的对象.可是集合中最先存储的对象类型一旦确定后,就不能在存储其它类型的对象了,否则,编译时不会报错 ...

  4. SQL Cursor生命周期

      阅读导航 1 Cursor Step 1.1 Create cursor 1.2 Parse statement 1.3 descript and define 1.4 Bind variable ...

  5. EasyPusher/EasyDarwin/EasyPlayer实现手机直播版本及效果整理

    EasyPusher手机直播 实现功能 最近很多EasyDarwin爱好者提出了手机移动端直播的功能需求,尤其是如何做出像映客这样能够快速出画面播放的效果,经过一段时间的移动端和服务端的优化,Easy ...

  6. Android笔记之启动界面的设置

    默认情况下,启动界面是白屏 我们自定义一个启动界面如下,3秒钟后进入主界面并结束启动页 SplashActivity.java package com.bu_ish.myapp; import and ...

  7. ThinkPHP RBAC权限管理机制

    RBAC是ThinkPHP很好用的后台权限管理的,话不多说,实现方法如下,也方便以后自己查询使用: 1.新建4个数据库表 self_role权限表 CREATE TABLE `self_role` ( ...

  8. Android项目中JNI技术生成并调用.so动态库实现详解

    生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配 ...

  9. LightOJ - 1104 Birthday Paradox —— 概率

    题目链接:https://vjudge.net/problem/LightOJ-1104 1104 - Birthday Paradox    PDF (English) Statistics For ...

  10. git rev-list 和 git rev-parse

    git-rev-list - Lists commit objects in reverse chronological order https://git-scm.com/docs/git-rev- ...