版权声明:本文为博主原创文章,未经博主允许不得转载。  

  ORB-SLAM[1]完全继承了PTAM(http://www.cnblogs.com/zonghaochen/p/8442699.html)的衣钵,并做出了两点巨大改进:1)实时回环检测;2)很鲁棒的重定位。为了实现这两点改进,ORB-SLAM把PTAM的mapping线程基于局部BA和全局BA拆分成了local mapping和loop closing两个线程,用ORB描述子替换了patch匹配,并且设计了非常优秀的地图管理策略。

  在tracking线程,ORB-SLAM和PTAM一样,也是先构造金字塔(默认8层)再提取特征点(一个常规技巧是把图像划分成网格,不同区域可以有不同的FAST阈值,这样尽量使得提取的特征点分散在图片各个区域)。不同的是,ORB-SLAM在FAST特征点的基础上又提取了ORB描述子,这种描述子在不同观测视角和不同光照条件下有鲁棒的不变性,并且计算速度比SIFT、SURF要快很多。描述子的用途是配合DBoW[2]做特征点匹配和回环检测。具体的说,每个描述子会对应词典里一个单词,词典中的单词以树状结构存储,每个单词对应一个叶节点。这个树状结构有两种检索方式,一种是从图片查单词(每张图片有哪些单词,以及单词对应的图片上特征点的具体编号),另一种是从单词查图片(每个单词在哪些图片被观测到,以及这个单词在这张图片的权重)。当前帧位置姿态的估计方法和PTAM也几乎一模一样,也是把前一帧对应的地图点投影到当前帧(根据匀速运动模型估计了一个初始位置姿态),然后找匹配(ORB匹配,而不是PTAM的patch匹配),找到足够匹配后再优化求解。Track Local Map是把附近更多的地图点投影到当前帧(上一步只涉及前一帧对应的地图点)。这也是近似PTAM从粗到细两轮求解的过程,粗测的优化结果作为精测的初值。在判断当前帧是否是关键帧方面,ORB-SLAM是相对宽松的(在满足PTAM类似的几个小条件的基础上,当前帧的匹配点数量少于关键帧的90%就要考虑插入新关键帧;在2016年的ORB-SLAM2[3]中,根据40倍baseline的距离把地图点分为近点和远点,近点对估计尺度、平移、旋转都有贡献,远点只对估计旋转有贡献。当近点数量少于一个阈值,也要插入新的关键帧),因为关键帧越密集,越不容易跟踪失败。这么做带来的问题是有冗余的关键帧,所以在local mapping线程,会再删去多余的关键帧控制BA的复杂度。

  在local mapping线程,插入新关键帧后首先要做的是更新covisibility graph和spanning tree。Covisibility graph是用来描述不同关键帧可以看到多少相同的地图点:每个关键帧是一个节点,如果两个关键帧之间的共视地图点数量大于15,则这两个节点之间建立边,边的权重是共视地图点的数量。Spanning tree是covisibility graph的子集,保留了所有的节点(或者说关键帧),但每个节点只保留和最多共视地图点关键帧之间的边。之后计算新关键帧的词袋(bags of words)描述,也就是建立上一段中“从图片查单词”和“从单词插图片”的检索,这一方面是为了匹配特征点三角化出新的地图点,另一方面是为了回环检测。Recent MapPoints Culling是检验前三个关键帧新生成的地图点(新生成的地图点要接受连续三个新关键帧的检验),如果这些地图点没有通过检验(只能被少数图片观测到)则删去。通过检验的地图点如果被少于三个关键帧观测到也会被删去,这通常发生在删除冗余关键帧和局部BA的情况下,这能保证地图点精准且不冗余。New Points Creation是为新关键帧上没有匹配上地图点的特征点找匹配,如果能从其他关键帧(根据covisibility graph检索共视地图点最多的十个关键帧)找到匹配,且满足一系列约束,则三角化出新的地图点。Local BA的做法和PTAM是一样的,也是把周围的地图点投影到周围的关键帧,让重投影误差最小。这和tracking线程Track Local Map的区别是,这里调整关键帧(位置姿态)和地图点(位置),tracking线程是调整当前帧的位置姿态。Local KeyFrames Culling阶段,如果某个关键帧观测到的90%的地图点都能被其他至少三个关键帧观测到,则被认为是冗余的,会被删去。

  在loop Closing线程,会把新关键帧的词袋描述和其他关键帧做比较,如果两个向量足够相似,就说明出现了回环。怎么才算足够相似呢?ORB-SLAM把新关键帧和周围关键帧(covisibility graph里共视地图点大于30个)的最小相似度作为动态阈值,其他关键帧的相似度只有大于这个阈值才有可能是回环关键帧(为了提高鲁棒性,covisibility graph里的连续三个关键帧都必须满足这个条件才可以)。由于新关键帧和回环关键帧之间可以进行ORB匹配,所以他们各自的地图点之间也建立了匹配关系,于是可以优化出两个关键帧之间的变换(2015年的ORB-SLAM只针对单目,会有尺度漂移的问题,所以计算的是相似变换;在2016年的ORB-SLAM2中,如果使用了双目或者RGBD相机,尺度不再是未知数,于是可以直接计算刚体变换)。Loop Fusion阶段,第一步是融合重复的地图点,并且在covisibility graph里补上回环的那条边。然后根据之前计算出的新关键帧和回环关键帧的变换,调整新关键帧及周围关键帧的位置姿态,这样回环的两头就基本对齐了。然后再把回环关键帧附近的地图点投影到新关键帧,把匹配上的地图点融合起来。之后再根据essential graph优化所有关键帧的位置姿态(essential graph是简版的covisibility graph,保留了所有的节点,共视地图点数量大于100才会建立边),把回环误差均摊到所有关键帧上。2015年的ORB-SLAM认为经过essential graph优化之后,精度已经足够高了,在执行全局BA(同时优化所有的关键帧和地图点)意义不大,但是ORB-SLAM2还是加上了全局BA(由于全局BA计算复杂度太高,为了不影响后续的回环检测,又开了个新的线程专门执行全局BA)。跟踪失败后会进入重定位模式,具体重定位的方法和回环检测类似。

  ORB-SLAM有两个问题:1)计算复杂度比较高,直接原因是每一帧都提取了描述子。2)实际测试中,ORB-SLAM的抖动(jitter)要比SVO大,个人感觉是因为ORB-SLAM的地图点是简单三角化出来的,额外的约束也只是为了剔除外点而没有进一步的考虑地图点的不确定性,而SVO的深度滤波器从概率分布的角度充分利用了多帧图像,深度不确定性收敛到比较小的区间才会插入地图点。

