ORB-SLAM: a Versatile and Accurate Monocular SLAM System 翻译&学习

Abstarct

ORB-SLAM是一个基于特征的单目SLAM系统,可以实时的运行在小尺度或大尺度、室内或室外环境。该系统对于剧烈运动有较好的鲁棒性,可以有比较大的余地*处理闭环控制、重定位、甚至全自动位置初始化。 基于最近几年的优秀算法,作者从基础开始设计了一种对所有SLAM任务使用相同功能的新系统:跟踪、地图构建、重定位和回环检测。一个有关于点云和重建关键帧的最优选择策略带来了较好的鲁棒性,并且生成了一个紧凑的和可追踪的地图,该地图只有在场景内容改变时更新,允许地图的可持续性构建。作者从最流行的数据集中对27个序列进行了详尽的评价。与其他最先进的单目SLAM方法相比,ORB-SLAM实现了前所未有的性能。作者公布了其源码: https://github.com/raulmur/ORB_SLAM

INTRODUCTION

BA可以用于精准的相机位姿估计和稀疏的几何重建,但是由于强大的匹配网络并且 需要提供良好的初始猜测,所以很长时间以来人们认为BA优化是不可以用于像视觉SLAM这种实时应用的。作者提出了在SLAM中可用的BA:

  • 在候选图像帧子集中(关键帧)匹配观测的场景特征(地图云点)
  • 复杂度随着关键帧数量的增加而增加,需要进行筛选以避免不必要的冗余
  • 一个强大的关于关键帧和点云的网络配置就可以产生准确的结果,即关键帧和点的强大网络配置可产生准确的结果,即,分布良好的关键帧集可观察到具有明显视差并具有大量闭环匹配的点
  • 关键帧和云点位置的初始估计,采用非线性优化的方法
  • 在构建局部地图的过程中,优化的关键是获得良好的可量测性
  • 具有实时进行快速全局优化回环的能力

在首先在实时应用中使用BA的是Mouragon等人的visual odometry,首先在SLAM中使用BA的是 Klein and Murray 的PTAM(ParallelTracking and Mapping)。但是PTAM中用的算法仅限于小尺度的操作中,提供简单但是高效的的方法用于关键帧的选取、特征匹配、云点三角化,每帧相机位置估计,追踪失败后的重定位非常有效。但是不幸的是几个因素限制了它的应用:缺少回环控制和针对闭塞的充分处理, 较差的视图不变特性和在形成地图过程中需要人工干预。

在本文中,作者基于PTAM的主要观点以及 place recognization、scale-aware loop closing和大场景的视图关联信息 设计了ORB-SLAM。

ORB-SLAM的主要贡献有:

  • 在所有的任务中使用相同的特征:追踪、地图构建、重定位和回环检测。使用相同的特征使得ORB-SLAM更加高效简单和可靠。作者使用了ORB 特征,该特征可以在无需GPU的情况下实现实时计算,具有很好的旋转和光照不变性。

  • 在大尺度的环境中也可以实现实时。这得益于共视图的使用,追踪、地图构建都可以只关注于局部的共视区域,可以独立于全局尺度的地图。

    共视图是具有内容关联性的视图

  • 实时的回环检测。这个是基于一个作者称为*“Essential Graph”*的位姿图实现的,它是从由系统维护的生成树、回路闭合链接和共视图的强边缘构建的。

  • 实时的相机重定位,并且具有显著的旋转和光照不变性。这就允许从跟踪失败中恢复,并且还增强了地图重用。

  • 一个自动的、鲁棒的基于模型选择的初始化程序。可以允许在平面或者非平面的初始化地图 。

  • 一种适者生存的映射点和关键帧选择方法,在选取时非常的宽松,但是会有严格的策略进行剔除。该策略提高了追踪的鲁棒性,并增强了长时间操作,因为冗余关键帧被丢弃。

作者在流行的公共数据集上做了测试,取得了很好成绩。闭环和重定位的方法是基于作者之前的论文:Fast relocalisation and loop closing in keyframe-based SLAM ,最初的版本是发表在作者的ORB-SLAM: Tracking and mapping recognizable features这篇论文上的,本论文主要是新增了初始化方法、用于回环检测的Essential Graph和其他的关键方法。

