ORB-SLAM2 Loop Closing

ORB-SLAM2整体分为tracking、local mapping、loop closing以及viewer四部分。其中viewer用来进行关键帧、位姿以及地图点的绘制,和SLAM整体过程无关。

Loop Closing处理的是从mlpLoopKeyFrameQueue中依次提取的关键帧。(Loopclosing中的关键帧是LocalMapping发送过来的,LocalMapping是Tracking中发过来的。在LocalMapping中通过InsertKeyFrame将关键帧插入闭环检测队列mlpLoopKeyFrameQueue)如果mlpLoopKeyFrameQueue中没有待处理的关键帧,则无需进行回环检测。

DetectLoop

  1. 从mlpLoopKeyFrameQueue中取出一帧关键帧。mlpLoopKeyFrameQueue是一个list,秉承先进先出的概念,按顺序进行处理关键帧。被选择的关键帧会被设定为不能删除,以避免在回环检测过程中该关键帧被当作冗余关键帧剔除掉。
  2. 为了避免连续回环带来的无效信息(如果第i帧已经被判定为回环,第i+1、i+2…大概率也会同样被判定为回环帧,但是后者几乎不会带来新的约束信息,可以认定为无效回环),如果距离上次闭环之后时间过短(程序中认为是10帧关键帧以内为时间过短)或者地图中存在关键帧不足(地图中是少于10帧关键帧),则不再进行回环检测。
  3. 获取第1步中取出的关键帧(暂且命名为当前关键帧)的所有共视关键帧,计算当前关键帧和其所有共视关键帧的词包得分。获取所有得分中的最低得分。
  4. 通过DetectLoopCandidates获取所有候选关键帧。
    1. 获取当前关键帧的所有共视关键帧,共视关键帧将不会被认为是回环帧(在ORB-SLAM2中,共视关键帧在Local BA中进行优化,所以共视关键帧的信息以及共视关键帧对累积误差的消除会在Local BA部分体现出来)
    2. 找出和当前关键帧具有相同单词的所有关键帧(不包括当前关键帧的共视关键帧)
      1. 遍历当前关键帧中的每一个单词
      2. 获取包含该单词的所有关键帧
      3. 去除已经被加入的候选帧或者当前关键帧的共视帧
      4. 记录当前帧和候选关键帧的共同单词数量
    3. 统计所有闭环候选帧中与当前关键帧的共同单词数量
      1. 获取所有候选关键帧中具有最多共同单词的单词数量
      2. 根据1中获得的最大共同单词数量maxCommonWords,设定最小共同单词数量minCommonWords(代码中是最大值的80%)
    4. 遍历所有闭环候选帧,挑选出共有单词数大于minCommonWords且单词匹配度大于minScore(由函数外部传入)存入lScoreAndMatch(lScoreAndMatch中存入的关键帧代表已经通过了相似性验证,lScoreAndMatch中存入的是pair<相似性得分,关键帧指针>)
    5. 将所有候选关键帧按照共视关系进行分组(候选关键帧中存在共视关系的两帧被分为一组)
      1. 针对每个候选关键帧,取出其10个具有最大共视关系的帧
      2. 在这10帧中找出同为候选关键帧的帧归为一组
      3. 统计组累计得分以及组内最高得分
      4. 记录得分最高的组的得分bestAccScore
    6. 依据最高组的得分计算最低“组得分”minScoreToRetain(程序中是最高得分的75%)
    7. 将满足要求的组中的拥有最高得分的关键帧添加到最终的候选帧列表中(由于第5步中有可能会出现同一个关键帧被多帧当作共视帧、最高得分关键帧的情况,因此在这一步进行了相关操作避免重复添加)
    8. 返回满足要求的候选关键帧列表
  5. 在候选帧中检测具有连续性的候选帧
    1. 每个候选帧将与自己相连的关键帧构成一个子候选组spCandidateGroup
    2. 遍历之前存在的连续组
      1. 判断当前组和之前的连续组是否存在共同的关键帧
        1. 如果存在共同关键帧,则连续计数加1
        2. 将当前组添加到连续组列表中
        3. 如果连续计数达到指定要求,则当前关键帧被加入到mvpEnoughConsistentCandidates中
      2. 不存在共同关键帧则计数为0,将当前组加入到连续组列表中
  6. 将当前关键帧加入到关键帧数据库中

ComputeSim3

  1. 遍历mvpEnoughConsistentCandidates中所有的候选关键帧
  2. 将当前帧与候选关键帧进行特征点匹配(这里利用词包匹配进行加速,获取匹配关系)
    1. 匹配特征点数量不足(代码中是 < 20),则剔除该候选帧
    2. 匹配点数量足够,构造Sim3Solver求解器,设定求解器参数(每一帧候选关键帧都有各自的Sim3Solver求解器。如果mbFixScale为true,则是6DoF优化,针对双目、RGBD数据;如果是false,则是7DoF优化,针对单目数据。默认至少20个inliers、300次迭代)
  3. 遍历所有满足2中要求的候选关键帧
    1. 对2中满足要求的关键帧求取Sim3变换,最多迭代5次,返回的Scm是候选帧pKF到当前帧mpCurrentKF的Sim3变换(**TODO:**这里用到的Sim3Solver的相关方法)。如果达到最大迭代次数仍未求解出Sim3变换,则剔除当前候选帧
    2. 通过求得的Sim3变换,利用SearchBySim3寻找步骤2中的漏匹配
    3. 更新匹配关系之后,重新优化两帧之间的Sim3
    4. 如果优化后内点数量 >= 20,则停止对其余候选帧的计算, 认为当前候选帧就是回环帧。如果没有任何一帧通过内点检测,则认为回环寻找失败,返回false
  4. 取出候选关键帧及其所有有共视关系的关键帧,将它们观测到的MapPoints添加到mvpLoopMapPoints中(针对每个MapPoint,标记该MapPoint被mpCurrentKF闭环时观测到并添加,避免重复添加)
  5. 将闭环匹配上关键帧以及相连关键帧的MapPoints投影到当前关键帧进行投影匹配。根据投影查找更多的匹配(成功的闭环匹配需要满足足够多的匹配特征点数),根据Sim3变换,将每个mvpLoopMapPoints投影到mpCurrentKF上,并根据尺度确定一个搜索区域。根据该MapPoint的描述子与该区域内的特征点进行匹配,如果匹配误差小于TH_LOW即匹配成功,更新mvpCurrentMatchedPoints(mvpCurrentMatchedPoints将用于SearchAndFuse中检测当前帧MapPoints与匹配的MapPoints是否存在冲突)
  6. 重投影之后匹配点数超过40,则认为匹配成功,返回true,否则认为匹配失败,返回false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值