转载请注明:http://blog.csdn.net/c602273091/article/details/54348202
对该论文进行讲解,同时看看自己有什么不懂的地方。
ORB-SLAM是一种基于特征的稀疏法的视觉SLAM,它不仅仅可以用于单目,还可以用于双目、RGBD(其实能够用于单目的一般都能够用于双目,单目的做法就是把连续的几帧串了起来,假设汽车的速度不变,那么连续两帧不就是可以看做双目了么?)
ORB-SLAM可以实时运行,看ORB-SLAM的官网,你可以看到它们做到了手机上。ORB-SLAM鲁棒性很高,可以在室内外,大小环境中都有较好的表现。与此同时,ORB-SLAM可以在运动剧烈的环境中工作,它可以检测出较大的闭环,在追踪丢失以后,它可以重新计算位姿,而且可以自动初始化(不像PTAM需要手动选两张图片初始化)
这篇论文可以看做是这几年来做视觉SLAM稀疏法(特征法)算法的集大成者,而且作者优美的代码,给这个工作增色不少。整个SLAM系统采用了多线程,分成了追踪、建图、重定位(Relocalization)、闭环检测。在这个SLAM里面,作者又增加了不少小技巧,来选择关键点(在3D中你可以叫它点云)和关键帧来进行数据去冗余,(不去除冗余的话,你试试跑几个小时的数据,那是惊人的,更不用说你要跑辣么久)同时使得这种方法会使建的图更加精确。作者在kitti上测试了ORB-SLAM,说他的ORB-SLAM是单目中最牛叉的。而我看到的是ORB-SLAM2上面显示是双目的呀,另外SVO2可是超过你了呀,SVO2是直接法里面最牛叉的了吧?
关键词: 超长期建图、定位、单目视觉、识别、SLAM。
Bundle Adjustment(BA)是一种估计相机位姿和几何重建常用的工具,但是长期以来在实时的视觉SLAM里面用这个被认为是一种不现实的事情。视觉SLAM的任务是估计相机位姿和建图,用BA再合适不过了。作者知道了为了达到较高的正确率,在非概率性的计算代价下(之前很多SLAM用的滤波法,计算的代价就是概率的代价)。我们需要给BA(g2o)提供以下数据:
1、将观测到的特征点和关键帧联系起来(要知道特征点对应的是那几帧);
2、关键帧越来越多,需要剔除冗余;
3、关键帧和关键点的网络具有很好的配置(就是graph-slam优化的时候参数设置,关键点选多少,关键帧多少帧取一帧合适)
4、初始化关键帧的位姿和关键点位置,用于非线性优化;
5、局部图的优化关注在于取得可扩展性;
6、快速的闭环检测,最好实时。
ORB-SLAM一直被认为是PTAM的改进版,因为PTAM提出的关键帧选取、特征匹配、特征点的三角化、相机位姿计算、重定位、多线程等等都被ORB-SLAM吸取。但是PTAM没有闭环检测、没有自动初始化等等。ORB-SLAM对此进行了改进和增加。
这篇论文的贡献在于:
1、所有步骤都是采样一样的特征:ORB特征。2、可以在大的环境中使用,这就是很多公司想做的高精度地图吧。这得益于covisibility-graphy的使用,这种图使得建图的时候可以先建立局部图(俗称map partition),再合并。3、在做闭环检测的时候,使用的就是essential graph(我觉得这个就是对总的covisibility graph进行一个精简,成为最小生成树);4、鲁棒性高,因为关照影响暂时不能使用,之后又可以重新定位回来。5、新的自动初始化技巧,可以在平面和非平面的情况下使用;6、一系列技巧用于提高鲁棒性和去除冗余。
听起来真棒,具体怎么做的呢?
之前说到了ORB-SLAM在PTAM上增加了闭环检测,那么我们就需要进行图片比较,来确定是不是经过了同一个地方。闭环匹配呢有图片到图片的匹配,有图片到地图的匹配,也有地图到地图的匹配。目前来看,图片到图片的匹配精度最高了。所以ORB-SALM使用的就是图片到图片的匹配。
在匹配的时候,这里用到了DBoW2的一个库,这个库就是做两幅图片匹配,计算相似度的。原本用到的特征是fast特征,BRIEF描述子。但是BRIEF不像SURF、SIFT那样具有大小、方向不变性。所以作者提出了一种具有方向(Oriented)的BRIEF特征——ORB。作者使用的是DBoW2的库,使用ORB特征进行图片匹配,进而做闭环检测。在这里,需要说一下DBoW2的原理,它首先是对大量图片提取出visual word,然后使用k-shift进行特征聚类,就有了字典,然后我们描述一幅图片的时候,就用visual word进行描述,通过对比不同图片之间visual word的“距离”大小,我们就得到了它的相似度。(具体细节看Bags of binary words for fast place recognition in image sequences)在速度上的话,因为BRIEF是二进制,操作相当快。10k的图片的匹配少于39ms。具体在ORB-SLAM里面,作者有很聪明的地方,他不仅仅是看最高的匹配度,还有匹配的两幅图片的连续那几副的匹配程度来决定最后的闭环检测结果。
一种是滤波法,初始化的位置有很大的不确定性,后面就是越来越高的置信度。目前半稠密的方法就用到了这种初始化方法。还有的就是假设初始化的位置是平面的,用homography或者是五点法求关键矩阵(essential matrix)但是在非平面情况下呢?这里就使用8点法计算fundamental matrix(这些东西都在MVG里面)
所以呢作者就根据一种启发的方式选择使用的模型是用于平面还是非平面。在大多数情况下,更倾向于选择平面模型。
单目SLAM有filter-based和key frame-based两大类。filter-based计算冗余度大,而且容易误差累计。key frame-based(基于关键帧)的方法,更容易进行BA,可以进行局部图的优化。
PTAM是第一个使用多线程的,使用于AR。但是它的闭环检测能力较差,对不同视角看同一个物体的鲁棒性低。所以作者使用7DoF的相似度约束于闭环检测中,然后可以检测大的环。
LSD-SLAM和SVO分别是稠密法和半稠密法的代表,它们一个是定位不准确、一个是没有闭环。发现ORB-SLAM特别喜欢拿loop closure。它真是一个巨无霸,非常完整。
最好是在追踪、闭环检测都可以用到。最好速度要快(排除SIFT、SURF、A-KAZE)、最好可以scale invariant、最好方向invariant(排除BRIEF、LDB) 然后差不多只有ORB了。ORB就是有方向的BRIEF。
三个线程:追踪、局部地图构建、闭环检测。
追踪就是前端部分,提取ORB特征,计算摄像头位姿、判别何时插入关键帧。最开始的特征匹配是和前面的帧匹配,优化的方法是motion-only BA。 如果追踪丢失的话,那么追踪模块就启动全局重定位。把当前的图片和之前的所有关键帧做一个比较,期待可以找到相似的进行重新定位。这个时候就用到了place recognition。
当进来新的一帧,如果相机的位姿初始化和特征匹配完成的话,局部可见地图就会进行一个检索,通过对covisibility graph检索就可以得到与这一帧有联系的局部地图。然后把这新的一帧的特征点进行逆映射回之前的关键帧,这个时候相机的位姿再次优化。最后,Tracking部分决定是否要插入新的关键帧到局部地图中。插入新的关键帧之后,就进行local BA进行优化。对新插入的关键帧上的新的特征点会进行一个exigent point culling的操作来去除低质量的特征点。同时,局部地图这个线程会进行局部关键帧剔除的工作以减少冗余。
闭环检测这部分会运行,只有新的一帧插入的时候。如果有环检测到,那么就是用Sim3优化。在检测到环的时候,会有一个essential graph(是covisibility graph的最小生产树)
文中的图优化使用的是g2o这个工具,算法是LM。
每个点云的组成: pi
1、3D坐标 Xw,i 在世界坐标的表示;
2、视角: ni
3、ORB的描述子: Di 这个是与其它对同一点云比较而言,距离最近的一个描述子。
4、该点云可以被观察到的最大 dmax 和最小距离 dmin , 根据的是ORB特征的尺寸不变约束。
每个关键帧 Ki 的组成:
1、相机位姿: Tiw ,是真是世界坐标到相机坐标的一个刚体旋转;
2、相机内参(焦距和Principal point)
3、该帧上所有的ORB特征。
这些点云和关键帧的生产都是比较宽松的,因为后期会有严格的去除冗余的操作。
在建图的过程中,每个关键帧可以看成一个节点,每条边就是它们都可以看到的点云。权重就是可以看到的点云的个数,点云个数要大于15,就连一条边。
但是covisibility graph会太稠密了,存储的信息很多。essential graph就是cg的压缩版本。eg的边就是观测到最多点云的集合。eg的阈值就是100。用eg做full BA就会有很高的精度。
可以用于重定位和闭环检测。
离线制作visual word的字典,然后使用。
使用闭环检测的时候,使用多covisibility graph的相邻帧进行匹配,高于75就算检测到闭环。在进行比较的时候,作者使用了一种字典树进行快速的暴力匹配。