本系列文章是记录学习高翔所著《视觉slam14讲》的内容总结,文中的主要文字和代码、图片都是引用自课本和高翔博士的博客。代码运行效果是在自己电脑上实际运行得出。手动记录主要是为了深入理解
1 关于SLAM
slam问题的本质:对运动主体自身和周围环境空间不确定性的估计
尽可能使用不依赖于环境的传感器如laser、imu、camera等,而视觉SLAM主要解决问题是使用相机解决定位和建图问题
2 关于相机
单目相机(Monocular)
关键问题:无法得到深度。
单目slam估计的轨迹和地图和真实的相差一个尺度因子,也叫尺度不确定性双目相机(Stereo)
关键问题:配置与标定比较复杂,深度量程受双目的基线和分辨率限制,视差计算量大,需要使用GPU和FPGA加速。深度相机
关键问题:测量范围有限,容易受日光干扰,无法测量透射材质,主要用于室内。
我们之前机器人比赛经常用到kinect和xtion,上面的几个问题都是常见的,比如测量范围,比较蛋疼的就是这个,机器人看柱子,最远的那个有7米远,kinect就不行了……
3 slam框架
- 传感器数据
相机图像信息的读取和预处理 视觉里程计(VO)
解决问题:估算相邻图像间的运动,以及局部地图的样子,又称为前端。
解决方法:主要进行图像特征提取和匹配后端优化(Optimization)
解决问题:处理slam过程中噪声的问题。从带有噪声的数据中估计整个系统的状态,以及这个状态估计的不确定性有多大——称为最大后验概率估计(MAP),状态包括机器人的轨迹和地图
解决方法:滤波和非线性优化算法回环检测(Loop Closure Detection)
解决问题:位置估计随时间漂移问题,让机器有识别到过场景的能力。
解决方法:判断图像间的相似性建图(Mapping)
解决问题:构建地图描述机器人周围的环境
解决方法: 有多种地图
1 度量地图(Metric Map)
强调精确表示地图中物体的位置关系,有稀疏和稠密两类。
对定位来说,稀疏地图就可以了;对导航来说需要稠密地图
Location—Saprse Map
Navgation—Dense Map, 二维的用Grid表示,三维的用Voxel表示,常见导航算法A*, Dij2 拓扑地图(Topollogical Map)
强调地图元素之间的关系。
拓扑地图是一个Graph,由节点和边组成,只考虑节点之间的连通性。
4 slam问题数学描述
两个方程,运动方程和观测方程。
xk=f(xk−1,μk,ω+k)
zk,j=h(yj,xk,vk,j)
已知量:
运动测量读数
传感器读数 z
求解量:
定位问题x
建图问题y
这是一个状态估计问题——如何通过带噪声的数据估计内部的隐藏的状态变量。
按照运动和观测方程是否线性和噪声是否服从高斯分布分为四类
线性/非线性,高斯/非高斯
其中
- 线性高斯系统(Linear Gaussian–LG)
最简单,无偏最优估计使用KF解决 - 非线性非高斯系统(NLNG)
可以用滤波器(EKF、Particle Filter)和非线性优化(图优化Graph Optimization)两种方法