视觉slam中的回环检测概述
在slam中,前端负责提供轨迹与地图的初值,后端负责对轨迹与地图进行优化。在小范围的环境中,前端与后端便已经够用了。但是当活动的范围增加以后,这一类只依靠内部传感器(相机、imu等)的定位方法不可避免的会出现累积误差,这时因为虽然我们可以使用ba等优化方式进行优化,但是这种优化方式毕竟还是局部的(比如某一个位姿下会有大部分的地图点是看不到的)。
回环检测
回环检测与累积误差
拿视觉slam来说,虽然对于当前位姿的估计我会使用ba进行优化,但是这个ba一般是基于局部地图的优化,首先必然会存在误差(ba只是尽量减小它),然后以后某一时刻的位姿会依赖此处的位姿结果进行估计,于是累积误差就出现了。
一般累积误差最常见的是位姿的累积误差,在单目视觉中,还会出现尺度的累积误差。
针对上述的累积误差问题,我们可以使用回环检测来修正。一般回环检测的步骤如下: 1. 检测到回环的发生
计算回环侯选帧与当前帧的运动
验证回环是否成立
闭环
回环检测可以修正累积误差,并且在各种图优化模型中,加入回环的约束可以有效的提高优化结果的精度。
检测回环
检测回环的方法很多。朴素的方法: 1. 最简单的方法是对任意两幅图像都做一遍特征匹配,根据正确匹配的数量确定哪两幅图像存在关联。这种方法朴素但是有效,缺点是任意两幅图像做特征匹配,计算量实在太大,因此不实用。
- 随机抽取历史数据进行回环检测,比如在\(n\)帧中随机抽5帧与当前帧比较。时间效率提高很多,但是抽到回环几率不高,也就是检测效率不高。
系统的方法: 1. 基于里程计几何关系的方法 - 大概思路是当我们发现当前相机运动到之前的某个位置附近时,检测他们是否存在回环 - 缺点:由于累积误差,很难确定运动到了之前某个位置
- 基于外观的方法
- 仅仅依靠两幅图像的相似性确定回环
- 核心问题是如何计算图像的相似性。
- 这个问题可以看成一个二分类问题,并且slam特性要求这个分类准确率必须要高,召回率可以相对低一点。
目前最广泛使用并且最有效的方法是基于外观的一种方法,使用词袋模型进行回环检测
需要注意的问题
相似性评分的处理
使用词袋模型,对于任意两张图片我们都可以给出一个相似性评分,但是有些环境本身就很相似,比如每间办公室中的桌椅可能款式一样,使得任意两幅图像之间的相似度都挺高的。考虑这种情况,我们通常会取一个先验相似度 \(s\left(\boldsymbol{v}_{t}, \boldsymbol{v}_{t-\Delta t}\right)\),它表示某一时刻关键帧图像与上一时刻关键帧的相似性。然后其他的分之都参照这个值进行归一化:
$ s({t}, {t_{j}})^{}=s({t}, {t_{j}}) / s({t}, {t-t}) $
一般我们会假设,如果当前帧与之前某关键帧的相似度超过当前帧与上一个关键帧相似度的\(3\)倍,我们才会认为可能存在回环。这样处理可以避免引入绝对的相似性阈值。
关键帧的处理
由于上面采用的相似性评分方式,如果我们在选取关键帧时选的很近,会使得两个相邻关键帧之间相似性太高,这样历史中的回环会很难检测出来。所以用于回环检测的关键帧最后是稀疏一些,彼此不太相同,同时又能涵盖整个环境。
回环聚类
如果我们的机器人将第\(1\)帧与第\(n\)帧检测出了回环,那么很有可能接下来的第\(n+1\)帧、第\(n+2\)帧都会和第\(1\)帧构成回环。但是确认第\(1\)帧与第\(n\)帧的回环对整个轨迹优化帮助很大,接下来的第\(n+1\)帧与第1帧的回环帮助就没那么大了。因为我们之前已经消除了累积误差,更多的回环带来的帮助不会更大。此时,我们通常把相近的回环聚成一类,使得算法不要检测同一类的回环。
回环检测后的验证
使用词袋的回环检测完全依赖外观,因此会出现由于外观相似而出现的错误检测(比如酒店里布置完全一样的两件客房)。所以在回环检测后,我们会进行验证。
验证方法很多,比如 1. 时间一致性检测。设立回环的缓存机制,认为单次检测到的回环不足以构成良好的约束,而是在一段时间内一直检测到的回环才是正确的回环。
- 空间一致性检测。对回环检测到的两帧进行特征匹配,估计相机运动。再将运动放到之前的位姿图中检测是否出入过大。
机器学习
词袋模型,本身是一种非监督的机器学习过程(基于树结构的聚类,数结构加速查找)。而回环检测本身是一个分类问题,只是这个分类问题是一种稠密的分类,分类类别近似于连续变量。
由于目前基于词袋模型的物体识别已经明显不如神经网络了,而回环检测又是意向相似的问题,之后这部分的工作也许可以尝试使用深度学习来替换。
参考文献
- [1] 视觉slam十四讲