ORB_SLAM2:重定位
重定位Relocalization就是相机跟踪丢失后利用已经建立的地图重新求出当前相机在地图中的位置和姿态。例如相机被遮挡几秒或者突然转向当前图像已经无法和上一帧稳定匹配。但只要重新看到地图中记录过的场景就会有机会恢复定位。1. 重定位的核心函数bool Tracking::Relocalization()正常SLAM模式下跟踪状态已经丢失时Tracking::Track()会调用它。流程可以概括为当前帧跟踪丢失 ↓ 计算当前帧的 BoW 词袋向量 ↓ 从关键帧数据库检索相似场景 ↓ 匹配当前帧特征与候选关键帧的地图点 ↓ PnP RANSAC 求初始位姿 ↓ 优化位姿剔除误匹配 ↓ 投影搜索更多匹配再优化 ↓ 有效内点达到要求 → 恢复定位2. 重定位要计算什么3. Bow如何找到候选关键帧如果之前把当前帧和全部地图点进行匹配计算量很大。所以先根据词袋模型缩小范围。mCurrentFrame.ComputeBoW(); mpKeyFrameDB-DetectRelocalizationCandidates(mCurrentFrame);代码的候选筛选过程是通过倒排索引找到与当前帧共享视觉单词的关键帧。统计共享单词数量保留超过约 0.8倍最大共享数量的关键帧。调用mpVoc-score()计算 BoW 相似度。结合最多 10 个共视邻居累计得分。保留累计得分超过最佳累计得分 0.75 倍的候选并去重。这样做的目的是一个地图区域中的多张相关关键帧都与当前图像相似比单张关键帧偶然相似更可信。BoW 此时只提供候选尚不能确认位置更不能直接得到相机位姿。4. ORB特征匹配建立2D-3D对应ORBmatcher matcher(0.75, true); int nmatches matcher.SearchByBoW(pKF, mCurrentFrame, vvpMapPointMatches[i]);5. PnPRANSACPnPsolver* pSolver new PnPsolver(mCurrentFrame, vvpMapPointMatches[i]); pSolver-SetRansacParameters(0.99, 10, 300, 4, 0.5, 5.991);6. 位姿优化pnp给出初始位姿之后对位姿进行优化int nGood Optimizer::PoseOptimization(mCurrentFrame);7、什么情况下认为重定位成功阶段条件含义初始 BoW 匹配匹配数至少 15允许进入 PnP 验证第一次位姿优化nGood 10放弃本次位姿假设优化后内点不足nGood 50尝试投影补充匹配粗搜索并优化后30 nGood 50尝试精细搜索最终验证nGood 50重定位函数返回成功