Tracking是SLAM的灵魂,更像是前端里程计VO,这里Tracking的主要任务两方面:(1)完成相机位姿估计(2)跟踪局部地图
思路:TrackLocalMap()在当前帧和局部地图之间找到尽可能多的对应关系,优化当前帧的位姿。对每一帧都进行跟踪
第一次接触这么大的工程,发现之前接触的真的好弱鸡,总结下来是:先看基本流程图+从头到尾啃一遍代码+总结
这里要感谢吴博和吃水的鱼和蚁族的坚持的博客,大神的博客给了很大的启发。
下面重点研究单目作传感器
Tracking线程代码主要有两部分:Track()函数为主线,各部分成员函数为分支。第一部分主要讲Track()函数部分代码,下一讲详细介绍各分支代码及原理。
基本流程框架:
1、单目初始化 MonocularInitialization()
2、相机位姿跟踪:(1)跟踪运动模型TrackWithMotionModel()(2)跟踪关键帧TrackReferenceKeyFrame()(3)重定位Relocalization()
3、跟踪局部地图 TrackLocalMap()
流程图1:
流程图2
Tracking线程主要函数代码逻辑
MonocularInitialization()
最初的两帧进行对极约束和全局BA优化,计算两帧位姿、三角化得到地图点深度
1、创建单目初始器mpInitializer,用Frame()函数构造第一帧mInitialFrame
2、如果当前帧特征点数大于100,则得到用于单目初始化的第二帧
3、在mInitialFrame与mCurrentFrame中找匹配的特征点对
4、如果初始化的两帧之间的匹配点太少,重新初始化
5、通过H模型或F模型进行单目初始化,得到两帧间相对运动、初始MapPoints
6、CreateInitialMapMonocular()将三角化得到的3D点包装成MapPoints
TrackWithMotionModel()
假设匀速运动,用上一帧位姿和速度估计当前帧位姿。方法:上一帧地图点投影到当前帧,完成匹配。
1、假设:两帧间相对运动不变,根据上一帧位姿和速度用PnP估计当前帧位姿。
2、SearchByProjection()在将上一帧的地图点投影到当前固定大小范围的帧平面上,如果匹配点少,那么扩大两倍的采点范围
3、PoseOptimization()优化相机位姿,BA算法,最小二乘法。
4、优化位姿后剔除outlier的mvpMapPoints
TrackReferenceKeyFrame()
关键帧中查找BOW相近的帧,进行匹配优化位姿。方法:关键帧BOW向量与当前帧进行匹配
1、mCurrentFrame.ComputeBoW()将当前帧的描述子转为BOW向量,加块匹配速度
2、matcher.SearchByBoW()通过特征点的BoW加快当前帧与参考帧之间的特征点匹配
3、mCurrentFrame.SetPose(mLastFrame.mTcw)将上一帧的位姿态作为当前帧位姿的初始值
4、PoseOptimization通过优化3D-2D的重投影误差来获得位姿
5、剔除优化后的outlier匹配点(MapPoints)
Relocalization()
重定位,之前所有关键帧中查找与当前帧有充足匹配点的候选帧,Ransac迭代,PnP求解位姿
1、计算当前帧特征点的Bow映射
2、找到与当前帧相似的候选关键帧,mpKeyFrameDB->DetectRelocalizationCandidates(&mCurrentFrame)
3、通过EPnP算法估计姿态
4、通过PoseOptimization对姿态进行优化求解
5、如果内点较少,则通过投影的方式对之前未匹配的点进行匹配,再进行优化求解
TrackLocalMap()
投影,从已经生成的地图点中找到更多对应关系。
1、UpdateLocalMap()更新局部关键帧mvpLocalKeyFrames和局部地图点mvpLocalMapPoints
2、SearchLocalPoints()在局部地图中查找与当前帧匹配的MapPoints
3、PoseOptimization()更新局部所有MapPoints后对位姿再次优化
4、更新当前帧的MapPoints被观测程度,并统计跟踪局部地图的效果
NeedNewKeyFrame
判断是否需要生成新的关键帧,确定关键帧的标准
1. 在上一次进行重定位之后,过了20帧数据,或关键帧数小于20个,不满足不能生成
2. 在上一个关键帧插入之后,过了20帧,或 局部建图是空闲状态,不满足不能生成。
3. 当前帧跟踪到大于若干个点,不满足不能生成
4. 当前帧的跟踪点数小于90%的参考关键帧跟踪点数,并且当前帧跟踪点数大于15,不满足不能生成
具体流程:
一、Tracking的两个模式
1、仅追踪模式(mbOnlyTracking):局部地图不工作,只追踪地图现有地图点
2、同时定位与建图( !mbOnlyTracking ):追踪线程同时有局部建图和回环检测。
二、Tracking的四种状态
NO_IMAGES_YET表示当前没有图片,NOT_INITIALIZED表示当前没有初始化追踪线程,OK证明当前追踪线程完好,LOST证明当前追踪线程丢失——注意这里的线程状态都是指当前帧处理之前的状态。
处于NO_I