SLAM
SLAM(Simultaneous Localization and Mapping),意为同时定位与建图。
看名字比较难理解,但是结合到日常生活中的例子就很好懂了。想象一下到了一个陌生环境中,比如你现在的某个陌生的迷宫里面,你需要找到出去的路,一开始你不知道自己在哪所以只能凭感觉四处走动,但是在行走过程中你还是很聪明的做了一些标记,当突然走到一个位置,你发现目前这个场景好熟悉,是不是哪里见过,不太肯定,但是毕竟没走出去只能继续往前走,知道走到某个位置,你发现了你之前做过的某个标记。此时你心里难免想着,要是有个地图就好了,或者能把你走过的地方记录下来就好了。这样你就能记录周围环境并从中提取出方向,确定自己的位置。
那么SLAM就是来解决这个问题的,利用载体上的各种传感器,记录环境的同时估计载体的空间姿态,最后生成一张可用于地位的地图,就是SLAM的使命。

此处的载体,指能在空间中运动的载体,移动机器人,车辆,手持设备等都可以算是移动载体。而要达到对环境及自身运动的估计,则需要传感器。传感器目前主要分为两类,测量值依赖外界环境的,与测量值依赖自身运动情况的。依赖外部环境的传感器如相机,激光雷达。相机需要收集外界环境光线,而雷达需要接收外界物体表面反射的激光。依赖自身运动的则如一些编码器与imu,imu测量得到的加速度与载体运动情况有关。载体与传感器的关系有如身体与眼睛的关系一样,载体为传感器提供了搭载的平台,而传感器则是载体感知世界的来源,计算机模仿大脑处理传感器信息,经过一系列算法,把传感器采集的数据不断拼接为环境的模型,并估计出自身的位姿。

视觉SLAM
视觉SLAM,也称为VSLAM,指利用视觉传感器来进行建图与定位的技术。常用的视觉传感器就是相机,当然相机也有很多分类,臂如单目相机,双目相机,深度相机等等。这类相机统称为视觉传感器。

主流框架
目前VSLMA框架可以大致分为四个部分分为前端估计,后端优化,回环检测,地图构建这四个模块。

在获取传感器数据后,会进行一个预处理过程,之后前端会对传感器数据进行特征提取及特征追踪,操作之后前端将会释放出一个里程计估计信息,这个过程中前端将通过算法的筛选留下一些具有代表性的信息帧给到后端,同时会将一些特征信息与这些历史帧进行比对进而判断是否回到之前到过的地方,如果存在,那么这个信息将会传递给后端,后端使用回环信息检测及全部关键帧信息进行全局优化,得到最优的观测量及姿态值的估计,最后把姿态及特征保存为地图。

总结来说,需要一个模块处理原始传感器数据,然后数据给到前端模块进行粗加工,提取其中的特征来短时间估计当前移动情况及特征的追踪情况(前端),然后把所有这些信息给到后端,作为优化的初始值。同时前端特征会与历史观测进行匹配(回环检测),并把回环检测结果发送给后端。后端把所有信息进行最优化估计(最大后验估计),得到最优的地图,最后生成一张可用来定位或者导航的地图(建图)。

分类
在以上框架中,按照前端使用不同的特征,可以把当前视觉slam分为直接法,间接法,及联合使用这两类的混合法。直接法使用图像的灰度梯度信息,按照使用的图像范围,分为稠密,半稠密,稀疏。而间接法,则从图像中提取一些特征点,提取完特征点后便舍弃掉整幅图像,所以间接法也叫基于特征的方法。而接着按后端中使用的优化技术方案,又可以把上述几个大类接着细分为基于滤波的方法,基于非线性优化的方法。
同时,也有按照算法适配的相机类型,把VSLAM算法分为单目算法,双目算法及RGB-D算法的。下图是几个类别的VSLAM代表算法及出现的时间,可以看出最早的VSLAM算法是基于特征的单目算法,之后出现了混合算法,再最新出现了直接法。
而对于后端优化,则是最先出现的滤波技术,然后出现了非线性优化技术。滤波计算量小,速度快,但结果精度差于非线性优化。非线性优化分为滑窗优化及全局优化,计算量大,使用的观测更多,速度慢一些,但目前取得了最高精度。

