ORB-SLAM(六)回环检测
上一篇提到,无论在单目、双目还是RGBD中,追踪得到的位姿都是有误差的。随着路径的不断延伸,前面帧的误差会一直传递到后面去,导致最后一帧的位姿在世界坐标系里的误差有可能非常大。除了利用优化方法在局部和全局调整位姿,也可以利用回环检测(loop closure)来优化位姿。
这件事情就好比一个人走在陌生的城市里,一开始还能分清东南西北,但随着在小街小巷转来转去,已经不知道自己在什么地方了。通过认真辨识周边环境,他可以建立起局部的地图信息(局部优化)。再回忆以前走过的路径,他可以纠正一些以前的地图信息(全局优化)。然而他还是不敢确定自己在城市的精确方位。直到他看到了一个之前路过的地方,就会恍然大悟,“噢!原来我回到了这个地方。”此时,将这个信息传递回整个地图,就可以得到相当准确的地图信息。这就是回环检测。
因此,回环检测在大尺度地图构建上是一个非常有用的方法。回环检测可以从二维图像出发,也可以从三维点云出发。目前大家更推荐基于二维图像的方法。
DBoW2
基于二维图像的方法本质上是一个场景识别的问题。我没有深入研究过,因此直接介绍一下ORB-SLAM中用到的DBoW2的方法。
BoW(bag of words,词袋模型),可以理解为一个以特征描述作为元素的词典。如果是ORB特征,那就是ORB词典;如果是SIFT特征,那就是SIFT词典。词典可以从图像数据集中训练出来。下面举一个简单的例子。假如我们有一个一万幅图像的数据集,并认为它基本上涵盖了我们所面临的场景。
从每幅图像中提取特征点和特征描述;特征描述一般是一个多维向量,因此可以计算两个特征描述之间的距离;
将这些特征描述进行聚类(比如k-means),类别的个数就是词典的单词数,比如1000;也可以用Beyes、SVM等;
DBoW2将这个词典组织成树的形式,方便搜索。
在实际应用中,每一幅图像都在词典中搜索其最近邻的单词,并在该单词下留下标记。如果A、B两幅图像定位到同一个单词时,说明这两幅图像有可能有相似的特征点。当A、B有一定量的相似点时,可以认为这两幅图像之间存在着一定的相似性。
ORB-SLAM的作者修改了DBoW2,输出一系列候选图像(candidate)而不是一幅最相似的图像。
基于BoW的方法有一些非常好的优势:
词典可以离线训练。在实时应用中能离线的东西越多越好。作者提供了通过大量数据训练出来的BRIEF和SIFT的词典。
搜索速度飞快。小尺寸的图像可以在毫秒级别完成。作者提供了正向(direct index)和反向(inverse index)两种辅助指标。反向指标在节点(单词)上储存到达这个节点的图像特征的权重信息和图像编号,因此可用于快速寻找相似图像。正向指标则储存每幅图像上的特征以及其对应的节点在词典树上的某一层父节点的位置,因此可用于快速特征点匹配(只需要匹配该父节点下面的单词)。
很多slam应用本身就需要计算特征点和描述,因此可以用特征来搜索。
ORB-SLAM的作者还用词典的特性做快速的特征筛选,减少特征匹配需要的时间(特别是在大尺度上搜索特征时)。
当然它也有自己的劣势:
如果应用的场景比较特殊,请训练自己的词典。一般的词典会不太好用。
- BoW一般不太考虑特征之间的几何关系(有人在做,但不清楚效果和计算量如何)
还有几个comments:
如果应用本身不需要计算特征,那要考虑额外的计算时间。
推荐像ORB-SLAM一样,BoW只用来快速筛选图像,后续需要通过其它方法一一验证、严格验证。如果回环选错了,那,就跪了。
如果场景特征很少,或者重复的特征太多,比较难办。
在稠密点云重建中,如果场景本身有丰富的几何纹理,那么可以利用两帧之间(包括相邻位置)的三维点云匹配去验证回环。如果匹配的误差足够小,那么回环是比较准确的。
回环验证和Sim3优化
对每个候选的回环帧,作者先匹配其和当前帧上的特征点,然后用特征点对应的三维点去求解一个相似变换矩阵(RANSAC框架下)。如果某个回环帧对应的矩阵有足够多的内点,那去做Sim3优化。利用优化结果再去寻找更多的特征匹配,再做一遍优化。如果内点足够多,那么接受这个回环。
Sim3优化详见上一篇。
回环融合(fusion)
这里有一个隐含假设,即误差随着时间不断累积,相对而言,我们更信任之前的信息而不是当前的信息。这部分主要是把回环帧的信息融合到当前帧里面,包括匹配的特征点对应的三维信息(深度、尺度等),世界坐标系下的位姿(通过Sim3的结果转化过去)等等。融合也包括回环帧的邻域和当前帧的邻域。
全局优化
全局优化时,固定回环帧及其邻域,当前帧及其邻域,优化剩余帧在世界坐标系的位姿。详见上一篇。
预告:
这个系列写到这里就暂时告一段落啦。回头来看,前面几篇写的并不满意,尤其追踪那部分,将来争取重写一下。
接下来,本来想写关于LSD的文章,估计会暂缓一下,先写一两篇关于网格生成的文章。
该系列的其它文章:
ORB-SLAM(六)回环检测的更多相关文章
- 浅谈SLAM的回环检测技术
什么是回环检测? 在讲解回环检测前,我们先来了解下回环的概念.在视觉SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿解算当前帧位姿,因此其中的误差便这样一帧一帧的传递下去,也就是我们所说 ...
- 综述 | SLAM回环检测方法
本文作者任旭倩,公众号:计算机视觉life成员,由于格式原因,公式显示可能出问题,建议阅读原文链接:综述 | SLAM回环检测方法 在视觉SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿 ...
- 一个基于深度学习回环检测模块的简单双目 SLAM 系统
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12634631.html 写在前面 最近在搞本科毕设,关于基于深度学 ...
- DLoopDetector回环检测算法
词袋模型是一种文本表征方法,它应用到计算机视觉领域就称之为BoF(bag of features),通过BoF可以把一张图片表示成一个向量.DBoW2是一个视觉词袋库,它提供了生成和使用词典的接口,但 ...
- Code Reading: ORB-SLAM回环检测源码阅读+注释
之前研究过一些回环检测的内容,首先要看的自然是用词袋回环的鼻祖和正当继承人(没有冒犯VINS和LDSO的意思)ORB-SLAM.下面是我的代码注释.因为代码都是自己手打的,不是在源码上注释的,所以一些 ...
- 【C++】链表回环检测
//链表回环检测问题 #include<iostream> #include<cstdlib> using namespace std; ; struct node { int ...
- segMatch:基于3D点云分割的回环检测
该论文的地址是:https://arxiv.org/pdf/1609.07720.pdf segmatch是一个提供车辆的回环检测的技术,使用提取和匹配分割的三维激光点云技术.分割的例子可以在下面的图 ...
- VINS 回环检测与全局优化
回环检测 VINS回环检测与全局优化都在pose_graph.cpp内处理.首先在pose_graph_node加载vocabulary文件给BriefDatabase用,如果要加载地图,会loadP ...
- VINS 检测回环辅助激光建图
最近接到一个任务,在激光检测回环失败时,比如黑色物体多,场景大等,可否利用视觉进行回环检测.如果只是检测回环,现有的许多框架都可以使用.ORB-SLAM本身就有单目模式,且效果不错.但是发现ORB在检 ...
随机推荐
- .NET开发之快捷键篇
引言:我们都知道快捷键使用得熟,将极大的提高我们的开发效率.可是我发现许多开发人员老喜欢用鼠标去点,不擅长使用快捷键. 1.VS常用快捷键 这个我们记住开发中常用的就可以了. F4:打开属性面板. F ...
- 理解RESTful架构
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- axis2+struts拦截地址冲突问题
axis2和struts在整合过程中,struts会把axis的地址也拦截了,默认当成一个action处理, 会因为找不到action而报错: <!-- struts配置 --> < ...
- 超小Web手势库AlloyFinger原理
目前AlloyFinger作为腾讯手机QQ web手势解决方案,在各大项目中都发挥着作用. 感兴趣的同学可以去Github看看:https://github.com/AlloyTeam/AlloyFi ...
- Reactjs-JQuery-Vuejs-Extjs-Angularjs对比
写在前面 前端越来越混乱了,当然也可以美其名曰:繁荣. 当新启动一个前端项目,第一件事就是纠结:使用什么框架,重造什么轮子? 那么,希望看完此篇,能够给你一个清晰的认识,或者让你更加地纠结和无所适从 ...
- Java基础知识【上】(转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- android图片验证码--自绘控件
自绘控件的内容都是自己绘制出来的 大致流程如下: 1.定义一个类继承view 使用TypedArray初始化属性集合 在view的构造方法中 有一个AttributeSet的参数 很明显是用来保存控件 ...
- Xcode自定义代码块
到现在才发现原来Xcode有自定义代码块这么神奇的功能,能简化很多无聊的敲重复代码的工作,真是感叹我怎么才知道!!! 具体的设置流程见:http://nshipster.cn/xcode-snippe ...
- iOS 自定义方法 - UIView扩展
示例代码 //#import <UIKit/UIKit.h>@interface UIView (LPCView)/** 上 */@property CGFloat top;/** 下 * ...
- 事件分发时候的onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent调用顺序
一直想弄清楚onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent的执行顺序,以及内部使用switch (event.getAction())中的执 ...