首先一个完整的SLAM流程分为前端跟踪、后端优化、回环检测、地图重建。
前端跟踪即视觉里程计负责初步估计相机帧间位姿状态及地图点的位置;
后端优化负责接收视觉里程计前端测量的位姿信息并计算最大后验概率估计;
回环检测负责判断机器人是否回到了原来的位置,并进行回环闭合修正估计误差;
地图重建负责根据相机位姿和图像,构建与任务要求相适应的地图。
1.帧间估计-->前端跟踪:
帧间估计依据的图像特征不同,回归相机位姿的方法也不同。经典的帧间估计方法主要包括基于特征点匹配的方法、光流法和直接法,目前较流行的也有深度学习帧间估计方法。
几何法
特征点提取方法如下:
1)SIFT (scale-invariant feature transform) 算法
2)SURF (speeded up robust features) 算法
3)ORB (oriented FAST and rotated BRIEF)
特征点的选取与匹配一直依赖于功耗巨大的特征向量。ORB 算法采用 FAST 关键点和 BRIEF 描述子,具有旋转不变性和抗噪声的特性。
<基于卷积神经网络优化回环检测的视觉 SLAM 算法>一文中采用的ORB,理由是:2011 年 Rublee 等提出了 ORB 算子,其计算速度比 SURF 和 SIFT 要快且具有良好的不性。
光流法
基于特征点的方法中关键点的提取和描述子的计算非常耗时;将提取出的特征点作为图像的代表也忽略了很多信息;有些图片中纹理单一,没有明显的特征点可以提取。面对这些问题时,使用光流法追踪并描述像素在光流之间的运动,其中稀疏光流法选取图像中的部分像素点进行运动跟踪。
Maity 检测图像中的边缘点使用光流法跟踪并利用三视点几何关系来细化、优化对应匹配关系。
关联论文:Edge SLAM: edge points based monocular visual SLAM
直接法
直接法不提取关键点、不计算描述子,可以在图像有光度的变化的无纹理情况直接回归相机的姿态。
整体看来直接法在前端跟踪中使用较少,LSD-SLAM (large scale direct monocular SLAM)是在单目 SLAM 中使用直接法成功的典例。
关联论文:LSD-SLAM: large-scale direct monocular SLAM
深度学习与帧间估计
基于深度学习的方法无需特征提取,也无需特征匹配和复杂几何运算,使得基于深度学习的方法更加直观简洁。
Konda 和 Memisevic 提出基于端到端的深度神经网络架构用于预测摄像机速度和方向的改变。该方法的主要特点是利用单一类型的计算模块和学习规则提取视觉运动和深度信息以及里程计信息。
关联论文: Learning visual odometry with a convolutional network
Costante 等利用卷积神经网络学习图像数据的最优特征表示进行视觉里程估计,其算法在应对图像运动模糊、光照变化方面的鲁棒性较好。
关联论文:Exploring representation learning with CNNs for frame-to-frame ego-motion estimation
2.后端优化
前端的视觉可以给出一个增量式的地图,但由于不可避免的误差累计,这个地图在长时间内是不准确的。当前端构建的地图增长到一定程度后,累计误差会使后来的数据越来越不准确。这时我们需要把所有地图数据放到一起做一次完整的优化,从而降低各部分的误差。
后端优化有很多种方案,过去采用以扩展卡尔曼滤波(Extended Kalman Filter,EKF)为主的滤波器方案,现在大多都采用非线性优化方案。EKF由于假设了马尔可夫性质,只利用前一状态来估计当前状态的值,这有点像视觉里程计中只考虑相邻两帧的关系一样,很难做到全局的优化。而现在常用的非线性优化方法,则是把所有数据都考虑进来,放在一起优化,虽然会增大计算量,但效果好得多。(具体方法可以自行搜索了解,这个过程可以做多种措施来实行优化)
3.回环检测
在整个SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿解算当前帧位姿,因此其中的误差便这样一帧一帧的传递下去,也就是我们所说的累计误差。我们的位姿约束都是与上一帧建立的,第五帧的位姿误差中便已经积累了前面四个约束中的误差。但如果我们发现第五帧位姿不一定要由第四帧推出来,还可以由第二帧推算出来,显然这样计算误差会小很多,因为只存在两个约束的误差了。像这样与之前的某一帧建立位姿约束关系就叫做回环。回环通过减少约束数,起到了减小累计误差的作用。
通俗的讲:怎么知道可以由第二帧推算第五帧位姿呢?也许第一帧、第三帧也可以呢。确实,我们之所以用前一帧递推下一帧位姿,因为这两帧足够近,肯定可以建立两帧的约束,但是距离较远的两帧就不一定可以建立这样的约束关系了。找出可以建立这种位姿约束的历史帧,就是回环检测。所以说回环检测问题本质上是场景识别问题,传统的回环检测通过人工设计的稀疏特征或像素级别稠密特征进行匹配,此外还有一种基于视觉相似度的检测方法。
最新的回环检测技术是基于深度学习的闭环检测技术,该方法早期主要利用预训练的 CNN 网络架构进行图像特征提取,不同层级的网络层在图像特征描述方面具有一定的差异性.Chen等首次提出了基于 CNN 模型的位置识别技术,其核心在于通过 CNN 学习图像特征表示,在其所测数据集上以 100% 的准确率提升了 75% 的召回率.作者选择 ImageNet 大赛中用以物体识别的OverFeat 神经网络模型进行图像描述。
相关论文:Convolutional neural network-based place recognition
Hou等利用 caffe 框架下的 AlexNet 模型进行特征提取,通过实验对比,发现在光照变化明显的环境下,采用深度学习的特征描述鲁棒性能优于传统特征,且特征提取更加迅速.
相关论文:Convolutional neural network-based image representation for visual loop closure detection
4.地图重建
地图重建,其实就是知道了机器人的真实轨迹,然后根据轨迹描绘出大体地图。研究主要分为如下2种地图展开:
路标地图。
地图由一堆路标点组成,EKF中的地图就是这样的。路标图尽管很方便,但是可读性不高。
度量地图
通常指2D/3D的网格地图,也就是大家经常见的那种黑白的/点云式地图。点云地图比较酷炫,很有种高科技的感觉。它的优点是精度比较高,比如2D地图可以用0-1表示某个点是否可通过,对导航很有用。缺点是相当吃存储空间,特别是3D,把所有空间点都存起来了。
拓扑地图
拓扑地图是比度量地图更紧凑的一种地图。它将地图抽象为图论中的"点"和"边",使之更符合人类的思维。比如说我要去五道口,不知道路,去问别人。那人肯定不会说,你先往前走621米,向左拐94.2度,再走1035米……(这是疯子吧)。正常人肯定会说,往前走到第二个十字路口,左拐,走到下一个红绿灯,等等。这就是拓扑地图
混合地图。
既然有人要分类,就肯定有人想把各类的好处揉到一起。这个就不多说了吧。
这四步就是一个完整的SLAM过程,可以当入门看看,深入了解请对各个步骤的关键技术点去研究。