SLAM系列之ORB-SLAM3开源系统代码解析-地图回环及合并检测

这篇文章将向大家介绍回环和地图合并检测相关实现逻辑,和局部建图器类似,回环检测实现的类为LoopClosing(该类同时也实现了回环矫正和地图合并及矫正,其中矫正和合并的内容将于后续文章介绍),和局部建图器模块一样,该模块也在背景线程中运行,线程运行函数为LoopClosing::run(),为一个随着系统一直运行的while(1)循环。该模块的总体功能是检测地图回环和可能的地图合并,整体地图的维护和所有关键帧的位姿和地图点的全局优化,这篇文章将向大家介绍LoopClosing中的地图回环及合并检测。具体的回环和合并矫正的内容将在下一篇文章中较为详细的分析介绍。

回环检测首先从回环检测队列中取出一个关键帧进行处理,首先调用NewDetectCommonRegions函数来判断当前帧和历史帧是否存在着共同的区域,如果存在,有可能是检测到了回环或者是合并的场景,如果合并条件成立,则调用MergeLocal或MergeLocal2对地图进行合并;如果检测到回环,则进行回环校正。

NewDetectCommonRegions函数的大体逻辑是如果还没有检测到回环或合并发生的次数(mnLoopNumCoincidences,mnMergeNumCoincidences刚开始回环检测或者期间没有检测到匹配候选时重置为0)。回环的检测并不是在当前帧与回环候选关键帧之间的第一次匹配时就直接确认回环存在,而是需要连续几帧都与回环候选帧的匹配度和几何验证通过,才会最终确认回环。其中mnLoopNumCoincidences为检测到回环发生的次数记录,mnLoopNumCoincidences>3说明需要至少连续三帧的匹配才算有效的回环检测,以增加回环检测的鲁棒性,合并状态检测的情形类似。

NewDetectCommonRegions函数首先通过调用KeyFrameDatabase类的DetectNBestCandidates函数根据当前帧和关键帧数据库中关键帧的特征点对应的属性“单词”word形成的“文档”(BOW,bag of words)采用余弦相似度或者TF/IDF为度量标准进行相似性计算找出回环关键帧候选集合和合并关键帧候选集合(在同一个地图的为回环候选关键帧,在不同的地图中的为合并候选关键帧),其中BOW为一个“文档向量”,向量中的每一个元素可以表示特征对应的属性单词是否在该关键帧的在词典中出现,关于BOW的相关实现,可以参考文献[2]中的ORBVocabulary的介绍。

然后两次调用DetectCommonRegionsFromBoW函数分别从候选匹配帧集合中找出是否存在回环或需要合并的匹配关键帧,其基本思想是遍历上一个函数返回的候选的回环候选帧和合并候选帧的集合,将每一个候选和当前关键帧进行匹配相似度计算,并采用Sim3Solver进行几何验证,返回最佳的匹配候选帧,该函数分别调用两次,将最优的匹配结果分别更新到变量mpLoopMatchedKF和mpMergeMatchedKF中去。同时通过计算分别获得mg2oLoopSlw和mg2oMergeSlw变量,这两个变量的求解过程使用到了Sim3Solver算法[1],该变量的含义为从回环匹配关键帧或合并匹配关键帧到当前关键帧进行Sim(3)变换进行纠正后的位姿。

如果检测到了回环的存在,则调用CorrectLoop函数进行回环矫正,如果检测到了合并状态的存在,则调用MergeLocal或MergeLocal2(有IMU的场景)进行地图的合并并进行位姿和地图点的矫正。具体的回环矫正和地图的合并的方法将在后续专门的博客文章里向大家介绍。

References


Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *