ORBSLAM源码理论分析3—tracking线程的追踪
1.创建帧3
与构造初始化帧2步骤完全相同,只不过提取的特征点数量减少为帧2的一半。帧3的关键点记为mvKeys3,帧3就是当前的mCurrentFrame。下文帧3记为F3。
2.追踪
1.跟踪前一帧
1.特征匹配
F2—F3的特征匹配与F1—F2的特征匹配过程大致相同。不一样的地方在于以下3点,
(1).F1与F2进行特征匹配时,F1与F2选取的特征点都是图像金字塔第0层的特征点。而F2与F3进行特征匹配时,F2选取的是F2中所有地图点mvpMapPoints对应的特征点。F3选取的是所有特征点。
(2).F1与F2进行特征匹配时,F2上的搜索半径为100,即虚线框边长为200,而F2与F3进行特征匹配时,F3上的搜索半径为200。
(3).F1与F2匹配完成后,会返回匹配成功数量nmatches和匹配点对在F1与F2各自关键点中的索引mvIniMatches。而F2与F3匹配完成后,会返回匹配成功数量nmatches和F3的匹配特征点对应的地图点vpMapPointMatches。
vpMapPointMatches[i3]= pMP;
vpMapPointMatches.size与mvKeys3.size相同。i3为F3的关键点在mvKeys3的索引,pMP为F2中特征点i2对应的地图点。i2与i3是匹配点对。为了表述方便将这里的vpMapPointMatches记为vpMapPointMatches1。
2.特征再匹配
特征再匹配以匹配点对的数量nmatches是否小于10,分为以下两种情况,
1.第一种情况
如果匹配点对的数量nmatches<10,则缩小搜索半径为100,重新匹配。令nmatches=0,并且将vpMapPointMatches1置空。将F2的位姿mTcw传递给F3,将vpMapPointMatches1传递给F3的地图点mvpMapPoints。
然后,再换一种方式重新匹配,这次的匹配对象依然是F2中所有地图点mvpMapPoints对应的特征点和F3中所有特征点。以F2中地图点pMP对应的特征点kp1为例,下面介绍新的匹配过程。
在特征匹配中,根据kp1的像素坐标,比如kp1像素坐标为(20,30),找到F3中对应搜索中心的像素点kp(20,30),特征再匹配过程与特征匹配的不同之处在于F3中对应搜索中心kp的像素点坐标不一定与kp1像素坐标相同,选取对应坐标的方法发生了变化。下面介绍变化后的选取方法。
根据F3的位姿mTcw将地图点pMP投影到F3,得到投影后的像素点kp,也就是 kp1在F3中对应搜索中心的像素点。此时,F3上的搜索半径设为50,其它匹配过程与特征匹配完全相同。投影过程可参考《视觉SLAM十四讲》86P的公式。
匹配完成后,同样会得到匹配点对的数量nmatches,和F3的匹配特征点对应的地图点vpMapPointMatches2。如果此时nmatches ⩾ \geqslant ⩾ 10,则特征再匹配顺利结束,否则跟踪前一帧的整个过程失败。
2.第二种情况
如果匹配点对的数量nmatches ⩾ \geqslant