参考文献:

[1] Mur-Artal R, Montiel J M M, Tardos J D. ORB-SLAM: a versatile and accurate monocular SLAM system[J]. IEEE Transactions on Robotics, 2015, 31(5): 1147-1163.

[2] Gálvez-López D, Tardos J D. Bags of binary words for fast place recognition in image sequences[J]. IEEE Transactions on Robotics, 2012, 28(5): 1188-1197.

[3] Mur-Artal R, Tardós J D. Orb-slam2: An open-source slam system for monocular, stereo, and rgb-d cameras[J]. IEEE Transactions on Robotics, 2017, 33(5): 1255-1262.

视觉SLAM算法框架解析(2) ORB-SLAM的更多相关文章

  1. 视觉SLAM算法框架解析(1) PTAM

    版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程 ...

  2. 视觉SLAM算法框架解析(3) SVO

    版权声明:本文为博主原创文章,未经博主允许不得转载. SVO(Semi-direct Visual Odometry)[1]顾名思义是一套视觉里程计(VO)算法.相比于ORB-SLAM,它省去了回环检 ...

  3. 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势

    SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...

  4. 三维重建:SLAM算法的考题总结

    参考英文维基:https://en.wikipedia.org/wiki/Slam 参考文档:视觉slam研究分析的一点认识 1. 请简单描述您对机器人的SLAM的概念理解? 答: 机器人需要在自身位 ...

  5. SLAM学习笔记(2)SLAM算法

    SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...

  6. 对比几种在ROS中常用的几种SLAM算法

    在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...

  7. 三维重建7:Visual SLAM算法笔记

    VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...

  8. [SLAM]Karto SLAM算法学习(草稿)

    Karto_slam算法是一个Graph based SLAM算法.包括前端和后端.关于代码要分成两块内容来看. 一类是OpenKarto项目,是最初的开源代码,包括算法的核心内容: https:// ...

  9. SLAM概念学习之随机SLAM算法

    这一节,在熟悉了Featue maps相关概念之后,我们将开始学习基于EKF的特征图SLAM算法. 1. 机器人,图和增强的状态向量 随机SLAM算法一般存储机器人位姿和图中的地标在单个状态向量中,然 ...

随机推荐

  1. 吴裕雄--天生自然TensorFlow2教程:高阶操作

    import tensorflow as tf a = tf.random.normal([3, 3]) a mask = a > 0 mask # 为True元素,即>0的元素的索引 i ...

  2. CF1217B Zmei Gorynich

    You are fighting with Zmei Gorynich — a ferocious monster from Slavic myths, a huge dragon-like rept ...

  3. JavaSE--java是值传递还是引用传递

    引用是已定义的变量的别名. 按引用传递就是一个变量使用两个名称. 两个变量在内存中的地址都是一样的. 按值传递, 传递的是值的拷贝. C++中可以通过传引用来改变传入的参数的值.在C++中可以通过以下 ...

  4. openstack trove主要贡献公司-Tesora被Stratoscale收购

    新闻链接:http://www.stratoscale.com/press/press-releases/stratoscale-acquires-database-as-a-service-prov ...

  5. Windbg 实践之符号篇

    How to display the size value 1)一开始不会加载,chksym 了一下就加载了. 2) 新版本已经可以显示size的大小了 3)?? 显示变量的类型 4)x std::v ...

  6. [CISCN2019 华北赛区 Day2 Web1]Hack World

    知识点:题目已经告知列名和表明为flag,接下来利用ascii和substr函数即可进行bool盲注 eg: id=(ascii(substr((select(flag)from(flag)),1,1 ...

  7. 计算机网络(2): http的基础上用SSL或TSL加密

    加密过程具体TCP实现 步骤 1 : 客户端通过发送Client Hello报文开始SSL通信(这里是在TCP的三次握手已经完成的基础上进行的).报文中包含客户端支持的SSL的指定版本.加密组件列表( ...

  8. 201512-2 消除类游戏 Java

    思路: 用二维数组,对于每一个棋子,向右看三个,向下看三个,如果相等则置为负数,最后遍历输出. import java.util.Scanner; public class Main { public ...

  9. F5负载均衡综合实例详解(转)

    转载自:https://blog.csdn.net/weixin_43089453/article/details/87937994  女程序员就不脱发了吗来源于:<网络运维与管理>201 ...

  10. 吴裕雄--天生自然 PYTHON3开发学习:数字(Number)

    print ("abs(-40) : ", abs(-40)) print ("abs(100.10) : ", abs(100.10)) #!/usr/bin ...