RELATED WORK

位置识别

目前基于图形处理技术的位置识别方法有图像到图像的匹配、地图到地图的匹配和图像到地图的匹配。其中图像到图像的匹配在大环境下相比其他两者拥有更好地尺度特性。在图像方法中词袋模型(Bow算法)的效率更高,比如说基于概率论的FAB-MAP。 由BRIEF特征描述子和FAST特征检测产生的二进制词袋可以用DBoW2获得。与SURF和SIFT相比,它的特征提取运算时间减小一个数量级。尽管系统运行效率高、鲁棒性好,采用BRIEF不具有旋转不变性和尺度不变性,系统只能运行在平面轨迹中,闭环检测也只能从相似的视角中获得。 作者用DBoW2生成了基于ORB的词袋模型位置识别器。ORB是具有旋转不变和尺度不变特性的二进制特征,它是一种高效的具有良好针对视图不变的识别器。作者提出了一种改进版本的位置识别方法,采用内容相关的视图,检索数据库时返回几个前提而不是最好的匹配。

BoW算法,就是Bags of Words,是CNN大火之前的王者,现在的过气网红了 = =。 用一个方法(BRIEF、FAST、SURF、SIFT etc.)获取图像中的特征点(单词),把最具代表性的单词(visual words/vocabulary)罗列出来,构造成一个字典(codebook)。 之后,我们可以把单张图像上的所有特征点和这些vocabulary做对比, 如果这个特征点和某个vocabulary 相似, 就把这个vocabulary的计数+1 ,遍历所有特征点就能得到这个图像的所有频率分布,遍历特征点获得频率分布,我们叫做quantization. 先这样处理training set, 得到已知类别(class)的频率分布,然后扔到任何一个multicalss classifier 里。再处理test set, 得到频率分布以后,把频率分布扔到上一个模型里做预测。在选取具有代表性的单词时,可以使用K-means.

随着图像数据的增加,为了改进大规模图像检索场景下的检索效果,有人提出了 Vocabulary Tree (VT)算法。ORB-SLAM使用的就是VT.

产生词典树形结构的步骤:
1、从训练图像中离线抽取特征
2、将抽取的特征用 k-means++ 算法聚类,将描述子空间划分成 k 类
3、将划分的每个子空间,继续利用 k-means++ 算法做聚类
4、按照上述循环,将描述子建立树形结构,如下图所示:

ORB-SLAM: a Versatile and Accurate Monocular SLAM System 翻译&学习

字典树在建立过程中,每个叶子也就是每个 word 记录了该 word 在所有的训练图像中出现的频率,出现的频率越高,表示这个 word 的区分度越小,频率的计算公式如下
idf(i)=logNni idf(i)=\log \frac{N}{{{n}_{i}}}
当在字典树中需要插入一幅新图像ItI_t ,在图像中提取的特征描述子按照 Hamming 距离从字典树的根部节点开始逐级向下到达叶子节点,可以计算每个叶子节点也就是每个 word 在图像ItI_t 中的出现频率:

tf(i,It)=niItnIt tf(i,{{I}_{t}})=\frac{{{n}_{i{{I}_{t}}}}}{{{n}_{{{I}_{t}}}}}
其中niIt{n_{iI_t}} 代表word在图像中出现的次数,nIt{n_{I_t}}代表图像中的特征子的总数。

在树构建的过程中每个叶子节点存储了 inverse index,存储了到达叶子节点的图像ItI_t 的 ID 和 图像 It描述 vector 中第 i维(第i个words)的值:
vti=tf(i,It)×idf(i) v_{t}^{i}=tf(i,{{I}_{t}})\times idf(i)
对于一幅图像的所有描述子,作上述操作,可以得到每个Word的值,然后这些值就组成了图像的描述向量vtv_t

对两幅图像比较计算其相似度时,两幅图像相似度计算公式如下:
s(v1, v2)=112v1v1v2v2 s({{v}_{1}},\ {{v}_{2}})=1-\frac{1}{2}|\frac{{{v}_{1}}}{|{{v}_{1}}|}-\frac{{{v}_{2}}}{|{{v}_{2}}|}|
两幅图像越相似得分越高。

