视觉SLAM十四讲笔记---02初始SLAM
第二次看高翔博士的《视觉SLAM十四讲》,把一些觉得重要的笔记或者一些自己的想法写下来。
之前第一次主要读完之后没有留下深刻的印象,代码也就只是简单地跑了一下,希望这次能够沉淀下自己的东西,也能学会自己写一些代码。
代码都是在kdevelop中跑的,比直接gedit下调试方便。
欢迎志同道合的朋友们一起交流!
1、相机的分类
(1)单目Monocular
优势:结构简单、成本低。
局限:
深度信息的缺失==>通过平移可以计算深度
但仍然是一个相对的值(将相机的运动和场景大小同时放大,单目看到的像是一样的)==>尺度不确定性
==>双目、深度相机或融合激光雷达等其他传感器
(2)双目Stereo
由两个单目相机组成,两个相机之间的距离(基线)已知。
优势:可以获得深度信息。
缺点:配置与标定均较为复杂,其深度量程和精度受双目的基线与分辨力的限制,且视差的计算非常消耗计算资源。
(3)深度RGB-D
利用红外结构光或Time-of-Flight原理,主动向物体发射光并接受返回的光,测出物体距离相机的距离,
优势:可以获得深度信息;利用物理手段,可节省大量的计算量。
缺陷:测量范围窄、噪声大、视野小、易受到日光干扰等,适用于室内。
2、经典视觉SLAM框架

当把工作环境限制在静态、刚体、光照变化不明显、没有人为干扰 的场景下,这个系统相当成熟。
(1)视觉里程计
- 计算机如何通过图像确定相机的运动?==>了解相机与空间点的几何关系
- 视觉里程计仅利用相邻两帧图像来估计两帧图像间的相机运动,如此累计可以得到机器人的轨迹,即解决了定位 问题。同样可以根据每个时刻的相机位置,计算出各像素对应的空间点的位置,即得到地图 。
- 但是每次估计会有误差产生,如此累计会导致累计漂移 问题,最终无法建立一致的地图。
- 故,在视觉里程计的基础上需要加入后端优化和回环检测技术。
(2)后端优化
- 目标:处理前端传来的带噪声的数据,以此估计整个系统的状态以及这个状态估计的不确定性有多大(最大后验概率估计)。
- 主要是滤波与非线性优化算法。
(3)回环检测
- 目标:解决位置估计随时间漂移的问题。实质上是计算图像数据相似性的算法。
- 需要让机器人具有识别曾到达过的场景的能力。可以判断图像间的相似性来完成回环检测。
- 回环检测的信息会使后端优化得到的结果更加的正确。
(4)建图
-
度量地图Metric Map
强调精确地表示地图中的物体的位置关系。
有时也会出现一致性问题。-
稀疏Sparse
选择具有代表意义的东西,即路标Landmark,其余可忽略;可以用于定位。 -
稠密Dense
二维格子(grid)或三维方块(voxel)都存储着该位置是否可以通过的信息;消耗大量存储空间;可以用于导航。
-
-
拓扑地图
强调地图元素之间的关系。 只考虑节点间的连通性,放送了地图对精确位置的需要,去掉地图的细节问题。
不擅长表达具有结构结构的地图。
导航与路径规划的实现还在研究中。
总结:传感器数据为输入,仅用视觉里程计也能完成定位和建图,但是为了解决漂移累计得到全局一致的地图,可以采用后端优化的问题更正确地得到最终的结果,而回环检测则可以理解为一种特殊情况的数据输入。
3、SLAM问题的数学表述
(1)数学模型
时刻:t = 1, …, K
位置:x 1,…,x K
路标:y 1,…,y N 假设有N个路标点
- 数学模型:
运动方程:x k = f(x k-1, u k, w k)
u k为运动传感器的读数(或输入),w k为噪声。
反映从k-1时刻到k时刻,位置x 如何变化。
观测方程:z k,j = h(y j, x k, v k,j)
v k,j为噪声。
反映在x k位置上看到某个路标点y j,产生了一个观测数据z k,j。
(2)参数化
根据真实运动和传感器的种类,存在着若干种参数化的方式。
-
例:位姿由两个位置和一个转角描述,即x k = [x, y, θ]Tk
运动传感器能够测量到在每两个时间间隔位置和转角的变化量u k = [△x, △y, △θ]Tk
且假设线性关系,则运动方程可以为:

-
例:假设使用二维激光传感器获得一个2D路标点,测得到路标点的距离r和夹角φ。
记路标点为y = [px, py]T,观测数据为z = [r, φ]T
则观测方程可以有:

(3)状态估计问题
由两个方程描述了最基本的SLAM问题:已知运动测量的读数u ,及传感器读数z ,求解定位问题(x )和建图问题(y )==>状态估计问题 -
根据运动和观测方程是否为线性,噪声是否服从高斯分布可以分类:
- 线性高斯:卡尔曼滤波器。
- 非线性非高斯:扩展卡尔曼滤波器+非线性优化。
- 线性非高斯
- 非线性高斯
