摘要
本文提出了ORB-SLAM,一种基于特征的单目SLAM系统,它可以在室内外的大小环境中实时运行。该系统对严重的运动噪声具有鲁棒性,允许宽基线闭环和重定位,并且可以全自动的初始化。基于近年来的优秀算法,我们设计了一个全新的系统,它使用和所有的其他SLAM系统相同的工作流程,包括: 跟踪、建图、重定位和闭环矫正。选择重建的地图点和关键帧的**“适者生存”策略**使得系统具有极好的鲁棒性,并生成仅在场景内容发生变化时才体积才增长的紧凑且可跟踪的地图,从而允许系统长时间运行。我们对从最广泛使用的公开数据集中的27个序列进行了详细的评估。ORB-SLAM相对于其他最先进的单目SLAM方法达到了前所未有的性能。
众所周知,由于提供了强大的匹配和良好的初始猜测,光束平差法(BA)可提供相机位置的准确估计以及稀疏几何重建[1],[2]。长期以来,这种方法被认为无法用于实时应用,如视觉同步定位和建图(visual SLAM)。视觉SLAM的目标是在重建环境的同时估计相机的轨迹。现在,我们知道,为了以可以接受的计算成本获得准确的结果,实时SLAM算法必须提供具有以下内容的BA。
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最完整、最可靠的解决方案,为了社区的利益,我们公开了源代码。演示视频和代码可以在我们的项目网页中找到。
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方法是非常谨慎地插入关键帧,以避免计算复杂性的过度增长。这种限制性的关键帧插入策略使跟踪在困难的探索条件下失败。我们的适者生存策略通过尽可能快地插入关键帧,然后删除多余的关键帧来避免额外的成本,在困难的场景中实现了前所未有的成功。
图1
系统的主要设计思想之一是将建图和跟踪所使用的相同特征用于位置识别,实现帧速率的重定位和闭环检测。这使得我们的系统效率更高,并且避免了像以前的工作[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,但提出的技术并不局限于这些特征。
我们的系统如上图所示,包含三个并行运行的线程:跟踪、局部建图和闭环矫正。
跟踪线程负责定位每一帧的相机,并决定何时插入一个新的关键帧。我们首先执行与前一帧的初始特征匹配,并使用仅运动BA优化位姿。如果跟踪失败(例如,由于遮挡或突然移动),则使用位置识别模块执行全局重定位。一旦有了相机位姿的初始估计和特征匹配,使用系统维护的关键帧共视图检索局部可见地图[见图2(a)和(b)]。然后,通过重投影方法搜索当前帧与局部地图点对应的匹配点,并使用所有的匹配关系再次优化相机位姿。最后,跟踪线程决定是否插入新的关键帧。第V节详细介绍了所有跟踪步骤。第IV节介绍了创建初始地图的新过程。
图2
**局部建图线程处理新的关键帧并执行局部BA,以实现相机位姿周围的最佳重建。**在共视图的连通关键帧中搜索新关键帧中未被匹配的ORB特征的新的对应关系,以三角化新的地图点。在生成后的一段时间后,基于跟踪过程中收集到的信息,采用了一种严格的地图点剔除策略来剔除冗余地图点来保留高质量的点。局部建图线程还负责剔除冗余关键帧。我们将在第VI节详细解释所有的局部建图步骤。
闭环矫正线程搜索每个新关键帧的闭环关系。如果检测到一个闭环,则计算一个相似变换来获取在闭环中累积的漂移。然后,将闭环的两侧对齐,并融合重复的地图点。最后,通过相似性约束[6]下的位姿图优化来实现全局一致性。主要的创新点在于,我们对本质图进行了优化,即第III-D节中解释的共视图的稀疏子图。第VII节详细解释了闭环检测和校正步骤。
我们使用在g2o[37]中实现的Levenberg–Marquardt算法来执行所有优化。在附录中,我们描述了每个优化中涉及的误差项、代价函数和变量。
每个地图点 p i p_i pi存储了以下内容:
每个关键帧 K i K_i Ki存储了以下内容:
地图点和关键帧是用一个宽松的策略创建的,之后一个非常严格的剔除机制负责检测冗余的关键帧和错误匹配或不可跟踪的地图点。这允许在探索过程中进行灵活的地图扩展,从而提高在恶劣条件下(例如旋转、快速移动)的跟踪鲁棒性,同时其大小在不断重访相同环境(即长期操作)时受到限制。此外,与PTAM相比,我们的地图包含的外点非常少,但代价是包含的点更少。第VI-B节和第VI-E节分别说明了地图点和关键帧的剔除程序。
关键帧之间的共视信息在我们系统的多个任务中非常有用,并表示为无向加权图,如[7]所示。每个节点都是一个关键帧,如果两个关键帧共享相同地图点的观测值(至少15个),则两个关键帧之间存在一条边,边的权重 θ \theta θ为公共地图点的数量。
为了矫正闭环,我们执行了一个位姿图优化[6],该优化将闭环误差沿图进行分布。为了不包含共视图提供的所有边(可能非常密集),我们建议构建一个保留所有节点(关键帧)但不包含所有边的本质图,仍然保留产生准确结果的强网络。系统从初始关键帧以增量方式构建生成树,该生成树提供具有最少边数的共视图的连通子图。插入新的关键帧时,它将包含在树中并与共享最多地图点观测的关键帧进行链接,并且当通过剔除策略删除关键帧时,系统将更新受该关键帧影响的链接。本质图包含生成树、具有高共视关系( θ m i n = 100 \theta_{min}=100 θmin=100)的共视图的边子集和闭环边,从而形成强大的相机网络。图2显示了共视图、生成树和对应的本质图的示例。如第VIII-E节中的实验所示,在执行位姿图优化时,该解决方案是如此精确,以至于额外的全局BA优化几乎无法进一步提升精度。在第VIII-E节末尾展示了本质图的效率和 θ m i n \theta_{min} θmin的影响。
系统嵌入了基于DBoW2[5]的位置识别模块来实现闭环检测与重定位。视觉词汇是一个离散化的描述子空间,被称为视觉词典。视觉词典通过从大量图像中提取的ORB描述子进行离线创建。如果图像集足够通用,那么同一部视觉词典在不同的环境下也能获得很好的性能。系统增量式地构建一个数据库,其中包含一个逆向索引,该索引存储词汇表中每个视觉单词被观测到的关键帧,因此可以非常高效地查询数据库。当剔除过程删除关键帧时,数据库也会更新。
由于关键帧之间存在视觉重叠,因此在查询数据库时,可能不会存在唯一的高分关键帧。原始DBoW2考虑了这种重叠,将时间相近的图像的分数相加。这有一个限制,即不包括查看同一位置但在不同时间插入的关键帧。取而代之的是,我们将那些在共视图中连接的关键帧进行分组。此外,我们的数据库返回所有关键帧匹配项,这些关键帧匹配项的得分高于最佳得分的75%。
文献[5]报道了将词袋表示用于特征匹配的另一个好处。当我们想要计算两组ORB特征之间的对应关系时,我们可以仅对属于词汇表树中某一层级的同一节点的特征进行暴力匹配,从而加快搜索速度。在搜索匹配以三角化新点、闭环检测和重新定位时,我们使用此技巧。我们还通过方向一致性测试(详见[11])来完善对应关系,该测试丢弃了外点,确保所有对应关系的一致旋转。
地图初始化的目的是计算两帧之间的相对位姿来三角化一组初始的地图点。这种方法应该独立于场景(平面场景或通用场景),并且不需要人为干预来选择良好的初始化场景,即两帧之间具有显著视差。在系统中并行计算两个几何模型:适用于平面场景的单应矩阵和适应于非平面场景的基本矩阵。然后使用一种启发式方法来选择一个模型,并尝试用一种特定的方法来使用所选模型恢复相对位姿。我们的方法仅在确定两帧视角配置安全时进行初始化,检测到低视差情况和众所周知的两部分平面歧义[27]时,我们避免去初始化一个损坏的地图。我们的算法步骤如下。
查找初始的匹配关系:在当前帧 F c F_c Fc上提取ORB特征点,并且在参考帧 F r F_r Fr中搜索匹配关系 x c ↔ x r x_c \leftrightarrow x_r xc↔xr。如果没有找到足够的匹配关系,则重置参考帧。
并行地计算两种几何模型:在两个线程中并行地计算单应矩阵 H c r H_{cr} Hcr和基础矩阵 F c r F_{cr} Fcr
x c = H c r x r , x c T F c r x r = 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]所述。为了使两个模型的过程同质化,提前设置两个模型的迭代次数,并且在每次迭代中使用相同的点:基本矩阵使用八对点,其中四对点用于单应矩阵。在每次迭代中,我们为每个模型 M M M计算一个分数 S M S_M SM( H H H代表单应矩阵, F F F代表基本矩阵)
S M = ∑ i ( ρ M ( d c r 2 ( x c i , x r i , M ) ) + ρ M ( d r c 2 ( x c i , x r i , M ) ) ) ρ M ( d 2 ) = { Γ − d 2 i f d 2 < T M 0 i f d 2 ≥ T M (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,xri,M)))ρM(d2)={Γ−d20ififd2<TMd2≥TM(2)
式中, d c r 2 d_{cr}^2 dcr2和 d r c 2 d_{rc}^2 drc2关注从一帧到另一帧的对称转换误差[2]。 T M T_M TM是基于95%( T H = 5.99 , T F = 3.84 T_H=5.99,T_F=3.84 TH=5.99,TF=3.84)的 χ 2 \chi^2 χ2测试的外点拒绝阈值,假设测量误差中1个像素的标准偏差)。 Γ \Gamma Γ被定义为等于 T H T_H TH以使得两个模型在其内点区域中对相同的 d d d的得分相等,再次使过程同质化。我们维持具有最高分数的单应矩阵和基本矩阵。如果找不到模型(没有足够的内点),我们将从步骤1重新启动该过程。
模型选择:如果场景是平面、近平面或具有较低的视差,则可以用单应性来解释。但是,也可以找到对应的基本矩阵,但问题没有得到很好的约束[2],任何试图从基本矩阵中恢复运动的尝试都会产生错误的结果。我们应该选择单应矩阵,因为这个重建方法将从一个平面场景正确初始化,或者它将检测到低视差情况并拒绝初始化。另一方面,具有足够视差的非平面场景只能用基础矩阵来解释,但如果匹配子集位于平面上或具有低视差(它们相距很远),也可以找到单应矩阵来解释这组匹配。在这种情况下,我们应该选择基础矩阵。我们发现一种鲁棒启发式算法来计算
R H = S H S H + S F (3) R_H=\frac{S_H}{S_H+S_F}\tag{3} RH=SH+SFSH(3)
并且如果 R H > 0.45 R_H>0.45 RH>0.45则选择单应矩阵,它可以很好地捕捉平面和低视差情况。否则,我们选择基础矩阵。
运动结构恢复:一旦选择了一种模型,我们检索相关的运动假设。在单应矩阵的情况下,我们使用Faugeras和Lustman的方法检索八个运动假设[23]。该方法提出了cheriality测试来选择有效解。但是,如果视差较低,则这些测试失败,因为点很容易在相机的前面或后面移动,这可能会导致选择错误的解决方案。我们建议直接对八个解决方案进行三角化,并检查是否有一个解决方案在两个相机前面的视差中看到的点最多,且重投影误差较低。如果没有一个明确的最优的解决方案,我们将不会继续初始化并从步骤1重新开始。这种消除解决方案的歧义性的技术使得我们的初始化在低视差和双面歧义配置下具有鲁棒性,可以认为是我们方法鲁棒性的关键。
在基础矩阵的情况下,我们使用标定矩阵 K K K将其转换为一个本质矩阵
E r c = K T F r c K (4) E_{rc}=K^TF_{rc}K \tag{4} Erc=KTFrcK(4)
然后使用[2]中解释的奇异值分解方法检索四个运动假设。我们对这四种解决方案进行三角化,并使用与单应矩阵相似的方法选择最优的重建。
BA:最后,我们执行全局BA(详见附录)以优化初始重建的结果。
图3显示了户外NewCollege机器人序列[39]中具有挑战性的初始化示例。可以看出PTAM和LSD-SLAM是如何在平面上初始化所有点,然而我们的方法一直等到有足够的视差时,才从基础矩阵进行正确的初始化。
图3
在本节中,我们将描述使用相机的每一帧执行的跟踪线程的步骤。在几个步骤中提到包含在仅运动BA中的相机位姿优化,如附录中所述。
我们以1.2的比例因子在八个尺度级别提取FAST角点。对于512×384到752×480像素的图像分辨率,我们发现适合提取1000个角点;对于更高的分辨率,如KITTI数据集[40]中的1241×376,我们提取2000个角点。为了确保均匀分布,我们在每个尺度级别中进行网格划分,试图在每个网格单元中提取至少五个角点。然后,我们检测每个网格单元中的角点,如果没有找到足够的角点,则调整检测器的阈值。如果某些网格单元不包含角点(无纹理或低对比度),则每个网格单元保留的角点数量也会调整。然后在保留的FAST角点上计算方向和ORB描述子。ORB描述子用于所有特征匹配,与PTAM中的块相关搜索不同。
如果上一帧的跟踪成功,我们将使用匀速运动模型来预测相机位姿,并对上一帧中观察到的地图点进行引导搜索。如果没有找到足够的匹配项(即,运动模型与实际运动情况不符),我们将在上一帧中对位置周围的地图点进行更广泛的搜索。然后,使用找到的对应关系优化位姿。
如果跟踪丢失,我们将当前帧转换为词袋向量,并查询识别数据库中的候选关键帧以进行全局重定位。如第III-E节所述,我们计算每个关键帧中与地图点相关的ORB对应关系。然后,我们对每个关键帧交替执行RANSAC迭代,并尝试使用PnP算法找到相机位姿[41]。如果我们找到一个具有足够内点的相机位姿,我们将优化该位姿,并对候选关键帧的地图点执行引导搜索来获取更多的匹配关系。最后,相机的位姿被再次优化,如果有足够的内点支持,跟踪过程将继续。
一旦我们有了相机位姿的估计和一组初始的特征匹配,我们就可以将地图投影到当前帧中并搜索更多的地图点对应关系。为了限制大型地图的复杂性,我们只投影一个局部地图。此局部地图包含一组与当前帧共享地图点的关键帧 K 1 \mathcal{K}_1 K1,以及一组在共视图中与关键帧 k 1 \mathcal{k}_1 k1相邻的关键帧 K 2 \mathcal{K}_2 K2。局部地图也有一个参考关键帧 K r e f ∈ K 1 \mathcal{K}_{ref} \in \mathcal{K}_1 Kref∈K1,它与当前帧共享大多数地图点。现在,在当前帧中搜索在 K 1 \mathcal{K}_1 K1和 K 2 \mathcal{K}_2 K2中看到的每个地图点,如下所示。
相机位姿最终使用当前帧中找到的所有地图点进行优化。
最后一步是确定当前帧是否派生为新的关键帧。由于在局部建图线程中有一种剔除冗余关键帧的机制,这里将尝试尽可能快地插入关键帧,因为这样可以使对于具有挑战性的相机运动,比如旋转的跟踪更加鲁棒。要插入新的关键帧,以下条件必须满足:
这里不使用与与PTAM相同的与其他关键帧的距离标准作为判断是否插入关键帧的条件,而是使用最小视觉变化来判断(条件4)。条件1确保良好的重定位,条件3确保良好的跟踪。如果在局部建图线程忙时插入关键帧(条件2的第二部分),则会发送一个信号来停止局部BA的进行,以便它能够尽快处理新的关键帧。
在本节中,我们将描述局部建图线程中使用每个新的关键帧 K i K_i Ki执行的步骤
首先,更新共视图,为被插入的关键帧 K i K_i Ki添加一个新的节点并用和其他关键帧共享的地图点来更新边。然后,通过链接新的关键帧 K i K_i Ki和具有最多共视地图点的已有关键帧更新生成树。最后计算关键帧的词袋表示,这将有助于三角化新的地图点时的数据关联。
地图点要保留在地图中,必须在创建后的前三个关键帧期间通过一个严格的测试,以确保它们是可跟踪的,并且不是由于虚假数据关联而被错误地三角化的。一个点必须满足以下两个条件:
一旦一个地图点通过了这个测试,只有在任何时候观测到它的关键帧个数小于3时,它才能够被移除。当关键帧被剔除并且局部BA丢弃了无效的观测值时,就会发生这种情况。这个策略使得地图包含很少的外点。
新的地图点是通过从共视图中连接的关键帧 K c \mathcal{K}_c Kc对ORB特征点进行三角化来创建的。对于 K i K_i Ki中每个未匹配的ORB特征点,在其他关键帧中搜索与其他未匹配点的匹配。按照第III-E节中的说明进行匹配,并丢弃不满足极线约束的匹配。ORB特征点对被三角化,并且为了接受这个新的点,检查三角化后的点在两个相机中的的正深度、视差、重投影误差和尺度一致性。最初,新的地图点被两个关键帧观察到,但它可能与其他的特征点也有匹配,因此它被投影到剩余的连接关键帧中,并按照第V-D节中的详细说明搜索对应匹配关系。
局部BA优化当前处理的关键帧 K i K_i Ki、共视图中与其连接的所有关键帧 K c \mathcal{K}_c Kc,以及这些关键帧看到的所有地图点。看到这些点但未连接到当前处理的关键帧的所有其他关键帧都包含在优化中,但位姿被固定。标记为外点的观测值将在优化的中间和结尾被丢弃。有关此优化的更多详细信息,请参见附录。
为了保持一个紧凑的重建,局部建图线程尝试检测冗余的关键帧并删除它们。这是有益的,因为BA的复杂性随着关键帧的数量的增加而增长,同时也因为这个机制使得系统可以在相同的环境中长时期运行,因为关键帧的数量不会无限增长,除非场景中的视觉内容发生变化。如果在 K c \mathcal{K}_c Kc中的某个关键帧90%的地图点都在相同或更细尺度的至少其他三个关键帧中被观测到,那么这个关键帧被认为是冗余的,从而被剔除掉。尺度条件确保了地图点以最准确的程度保持了与其对应的关键帧。这一策略的灵感来源于Tanet al.[24]的工作中提出的一项策略,其中关键帧在变化检测过程后被丢弃。
闭环矫正线程接受局部建图线程处理的最后一个关键帧 K i K_i Ki,它尝试检测并矫正闭环。接下来将描述这些步骤。
首先,计算关键帧 K i K_i Ki和他在共视图中的所有相连关键帧( θ m i n = 30 \theta_{min}=30 θmin=30)的视觉单词向量相似度,并计算最低相似分数 S m i n S_{min} Smin。然后,查询识别数据库并丢弃所有那些相似分数低于 S m i n S_{min} Smin的关键帧。这是一个类似于获得于在DBoW2中归一化分数来获得稳健性的操作,它是从前面的图像计算出来的,但这里我们使用共视信息。此外,所有和关键帧 K i K_i Ki直接连接的关键帧都将从结果中丢弃。为了确认接受一个候选的闭环,必须连续地检测出三个一致的闭环候选(共视图中连接的关键帧),如果有多个与关键帧 K i K_i Ki所观测到的环境相似的位置,则可以有多个闭环候选。
在单目SLAM中,地图的累积漂移有七个自由度:三个平移、三个旋转和一个尺度因子[6]。因此,要矫正一个闭环,需要计算一个从当前关键帧 K i K_i Ki到闭环关键帧 K l K_l Kl的相似变换,它告诉我们在闭环中累积的误差。这种相似变换的计算也将作为闭环正确性的几何验证。
首先计算与当前关键帧中的地图点相关的ORB描述子和闭环候选帧中地图点的ORB描述子之间的匹配关系。此时,已经获得了当前帧和每个闭环候选帧的3-D到3-D匹配关系。交替地对每个候选关键帧执行RANSAC迭代,试图用Horn的方法找到相似变换[42]。如果找到一个具有足够内点的相似变换 S i l S_{il} Sil,将对其进行优化(参见附录),并进行引导搜索以获得更多的匹配关系。再次对相似变换 S i l S_{il} Sil进行优化,如果经过验证有足够的内点,则会接受这个闭环 K l K_l Kl。
闭环校正的第一步是融合重复的地图点,并将形成闭环的两帧的链接作为新的边插入共视图。首先,使用相似变换 S i l S_{il} Sil校正当前关键帧的位置 T i w T_{iw} Tiw,并将该校正关系传播到 K i K_i Ki的所有邻居,串联地进行变换,从而使闭环的两侧对齐。闭环关键帧及其邻域看到的所有地图点都投影到 K i K_i Ki中,在投影周围的狭窄区域中进行搜索以获得匹配关系,如第V-D节所述。所有匹配的地图点和计算相似变换 S i l S_{il} Sil中的得到的内点都被融合。所有参与融合的关键帧都将更新其在共视图中的边,创建的新的边将用于闭环矫正。
为了有效地矫正闭环,对本质图进行了位姿图优化,如第III-D节所述,该优化将闭环误差沿着本质图进行分配。通过相似变换进行优化,以校正尺度漂移[6]。在优化之后,每个地图点根据一个观察到它的的关键帧的校正结果进行变换。
略
在这项研究中,我们提出了一个新的单目SLAM系统,详细描述了其构建模块,并在公共数据集上进行了详尽的评估。我们的系统已经证明它可以处理室内和室外场景以及汽车、机器人和手持运动的序列。在小室内场景中,该系统的精确度通常低于1厘米,在大室外场景中,精确度通常低于几米(一旦我们将尺度与地面真值对齐)。
目前,Klein和Murray的PTAM[4]被认为是实时单目视频中最精确的SLAM方法。PTAM的后端是BA,这不是巧合,BA是众所周知的离线从运动恢复结构的黄金标准方法[2]。PTAM的主要成功之一,也是Miuragnon早期的工作[3],就是将这些知识引入机器人SLAM社区,并展示其实时性能。我们工作的主要贡献是将PTAM的多功能性扩展到该系统难以处理的环境中。为此,我们使用一些新的想法和算法从零开始设计了一个新的单目SLAM系统,但也结合了过去几年中发展的优秀工作,如闭环检测[5],闭环矫正程序和共视图[6],[7],g2o优化框架[37],以及ORB特征[9]。据我们所知,没有其他系统能在如此多的不同场景下如此精确地工作。因此,我们的系统是目前最可靠、最完整的单目SLAM解决方案。我们新的产生和剔除关键帧的策略允许创建几个关键帧,当这些关键帧被认为是多余的时,它们最终会被剔除。这种灵活的地图扩展在有条件的探索轨迹中非常有用,即接近纯旋转或快速移动。当在同一个环境中重复操作时,只有当场景的视觉内容发生变化时,地图才会增长,并存储其不同视觉表现的历史。通过分析这段历史,可以提取出长期建图的有趣结果。
最后,我们还证明了ORB特征具有足够的识别能力,能够从严重的视角变化中进行位置识别。此外,它们提取和匹配速度非常快(不需要多线程或GPU加速),支持实时精确的跟踪和建图。
最近的实时单目SLAM算法,如DTAM [44]和LSD-SLAM [10]能够对环境进行稠密或半稠密的重建,而相机是通过直接优化图像像素强度来定位的。这些直接方法不需要特征提取,因此避免了相应的虚假特征关联。它们对模糊、低纹理和像沥青一样的高频纹理[45]也更稳定。与我们的系统或PTAM的稀疏点地图相比,它们稠密的重建可能对其他任务更有用,而不仅仅是相机定位。
然而,直接方法有其自身的局限性。首先,这些方法假设表面反射模型在真实场景中会产生自己的伪影。光度一致性限制了匹配的基线长度,通常会比基于特征的方法允许的范围窄。这对重建精度有很大影响,它需要宽基线观测来降低深度不确定性。直接方法,如果建模不正确,会受到卷帘式快门、自动增益和自动曝光的影响(如在TUM RGB-D基准中)。最后,因为直接方法通常对计算要求很高,所以地图只是像在DTAM那样增量扩展,或者地图优化被简化为一个位姿图,像在LSD-SLAM那样丢弃所有传感器测量。
相比之下,基于特征的方法能够匹配具有宽基线的特征,这得益于它们对视角和光照变化的良好不变性。BA联合优化摄像机位置和传感器测量生成的地图点。在结构和运动估计的背景下,Torr 和 Zisserman[46]指出了基于特征的方法相对于直接方法的优势。在这项研究中,我们提供了实验证明,证明基于特征的方法在实时SLAM中具有卓越的准确性。我们认为,单目SLAM的未来应该结合这两种方法的优点。
我们的系统的精度仍然可以通过在跟踪中包含无穷远的点来提高。这些点没有足够的视差,我们的系统也没有将它们包括在地图中,但是他们对相机的旋转估计非常有用[21]。
另一个想法是将我们系统的稀疏地图升级为更稠密和更有用的重建结果。得益于我们的关键帧选择,关键帧构成了一个紧凑的环境概要,它具有非常高的位姿精度和丰富的共视信息。因此,ORB-SLAM稀疏地图可以是一个很好的初始猜测和骨架,在此基础上可以构建一个稠密而且准确的地图。这方面的第一次努力在[47]中提出。
BA[1]:地图点三维位置 X w , j ∈ R 3 X_{w,j} \in \mathbb{R}^3 Xw,j∈R3和关键帧位姿 T i w ∈ S E ( 3 ) T_{iw}\in SE(3) Tiw∈SE(3),其中 w w w代表世界坐标系被进行了优化,以最小化相对于匹配特征点 x i , j ∈ R 2 x_{i,j}\in \mathbb{R}^2 xi,j∈R2的重投影误差。地图点 j j j在关键帧 i i i中的观测误为
e i , j = x i , j − π i ( T i w , X w j ) (5) e_{i,j}=x_{i,j}-\pi_{i}(T_{iw},X_{wj}) \tag{5} ei,j=xi,j−πi(Tiw,Xwj)(5)
其中, π i \pi_{i} πi是投影函数
π i ( T i w , X w , j ) = [ f i , u x i , j z i , j + c i , u f i , v y i , j z i , j + c i , v ] [ x i , j y i , j z i , j ] T = R i w X w , j + t i w (6) \pi_i(T_{iw},X_{w,j})=\begin{bmatrix} f_{i,u} \frac{x_{i,j}}{z_{i,j}}+c_{i,u} \\ f_{i,v} \frac{y_{i,j}}{z_{i,j}}+c_{i,v}\end{bmatrix} \\ \begin{bmatrix} x_{i,j} & y_{i,j} & z_{i,j} \end{bmatrix}^T = R_{iw}X_{w,j} + t_{iw} \tag{6} πi(Tiw,Xw,j)=[fi,uzi,jxi,j+ci,ufi,vzi,jyi,j+ci,v][xi,jyi,jzi,j]T=RiwXw,j+tiw(6)
其中 R i w ∈ S O ( 3 ) R_{iw} \in SO(3) Riw∈SO(3)和 t i w ∈ R 3 t_{iw} \in \mathbb{R}^3 tiw∈R3分别是 T i w T_{iw} Tiw的旋转和平移部分, ( f i , u , f i , v ) (f_{i,u},f_{i,v}) (fi,u,fi,v)和 ( c i , u , c i , v ) (c_{i,u},c_{i,v}) (ci,u,ci,v)是与相机 i i i相关的焦距和主点。要最小化的代价函数为
C = ∑ i , j ρ h ( e i , j T Ω i , j − 1 e i , j ) (7) C=\sum_{i,j}{\rho_h(e_{i,j}^T\Omega_{i,j}^{-1}e_{i,j})} \tag{7} C=i,j∑ρh(ei,jTΩi,j−1ei,j)(7)
其中 ρ h \rho_h ρh表示Huber鲁棒代价函数, Ω i , j = σ i , j 2 I 2 × 2 \Omega_{i,j} = \sigma_{i,j}^2I_{2 \times 2} Ωi,j=σi,j2I2×2表示与检测到关键点的尺度相关的协方差矩阵。对于全局BA(用于第IV节中解释的地图初始化和第VIII-E节中的实验),我们优化了所有点和关键帧,但第一个关键帧除外,它被固定作为为原点。在局部BA(参见第VI-D节)中,局部区域中包含的所有点都进行了优化,而关键帧子集是固定的。在位姿优化或仅运动BA(参见第V节)中,所有点都是固定的,并且只优化相机位姿。
Sim(3)约束条件下的位姿图优化[6]:给定二元边的位姿图(见第VII-D节),我们将边中的误差定义为
e i , j = l o g S i m ( 3 ) ( S i j S j w S i w − 1 ) (8) e_{i,j}=log_{Sim(3)}(S_{ij}S_{jw}S_{iw}^{-1}) \tag{8} ei,j=logSim(3)(SijSjwSiw−1)(8)
其中, S i j S_{ij} Sij是在位姿图优化和将比例因子设置为1之前,从SE(3)位姿计算的两个关键帧之间的相对Sim(3)变换。在闭环边的情况下,使用Horn[42]的方法计算该相对变换。 l o g S i m ( 3 ) log_{Sim(3)} logSim(3)[48]变换到切线空间,因此误差为 R 7 \mathbb{R}^7 R7中的向量。目标是优化Sim(3)关键帧位姿,以最小化成本函数
C = ∑ i , j e i , j T Λ i , j e i , j (9) C=\sum_{i,j}{e_{i,j}^T\Lambda_{i,j}e_{i,j}} \tag{9} C=i,j∑ei,jTΛi,jei,j(9)
其中 Λ i , j \Lambda_{i,j} Λi,j是边的信息矩阵,如[48]中所述,我们设置为单位矩阵。我们固定闭环关键帧,以固定7个标准自由度。尽管该方法是全局BA的粗略近似,但我们在第VIII-E节中通过实验证明,它比BA具有显著的更快和更好的收敛性。
相对Sim(3)优化:给定一组 n n n个匹配 i ⇒ j i \Rightarrow j i⇒j(关键点及其相关的三维地图点)在关键帧1和关键帧2之间,我们希望优化相对Sim(3)变换 S 12 S_{12} S12(参见第VII-B节),以最小化两幅图像中的重投影误差
e 1 = x 1 , i − π 1 ( S 12 , X 2 , j ) e 2 = x 2 , j − π 2 ( S 12 − 1 , X 1 , i ) (10) e_1 = x_{1,i}-\pi_1(S_{12},X_{2,j}) \\ e_2 = x_{2,j} - \pi_2(S_{12}^{-1},X_{1,i}) \tag{10} e1=x1,i−π1(S12,X2,j)e2=x2,j−π2(S12−1,X1,i)(10)
需要最小化的代价函数是
C = ∑ n ( ρ h ( e 1 T Ω 1 , i − 1 e 1 ) + ρ h ( e 2 T Ω 2 , j − 1 e 2 ) ) (11) C = \sum_{n}(\rho_h(e_1^T\Omega_{1,i}^{-1}e_1)+ \rho_h(e_2^T\Omega_{2,j}^{-1}e_2)) \tag{11} C=n∑(ρh(e1TΩ1,i−1e1)+ρh(e2TΩ2,j−1e2))(11)
式中, Ω 1 , i \Omega_{1,i} Ω1,i和 Ω 2 , j \Omega_{2,j} Ω2,j是与检测到图像1和2中关键点的尺度上对应的的协方差矩阵。在此优化中,点是被固定的。
总结:
主要内容如下:
主要贡献如下:
- 实时性:
- ORB特征(Oriented FAST and Rotated BRIEF),采用FAST特征和BRIEF描述子,方向采用几何中心指向灰度质心,具有旋转不变性
- 共视图,跟踪建图只处理共视区域,而与全局地图无关
- 基于位姿图(本质图)优化的实时闭环矫正
- 重定位:词袋+EPnP
- 启发式的单目初始化,同时适用于平面场景的单应矩阵和适应于非平面场景的基本矩阵
- 选择地图点和关键帧的“适者生存”策略,在生成阶段要求比较宽松,但在剔除时要求十分严格。