ORB SLAM的tracking部分代码解析

    接着LSD SLAM的代码整理,现在把ORB SLAM的代码也梳理一遍。ORB SLAM是基于特征点法的SLAM的一个代表性的工作,并且有个可读性很强的开源代码[1],感兴趣的人可以下载下来跑一跑。

    ORB SLAM主要分成四个部分,tracking、mapping、relocalization和Loop closure。它的系统框图很好的反映了这点。先放上系统框图。

如上图所示,tracking部分主要实现的是:
1、提取ORB 特征(提取ORB keypoints和ORB descriptor)
2、初始化
3、获得初始的Pose
4、在Track Local Map中优化Pose
5、判断当前帧是否被选为Keyframe
在代码中,总的tracking的实现部分都在void Tracking::Track()这个成员函数中。

1、ORB feature
    ORB feature是根据fast角点和brieaf 描述子改进而来,它具有旋转不变性和尺度不变性
旋转不变性:因为提取角点的时候会计算角点周围一个patch的质心,ORB特征会将角点到质心这个矢量作为ORB特征的方向,所有会有旋转不变性。
尺度不变性:通过在不同分辨率(图像金字塔)上抽取ORB特征,获得尺度不变性。

2、初始化
在单目SLAM中,初始化的函数为:MonocularInitialization()
(1)当前帧的特征点超过100,初始化才可以成功,否则不停初始化。
(2)给初始化成功的帧一个初始的Pose
(3)调用CreateInitialMapMonocular()来产生初始的map点

3、获得初始的pose
     初始化成功之后就开始正常的tracking过程了,每当新来一帧的时候,会给新来帧一个初始的pose。
(1)恒速模型(TrackWithMotionModel())
使用恒速模型的假设是摄像头运动是匀速运动的,利用匀速运动之后的pose来初始化当前帧。
(2)使用参考帧(TrackReferenceKeyFrame()
如果恒速模型失效,就开始尝试和相邻的关键帧来进行匹配,并且可以使用BOW来加速匹配,首先计算当前帧的BOW,并设定初始位姿为上一帧的位姿,然后根据位姿和BOW词典来寻找特征匹配,进一步优化位姿。代码实现如下:

(3)如果找不到匹配的帧,说明跟踪丢了,需要利用relocalization到全局的地图中查找匹配帧,计算位姿(solvePnP实现)。

4、在Track Local Map中优化Pose
   tracking成功后接下来就开始调用TrackLocalMap()函数来优化位姿了。

如上图所示,其中mbOnlyTracking是个bool型变量,默认为false
false:正常跟踪,选择关键帧,调用TrackLocalMap优化。
true:可以根据运行界面去选取,不插入关键帧,局部地图不工作。

TrackLocalMap()包括下面几个函数:
UpdateLocalMap():更新局部地图中的keyframes和Local Points
searchLocalPoints():获得局部地图与当前帧的匹配
PoseOptimization():最小化重投影误差来优化位姿

5、判断当前帧是否被选为Keyframe
在Local Map 被track成功之后,我们需要开始判断当前帧是否应该被选择为Keyframe。主要有两个函数:
(1)NeedNewKeyFrame():判断当前是否需要加入关键帧

如上图所示,首先有三个条件来筛选是否需要插入新的关键帧了。
a、mbOnlyTracking标志位为true时,不更新关键帧
b、进行Loop Closure时,Local Mapping被冻结了,不更新关键帧
c、从上一个relocalization之后没有经过足够的帧的时候,不更新关键帧

通过了上面三个条件的筛选之后,再利用下面的条件来判断是否需要更新关键帧:
这里写图片描述

可满足的条件是:
条件c1a:距上一次插入keyframe很长时间了(frame已经超过了mMaxFrames这个阈值了);
条件c1b:距上一次插入keyframe超过一个mMinframes的阈值,并且LocalMapping线程是空闲的;
条件c1c:传感器不是monocular并且跟踪快要跪掉了;
必须满足的条件是:
条件c2:跟踪地图Mappoints的比例比较少。

(2)CreateNewKeyFrame():创建一个新的关键帧

参考文献:
[1] https://github.com/raulmur/ORB_SLAM2
[2] 【泡泡机器人公开课】第三十六课:ORB-SLAM2源码详解 by 吴博
[3] Mur-Artal, Raul, Jose Maria Martinez Montiel, and Juan D. Tardos. “ORB-SLAM: a versatile and accurate monocular    SLAM system.” IEEE Transactions on Robotics 31.5 (2015): 1147-1163.
[4] Mur-Artal, Raul, and Juan D. Tardós. “Orb-slam2: An open-source slam system for monocular, stereo, and rgb-d cameras.” IEEE Transactions on Robotics 33.5 (2017): 1255-1262.

猜你喜欢

转载自blog.csdn.net/OsgoodWu/article/details/80063243