ORB-SLAM2论文笔记:An Open-Source SLAM System for Monocular, Stereo,and RGB-D Cameras

ORB-SLAM2下载地址:ORB-SLAM2论文
ORB-SLAM下载地址:ORB-SLAM论文

前言

       大四目前在学习SLAM方面的相关知识,在深蓝学院学习了高翔老师的《视觉SLAM十四讲》的内容,现在开始阅读论文。相关的翻译论文打算放在****上供大家参考改正。这是我的第一篇博客,欢迎大家指正。(后续打算将深蓝学院SLAM课后作业代码和ORB-SLAM1的论文放在博客上)废话不多说,开始正文。

摘要

       我们提出了ORB-SLAM2,一个完整的SLAM系统,可以适用于单目、双目和深度RGB-D相机,包括地图重利用、回环和重定位能力。这个系统可以在标准的CPU上实时的工作,适用于各种各样的环境,从小型的手持设备到工业环境中的无人机飞行和城市中的汽车驾驶。这个系统的后端,基于单目和双目观测的BA优化,可以实现精确的轨迹估计,精度可以到米。我们的系统通过利用视觉里程计对没有建图地图的追踪和地图点的匹配,实现了一个轻量级的定位模式(只开启追踪线程,建图和回环检测线程并不开启),能够实现零漂移定位。在在29中流行的数据集上的评估结果显示我们的方法能够实现最先进的准确度,在大多数情况下是最精确的SLAM结果。我们公开了源码,不仅是为造福SLAM社区,因为为了为其他领域的研究者提供一个方便使用的SLAM解决方案。

一. 介绍

       在过去的二十多年里,同时定位与建图(SLAM)已经成为计算机视觉和机器交流中的一个热点研究话题,并且近来引起了很多高科技公司的注意。SLAM技术聚焦于实时操作,在未知环境中构建地图并且在地图中进行定位。在不同的传感器之中,相机是最便宜的,并且提供了丰富的环境信息,来实现鲁棒性和精确的地点识别。因此,以相机为主要传感器的视觉SLAM,具有极大的利益。地点识别是SLAM中一个关键的模块来实现回环(发现什么时候传感器回到了已经经过的地方并且矫正累计误差)和由于障碍物或者是运动出错,或是在系统重新初始化而导致跟踪失败后的重定位。
       视觉SLAM能够通过最便宜和最小的单目相机实现。然后,由于深度无法仅从一个相机中观测到,因此地图和估计的轨迹的精度是位置的。除此之外,由于无法从第一帧图像开始进行三角化,因此系统引导需要多视图或者是滤波技术。最后不得不提的是,单目相机会产生尺度漂移并且如果纯旋转(可以使用单应矩阵求解,而不使用本质矩阵求解)的话有可能会失败。通过使用双目或者是深度相机,所有的这些问题会解决,并且能有最可靠的视觉SLAM解。
       在ORB-SLAM1中的论文中,我们构建了单目的SLAM系统,而ORB-SLAM2有如下的贡献:

  1. 第一个开源的适用于单目、双目和深度相机的SLAM系统,包含回环检测、重定位和地图重利用。
  2. 我们的RGB-D结果显示,通过使用BA算法,我们实现了比基于ICP或者广度深度误差最小化的先进方法更加的精确。
  3. 通过使用近处和远处的立体点和单目观测(这部分不知道怎么翻译了。。。。),我们的双目结果比先进的使用直接法的双目SLAM系统更加的准确。
  4. 一个轻量级的能够重复利用地图的重定位模式。
    Fig1显示了一些ORB-SLAM2对双目深度相机的一些输出结果。
    ORB-SLAM2论文笔记:An Open-Source SLAM System for Monocular, Stereo,and RGB-D Cameras
           这篇论文剩余的内容,在第二部分讨论相关工作,第三部分介绍ORB-SLAM2系统,然后在第四部分展示评估结果,最后进行总结。(评估结果和总结没有翻译)

二. 相关工作

       在这一部分,我们讨论双目和深度SLAM的相关工作。我们在这里的讨论以及第四部分中的评估都仅聚焦于SLAM方法。

