ORB-SLAM2源码解读(2.1):Tracking

Tracking是SLAM的灵魂,更像是前端里程计VO,这里Tracking的主要任务两方面:(1)完成相机位姿估计(2)跟踪局部地图

思路:TrackLocalMap()在当前帧和局部地图之间找到尽可能多的对应关系,优化当前帧的位姿。对每一帧都进行跟踪

第一次接触这么大的工程,发现之前接触的真的好弱鸡,总结下来是:先看基本流程图+从头到尾啃一遍代码+总结

这里要感谢吴博和吃水的鱼蚁族的坚持的博客,大神的博客给了很大的启发。

下面重点研究单目作传感器

Tracking线程代码主要有两部分:Track()函数为主线,各部分成员函数为分支。第一部分主要讲Track()函数部分代码,下一讲详细介绍各分支代码及原理。


基本流程框架:

1、单目初始化 MonocularInitialization()

2、相机位姿跟踪:(1)跟踪运动模型TrackWithMotionModel()(2)跟踪关键帧TrackReferenceKeyFrame()(3)重定位Relocalization()

3、跟踪局部地图 TrackLocalMap()

流程图1:

流程图2

 Tracking线ç¨æ´ä½æµç¨å¾


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

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值