SLAM——回环检测

回环检测(Loop Closure Detection)和之前谈到的前端和后端都不一样,但是一个完整的SLAM系统也不能离开回环检测。

回环检测,简单的来说,就是来看看现在扫描的场景之前有没有遇到过。因为即时有了前后端的存在,我们依然无法保证位姿与路标的完全正确性,由于噪声的存在,下一次你再次走到该地方的时候,得到的路标可能与上次的路标位置不同。这几乎是一定会发生的事情。这样,没有回环检测,就会导致建图出现差错,重影,从而也会影响到定位。下图展示了闭环检测前与闭环检测后的效果:

实际上对于回环检测也有很多的方法。有一种想法是基于里程计的几何关系,也就是我们知道运动到上次运动的地方了,然后进行闭环检测,来观察是否是上次运动的地点。不过这个想法有点本末倒置,因为由于误差的存在,我们往往无法知道是否运动到了之前运动地点的附近。相反,我们正是希望通过闭环检测来更加准确的建图和定位,因此这个方法无法在累积误差较大的时候工作。

另外一种是基于外观的,也是目前的闭环检测方法的主流。主要就是判断当前场景与之前运动过场景进行一个相似度的辨识。如果相似度很高,就可以找到之前运动的地点了。

对于闭环检测的判别,与其他分类,判断的问题一样,是有准确率和召回率两个判断依据的。准确率是通过这个闭环检测器检测出来的是相同地点中判断正确的比例,而召回率是所有相同地点有多少被检测出来了。在SLAM中,我们对准确率要求更高,因为如果不是相同地点我们却当成了相同地点,那会导致建图结果与实际运动情况差别非常大,而将相同地点判断为非相同地点,可能也就是出现少数重影,也可以通过别的回环或者其他方法消除这个inconsistency。

对于相似度的判别有很多,有一种办法是基于特征匹配的,比较容易理解。只要匹配个数超过一定值,我们就认为出现了闭环,或者定义匹配个数数量为相似度的度量。这个方法对于光照等变化比较敏感,因为可能光照不同,就会造成特征匹配不成功。

另外一种方法是词袋模型。这里我简单介绍一下词袋模型(Bag of Words)。词袋模型需要字典(dictionary)。简单来说,就是对扫描的场景中出现的属于某些东西做成一个分类,类似于字典。而对于扫描到的每一帧,建立一个词袋,来观察该帧里出现的属于字典中的东西。我们可以用0和1来表示某个“字”是否出现过,或者用大于1的数表示该帧里出现的次数,从而对于某个帧都能形成一个向量,再比较向量的相似性,从而比较图片的相似性。我们可以假象字典里有桌子,椅子等等,但是实际上字典的建立是一个聚类问题,比如使用k-means算法进行无监督学习来聚类,字典中的”字“比我们想象的更抽象,就是聚类的结果,一般来说就是一个个数字来标识类别。为了提高字典的查找速度,可能需要用多叉数来建立这个字典,也就是多层聚类等。

词袋模型是一个很好的闭环检测的方法。我们可能隐约感觉到了词袋模型很像语义分割。实际上目前神经网络的识别远远超过了词袋模型,因此越来越多的研究者将深度学习与闭环检测结合,达到更好的效果。

最后,实际上基于特征的闭环检测用的也很多,实验室的学长提出的MILD: Multi-Index hashing for Loop closure Detection是一种非常快速的闭环检测方法,可以用到实时的三维重建当中。

本篇文章只是简单的介绍了下什么是闭环检测,并没有涉及到具体的做法。而闭环检测有很多相关的论文,可以通过阅读它们来了解更先进的闭环检测方法。