A. 双目相机

       早先一个标志性的双目SLAM系统是Paz等人的工作。基于conditionally independent divide和扩展卡尔曼滤波的SLAM,能够在那个时间里比其他方法工作在更加大的环境当中。更重要的是,它是第一个同时利用近点和远点的双目SLAM系统,对后者使用了反向深度参数。他们显示如果这些点的深度小于双目相机基线的四十倍的,这些点能够被可靠的三角化测量。在本文中,我们使用了这种利用近点和远点的方法, 会在第三部分A中介绍。
       现在最前沿的双目SLAM系统是基于关键帧并且在局部区域执行BA优化来实现可伸缩性。Strasdat等人的工作在关键帧的内部窗口执行3D点和位姿的BA算法,在外部窗口执行位姿图优化。通过限制这些窗口的尺寸,该方法实现了常数时间复杂度,但是不能保证全局一致性。Mei等人的RSLAM算法使用路标点和位姿的相对表示,并且在一个活动区域内执行相对BA,能够被约束为常数时间。RSLAM能够实现回环,能够允许在回环的两侧扩展活动区域,但是全局一致性不能强制要求的。最近Pire等人的S-PTAM使用局部BA,但是缺少大范围的回环检测。与这些方法相似的是,我们在关键帧的局部执行BA,来使复杂度和地图的大小独立,并且我们可以在大环境中进行优化。然后,我们的目标是构建一个全局一致的地图。当检测到回环时,我们首先像RSLAM一样,对齐所有的边来使跟踪能够继续使用旧地图进行定位。然后,在回环中执行位姿图优化来最小化累计漂移,最后是full-BA。
       最近的Engel等人的LSD-SLAM是一个最小化灰度误差的半稠密直接法。不依赖于特征点,这种方法在运动模糊或者是特征不明显的的环境中更加的鲁棒性。然而,作为直接法,它的性能会受到未建模的影响,如滚动快门或非兰伯反射

B. 深度相机

       最早最著名的RGB-D SLAM系统是Newcombe等人的KinectFusion。这种方法融合所有的深度数据到体积密度模型,使用ICP来追踪相机位姿。由于体表示和缺少回环,这个系统限制在小的工作空间中。Whelan等人的Kintinuous通过使用滚动循环缓冲区能够在大环境中工作,并且通过使用地点识别和位姿图优化来是实现回环。
       或许最流行的开源系统是Endres等人的RGB-D SLAM。这是一个基于特征点的系统,前端通过特征匹配和ICP计算每幅图像帧之间的运动。后端通过回环约束执行位姿图优化。相似地,Kerl等人的DVO-SLAM的后端也是优化了位姿图,其中关键帧到关键帧的约束是通过视觉里程计计算的,从而最小化了光度和深度误差。DVO-SLAM也是在所有先前的帧中使用一种启发式的方法搜索回环候选帧,而不是依赖于地点识别。
       Whelan等人的ElasticFusion构建了surfel地图。这是一种以地图为中心的方法,并且通过对地图施加非刚体变形来形成回环。这个系统的详细重构和定位精度令人印象深刻,但是由于复杂度会随着地图中点元的数目提高而提升,目前的应用还是受限制在房间大小的地图。
       遵循Strasdat等人的建议,我们的ORB-SLAM2为了在图像中提取特征,使用深度信息来生成一个双目坐标系。通过这种方法我们的系统不需要知道输入的是双目相机的数据还是深度相机的数据。和所有以上方法不同的是,我们的后端是基于BA,并且构建一个全局一致的稀疏地图。因此我们的方法是轻量级的,并且可以工作在标准CPU下。我们的目标是长期并且全局一致的定位,而不是构建最详细稠密的地图。从高精度的关键帧位姿中我们可以融合深度地图并且得到局部区域精确的重构,或者是在full-BA后,从所有关键帧中后置处理深度地图,并且得到一个整个场景的精确3D模型。

ORB-SLAM2

       双目和深度相机的ORB-SLAM2是基于单目相机的ORB-SLAM。整个系统的大致概括如图2所示。 ORB-SLAM2论文笔记:An Open-Source SLAM System for Monocular, Stereo,and RGB-D Cameras
这个系统有三个主要的并行线程:
1)跟踪线程通过特征点匹配和应用motion-only BA(仅优化位姿)最小化重投影误差来对相机进行定位。
2)局部建图线程处理并且优化局部地图,执行局部BA算法。
3)回环检测线程用来检测大的回环,通过执行位姿图优化校正累计漂移。这个线程会生成第四个线程,在位姿图优化后来执行full-BA,来计算最优结构和运动解。
       这个系统有一个基于DBoW2的嵌入的位置识别模块,用来在跟踪失败下的重定位,或者是在已经建图过的场景中的重新初始化或是回环检测。系统维持一个共视图,这个共视图会连接任意两幅观测到相同点的关键帧和一个连接所有关键帧的最小生成树。这些图结构可以恢复一个关键帧的局部窗口,来进行局部地追踪和建图操作。这样可以工作在大的环境中,并且当形成回环时可以作为位姿图优化的图结构。
       这个系统使用相同的ORB特征用来追踪、建图和地点识别。这种特征点具有尺度不变性和旋转不变性,并且对相机自动增益、自动曝光和照度变化具有良好的不变性。而且,他们可以很快地被提取和匹配,来适应于实时操作并且在词袋位置识别中具有很好的准确率和召回率。
       这一章节的剩余部分讲述的是双目或者是深度信息如何被利用和系统的那些元素会受到影响。