实例

单目VSLAM的工作流程为提取特征点->特征点追踪->系统初始化->初始位姿估计->关键帧判断->局部BA->回环检测->全局BA,接下来以ORB_SLAM为例,看一个单目VSLAM如何工作。

整个系统分为追踪(Tracking),局部建图(Local Mapping)和回环检测(Loop Closing)三大线程,并维护地图及视觉词典两大数据结构。

特征追踪
当接收到每一帧图像数据时,追踪线程首先在图像上提取角点特征(ORB特征)。在系统刚启动时,单目VSLAM系统由于缺乏尺度信息,需要先利用对极几何进行初始化。这个时候需要相机在空间中运动一小段距离以保证对极约束的有效性,ORB_SLAM在初始化中会开两个线程,对本质矩阵和单应矩阵同时进行估计,选择效果最好的模型进行初始化。
初始化完成后,系统就获得了带尺度信息的初始地图。对于后面新接收到每一帧图像,再利用特征点的匹配关系,就可以计算出当前帧的位姿。在获得当前帧位姿之后,ORB_SLAM会在局部地图中将具有共视关系帧上的特征点也投影到当前帧上,以寻找更多的匹配点,并利用新找到的匹配点再次对相机位姿进行优化,这一步称为局部地图追踪。在完成这些步骤之后,会根据当前帧相对于上一帧运动的距离及匹配到的特征点数量,判断当前帧是否有条件成为一个关键帧,如果是关键帧,则会进行局部建图,如果不是,则继续处理下一帧。

局部建图
在新生成一个关键帧之后,便会进入局部建图线程。新的关键帧的插入会使ORB_SLAM更新其“生成树”(spanning Tree)及共视图(Covisibility Graph)及本质图(Essential Graph)。这些数据结构维护关键帧之间的相对位移关系及共视关系。更新完这些数据结构后,就完成了关键帧的插入。
接下来是对不可靠地图点的剔除,即能观测到该地图点的关键帧数量少于一个阈值,这个地图点作用就不大了,此时会对其进行剔除。剔除完之后就是新地图点的生成,对于新检测到的特征点,如果和之前未匹配上的地图点产生了匹配,这个特征点就可以恢复出深度,并产生新的3D地图点。之后对新的关键帧及与其有共视关系的局部地图帧,及其它们能看到的地图点,会进行局部BA,通过新的约束关系提高局部地图精度。局部追踪和局部BA利用了中期数据关联,是ORB_SLAM精度高的一大原因。在完成局部BA后,ORB_SLAM会对冗余的关键帧(一帧上的大部分的地图点,能被其他关键帧看到)进行剔除。这种关键帧的剔除机制,在ORB_SLAM在称为适者生存机制,是其能在一个地方长期运行,而关键帧数量不至于无限制增长的关键设计。

回环检测
对于每一个关键帧,在进行完局部建图后,会进入到回环检测阶段。首先ORB_SLAM会使用DBoW库检索可能的回环帧,对检测结果会进行几何一致性检验。通过几何一致性检验后,认为发生了回环,此时会计算当前帧与回环帧之间的Sim3关系,即平移,旋转加尺度。利用这个信息,建立当前帧及其共视图,与回环帧及其共视图之间的约束关系,这一步就称为回环融合。最后,对带回环约束关系的本质图进行优化,完成对整个地图的调整。如果没有发生回环,则会把当前帧的特征描述子信息加入到视觉词典中,以与后面新的关键帧做匹配。
在这整个系统中,特征追踪部分称为前端,而局部建图,回环检测部分,则称之为后端。前端主要职责是检测特征,并寻找尽可能多的数据关联。后端则是基于前端给的初始估计及数据关联进行优化,消除观测误差及累计误差,生成精度尽可能高的地图。

文章知识点与官方知识档案匹配,可进一步学习相关知识