ORB_SLAM2源码阅读记录(2):主线程Tracking

ORB_SLAM2源码阅读记录(2):主线程Tracking_第1张图片

接着上一次阅读的完成单目初始化,继续阅读Tracking主线程,单目初始化完成后,开始进行帧跟踪,分为三个小步骤,如论文中的系统框架所示,(1)初始位姿估计;(2)跟踪局部地图;(3)跟踪良好,检查是否插入新的关键帧,及生成关键帧。

ORB_SLAM2源码阅读记录(2):主线程Tracking_第2张图片

1.初始位姿估计

初始位姿估计又分为SLAM模式和定位模式两种,在显示地图界面可以勾选是否是只进行定位(仅跟踪,局部建图LocalMapping线程和回环LoopClosing线程就会关闭),SLAM模式是完整的,程序默认情况下是这种模式,这里也只看这种模式对应的代码。

跟踪成功的话 bOK

CheckReplacedInLastFrame(); 检查并替换上一帧中被跟踪的局部地图点,局部建图可能更改了上一帧中被跟踪的某些地图点,将上一帧跟踪的地图点依次遍历,判断是否存在更改,如果存在更新/更改,则更新上一帧跟踪的地图点。

恒速模型跟踪失败的时候,利用参考关键帧来计算当前帧的位姿

TrackReferenceKeyFrame()函数

(1)当前帧可以通过ComputeBoW计算其对应的词袋向量;

(2)找匹配,当前帧与参考关键帧;

(3)上一帧位姿设为当前帧位姿,根据匹配的点,当前帧位姿,优化当前帧的位姿;

(4)删除异常匹配的地图点,匹配的地图点大于10返回true。

 

TrackWithMotionModel()函数

(1)根据参考关键帧更新上一帧位姿;

(2)将上一帧位姿,再乘上速度,设为当前帧的位姿,搜索当前帧与上一帧之间的匹配点,并利用所有匹配优化当前帧位姿;

(3)删除异常匹配的地图点,匹配的地图点大于10返回true;

TrackWithMotionModel()函数内部调用UpdateLastFrame()函数,其实也是根据参考关键帧更新上一帧位姿。

2. 跟踪局部地图

(1)更新局部地图,包括局部关键帧和局部地图点,找出的但还没有与当前帧有匹配的那些地图点投到当前帧,进行匹配操作。当最匹配的点的距离小于次最佳点的距离时,认为匹配成功;

(2)优化位姿,在有了更多匹配后,再一次优化当前帧位姿,BA最小化重投影误差;

(3)判断这次追踪局部地图是否成功;

最终目的:也是进一步优化相机位姿。

3. 跟踪良好,检查是否插入新的关键帧,及生成关键帧。

NeedNewKeyFrame函数,检查是否插入新的关键帧,插入关键帧的条件:

(1)很长时间没有插入关键帧;

(2)局部地图空闲;

(3)跟踪很弱;

满足以上三种之一,同时,与参考关键帧相比,跟踪的点很少。

如果NeedNewKeyFrame函数返回true,则需要生成关键帧,CreateNewKeyFrame函数,生成关键帧,把当前关键帧设为参考关键帧,同时把当前关键帧设为当前帧的参考帧。将当前关键帧插入关键帧列表中mlNewKeyFrames。

你可能感兴趣的:(视觉SLAM,VIO)