A. 关键点定义

       作为一种基于特征点的方法,ORB-SLAM2会预处理输入的图像数据,来提取特征明显特征点。提取特征点之后,输入的图像数据就会被取消,后续所有的操作都是基于这些特征点,来使系统与传感器的类型无关。ORB-SLAM2会处理单目和双目关键点,这些关键点进一步会被分为近点和远点。
       双目关键点*(Stereo keypoints)*是三维坐标,坐标记为 x s = ( u L , v L , u R ) \pmb x_s=(u_L,v_L,u_R) xxxs=(uL,vL,uR),其中 ( u L , v L ) (u_L,v_L) (uL,vL)是关键点在左侧图像中的坐标, u R u_R uR是在右侧图像的水平坐标。对于双目相机,我们在左右两幅图像中都提取ORB特征点,并且对于左侧中的关键点,都会在右侧图像中找到相应的匹配。这可以有效假设立体校正图像,来使极线是水平的。然后生成双目关键点的坐标。对于RGB-D相机,我们在RGB图像中提取ORB特征点,对于每一个坐标为 ( u L , v L ) (u_L,v_L) (uL,vL)的特征,将其深度值 d d d转换为虚拟的右侧坐标为
u R = u L − f x b d u_R = u_L - \frac{f_xb}{d} uR=uLdfxb
其中 f x f_x fx是水平焦距, b b b是相机光心和红外线发射端水平距离,成为基线。通过这种方法可以将深度传感器的不确定性转化为虚拟右侧坐标的不确定性。这样,从双目和深度中的特征点在后续的系统操作中会被同样的处理。
       双目关键点被分为近点和远点。如果深度小于双目或者深度相机基线的40被,那么这个点就是近点,否则会是远点。因为深度是可以被精确地估计因此近点可以被完整的三角测量,并且可以提供尺度、平移和旋转信息。另一方面,远点提供精确的旋转信息,但是尺度和平移信息比较差。当远点有多重视图支持时,我们对远点进行三角测量。
       单目关键点是二维坐标,定义为左侧图像的坐标 x m = ( u L , v L ) \pmb x_m=(u_L,v_L) xxxm=(uL,vL)。这些单目关键点是在双目相机中无法匹配或者是深度相机中深度信息无效的关键点。这些点只有在多视图中才被三角测量,并且不提供尺度信息,但是仍然可以对旋转和平移进行估计。

B. 系统引导

       使用双目和深度相机的好处是,仅从一帧图像中就可以获得深度信息,不需要像单目相机那样进行相机初始化。在系统开始时,我们将第一帧图像作为关键帧,设置其位姿作为原点,并且从所有的双目关键点中创建一个初始地图。

C. 单目双目约束下的BA优化

       在跟踪线程中,会执行BA(motion-only BA)算法来优化相机的位姿;在建图线程中会执行BA算法(local BA)来优化局部的关键帧和空间点。在形成闭环后,会通过full BA优化所有的关键帧和空间点。BA优化算法使用的是g2o中的列文伯格-马夸尔特非线性最小二乘法。
       Motion-only BA优化旋转矩阵和平移向量(也就是相机的位置),在匹配到的世界坐标系下的三维空间点 X i ∈ R 3 \pmb X^i \in \mathbb R^3 XXXiR3和关键点 x i \pmb x^i xxxi i ∈ χ i \in \chi iχ,其中 χ \chi χ是所有匹配的集合,公式为
{ R , t } = arg ⁡ min ⁡ R , t = ∑ i ∈ χ ρ ( ∣ ∣ x ( ⋅ ) i − π ( ⋅ ) ( R X i + t ) ∣ ∣ Σ 2 ) \{\pmb R,\pmb t \}=\arg \min_{\pmb{R},\pmb{t} }=\sum_{i \in \chi}\rho(||\pmb{x^i_{(·)}} -\pi_{(·)}(\pmb R\pmb X^i+\pmb t)||^2_\Sigma) {RRR,ttt}=argRRR,tttmin=iχρ(x()ix()ix()iπ()(RRRXXXi+ttt)Σ2)
其中 ρ \rho ρ是鲁棒核函数, Σ \Sigma Σ是和关键点相关的协方差矩阵,对于映射函数 π ( ⋅ ) \pi_{(·)} π(),单目映射 π m \pi_m πm和双目映射 π s \pi_s πs定义为:
π m ( [ X Y Z ] ) = [ f x X Z + c x f y Y Z + c y ] π s ( [ X Y Z ] ) = [ f x X Z + c x f y Y Z + c y f x X − b Z + c x ] \pi_m(\left[\begin{matrix} X \\ Y \\ Z \\ \end{matrix}\right])= \left[\begin{matrix} f_x\frac{X}{Z}+c_x \\ f_y\frac{Y}{Z}+c_y \end{matrix}\right] \\ \pi_s(\left[\begin{matrix} X \\ Y \\ Z \\ \end{matrix}\right])= \left[\begin{matrix} f_x\frac{X}{Z}+c_x \\ f_y\frac{Y}{Z}+c_y \\ f_x\frac{X-b}{Z}+c_x \end{matrix}\right] πm(XYZ)=[fxZX+cxfyZY+cy]πs(XYZ)=fxZX+cxfyZY+cyfxZXb+cx
其中 ( f x , f y ) (f_x,f_y) (fx,fy)是焦距, ( c x , c y ) (c_x,c_y) (cx,cy)是光心, b b b是基线。
       Local BA优化共视的关键帧 K L \mathcal K_L KL和在这些关键帧中观测到的所有点 P L \mathcal P_L PL。所有那些不在 K L \mathcal K_L KL,但是观测到 P L \mathcal P_L PL的关键帧记为 K F \mathcal K_F KF,也会被加入到优化的范围,但是取值是保持不变的。定义 χ k \chi_k χk P L \mathcal P_L PL中的点和当前关键帧的匹配到的点的集合,优化问题可以定义为
