ORB-SLAM2代码整理--LoopClosing线程

本文详细介绍了ORB-SLAM2中LoopClosing线程的工作流程,从DetectLoop()的闭环检测到ComputeSim3()的Sim3变换求解,再到CorrectLoop()的局部地图修正,深入剖析了闭环检测的关键步骤,包括关键帧的相似度计算、候选帧筛选、Sim3变换优化以及冲突处理等环节。
摘要由CSDN通过智能技术生成

找到线程的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

          

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值