论文阅读《ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras》
本文提出了ORB-SLAM2,它是基于单目、双目或RGB-D相机的一个完整的SLAM系统,其中包括地图重用、回环检测和重定位功能。
前置工作ORB-SLAM
基于双目和RGB-D相机的ORB-SLAM2是建立在基于特征的单目ORB-SLAM的基础上的。所以,这里首先回顾一下前置工作 ORB-SLAM。
ORB-SLAM系统概述,显示了跟踪,局部建图和回环检测这三个线程执行的所有步骤。还显示了地点识别模块和地图的主要组件。
跟踪
负责对每一帧摄像机进行定位,并决定何时插入一个新的关键帧。首先与前一帧进行初始特征匹配,并使用纯运动的BA优化姿势。如果跟踪丢失(例如由于遮挡或突然的移动),则使用地点识别模块来进行全局重新定位。一旦有了对摄像机姿势和特征匹配的初步估计,就会使用系统维护的关键帧的共存图来检索局部可见图。然后,通过重新投影寻找与本地地图点的匹配,并通过所有的匹配再次优化摄像机的姿势。最后,跟踪线程决定是否插入一个新的关键帧。
局部建图
处理新的关键帧并执行局部BA,以在相机姿态的周围环境中实现最佳重建。新关键帧中未匹配ORB的新对应关系在共视性图中的连接关键帧中搜索,以三角化新点。创建后一段时间,基于跟踪期间收集的信息,应用紧急点剔除策略,以便仅保留高质量点。局部映射还负责剔除冗余关键帧。
回环检测
在每个新的关键帧中搜索回环。如果检测到一个回环,就计算一个相似性变换,得到回环中积累的漂移。然后,回环的两边被对齐,重复的点被融合。最后,对相似性约束进行姿势图优化,以实现全局一致性。主要的创新之处在于,我们在基本图上进行优化,这是一个更稀疏的共存图子图。
orb-slam更具体的细节还是看论文和代码,论文把这个工作讲得特别详细!!!
阅读orb-slam2的代码有问题时,也可以再回来看这两篇论文,帮助挺大的。
ORB-SLAM2的系统架构
ORB-SLAM2由三个主要的并行线程组成:跟踪、局部建图和回环检测。在回环检测后会执行第四个线程,进行全局BA。跟踪线程会对双目和RGB-D输入进行预处理,从而使得系统其它部分可以独立于输入传感器运行。虽然这张图没有展示,但ORB-SLAM2也可以基于单目输入运行。
该系统具有三个主要的并行线程:
1)跟踪线程是用来在每一帧中定位相机的位置,通过匹配特征和局部地图并且进行运动BA(motion-only BA)最小化重投影误差;
2)局部建图线程是用来管理和优化局部地图;
3)回环检测线程是用来检测大回环,并通过执行位姿图优化来修正累积误差。该线程在位姿图优化后会启动第四个线程来执行全局BA,计算最优的结构和运动结果。
该系统嵌入了一个基于DBoW2 的位置识别模块,在发生跟踪失败(例如:碰撞)或者在建好图的场景中重新初始化时用来进行重定位,以及用来进行回环检测。该系统维护了一个关联可见地图(convisible map),此地图将每两个观察到相同地图点的关键帧连接到一起;同时该系统也维护了一个最小生成树,它连接了所有的关键帧。这种地图结构实现了对于关键帧局部窗的检索,因此跟踪线程和局部建图线程可以局部地运行,使其可以在大场景中工作;同时该结构在回环闭合进行位姿图优化时,也可作为优化的图结构。
基于ORB-SLAM进行的工作
这篇论文后面主要介绍在ORB-SLAM基础上进行的工作,即如何使用双目/深度信息,以及系统的哪些部分将会被影响。
TRACKING部分
ORB-SLAM在初始化的时候是计算两帧之间的相对pose,然后用三角测量的方式初始化地图点集,它同时计算了两个模型(一个基础矩阵F,一个单应矩阵H),最后选择一个更好的模型来求解SFM问题。
ORB-SLAM2多了一个预处理的部分,把RGB-D输入或者双目的输入处理成为单目特征点和这些特征点对应的深度,之后系统的全部运算就基于这些特征,而输入的图像就被丢弃了。
ORB-SLAM应该也是基于这些特征做运算?
其中,RGB-D输入也被他们处理成类似双目的输入了,他们为RGB-D图像中提取的特征点计算了一个虚拟的右图坐标,这样就可以统一的进行处理。这里他们是把特征点划分为近处点和远处点,近处特征点可以被安全地三角化,深度能被精确估计,而远处特征点提供了精确地旋转信息,不过无法提供精确的尺度和平移信息,只有远处特征点在多个视图中存在的时候才会被三角化。
因为双目或者RGB-D能够直接从单帧图像获取深度信息,所以第一帧设置为关键帧,其位姿设置为初始姿态,并且根据所有的立体关键点来建立一个初始地图。
FULL BA部分
ORB-SLAM的论文里在讲初始化(IV. AUTOMATIC MAP INITIALIZATION )的时候提到初始化过程的最后会执行一个全局的BA来完善初始化的重建。
而ORB-SLAM2这里是在位姿图优化后,再采用全局BA优化来得到最优解。这个优化过程可能开销会很大,所以被放在一个独立的线程中,从而使得系统可以持续建立地图、检测回环。
但这样会导致BA输出与当前地图状态之间进行融合产生困难。如果在优化运行的同时发现了新的回环,ORB-SLAM2就停止优化,转而去闭合回环,这将再次启动全局BA优化。当全局BA完成时,就需要将全局BA优化更新后的关键帧和点的集合,与在优化过程中插入的未更新的关键帧和点,进行融合。这通过将更新的关键帧的修正(未优化位姿至优化位姿的变换)沿生成树传递至未更新的关键帧来完成。未更新的点依据它们的参考帧的修正来进行变换。