ORB-SLAM2论文笔记:An Open-Source SLAM System for Monocular, Stereo,and RGB-D Cameras
       Full-BA是Local BA的特殊形式,在地图中所有的关键帧的位姿和空间点都会被优化,除了原始关键帧是固定的。

D. 回环和full-BA

       回环分为两步,首先需要检测并且确认一个回环;其次,这个回环会通过位姿图得到优化。在ORB-SLAM单目系统中,尺度会发生漂移,双目或者是深度信息使得尺度是可以观测的,并且几何模型确认和位姿图优化不再要求处理尺度漂移,因此是基于变换矩阵而不是相似变换矩阵。
       在ORB-SLAM2中,在执行完位姿图优化后,会执行full-BA来实现更加优化的解。这个优化方法是非常消耗计算资源的,因此将其放在一个独立的线程来持续地创建地图和检测回环。然而,这带来了融合BA优化输出解和地图的当前状态的困难。当full BA正在执行时,如果一个新的回环被检测到,就会打断这个优化来处理回环。然后在重新加载full BA线程。当full BA结束时,需要将更新过的关键帧和空间点与在优化过程中新插入的关键帧与空间点进行融合。这是通过生成树,将更新过的关键帧的修正传递到没有更新过的关键帧。没有更新过的空间点通过它们的关键帧的修正进行变换。

E. 关键帧插入

       ORB-SLAM2遵循ORB-SLAM中介绍的插入关键帧和剔除冗余关键帧的测率。双目空间点中的近点和远点允许我们介绍一种新的关键帧插入条件。这个插入条件在大部分场景都远离双目传感器的环境中具有挑战性。如图3所示。
ORB-SLAM2论文笔记:An Open-Source SLAM System for Monocular, Stereo,and RGB-D Cameras
在这种环境中 ,我们需要足够数目的近点来精确地估计平移向量,因此如果追踪到的近点数目低于 τ t \tau_t τt,并且当前处理的帧能够创造至少 τ c \tau_c τc个新的近点,系统将要插入一个新的关键帧。在实验中,取 τ t = 100 , τ c = 70 \tau_t=100,\tau_c=70 τt=100,τc=70

F. 定位模式

    在ORB-SLAM2中引入了定位模式,只要环境中没有显著的改变,这个模式可以用于轻量级长期定位在容易建图的地方。在这种模式中,局部建图和回环线程都被关闭,如果需要,跟踪将使用重定位来定位相机的位置。在这种模式下,跟踪线程利用视觉里程计匹配和地图点的匹配。视觉里程计匹配是当前帧的ORB特征和在先前帧中创造的3D点的匹配。这些匹配可以在未建图区域,使得定位更加的鲁棒,但是会引起漂移的积累。地图点匹配确保无漂移定位到现有地图。

这篇论文翻译到此为止,论文主要介绍了ORB-SLAM2设计的方法,后续可以根据ORB-SLAM和ORB-SLAM2这两篇论文阅读ORB-SLAM的源码了。
第一次写博客,欢迎各位评论区批评指正。