ORB-SLAM2学习7 LocalClosing.h

闭环这一部分,主要工作就是找出闭环,并且找出闭环之后可以优化关键帧位姿、地图点。

主要的步骤也是在那个经典的论文图里面。这里就不贴出图了。这些讲重要的函数。

 

bool LoopClosing::DetectLoop()

  这个函数对应论文VII的A部分。Loop Candidates Detection。

第一步:计算当前帧mpCurrentKF和每一个与当前帧有共视关键帧们的Bow得分,得到最小得分minScore

第二步:根据这个最小得分minScore 从mpKeyFrameDB(关键帧库)里面找出候选的的集合vpCandidateKFs.

第三步:对于vpCandidateKFs里面的每一个关键帧,作为当前关键帧。我们找出其有共视关系的关键帧们组成一个当前整体spCandidateGroup。如果当前关键帧是vpCandidateKFs中第一帧的话,直接把这个spCandidateGroup整体,以分数0直接放到mvConsistentGroups中。如果不是第一帧的话,我们就从mvConsistentGroups中依次取出里面的元素pair<set<KeyFrame*>,int>的first这些元素也是关键帧们组成以前整体sPreviousGroup。只要是当前整体中的任意一个关键帧能在以前整体里面找到,我们就要将当前整体的得分加一并把当前整体放到mvConsistentGroups里面如果当前整体的得分大于3(mnCovisibilityConsistencyTh)了的话,当前帧就通过了一致性检测,把当前帧放到mvpEnoughConsistentCandidates,我们会找到很多候选的关键帧。下一步用sim3找出闭环帧。注意该函数改变的就mvpEnoughConsistentCandidates的里面的东西mvpEnoughConsistentCandidates作为该函数的输出

 

bool LoopClosing::ComputeSim3()

  该函数找出真正的闭环帧mpMatchedKF。这个函数的实现策略跟有使用pnp算法的那个函数策略相似。

具体步骤:第一步:将当前帧与候选的关键帧进行Bow匹配,当匹配的数目超过20,我们为这个候选参考帧和当前帧构造一个sim3Solver,.既相似求解器。

     第二步:我们用相识求解器求解出位姿Scm,通过相似变化求找出更多的匹配地图点,然后进行优化,优化的结果足够好的话就把候选的关键帧作为当前帧的闭环帧。

                这里是会得到mg2oScw。

 

void LoopClosing::CorrectLoop()

  这个函数对应的是论文VII下的c部分Loop Fusion。主要处理的是回环检测到了之后,对当前帧(回环帧)周围的帧的影响,回边的连接。以及地图点做出的相应的改变。

具体步骤:第一步:通过上一步计算出来的当前帧的相似变换mg2oScw,来对当前帧周围的每一个关键帧进行相似变化修正。

第二步:这些关键帧们有了修正好的相似变化,我们讲这些关键帧里面的看到的地图点进行修正。并且修正这些关键帧的位姿T。

第三步:因为第二步修正了地图点,我们现在需要跟新当前帧的地图点,如果要替换关键点的话替换。当然我们也需要跟新当前帧周围关键帧们里的地图点。

第四步:因为找到了闭环,我们现在需要在covisibility里面增加闭环边(不止一条边),然后就是进行EssentialGraph优化。

 

posted @ 2017-06-13 15:21  功夫Panda1  阅读(606)  评论(0编辑  收藏  举报