SLAM学习——回环检测

本文介绍了SLAM中的回环检测,强调了其在轨迹校正和重定位中的作用,探讨了基于几何和外观的回环检测方法,重点讲解了基于外观的回环检测中的词袋模型、字典构建和相似度计算。通过词袋模型将图像转换为向量,并利用TF-IDF计算单词权重,最后使用L1范数衡量图像间相似度。

1.回环检测

回环检测的关键,就是如何有效的检测出相机经过同一个地方这件事。它关系到我们估计的轨迹和地图在长时间下的正确性。

由于回环检测提供了当前数据与所有历史数据的关联,在跟踪算法丢失后,我们还可以利用重定位。有些时候,我们把仅有前端和局部后端的系统称为VO,把带有回环检测和全局后端的系统称为SLAM。

回环检测的方法:基于里程计的几何关系和基于外观。
基于几何关系是说,当我们发现当前相机运动到了之前的某个位置时,检测它们有没有回环关系。但是由于误差积累的存在,我们往往没办法正确发现“运动到了之前的某个位置附近”这个事实。
基于外观的(主流做法),它和前端、后端的估计都无关,仅根据俩副图像的相似性确定回环检测关系,这种做法摆脱了积累误差,使回环检测模块成为SLAM一个相对独立的模块。

在基于外观回环检测算法中,核心问题是如何计算图像间的相似性。比如对于图像A和图像B,我们要计算它们之间的相似性评分:s(A,B)。如果单单用俩副图像相减然后取范数 s(A,B)=||AB||s(A,B)=||A−B||但是由于一副图像在不同角度或者不同光线下其结果会相差很多,所以不使用这个函数。

程序判断与实际总有误差,以下是我们的分类结果:

这里写图片描述

其中假阳性又称为感知偏差,假阴性称为感知变异。为方便,则真阳性(True Positive)简称TP,假阳性称为(False Positive)简称FP,以此类推。当然,所有的结果我们都希望FP和FN尽可能要低。对于某特定算法,我们可以统计它在某个数据集上的TP、FP、FP、FN的出现次数,并统计俩个统计量:准确率Presicion=TP/(TP+FP)和召回率Recall=TP/(TP+FN)。
从上述公式可以得到,准确率描述的是,算法提取的所有回环中确实是真实回环的概率。而召回率是说在所有真实回环中被正确检测出来的概率。一般而言,我们更倾向于提高算法的准确性,稍微牺牲下召回率。如果出现假阳性,那么就会在后端的Pose graph添加错误的边,导致误差不准。

2.词袋模型

1.确定概念,例如一副图像上有人、狗等,那么“人”“狗” 等概念就是Bag-of-Words中的“单词”,许多单词放在一起,组成了“字典”。
2.确定一副图像中出现了哪些在字典中定义的概念——用单词出现的情况(直方图)描述整副图像,转换成向量。
3.比较上一步中的描述的相似程度。

举个例子,若“人”“狗”都在字典里(这里的字典是已经知道的),不防设为w1,w2w1,w2假设A图像中有人没狗,则可以描述成:A=1w1+0w2A=1∗w1+0∗w2,由于字典是固定的,那么只需要一个向量就可以描述整副图像了,例如 A=[1,0]TA=[1,0]T

通过这个词袋模型,我们可以得到俩张图片在这个词袋里面的向量a,bRwa,b∈Rw,那么可以计算

### 视觉SLAM回环检测的原理 在视觉SLAM系统里,回环检测扮演着至关重要的角色。当机器人再次访问之前已经探索过的区域时,该功能允许设备识别这种重复路径并修正由于长时间积累而产生的定位偏差[^1]。 对于视觉SLAM而言,位姿估计通常依赖于连续图像间的匹配关系来进行更新;然而这种方法容易受到噪声影响从而引入累计误差。一旦成功执行了回环闭合操作,则意味着找到了两个不同时间点拍摄但实际地理位置相同的两张图片之间的关联性,并据此调整整个轨迹以及对应的地图结构以减少上述提到的时间序列上的漂移现象[^3]。 ### 实现方法概述 一种常见的做法是在构建局部子地图的同时维护全局描述符数据库,在新观测到来之时查询是否存在相似项作为潜在候选者参与后续验证流程。具体来说: - **特征提取与描述**:从每一帧获取显著性的几何或外观特性; - **索引建立**:依据这些属性创建易于检索的数据表单以便快速查找相近实例; - **候选选取**:针对最新加入的内容搜索可能构成循环的部分; - **确认过程**:运用几何一致性检验或其他手段确保所选配对确实代表同一地点的不同视角观察结果。 此外还有研究指出采用分层策略能有效提升大规模环境下工作的效率——即将整体空间划分为若干个小范围各自负责一部分计算任务再经由接口相连互通信息完成最终决策[^2]。 ```python def detect_loop_closure(current_frame, database): features = extract_features(current_frame) # 特征提取 candidates = search_similar_entries(features, database) # 查询候选集 confirmed_loops = [] for candidate in candidates: if verify_geometric_consistency(candidate, current_frame): # 几何一致性校验 confirmed_loops.append((candidate.id, compute_relative_pose_change())) return confirmed_loops ```
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值