O(∩_∩)O哈!
今天又把第二讲《初识SLAM》的东西大致看了一下,在此做个简单记录,高博在其中也说,这一讲算是全书的一个大纲,所以相当的详细和具体了
首先,高神把小萝卜要解决的问题做了一个更通俗的诠释,也就是说
- 要明白自身的状态 这就是location
-
要明白外在的环境 这就是mapping
既然是视觉问题,那肯定是只是用到相机了,根据能否直接得到深度距离,把各自相机的优缺点罗列一下很有必要:
单目相机 | 三维世界在二维图像的投影 |
估计的模式 | 相机运动时候形成视差,估计远近距离 |
缺点 | 具有尺度不确定性,也就是说无法仅仅评级图像来反应真实的尺度大小,需要用软件算法来还原计算 |
双目相机 | 两个单目组成;两眼之间的距离为基线,基线越大,可测的深度距离越大 |
特点 | 通过左右眼睛的差异,来判断物体远近 |
缺点 | 两眼之间视差计算消耗量大,需要GPU或者FPGA加速 |
深度相机 | 红外结构光,Time of Flight 飞时法物理直接得到距离 |
特点 | 主动向物体发射光并接收返回光,来测距,节省大量计算 |
缺点 | 主流传感器,但是容易受到噪声和日光的影响 |
经典SLAM框架
1、传感器信息读取,相机信息读取和预处理
2、视觉里程计,估算相邻图像之前的相机运动,特征提取与匹配,短期记忆,存在累计漂移
3、后端优化,从有噪声的数据中估计系统状态,推出估计状态的不确定性MAP,滤波和非线性优化,原本的SLAM研究
4、回环检测,判断是否回到原点,比较图像之间的相似性
5、建图,度量地图有稠密和稀疏,用于导航的是稠密图,拓扑地图只考虑边和点直接拓扑关系
SLAM问题的数学表述
- 两个方程
- 运动方程和观测方程
- 两个方程的参数化
实践过程
Linux操作:
寻找某个文件:whereis
删除文件夹:rm -r
复制文件到下一个文件夹 cp -r ./ch2
g++打开文件重命名:g++ helloSLAM.cpp -o Hello
Helloslam
使用camke
生成的可执行文件a,out打开运行:./a.out 点.表示当前文件夹
在当前文件目录下编译运行的话:cmake . make ./helloSLAM
CMakelists.txt中添加可执行文件的语法:add_executable(要生成的程序名 源代码文件)
更常见的用法:1、mkdir build 2、cd build 3、cmake.. 4、make
使用库
在cmakelist中添加:add_library(要编译成的文件名称 源文件名称.cpp)
如果用动态库:cmakelists中添加:add_library(要编译的库文件名称 SHARED 源代码文件):add_library(a SHARE a.cpp)
- 库文件是一个压缩包a.so,其中封装了二进制函数f,如果要使用的话
- 要先写一个头文件b.h对这个库的使用做一个解释
- 然后再写有main函数的可执行程序c.cpp来调用:#include"b.h"
- CMakelists.txt中添加可执行文件的生成命令:
- add_executable(c c.cpp)
- target_link_libraries(c a )
CMAKE构建工程的,参考宋洋鹏同学的笔记和HL-SIRB同学的笔记