视觉SLAM算法框架解析(2) ORB-SLAM

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

  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.

原文地址:https://www.cnblogs.com/zonghaochen/p/8443357.html

时间: 2024-10-23 04:11:09

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程碑式的项目.在此之前,MonoSLAM[2]为代表的基于卡尔曼滤波的算法架构是主流,它用单个线程逐帧更新相机位置姿态和地图.地图更新的计算复杂度很高,为了做到实时处理(30Hz),MonoSLAM每帧图片只能用滤波的方法处理约10~12个最稳定的特征点.PTAM最大的贡献是提出了tracking.m

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

版权声明:本文为博主原创文章,未经博主允许不得转载. SVO(Semi-direct Visual Odometry)[1]顾名思义是一套视觉里程计(VO)算法.相比于ORB-SLAM,它省去了回环检测和重定位的功能,不追求建立.维护一个全局地图,更看重tracking的效果,追求高计算速度.低CPU占用率,所以SVO非常适合在计算资源有限的移动设备上使用.SVO对PTAM的改进主要在两个方面:1)高效的特征匹配:2)鲁棒的深度滤波器.SVO比PTAM.ORB-SLAM计算速度快很多的最主要原因

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

在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是:HectorSLAM,Gmapping,KartoSLAM,CoreSLAM和LagoSLAM.当然最后还有比较经典的google开源的cartographer,虽然不是基于ROS的但是大牛们已经将它修改为基于ROS的版本的cartographer_ros, ROS(Robot Operating

SLAM概念学习之随机SLAM算法

这一节,在熟悉了Featue maps相关概念之后,我们将开始学习基于EKF的特征图SLAM算法. 1. 机器人,图和增强的状态向量 随机SLAM算法一般存储机器人位姿和图中的地标在单个状态向量中,然后通过一个递归预测和量测过程来估计状态参数.其中,预测阶段通过增量航迹估计来处理机器人的运动,并增加了机器人位姿不确定性的估计.当再次观测到Map中存储的特征后,量测阶段,或者叫更新阶段开始执行,这个过程可以改善整个的状态估计.当机器人在运动过程中观测到新特征时,便通过一个状态增强的过程将新观测的特

TLD视觉跟踪算法(转)

源:TLD视觉跟踪算法 TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总结,感觉挺好的,收藏了!下面有个Compressive Tracking的网址,提供的代码很少,但实时性很好,matlab代码下下来就能用. 以下博文转自:http://blog.csdn.net/windtalkersm/article/details/8018980 TLD是一种算法的简称,原作

图的算法框架

-------------------siwuxie095 图的算法框架 图的算法可以写在函数中,也可以封装在类中,为了严谨起见 和后续复用,这里统一将图的算法都封装在类中 其实对于图的算法而言,通常会比较复杂,需要很多辅助数据 结构,而且这些数据结构可能会成为类中的成员变量,这也是 要将图的算法封装在类中的原因之一 同时,这里也会将封装成的类都设置为类模板,这样,不管是 稀疏图,还是稠密图,都可以传入算法中,从而形成模板类 如:从文件中读取图的测试用例的算法 文件 testG1.txt 的内容

回溯0--递归回溯算法框架

递归回溯算法框架 一.心得 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 search后面的k是轮数  三个数组:原数据数组标记数组储存结果数组 框架二 到目的地的情况要多加1,因为满足了的下一轮就好判断 二.代码 1 /* 2 递归回溯算法框架: 3 都是在for下的if下的 4 保存结果,找下一步,回溯,这三个是一起的 5 还有一个到达目的地输出解放在外面就好 6 */ 7 /* 8 框架一 9 */ 10 int se

(一)FlexViewer之整体框架解析

1.FlexViewer简介 FlexViewer框架为Esri提供的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架.目前有两种版本,一种是针对非开发人员的版 本,即编译后的发布(release)版本:一种是供开发人员在源框架的基础上,通过修改代码和配置文件等,来实现定制业务. 这里我要跟大家一起探讨的是面向开发人员的FlexViewer版本. 2.FlexViewer框架的组成 当我们从网上下载到FlexViewer的源码,通过eclipse加载后便可以看到该框架的组成结

前端网页开发经常用到的框架解析

前端网页开发经常用到的框架解析?个人感觉这分为两种情况,一种是能力超强,时间够用的情况,另外一种就是用前端网页框架,可以节约开发时间和减少工作量,这可以根据自身的情况作出正确的判断,并不是别人说什么就是什么. 小项目到底用不用前端网页框架? 小项目本身就是做的事情比较多,但是成本还小,如果让开发人员不停写代码可能会花很多的时间去做,这需要考虑到这个小项目开发时间和成本的.如果用前端网页框架相信大家都知道,可能会考虑到浏览器兼容性,还有功能不够自己用,我想这都不用担心,从QUICKUI开发以来,体