0总述
在Tracking
线程中,当系统初始化完成后就会正式进入跟踪环节。在ORB-SLAM3算法代码中提供了两种模式,一种是纯定位模式,一种是定位建图的SLAM模式。
对于纯定位模式,在源码中由成员变量mbOnlyTracking
控制,这个变量是通过UI界面进行控制改变的。
可以由上图看到,纯定位模式和SLAM模式主要是在与第一阶段的处理方式不同,由于纯定位模式不进行关键帧的创建,因此,在存在加载先验地图时使用纯定位模式比较合适,不然VO的轨迹会漂的非常厉害。
1.定位
根据代码中的逻辑,纯定位模式主要依托于跟踪运动模型TrackWithMotionModel()
实现定位,即根据论文中的恒速运动模型先获取一个当前帧的初始位姿。后面会根据这个初始位姿进行匹配优化,最终得到优化后的位姿。
mCurrentFrame.SetPose(mVelocity * mLastFrame.GetPose());
在跟踪恒速运动模型过程中,如果是纯定位模式会有一个更严苛一点的判断,如果通过当前帧特征点恢复出的3D内点的数量较少mbVO = nmatchesMap<10;
,认为系统即将要跟踪失败,在下一帧就要考虑重定位了。
2.重定位
纯定位模式下,如果跟踪失败了是通过重定位进行找回的。对于纯定位模式的重定位,当系统跟踪快要失败时以及系统已经跟踪失败时,都会进入到重定位模式中。
如果上一帧只是跟踪质量较差,其实还是有恒速模型存在,则重定位会首先进行一次跟踪恒速模型
if(mbVelocity)
{
bOKMM = TrackWithMotionModel();
vpMPsMM = mCurrentFrame.mvpMapPoints;
vbOutMM = mCurrentFrame.mvbOutlier;
TcwMM = mCurrentFrame.GetPose();
}
接着还会进行一次重定位,重定位的主要思想是通过遍历当前关键帧数据库中的所有关键帧,寻找和当前帧存在匹配关系的关键帧,通过关键帧和当前帧之间的匹配计算当前帧位姿,这个过程和回环检测有点相似,简单地说也是位置识别。
如果重定位找不回来VO就宣告失败了,接下来会一直陷入到重定位的逻辑里,直到找到匹配关系。所以说VO模式需要先验地图作为保障,VO本身是不创建关键帧的,在跟踪失败时如果没有先验关键帧,重定位就没有意义。
3.小结
在实测过程中,对于纯定位模式的使用,需要保证当前运行的环境保持稳定,也不能出现较为恶劣的环境,比如运动模糊和光线变化导致的过曝欠曝,这些都会导致纯定位的不稳定,出现位姿漂移甚至跟踪失败。总的来说,ORB-SLAM3中的纯定位模式有些鸡肋,而且在加载先验地图的情况下也可以运行SLAM模式,根据实测统计,VO的跟踪时间并没有比SLAM模式跟踪时间有所降低。