字典树除了存储了 inverse index,还存储了 direct index 如下图所示(这是两种不同的存储direct index的数据结构),direct index 方便两幅图像特征搜索,建立特征之间的对应,计算两帧之间的位姿转换。

ORB-SLAM: a Versatile and Accurate Monocular SLAM System 翻译&学习

More details:

  • https://blog.****.net/fuxingyin/article/details/51489160

  • https://blog.****.net/qq_24893115/article/details/52629248

地图初始化

单目SLAM需要一个过程来创建初始地图,因为深度不能从单个图像中恢复。解决这个问题的一种方法是首先跟踪一个已知的结构。在滤波方法的背景下,可以使用反向深度参数化来初始化深度高度不确定的点,该参数化有望稍后收敛到它们的真实位置。例如 Engel的工作,将像素深度初始化为具有高方差的随机值。

通过两个局部平面场景视图进行初始化的方法,从两个相关相机(视图)位姿进行3D重构,相机的位姿关系用单映射表示,或者计算一个基本矩阵,通过5点算法构建平面模型或者一般场景模型。两种方法都不会受到低视差的约束,平面上的所有的点也不需要靠近相机中心。另外,非平面场景可以通过线性8点算法来计算基本矩阵,相机的位姿也可以重构。 如果平面场景的所有点都靠近相机中心之一,则这两种重建方法在低视差下都不会受到很好的约束,并且会遇到双重歧义解。另一方面,如果看到具有视差的非平面场景,可以用八点算法计算唯一的基本矩阵,并且可以毫无歧义地恢复相对相机姿态。

作者提出了一种新的基于平面的单应矩阵或者非平面的基本矩阵的自动化方法用于地图初始化。 基于相似变换理论,作者开发了初始化算法,选择退化二次曲线例子中基本矩阵,或单应矩阵。在平面例子中,为了程序稳定性,如果选择情况模糊不清,应该尽量避免做初始化,否则方案可能崩溃。作者选择在这种情况下延迟初始化过程,直到所选的方案产生明显的视差。

单目SLAM

最初的单目SLAM是用滤波来解决问题的。在这种方法中,每一帧都会被滤波处理以估计地图特征点的位置以及相机的位姿。这种方法有一个严重的缺点就是会浪费大量的计算用于处理没有多少新信息的连续帧,并且会产生线性的累积误差。而基于关键帧的方法,则是使用选取的关键帧用于地图估计,这种方法的执行成本更低并且使用BA约束带来了更好地精度,而且不依赖于帧率。Strasdat等人的论文证明了基于关键帧的技术优于在连续帧上使用滤波的方法。

最具有代表性的基于关键帧的SLAM恐怕就是 Klein 和 Murray的PTAM了,在PTAM中首次提出了相机追踪和地图构建分开,并行计算,在小型场合,如增强现实领域非常成功。PTAM中的地图云点通过图像区块与FAST角点匹配。云点适合追踪但不适合位置识别。实际上,PTAM并不适合检测大的闭合回路,重定位基于低分辨率的关键帧小图像块,对视图不变性较差。

Strasdat发表的大尺度的单目SLAM系统。前端是基于在GPU上实现的光流追踪,使用FAST特征进行匹配和运动BA 。在后端上使用基于滑动窗口的BA。 闭环检测通过7*度约束的相似变换位姿图优化,能够校正单目系统中的尺度偏移。ORB- SLAM也使用了具有7*度的位姿图优化,将它应用到了Essential Graph中。

接下来的一些单目SLAM的Related Work,批判一番:

Strasdat的PTAM前端,通过内容相关的视图提取局部地图执行追踪。他们使用两个窗口优化后端,在内部窗口中采用BA,在外部一个限制大小的窗口做位姿图。只有在外部窗口尺寸足够大可以包含整个闭环回路的情况下,闭环控制才能起作用。我们采用了基于内容相关的视图构建局部地图的方法,并且通过内容相关的视图构建位姿图,同时用它们设计前端和后端。另一个区别是,我们并没有用特别的特征提取方法做闭合回路检测(比如SURF方法),而是在相同的追踪和建图的特征上进行位置识别,获得具有鲁棒性的重定位和闭环检测。

