我们以ORBSLAM中的重定位举例,来分析重定位的过程。当跟踪失败的时候,系统会启动重定位。 找出一些候选关键帧,对每个候选关键帧,用ransac和EPNP估计位姿,然后更新当前帧的地图点匹配,然后优化位姿,如果内点较少,则通过投影的方式对之前未匹配的点进行匹配,再进行优化求解,直到有足够的内点支持,重定位完成。
下面简要梳理重定位的过程——
- 用关键帧库的DetectRelocalizationCandidates函数找到当前帧对应的候选关键帧
- 对每个候选关键帧,用SearchByBow匹配当前帧和该关键帧(即更新当前帧特征点对应的地图点,更新mvMapPoints列表), 用当前帧和当前帧的特征匹配关系来初始化PnPSolver
- 对每个候选关键,用EPNP估计位姿
- 如果估计成功,用估计所得的内点更新当前帧的特征匹配
- 调用PoseOptimization,优化当前帧的位姿
- 优化后,剔除特征匹配的外点(即去除误匹配的地图点)
- 如果优化后的内点过少,用SearchByProjection对未匹配的特征点匹配当前帧与关键帧
- 所有的匹配点(内点加新增的匹配点)大于50,调用PoseOptimization
- 若优化后,新的内点数还是较少(30~50),用更小的窗口再次调用SearchByProjection
- 所有的匹配点数大于50,调用PoseOptimization(最后一次优化),并剔除外点
- 如优化后的内点大于50,中断,重定位成功,当前帧的ID就是最近一次的重定位ID帧
下面的几张图来自网上,不可全信,但可参考,真相还是要看ORBSLAM的源码——
在T