同局部构图模块一样回环检测模块同样是存在一个线程函数run;

void LoopClosing::Run()
{
mbFinished =false;
while(1)
{
// Check if there are keyframes in the queue
// Loopclosing中的关键帧是LocalMapping发送过来的,LocalMapping是Tracking中发过来的
// 在LocalMapping中通过InsertKeyFrame将关键帧插入闭环检测队列mlpLoopKeyFrameQueue
// 闭环检测队列mlpLoopKeyFrameQueue中的关键帧不为空
if(CheckNewKeyFrames())
{
// Detect loop candidates and check covisibility consistency
if(DetectLoop())
{
// Compute similarity transformation [sR|t]
// In the stereo/RGBD case s=1
if(ComputeSim3())
{
// Perform loop fusion and pose graph optimization
CorrectLoop();
}
}
}
ResetIfRequested();
if(CheckFinish())
break;
//usleep(5000);
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
SetFinish();
}
一、寻找闭环帧DetectLoop()
- 在所有关键帧(不包括相连帧)查找闭环备选帧:相连关键帧分组计分排序
- 备选帧连续性检验:备选闭环帧在前两次DetectLoop里也是备选闭环帧
二、计算相似变换ComputeSim3()
- 筛选候选帧,对每一帧建立sim3求解器
- 求解sim3变换
- 利用sim3结果对3D点重投影进行匹配
- 优化Sim3,只要有一个候选帧通过Sim3的求解与优化,就跳出停止对其它候选帧的判断
- 闭环帧相邻帧进行投影匹配
三、闭环纠正CorrectLoop()
1. 通过求解的Sim3以及相对姿态关系,调整与当前帧相连的关键帧位姿以及这些关键帧观测到的MapPoints的位置(相连关键帧---当前帧)
2. 将闭环帧以及闭环帧相连的关键帧的MapPoints和与当前帧相连的关键帧的点进行匹配(相连关键帧+当前帧---闭环帧+相连关键帧)
3. 通过MapPoints的匹配关系更新这些帧之间的连接关系,即更新covisibility graph
4. 对Essential Graph(Pose Graph)进行优化,MapPoints的位置则根据优化后的位姿做相对应的调整
5. 创建线程进行全局Bundle Adjustment
至此ORB-SLAM2系统的主体架构已经结束,接下来再看看几个工具类,主要有ORB特征类与优化类等。
本文深入解析ORB-SLAM2的回环检测模块,包括DetectLoop()中寻找闭环帧的策略,ComputeSim3()中计算相似变换的过程,以及CorrectLoop()中闭环纠正的步骤,涉及Sim3求解、3D点重投影匹配和全局优化。
723

被折叠的 条评论
为什么被折叠?



