ORB-SLAM2是计算机视觉领域中一款非常著名的开源立体视觉SLAM系统,它是由Raul Mur-Artal等人开发的,其核心算法被发表在多个学术期刊上。ORB-SLAM2支持单目、双目和RGB-D三种不同的摄像机输入,并且具有很强的鲁棒性和准确性,因此它在学术界和工业界都得到了广泛的应用。
在本文档中,我们将深入探讨ORB-SLAM2的源码,包括它的主要结构、变量命名规则、各个线程的工作流程以及它们在处理图像时的关键步骤。文档首先提到ORB-SLAM2的系统入口,这部分主要涉及GrabImageStero、GrabImageRGBD和GrabImageMonocular函数,这些函数负责接收不同类型的输入图像,并根据输入类型构建相应的Frame对象。在处理双目图像时,需要对左右图像分别进行灰度化处理,然后用相应的ORB特征提取器来构造Frame对象。对于RGB-D摄像头,除了灰度图像之外,还需要深度信息,这时使用的是mpORBextractorLeft来提取特征。而单目摄像头在未初始化之前使用的是mpIniORBextractor,在初始化之后与双目摄像头一样使用mpORBextractorLeft。
在 Tracking 线程中,主要进行的是相机位姿的跟踪,包括初始化相机位姿(StereoInitialization和MonocularInitialization函数),位姿跟踪(TrackWithMotionModel、TrackReferenceKeyFrame、Relocalization函数),以及跟踪过程中的一些维护操作(UpdateLocalMap、UpdateLocalKeyFrames、UpdateLocalPoints)。值得一提的是,Tracking 线程有一个mbOnlyTracking的布尔变量,当其设置为true时,系统只进行跟踪与定位,而不会插入新的关键帧到局部地图中,这在某些情况下可以提高系统的跟踪速度。
LocalMapping 线程主要负责处理新加入的关键帧,并更新地图点(MapPoints)与关键帧(KeyFrame)之间的关联。这个线程会剔除一些质量不高的地图点,并通过三角化方法恢复新的地图点。LocalMapping 还会通过局部Bundle Adjustment(LocalBA)来优化关键帧及地图点的位置。
LoopClosing 线程负责闭环检测,即检测当前观测到的地图是否与之前已经观测过的地方相重合。这是SLAM系统中非常重要的一个环节,因为只有正确地检测到闭环,才能对系统进行正确的校正,避免累计误差。LoopClosing 线程首先检查是否有足够的帧数进行闭环检测,然后计算当前帧与相连关键帧的Bow得分,最后通过分组和连续性检测来确定候选的闭环帧。
在整个系统中,变量命名规则遵循特定的约定,如使用“p”表示指针类型,用“n”表示int类型,用“b”表示bool类型,用“s”表示set类型,用“v”表示vector类型,用“l”表示list类型,而“m”表示类成员变量。这些规则的统一使用有助于代码的阅读和维护。
在跟踪线程中,系统会根据输入的图像类型使用不同的初始化方式来建立初始的相机位姿,为后续的跟踪提供基础。而在跟踪过程中,系统会根据当前的跟踪状态和地图的更新情况,采取不同的策略来保证跟踪的稳定性和准确性。
在局部地图构建方面,LocalMapping线程通过各种检查来更新和剔除地图点,通过局部BA优化来保证地图的质量和准确性。这保证了地图构建过程的效率和准确性,同时避免了因为新加入关键帧而导致的计算量过大。
而闭环检测是ORB-SLAM2系统中较为复杂且关键的环节,LoopClosing线程通过一系列的计算和逻辑判断来识别和处理潜在的闭环场景。闭环检测对于提升整个系统的定位精度和地图的稳定性有着至关重要的作用。
ORB-SLAM2源码的深入解读为我们展示了一个复杂SLAM系统是如何一步步构建起来的,每个线程的职责、如何处理图像输入、如何跟踪相机位姿、如何构建和维护地图、如何检测和处理闭环,等等。这些内容对于想要深入理解ORB-SLAM2系统,或者对于开发自己的SLAM系统的读者来说,都是一份宝贵的资料。