ORB-SLAM: a Versatile and Accurate Monocular SLAM System
摘要
本文提出了ORB-SLAM,一种基于特征的单目SLAM系统,它可以在室内外的大小环境中实时运行。该系统对严重的运动噪声具有鲁棒性,允许宽基线闭环和重定位,并且可以全自动的初始化。基于近年来的优秀算法,我们设计了一个全新的系统,它使用和所有的其他SLAM系统相同的工作流程,包括: 跟踪、建图、重定位和闭环矫正。选择重建的地图点和关键帧的“适者生存”策略使得系统具有极好的鲁棒性,并生成仅在场景内容发生变化时才体积才增长的紧凑且可跟踪的地图,从而允许系统长时间运行。我们对从最广泛使用的公开数据集中的27个序列进行了详细的评估。ORB-SLAM相对于其他最先进的单目SLAM方法达到了前所未有的性能。为了社区的利益,我们公开了源代码。
I 引言
众所周知,由于提供了强大的匹配网络和良好的初始猜测,光束平差法(BA)可提供相机位置的准确估计以及稀疏几何重建[1],[2]。长期以来,这种方法被认为无法用于实时应用,如视觉同步定位和建图(visual SLAM)。视觉SLAM的目标是在重建环境的同时估计相机的轨迹。现在,我们知道,为了以可以接受的计算成本获得准确的结果,实时SLAM算法必须提供具有以下内容的BA。
- 在选定帧(关键帧)的子集中对场景特征(地图点)的相应观测
- 由于随着关键帧数量的增加,复杂性增加,其选择应避免不必要的冗余
- 关键帧和地图点的强大网络配置以产生准确的结果,即,一组分布良好的关键帧观察具有明显视差的地图点,并有大量的闭环匹配
- 用于非线性优化的关键帧位姿和地图点位置的初始估计
- 探索中的局部地图,其中优化的重点是实现可扩展性
- 执行快速全局优化(例如pose graph)以实时闭环矫正的能力
BA的首次实时应用是Mouragonet等人[3]的视觉里程计工作,随后是Klein和Murray[4]的ground-breaking SLAM工作,称为并行跟踪和建图(PTAM)。该算法虽然局限于小规模操作,但为关键帧选择、特征匹配、地图点的三角化、每帧相机定位以及跟踪失败后的重新定位提供了简单而有效的方法。不幸的是,有几个因素严重限制了它的应用:缺乏闭环矫正和障碍物的充分处理,对重定位视角的低不变性,以及地图初始化需要人为干预。
在本研究中,我们以PTAM的主要思想、Ǵalvez-Ĺopez和Tard́os[5]的位置识别工作、Strasdatet等人[6]的尺度感知闭环矫正以及大规模操作中共视信息的使用[7]、[8]为基础,从头开始设计ORB-SLAM,即,一种新的单目SLAM系统,其主要贡献如下。
- 对所有任务使用相同的特征,包括:跟踪、建图、重定位和闭环矫正。这使得我们的系统更加高效、简单和可靠。我们使用ORB特征[9],它允许在没有GPU的情况下实现实时性能,对视角和光照的改变具有良好的不变性。
- 在大型环境中保证了实时性。由于使用了共视图,跟踪和建图专注于处理局部共视区域,与全局地图的大小无关。
- 基于位姿图优化的实时闭环矫正,我们称之为本质图。它由系统维护的生成树、闭环连接关系和共视图中具有强共视关系的边构成。
- 对视角和光照具有显著不变性的实时相机重定位。这允许从跟踪失败中恢复,还增强了地图重用性。
- 一种新的基于模型选择的自动和鲁棒的初始化过程,允许在平面和非平面场景下创建初始地图。
- 选择地图点和关键帧的“适者生存”策略,在生成阶段要求比较宽松,但在剔除时要求十分严格。由于冗余关键帧被丢弃,该策略提高了跟踪鲁棒性并允许系统长时间运行。
我们对室内和室外环境的最流行的公共数据集进行了广泛的评估,包括手持、车载和机器人序列。值得注意的是,我们实现了比最先进的直接法更好的相机定位精度[10],该方法直接优化像素强度,而不是特征重投影误差。我们在第IX-B节中讨论了使基于特征的方法比直接法更准确的可能的原因。
这里介绍的闭环矫正和重定位方法是基于我们以前的工作[11]。[12]中介绍了系统的初始版本。在本文中,我们添加了初始化方法、本质图,并完善了所有涉及的方法。我们还详细描述了所有的模块,并进行了详尽的实验验证。
据我们所知,这是单目SLAM最完整、最可靠的解决方案,为了社区的利益,我们公开了源代码。演示视频和代码可以在我们的项目网页中找到。
II 相关工作
A. 位置识别
Williamset等人[13]的调查比较了几种位置识别方法,并得出结论:基于外观的技术,即图像到图像的匹配,在大环境下比地图到地图或图像到地图的方法更具规模。在基于外观的方法中,词袋技术[14],如概率方法FAB-MAP[15],因其高效率而脱颖而出。DBoW2[5]首次使用从BRIEF描述子[16]中获得的二进制单词向量,以及非常高效的FAST特征检测器[17]。与目前在词袋中使用的SURF[18]和SIFT[19]特征相比,这在几个数量级上减少了特征提取所需的时间。虽然该系统被证明是非常高效和鲁棒的,但由于使用了不具有旋转和尺度不变性的BRIEF描述子,使得该系统仅限于从相似的视角进行平面内轨迹和闭环检测。在我们之前的工作[11]中,我们提出了一种基于DBoW2和ORB[9]的词袋位置识别器。ORB是对旋转和尺度(在一定范围内)具有不变性的二元特征,因此是具有良好的视角不变性的快速识别器。我们在四个不同的数据集中展示了识别器的高召回率和鲁棒性,从10K图像数据库中检索候选图像需要不到39ms(包括特征提取)。在这项研究中,我们使用经过改进的位置识别器,使用共视信息,并在查询数据库时返回多个假设,而不仅仅是最佳匹配。
B. 地图初始化
单目SLAM需要一个过程来创建初始地图,因为无法从单个图像中恢复深度。解决此问题的一种方法是初始跟踪已知的结构[20]。在滤波方法的情境下中,点可以使用逆深度参数化(inverse depth parameterization)[21]以高度的深度不确定性进行初始化,并希望稍后收敛到其真实位置。Engelet al.[10]最近的半稠密工作采用了类似的方法,将像素深度初始化为具有高方差的随机值。
来自两个视图的初始化方法要么假设局部场景的平面性[4],[22],并使用Faugeras和Lustman[23]的方法从单应性恢复相对相机位置,要么使用Nist的五点算法计算平面和一般场景的本质矩阵[24],[25],这需要处理多个解。这两种重建方法在低视差的情况下下都没有很好的约束,如果平面场景的所有点都靠近其中一个相机中心,则会出现双重歧义解[27]。另一方面,如果看到具有视差的非平面场景,则可以使用八点算法[2]计算唯一的基础矩阵,并且可以在没有歧义的情况下恢复相机的相对位姿。
在第IV节中,我们提出了一种新的基于平面场景的单应矩阵和非平面场景的基本矩阵之间的模型选择的自动化方法。Torr等人[28]提出了一种模型选择的统计方法。基于类似的原理,我们开发了一种启发式的初始化算法,该算法考虑了在近似退化情况下(即平面、近平面和低视差)选择基本矩阵的风险,在这种情况下倾向于选择单应矩阵。在平面情况下,为了安全操作,如果解决方案具有双重歧义性,我们将避免进行初始化,因为可能会选择错误的解。我们进行延迟初始化,直到该方法产生具有显著视差的唯一解。
C. 单目同时定位与建图
单目SLAM最初通过滤波方法[20]、[21]、[29]、[30]解决。在该方法中,滤波器对每一帧进行处理,以联合估计地图的特征位置和相机位姿。它的缺点是在处理几乎没有新信息的连续帧时会浪费计算量,并且会累积线性化误差。另一方面,基于关键帧的方法[3]、[4]仅使用选定的帧(关键帧)估计地图,因为地图与帧速率无关,允许执行成本更高但更精确的BA优化。Strasdatet等人[31]证明,在计算成本相同的情况下,基于关键帧的技术比滤波方法更加精确。
最具代表性的基于关键帧的SLAM系统可能是Klein和Murray的PTAM[4]。这是首次引入在并行线程中分别进行相机跟踪和建图的思想,并被证明在小型环境中的实时增强现实应用中是成功的。原始版本后来通过边缘特征、跟踪期间的旋转估计步骤和更好的重新定位方法进行了改进[32]。PTAM的地图点对应于通过块相关性进行匹配的FAST角点。这使得点仅用于跟踪,而不用于位置识别。事实上,PTAM不会检测到大闭环,而重定位是基于关键帧的低分辨率缩略图的相关性,从而导致低的视角不变性。
Strasdatet等人[6]提出了一种大规模单目SLAM系统,前端基于GPU上实现的光流,然后是FAST特征匹配和仅运动BA,后端基于滑动窗口BA。闭环矫正通过具有相似约束[7个自由度(DoF)]的位姿图优化来解决,该优化能够纠正单目SLAM中出现的尺度漂移。在这项工作中,我们采用7自由度位姿图优化的闭环矫正思想,并将其应用于第III-D节中定义的本质图。
Strasdatet等人[7]使用了PTAM的前端,但仅在从共视图中检索的本地地图中执行跟踪。他们提出了一种双窗口优化后端,该后端在内部窗口中连续执行BA,在有限大小的外部窗口中连续执行位姿图优化。但是,只有当外部窗口的大小大到足以包含整个闭环时,闭环矫正才有效。在我们的系统中,我们利用了使用基于共视信息的局部地图和从共视图构建位姿图的优秀思想,但将其应用于完全重新设计的前端和后端。另一个区别是,与使用特定特征进行闭环检测(SURF)不同,我们使用和跟踪以及建图相同的特征执行位置识别,获得鲁棒的帧速率重定位和闭环检测。
Pirkeret al.[33]提出了CD-SLAM,即一个非常复杂的系统,包括闭环矫正、重定位、大规模操作以及在动态环境中工作的努力。但是,没有提到地图初始化。由于缺乏公开的实现,我们无法对准确性、鲁棒性或大规模运行的能力进行比较。
Songet al.[34]的视觉里程计使用ORB特征进行跟踪,并在后端使用时间滑动窗口BA。相比之下,我们的系统更通用,因为它们没有全局重定位、闭环矫正并且它们不重用地图。它们还使用从相机到地面的已知距离来限制单目尺度漂移。
Limet等人[25],在我们提交这项工作的初步版本[12]后发表的工作,也使用相同的特性进行跟踪、建图和闭环检测。然而,BRIEF描述子的选择将系统限制为平面内的轨迹。他们的系统只跟踪最后一个关键帧的点;因此,如果重新访问之前的地点(类似于视觉里程计),地图不会被重用,并且存在无界增长的问题。在第VIII-E节中我们将我们的结果与这种方法进行定性比较。
Engelet al.[10]最近的工作被称为LSD-SLAM,可以使用直接方法(即,直接对图像像素强度进行优化)而不是对特征进行BA,来构建大规模半稠密地图。他们的结果非常令人印象深刻,因为该系统能够在没有GPU加速的情况下实时运行并构建一个半稠密地图,与基于特征的SLAM生成的稀疏输出相比,该方法在机器人方面有更多潜在的应用。然而,它们仍然需要特性用于闭环检测,并且它们的相机定位精度明显低于我们的系统和PTAM,正如我们在第VIII-B节中的实验结果所示。这一令人惊讶的结果在第IX-B节中讨论。
在直接方法和基于特征的方法之间,处于中间位置的是Forsteret等人[22]的半直接视觉里程计SVO。由于不需要在每一帧中提取特征,它们能够在高帧速率下运行,并在四旋翼中获得令人印象深刻的结果。然而,它没有执行闭环检测,并且当前的实现主要考虑向下看的相机。
最后,我们要讨论关键帧选择。文献中所有的视觉SLAM工作都认为使用所有的点和所有的帧运行BA是不可行的。Strasdatet al.[31]的工作表明,最具成本效益的方法是保留尽可能多的点,同时只保留非冗余关键帧。PTAM方法是非常谨慎地插入关键帧,以避免计算复杂性的过度增长。这种限制性的关键帧插入策略使跟踪在困难的探索条件下失败。我们的适者生存策略通过尽可能快地插入关键帧,然后删除多余的关键帧来避免额外的成本,在困难的场景中实现了前所未有的成功。
III 系统概述
A. 特征选择
系统的主要设计思想之一是将建图和跟踪所使用的相同特征用于位置识别,实现帧速率的重定位和闭环检测。这使得我们的系统效率更高,并且避免了像以前的工作[6],[7]那样,需要从近SLAM特征中插入识别特征的深度。我们需要特征在每幅图像的提取时间远小于33毫秒,这就排除了流行的SIFT(∼300毫秒)[19],SURF(∼300毫秒)[18],或最近的A-KAZE(∼100毫秒)[35]。为了获得通用的位置识别能力,我们需要旋转不变性,这排除了BRIEF[16]和LDB[36]。
我们选择了ORB特征点,它是一种具有256位关联二进制描述子的多尺度FAST角点。它的计算和匹配速度非常快,并且对视角具有良好的不变性。这使得在系统中可以在宽基线情况下来匹配它们,从而提高BA的准确性。我们已经在[11]中展示了ORB用于位置识别的良好性能。虽然我们当前的实现使用ORB,但提出的技术并不局限于这些特征。
B. 三个线程:跟踪、局部建图和闭环矫正
我们的系统如上图所示,包含三个并行运行的线程:跟踪、局部建图和闭环矫正。跟踪负责定位每一帧的相机,并决定何时插入一个新的关键帧。我们首先执行与前一帧的初始特征匹配,并使用仅运动BA优化位姿。如果跟踪失败(例如,由于遮挡或突然移动),则使用位置识别模块执行全局重定位。一旦有了相机位姿的初始估计和特征匹配,使用系统维护的关键帧共视图检索局部可见地图[见图2(a)和(b)]。然后,通过重投影方法搜索当前帧与局部地图点对应的匹配点,并使用所有的匹配关系再次优化相机位姿。最后,跟踪线程决定是否插入新的关键帧。第V节详细介绍了所有跟踪步骤。第IV节介绍了创建初始地图的新过程。
局部建图线程处理新的关键帧并执行局部BA,以实现相机位姿周围的最佳重建。在共视图的连通关键帧中搜索新关键帧中未被匹配的ORB特征的新的对应关系,以三角化新的地图点。在生成后的一段时间后,基于跟踪过程中收集到的信息,采用了一种严格的地图点剔除策略来剔除冗余地图点来保留高质量的点。局部建图线程还负责剔除冗余关键帧。我们将在第VI节详细解释所有的局部建图步骤。
闭环矫正线程搜索每个新关键帧的闭环关系。如果检测到一个闭环,则计算一个相似变换来获取在闭环中累积的漂移。然后,将闭环的两侧对齐,并融合重复的地图点。最后,通过相似性约束[6]下的位姿图优化来实现全局一致性。主要的创新点在于,我们对本质图进行了优化,即第III-D节中解释的共视图的稀疏子图。第VII节详细解释了闭环检测和校正步骤。
我们使用在g2o[37]中实现的Levenberg–Marquardt算法来执行所有优化。在附录中,我们描述了每个优化中涉及的误差项、代价函数和变量。
地图点、关键帧及其选择
每个地图点pip_ipi存储了以下内容:
- 在世界坐标系下的3D位置Xw,iX_{w,i}Xw,i
- 地图点的观测方向nin_ini,为归一化后的平均观测方向(指连接该地图点和其对应观测关键帧光心的的单位方向向量的均值)
- 一个具有代表性ORB描述子DiD_iDi,与其他所有能观测到该点的关键帧中的ORB描述子相比,该描述子的汉明距离中值最小
- 根据ORB特征的尺度不变性获取到的可以观察到这个地图点的的最大dmaxd_{max}dmax和最小dmind_{min}dmin距离。
每个关键帧KiK_iKi存储了以下内容:
- 相机的位姿TiwT_{iw}Tiw,这是一种刚体变换,将点从世界坐标系变换到相机坐标系;
- 相机内参,包括主点和焦距
- 在当前帧中提取的所有ORB特征,可以已经与地图点关联或不关联,如果提供了畸变模型,则其坐标为去畸变后的坐标。
地图点和关键帧是用一个宽松的策略创建的,之后一个非常严格的剔除机制负责检测冗余的关键帧和错误匹配或不可跟踪的地图点。这允许在探索过程中进行灵活的地图扩展,从而提高在恶劣条件下(例如旋转、快速移动)的跟踪鲁棒性,同时其大小在不断重访相同环境(即长期操作)时受到限制。此外,与PTAM相比,我们的地图包含的外点非常少,但代价是包含的点更少。第VI-B节和第VI-E节分别说明了地图点和关键帧的剔除程序。
D. 共视图和本质图
关键帧之间的共视信息在我们系统的多个任务中非常有用,并表示为无向加权图,如[7]所示。每个节点都是一个关键帧,如果两个关键帧共享相同地图点的观测值(至少15个),则两个关键帧之间存在一条边,边的权重θ\thetaθ为公共地图点的数量。
为了矫正闭环,我们执行了一个位姿图优化[6],该优化将闭环误差沿图进行分布。为了不包含共视图提供的所有边(可能非常密集),我们建议构建一个保留所有节点(关键帧)但不包含所有边的本质图,仍然保留产生准确结果的强网络。系统从初始关键帧以增量方式构建生成树,该生成树提供具有最少边数的共视图的连通子图。插入新的关键帧时,它将包含在树中并与共享最多地图点观测的关键帧进行链接,并且当通过剔除策略删除关键帧时,系统将更新受该关键帧影响的链接。本质图包含生成树、具有高共视关系(θmin=100\theta_{min}=100θmin=100)的共视图的边子集和闭环边,从而形成强大的相机网络。图2显示了共视图、生成树和对应的本质图的示例。如第VIII-E节中的实验所示,在执行位姿图优化时,该解决方案是如此精确,以至于额外的全局BA优化几乎无法进一步提升精度。在第VIII-E节末尾展示了本质图的效率和θmin\theta_{min}θmin的影响。
E. 基于词袋的位置识别
系统嵌入了基于DBoW2[5]的位置识别模块来实现闭环检测与重定位。视觉词汇是一个离散化的描述子空间,被称为视觉词典。视觉词典通过从大量图像中提取的ORB描述子进行离线创建。如果图像集足够通用,那么同一部视觉词典在不同的环境下也能获得很好的性能。系统增量式地构建一个数据库,其中包含一个逆向索引,该索引存储词汇表中每个视觉单词被观测到的关键帧,因此可以非常高效地查询数据库。当剔除过程删除关键帧时,数据库也会更新。
由于关键帧之间存在视觉重叠,因此在查询数据库时,可能不会存在唯一的高分关键帧。原始DBoW2考虑了这种重叠,将时间相近的图像的分数相加。这有一个限制,即不包括查看同一位置但在不同时间插入的关键帧。取而代之的是,我们将那些在共视图中连接的关键帧进行分组。此外,我们的数据库返回所有关键帧匹配项,这些关键帧匹配项的得分高于最佳得分的75%。
文献[5]报道了将词袋表示用于特征匹配的另一个好处。当我们想要计算两组ORB特征之间的对应关系时,我们可以仅对属于词汇表树中某一层级的同一节点的特征进行暴力匹配,从而加快搜索速度。在搜索匹配以三角化新点、闭环检测和重新定位时,我们使用此技巧。我们还通过方向一致性测试(详见[11])来完善对应关系,该测试丢弃了外点,确保所有对应关系的一致旋转。
IV. 自动化的地图初始化
地图初始化的目的是计算两帧之间的相对位姿来三角化一组初始的地图点。这种方法应该独立于场景(平面场景或通用场景),并且不需要人为干预来选择良好的初始化场景,即两帧之间具有显著视差。在系统中并行计算两个几何模型:适用于平面场景的单应矩阵和适应于非平面场景的基本矩阵。然后使用一种启发式方法来选择一个模型,并尝试用一种特定的方法来使用所选模型恢复相对位姿。我们的方法仅在确定两帧视角配置安全时进行初始化,检测到低视差情况和众所周知的两部分平面歧义[27]时,我们避免去初始化一个损坏的地图。我们的算法步骤如下。
-
查找初始的匹配关系:在当前帧FcF_cFc上提取ORB特征点,并且在参考帧FrF_rFr中搜索匹配关系xc↔xrx_c \leftrightarrow x_rxc↔xr。如果没有找到足够的匹配关系,则重置参考帧。
-
并行地计算两种几何模型:在两个线程中并行地计算单应矩阵HcrH_{cr}Hcr和基础矩阵FcrF_{cr}Fcr
xc=Hcrxr,xcTFcrxr=0(1)x_c = H_{cr}x_r, x_c^TF_{cr}x_r = 0 \tag{1}xc=Hcrxr,xcTFcrxr=0(1)
分别使用正则化DLT和八点算法,如RANSAC方案中的[2]所述。为了使两个模型的过程同质化,提前设置两个模型的迭代次数,并且在每次迭代中使用相同的点:基本矩阵使用八对点,其中四对点用于单应矩阵。在每次迭代中,我们为每个模型MMM计算一个分数SMS_MSM(HHH代表单应矩阵,FFF代表基本矩阵)
SM=∑i(ρM(dcr2(xci,xri,M))+ρM(drc2(xci,xri,M)))ρM(d2)={ Γ−d2ifd2<TM0ifd2≥TM(2)S_M=\sum_{i}{(\rho_M(d_{cr}^2(x_c^i,x_r^i,M))+\rho_M(d_{rc}^2(x_c^i,x_r^i,M)))} \\ \rho_M(d^2)=\begin{cases} \Gamma-d^2 & if & d^2 < T_M \\ 0 & if & d^2 \geq T_M\end{cases} \tag{2}SM=i∑(ρM(dcr2(xci,xri,M))+ρM(drc2(xci,x