VSLAM(9):回环检测

文章详细介绍了回环检测在视觉SLAM系统中的重要性,包括其定义、方法、准确率和召回率的衡量标准。回环检测通过特征匹配和图像相似度计算来识别相机是否重复经过同一地点,以纠正累计误差并提供重定位功能。词袋模型和K-means聚类用于生成字典,进行图像特征的表示和比较。在实际应用中,还需要考虑回环验证以确保检测的准确性。

目录

一. 回环检测

1.1 回环检测的定义

1.2 回环检测方法

1.3 准确率和召回率

1.4 词袋模型

1.5 字典

1.6 相似度计算


根据前面的介绍,视觉SLAM前端主要是视觉里程计,负责提取特征点和轨迹,地图的初值;后端负责对数据进行优化。视觉里程计会计算前后帧之间的相对运动,这样会导致前面计算的误差会累加到下一时刻,使得SLAM出现不断增加的累计误差,无法构建全局一致的轨迹和地图。

一. 回环检测

1.1 回环检测的定义

如下图所示,当前端只给出了相邻帧间的估计,由于当前帧的位姿由上一帧的位姿加上相邻帧的相对位姿决定,所以上一帧位姿的误差就延续到了当前帧。以此类推,误差就会越累计越大,使得结果跟真实轨迹越差越远,满满趋向于不稳定。

后端虽然可以在一定程度上缓解误差问题,但是只有相邻帧的时候,对于累计误差也无法消除。这时候就要引入回环检测,来给出除了相邻帧外的,一些时隔更久远的约束。回环检测的目的就是识别相机是否经过同一个地方,采集到了相似的数据。如果成功检测,可以为后端提供额O(N^2)外的约束信息,使得最终的估计是一个全局一致(Global Consistent)的估计。而回环检测的关键就是如何有效的检测出相机经过同一个地方这个事。

回环检测除了为后端优化提供额外的约束条件以外,还为SLAM提供了重定位的功能。当跟踪算法失效,例如特征点丢失,这时候的就需要使用回环检测来重新定位机器人现在的位置。一般定义的SLAM问题是包括前端和局部后端优化以及回环检测的算法框架,而只有前两者的系统称为视觉里程计,即VO。

1.2 回环检测方法

对于回环检测的实现方法,最简单的就是将当前的帧的图像特征点与之前的所有的图像特征点做一遍特征匹配[1],根据匹配得分来确定是否存在回环。但是这样的问题就是随着机器人的运动,过去的图像会越来越多,盲目的假设当前帧与之前的所有帧都可能存在匹配关系会导致检测数量不断增加,算法的复杂度就是O(N^2),这样对于大部分的场景是不适用的。另一个简单的办法就是,随机抽取历史帧进行回环检测,例如抽取历史中的五帧与当前帧进行对比[2],这样算法的复杂度就是一个常数。但是这样的问题就是随着轨迹不断增多,如果真的存在回环,那么抽到回环的概率会随着帧数的增长而不断减小,使得检测效率不高。(如果抽取的帧数随着帧数增大而不断增大会不会好好一点?)

另一种回环检测的方法是基于外观的,仅根据两张图像的相似度来判断是否存在回环。这种方法摆脱了累计误差,使得回环检测成为SLAM系统中一个相对独立的模块。基于外观的回环检测方法再参考文献[3]-[5]中有提到。基于外观回环检测核心问题就是如何计算图像之间的相似度:s(A,B),当这个值大于某一个阈值的时候,就可以认为出现了回环。对于计算图像相似度最简单的方法就是让两个图像相减,然后取某种范数来表示相似度,例如s(A,B) = ||A-B||,但是这种方法会受到光照,相机曝光等的影响,同样当相机的视角发生改变时,即使光度不变,像素也会存在位移,导致最终匹配结果不佳。

对于相似关系函数的好坏,可以从感知偏差(Perceptual Aliasing)感知变异(Perceptual Variablity)两个角度来讨论。

1.3 准确率和召回率

回环检测会根据检测的情况分为真阳,假阳,假阴和真阴四种情况,如下表所示:

假阳性(True Positive)又称为感知偏差,而假阴性(False Negative)称为感知变异。一个回环检测算法的优略,取决于它TP和TN的概率。所以对于特定的算法,可以在数据集中测试他的TP,TN,FP,FN的出现次数,并计算两个统计量:准确率和召回率(Percision&Recall)。

 准确率描述的是回环检测算法中,检测为回环并且真是回环的概率,而召回率则是所有正确检测的回环中,回环被正确检测出的概率。通常来说,这两个量存在矛盾性。

在视觉SLAM(Visual SLAM, VSLAM)建图过程中,回环检测(Loop Closing)是关键模块之一,它主要解决以下几类问题: ### 回环检测解决的问题 1. **累积误差的校正** 在视觉里程计(VO)中,位姿估计是基于连续帧之间的相对运动进行计算的,这种递推方式会导致误差的累积。随着机器人移动距离的增加,这些误差会不断叠加,使得最终构建的地图和轨迹出现明显的漂移[^2]。回环检测通过识别机器人是否回到先前访问过的地点,并将当前观测与历史地图进行匹配,从而对整体轨迹进行全局优化,修正累积误差[^1]。 2. **提高地图的全局一致性** 在没有回环检测的情况下,由于位姿估计的误差,地图中可能会出现重复结构或不一致的特征分布,例如同一个地点在地图中被表示为两个不同的位置。回环检测能够在识别到闭环时触发全局优化过程,调整地图中所有相关帧的位姿,从而确保地图的几何一致性[^1]。 3. **增强系统的鲁棒性与重定位能力** 当视觉SLAM系统由于遮挡、快速运动或特征缺失等原因导致跟踪失败时,回环检测可以用于重定位。通过匹配历史关键帧,系统能够快速恢复当前位姿估计,从而避免系统崩溃或需要重新初始化[^1]。 4. **支持长期自主导航** 在长时间运行的SLAM系统中,地图的规模会不断增长,同时环境也可能发生动态变化。回环检测不仅能够识别闭环,还能帮助系统维护一个紧凑且一致的地图表示,从而提升机器人在复杂或动态环境中的导航能力。 5. **优化地图结构与减少冗余信息** 回环检测不仅有助于位姿优化,还能在建图过程中减少冗余点云或地图特征的积累。通过闭环信息,可以对地图进行拓扑结构优化,使得地图更加紧凑且易于后续处理[^3]。 ### 示例代码:闭环检测的简要逻辑(基于词袋模型 BoW) ```python # 示例伪代码:基于词袋模型的闭环检测 class LoopDetector: def __init__(self): self.database = [] # 存储历史关键帧及其描述子 self.bow_model = BoW() # 初始化词袋模型 def add_keyframe(self, keyframe): descriptor = self.bow_model.compute(keyframe.image) keyframe.bow_descriptor = descriptor self.database.append(keyframe) def detect_loop(self, current_frame): current_desc = current_frame.bow_descriptor best_match = None best_score = float(&#39;inf&#39;) for kf in self.database: score = self.bow_model.match(current_desc, kf.bow_descriptor) if score < best_score and self.is_similar_pose(current_frame, kf): best_score = score best_match = kf return best_match def is_similar_pose(self, frame1, frame2): # 检查两帧之间的位姿是否足够接近,避免误匹配 return np.linalg.norm(frame1.pose - frame2.pose) < 0.5 ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值