Pirker等人搞得 D-SLAM方法,一个非常复杂的系统,包括闭环控制,重定位,动态环境、大场景下运行。但它的地图初始化并没有讲。所以没法做精确性、鲁棒性和大场景下的测试对比。

Song等人的 视觉里程计方法使用了ORB特征做追踪,处理BA后端滑动窗口。相比之下,我们的方法更具一般性,他们没有全局重定位,闭环回路控制,地图也不能重用。他们使用了相机到地面的真实距离限制单目尺度漂移。

Lim这个人的工作和我们之前版本的工作一样, 也采用的相同的特征做追踪,地图构建和闭环检测。由于选择BRIEF,系统受限于平面轨迹。从上一帧追踪云点,访问过的地图不能重用,与视觉里程计很像,因此系统不能扩展。

Engel 最近搞得这个LSD-SLAM, 可以构建大场景的半稠密地图,特征提取并没有采用BA方法,而是直接方法(优化也是直接通过图像像素)。没有用GPU加速,构建了半稠密地图,可以运行在实时应用中,非常适合机器人应用,比其他基于特征的稀疏地图SLAM效果好。但它们仍然需要特征做闭环检测,相机定位的精度也明显比PTAM和我们的系统慢。

Forster 提出了介于直接方式和基于特征的方法之间的半直接视觉里程SVO方法。不需要每帧都提取特征点,可以运行在较高的帧率下,在四轴飞行器上效果很好。然而,没有闭环检测,而且只使用了视角向下的摄像头。

最后,作者想讨论一下关于关键帧选取的问题。用所有的云点和图像帧搞BA肯定是不行的。Strasdat等人的PTAM虽然在他们的方法中保留了尽可能多云点和非冗余的关键帧。但是Strasdat的PTAM在插入关键帧非常谨慎以避免运算量增大的方法可能使在未知地图上的追踪失败。作者提出了一种比较好的策略: 在插入关键帧的时候使用比较宽松的限制以实现快速插入,然后再移除那些冗余的图像帧,避免额外的运算成本 。

系统概述

特征选择

ORB-SLAM的一个主要设计思想就是在不同的任务中使用相同的特征,包括构建地图、追踪、位置识别、基于图像帧率的重定位和回环检测。使用同样的特征让系统更加高效并且避免了极化特征识别的深度图。作者要求这个特征能够满足每帧的提取速度小于33ms,因此SIFT(约300ms)、SURF(约300ms)和A-KAZE(约100ms)这些都不行。而且作者为了获得一般的位置识别能力,因此还需要旋转不变性,所以BRIEF和LDB也不行。

最终作者选择了ORB, 是一个旋转多尺度FAST角点检测具有256位特征描述子。 计算速度贼拉快,同时还有旋转不变的特性 ,这就可以在更宽的基准线上匹配他们,增强了BA的精度。

三线程:追踪,局部地图构建和回环检测

ORB-SLAM: a Versatile and Accurate Monocular SLAM System 翻译&学习

ORB-SLAM的构架,如上图所示,包含三个并行运行的线程:跟踪、局部地图构建和回环检测。追踪负责使用每一帧图片对相机进行定位,并且决定哪一张图片应该被插入关键帧中。先通过前一帧图像帧初始化特征匹配,再采用运动B A优化位姿 。如果追踪丢失的话(由于遮挡或者突然移动),位置识别模块就执行全局重定位。 一旦获得最初的相机位姿估计和特征匹配 ,就可以使用系统中存储的关键帧的共视图得到一个局部的可视化地图 ,如图2a和2b所示。然后使用重投影搜索来和局部地图点云匹配,相机位姿再根据所有的匹配进行优化。最终追踪线程将会决定是否插入个新的关键帧。 所有的追踪步骤将在第五章详细解释。创建初始化地图将在第四章进行说明。

ORB-SLAM: a Versatile and Accurate Monocular SLAM System 翻译&学习