ORB-SLAM2源码学习(三)——跟踪Tracking.cc

作为ORB-SLAM2里三大线程中的第一个,Tracking线程接收传感器(摄像头)传来的每一帧,并将处理的关键帧传递给LocalMapping线程。Tracking线程其实是系统里的主线程,通过反复调用Track函数进行。

Tracking模块主要完成了以下几件事情:

  1. 单目地图的初始化
  2. 当前帧的位姿估计
  3. 当前帧的局部地图跟踪
  4. 生成候选关键帧

ORB-SLAM2源码学习(三)——跟踪Tracking.cc_第1张图片

一、Tracking构造函数

之前有讲过Tracking对象在System对象构造函数里初始化,而在Tracking构造函数里初始化了:相机内参、ORB特征点提取参数(相应的ORB特征提取器)。

二、GrabImageMonocular函数

将图像转为灰度图像并初始化当前帧(提取特征点,若地图未初始化则提取特征点数增加一倍),之后进行tracking过程,最后输出世界坐标系(Tcw)到该帧相机坐标系的变换矩阵(注意此时返回的变换矩阵是tracking的位姿估计)。

三、Track函数

1、单目地图的初始化MonocularInitialization:

两帧间匹配特征点大于100对时进行地图初始化,得到两帧间的相对姿态T21与初始MapPoints,将第一帧相机坐标系作为世界坐标系,计算第二帧的Tcw(由T21),最后CreateInitialMapMonocular(为单目摄像头三角化生成MapPoints),在这个函数内进行了初始化两帧的BA以及MapPoints深度归一化、姿态归一化(归一化的方法为物点坐标与姿态位移除以物点z坐标的中间值)。

2、当前帧的位姿估计​

  1. TrackReferenceKeyFrame():运动模型为空或重定位后,与参考帧做匹配,以上一帧位姿为初值BA,剔除误匹配点后若匹配点数大于10对则位姿估计成功
  2. TrackWithMotionModel():根据匀速运动模型由上一帧Tcw估计出当前帧位姿,后3D投影匹配点对进行BA优化,剔除误匹配点后若匹配点数大于10对则位姿估计成功

  3. Relocalization():初始化失败或与相邻关键帧匹配也丢失,则尝试全局Bow搜索,使用PnP求解位姿

3、当前帧的局部地图跟踪TrackLocalMap:

  1. 更新局部关键帧UpdateLocalKeyFrames()&更新局部关键点UpdateLocalPoints():由当前帧的MapPoints找到相邻关键帧,由相邻关键帧取其MapPoints;
  2. SearchLocalPoints():在局部地图中查找与当前帧匹配的MapPoints

  3. 局部位姿优化后,判断是否Track成功

4、生成候选关键帧

  1. NeedNewKeyFrame():断当前帧是否为关键帧:局部地图被闭环使用、距上一次插入关键帧时间、匹配点数量、候选关键帧队列大小

  2. CreateNewKeyFrame():创建新的关键帧,在这里将关键帧插入了LocalMapper的候选关键帧队列

​​​​​​​这样就进入到了局部构图线程。

你可能感兴趣的:(slam)