找到线程的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();
}
只要闭环检测关键帧队列不为空下面的检测会一直执行
1 DetectLoop() 进行闭环检测
1.1 从队列中取出一个关键帧
1.2 判断:如果距离上次闭环没多久(小于10帧),或者map中关键帧总共还没有10帧,则不进行闭环检测
1.3 遍历所有共视关键帧,计算当前关键帧与每个共视关键的bow相似度得分,并得到最低得分minScore
1.3.1 找出所有与当前关键帧相连的KeyFrame,这些相连Keyframe都是局部相连,在闭环检测的时候将被剔除
1.3.2 步骤1:找出和当前帧具有公共单词的所有关键帧(不包括与当前帧链接的关键帧)
1.3.3 遍历当前关键帧的每一个word
1.3.4 提取包含该word的关键帧pKFi,但不包括与当前关键帧相邻的关键帧
1.3.5 步骤2:统计所有闭环候选帧中与pKF具有共同单词最多的单词数
1.3.6 步骤3:遍历所有闭环候选帧,挑选出共有单词数大于minCommonWords且单词匹配度大于minScore存入lScoreAndMatch