个人微信公众号,专注于机器学习公式推导代码实现、计算机视觉、深度学习、步态识别、视觉slam、激光slam。
摘要
本文介绍了ORB-SLAM,一种基于特征的单目SLAM系统,该系统可在大小场景和室内外环境中实时运行。该系统对复杂的剧烈运动具有鲁棒性,允许宽基线闭环和重定位,且包含完整的自动初始化。在近年来优秀算法的基础上,我们从头开始设计了一个新系统,该系统在所有SLAM任务中使用相同的功能:跟踪、建图、重定位和回环。选择重建点和关键帧的适当的策略具有很好的鲁棒性,并生成一个紧凑且可跟踪的地图,该地图只有在场景内容发生变化时才会增长,允许长时间操作。我们从最流行的数据集中对27个序列进行了详尽的评估。ORB-SLAM与其他最先进的单目SLAM方法相比,实现了前所未有的性能。为了社区的利益,我们公开了源代码。
关键字:持续建图,定位,单目视觉,识别,同时定位和建图(SLAM)。
I. 介绍
(Bundle adjustment)BA可提供相机定位的精确估计以及稀疏几何重建[1],[2],因为提供了强大的匹配网络和良好的初始猜测。长期以来,这种方法被认为无法用于实时性应用,例如VSLAM。VSLAM系统的目标是在构建环境的同时估计相机的轨迹。现在,我们为了不以过高的计算成本获得准确的结果,实时SLAM算法必须向BA提供以下信息。
- 1)在候选图像帧中(关键帧)匹配观测的场景特征(地图点)
- 2)由于关键帧数量的增长,需要做筛选避免冗余
- 3)关键帧和点的网络配置可以产生精确的结果,也就是说分布良好的关键帧集合有明显视差,并有大量回环匹配的观测点。
- 4)非线性优化关键帧位姿和点位置的初始估计
- 5)在构建局部地图的过程中,优化的关键是获得良好的稳定性
- 6)执行快速全局优化(如位姿图)以实时闭环回路。
BA的首次实时应用是Mouragon等人[3]的视觉里程计工作,随后是Klein和Murray[4]开创性的SLAM工作,称为平行跟踪和建图(PTAM)。该算法虽然局限于小场景操作,但为关键帧的选择、特征匹配、点的三角化、每帧相机定位以及跟踪失败后的重定位提供了简单而有效的方法。不幸的是,有几个因素严重限制了它的应用:缺乏回环和对遮挡场景的充分处理,重定位的视角不变性低,以及地图的初始化需要人为干预。
在本文中,我们基于PTAM算法的主要框架,采用Gálvez-López和Tardós提出的place recognition(场景/位置识别)算法,Strasdat等人提出的scale-aware loop closing(具备尺度感知的回环)算法以及文献[7][8]中的大尺度操作中共视信息的使用,重新设计了一种新的单目SLAM系统ORB-SLAM,本文的贡献主要包括:
- 1)在所有任务中使用相同的功能:跟踪、建图、重定位和回环检测。这使得我们的系统更加高效、简单和可靠。我们使用ORB特征[9],它允许在没有GPU的情况下实现实时性能,对旋转和光照的变化提供良好的不变性。
- 2)算法支持在宽广环境中的实时操作。由于使用共视图,跟踪和建图集中在局部共视区域,与全局地图大小无关。
- 3)使用本质图来优化位姿实现回环检测。构建生成树,并由系统、回环检测链接和共视图的强边缘进行维护。
- 4)算法的实时相机重定位具有明显的旋转不变特性和光照不变性。这就使得点跟踪丢失后可以恢复,增强了地图的重用性。
- 5)一种新的基于模型选择的自动且健壮的初始化过程,允许创建平面和非平面场景的初始地图。
- 6)提出了一种合适的方法来选择地图点和关键帧,通过严格筛选关键帧和地图点,剔除冗余信息,使得特征点的跟踪具备了更好的稳定性,从而增强算法的可持续操作性。好的筛选方法可以增强追踪的鲁棒性,同时舍弃多余的关键帧加强系统长时间操作性。
我们对室内外环境中流行的公共数据集(包括手持、汽车和机器人系列)进行了广泛的评估。值得注意的是,我们在直接方法[10]中实现了比最新技术更好的相机定位精度,该方法直接优化像素强度,而不是特征重投影误差。我们在第IX-B节中讨论了使基于特征的方法比直接方法更准确的可能原因。
这里介绍的回环检测和重定位方法是基于我们以前的论文[11]。论文[12]中介绍了该系统的初步版本。在本文中,我们添加了初始化方法、本质图,并完善了所有涉及的方法。我们还详细描述了所有构建模块,并进行了详尽的实验验证。
据我们所知,这是单目SLAM最完整、最可靠的解决方案,为了社区的利益,我们公开了源代码。演示视频和代码可以在我们的项目网页中找到。
II. 相关工作
A. 位置识别
Williams等人[13]的调查比较了几种地方识别的方法,并得出结论:基于外观的技术,即图像到图像的匹配,在大环境中比地图到地图或图像到地图的方法更好。在基于外观的方法中,bags of words(词袋)[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]。在滤波方法的背景下,可以使用逆深度参数化[21]以高度不确定性的深度初始化点,这有望稍后收敛到它们的实际位置。Engel等人[10]最近的半密集工作采用了类似的方法,将像素深度初始化为具有高方差的随机值。
来自两个视图的初始化方法要么假设局部场景平面性[4],[22],并使用Faugeras和Lustman[23]的方法从单应矩阵恢复相对相机位姿,要么使用Nistér[26]的五点算法计算模拟平面和一般场景的本质矩阵[24],[25],但该方法存在多解的问题。这两种重建方法在低视差下都没有很好的约束,如果平面场景的所有点都更靠近其中一个相机中心,则会出现双重模歧义[27]。另一方面,如果看到具有视差的非平面场景,则可以使用八点法[2]计算唯一的基础矩阵,并且可以恢复相对相机姿态而不会产生模糊。
在第四部分中,我们提出了一种新的自动初始化方法,该方法基于平面场景的单应矩阵和非平面场景的基本矩阵之间的模型选择。Torr等人[28]提出了一种模型选择的统计方法。在类似的理论基础下,我们开发了一种启发式初始化算法,该算法考虑了在近似退化情况下(即,平面、近平面和低视差)选择基础矩阵的可能存在问题,则选择单应矩阵。在平面情况下,为了安全操作,如果解决方案具有双重歧义,我们将避免初始化,因为可能会选择错误的解决方案。我们延迟初始化,直到该方法生成具有显著视差的唯一解。
C. 单目同时定位和建图
单目SLAM最初是通过滤波[20]、[21]、[29]、[30]解决的。在该方法中,滤波器对每一帧进行处理,共同估计地图特征位置和相机位姿。它的缺点是在处理连续帧图像上对计算资源的浪费,并且造成线性误差累积。另一方面,基于关键帧的方法[3]、[4]仅使用少数筛选过关键帧构建地图,从而进行更精确的BA优化,因为构建地图与帧速率无关。Strasdat等人[31]证明,在相同的计算成本下,基于关键帧的技术比滤波更精确。
最具代表性的基于关键帧的SLAM系统可能是Klein和Murray的PTAM算法[4]。它第一次将相机追踪和地图构建拆分成两个并行的线程,并成功用于小环境的实时增强现实中。后来文献[32]引入边缘特征对PTAM算法进行了改进,在跟踪过程中增加了旋转估计步骤,实现了更好的重定位效果。由于PTAM中的地图点通过图像区块与FAST角点匹配,因此仅适合于特征跟踪并不适合用于后期的位置识别。事实上,PTAM不会检测到回环,并且重定位也仅是基于关键帧低分辨率缩略图的相关性进行的,因此视角不变性较差。
Strasdat等人[6]提出了一种大尺度单目SLAM系统,其前端基于GPU上实现的光流算法,然后是FAST特征匹配和运动BA,后端基于滑动窗口BA。使用具有相似性约束(7个自由度)的位姿图优化来解决回环检测问题,该优化能够纠正单目SLAM系统中出现的尺度漂移。在这项工作中,我们采用了7自由度位姿图优化的回环思想,并将其应用于第三部分D节中定义的本质图。
Strasdat等人[7]使用了PTAM的前端,但仅在从共视图检索的局部地图中执行跟踪。他们提出了一种双窗口优化后端,该后端在内部窗口中连续执行BA,在有限大小的外部窗口中连续执行位姿图。但是,只有当外部窗口的大小足够大以包含整个回环时,回环检测才有效。在我们的系统中,我们利用了使用基于共视的局部地图和从共视图中构建位姿图的优秀思想,但将其应用于重新设计的前端和后端。另一个区别是,我们没有使用特定的特征进行回环检测(SURF),而是对相同的追踪和建图特征执行位置识别,从而获得鲁棒的帧速率重新定位和回环检测。
Pirker等人[33]提出了CD-SLAM,即一个非常完整的系统,包括回环检测、重定位、大尺度操作以及在动态环境中工作的改进。但是,没有提到地图初始化。由于缺乏公共实现,我们无法对准确性、鲁棒性或大规模功能进行比较。
Song等人[34]的视觉里程计使用ORB特征进行跟踪,并在后端使用BA滑动窗口。相比之下,我们的系统更通用,因为它们没有全局重定位、回环检测,并且地图也不能重用。他们还利用相机到地面的已知距离来限制单目SLAM算法的尺度漂移。
Lim等人在我们提交本文最初的版本[12]之后发表了论文[25],他们也采用相同的特征进行跟踪,地图构建和回环检测。但是,由于Lim等人的算法选择的BRIEF描述子不具备尺度不变性,因此其算法运行受限在平面轨迹上。他们的算法仅从上一帧关键帧开始跟踪特征点,因此访问过的地图不能重用,这样的处理方式与视觉里程计很像,存在系统无限增长的问题。我们在第三部分E小节里面与该算法进行了定性比较。
Engel等人[10]最近的工作称为LSD-SLAM,能够使用直接方法(即,直接对图像像素灰度进行优化)而不是对特征进行优化,构建大规模半稠密地图。他们的成果令人印象深刻,因为该系统能够实时运行,无需GPU加速,构建半密集地图,与基于特征的SLAM产生的稀疏输出相比,该系统在机器人方面有更多潜在应用。尽管如此,它们仍然需要回环检测功能,并且它们的相机定位精度明显低于我们的系统和PTAM,正如我们在第VIII-B节中的实验所示。这一令人惊讶的结果在第IX-B节中讨论。
Forster等人[22]的半直接视觉里程计SVO介于直接方法和基于特征的方法之间。无需在每一帧中提取特征,它们就能够在高帧速率下运行,在四轴飞行器上获得令人印象深刻的结果。然而,不执行回环检测,并且当前的实现主要针对向下看的相机。
最后,我们要讨论关键帧选择。文献中所有的视觉SLAM工作都认为用所有的点和所有的帧运行BA是不可行的。Strasdat等人[31]的工作表明,最具成本效益的方法是保留尽可能多的点,同时只保留非冗余关键帧。PTAM方法非常谨慎插入关键帧避免运算量增长过大。然而,这种严格限制关键帧插入的策略在算法运行困难的情况下可能会导致追踪失败。通过尽可能快地插入关键帧,并在稍后删除多余的关键帧,我们的生存策略在困难场景中实现了前所未有的健壮性,以避免额外的成本。
III. 系统架构
A. 特征选择
我们系统的主要设计思想之一是将建图和跟踪所使用的相同特征用于位置识别,以执行帧速率重定位和回环检测。这使得我们的系统效率更高,并且避免了像以前的论文[6],[7]那样需要从近SLAM特征中插值识别特征的深度。我们需要的特征提取量远小于每幅图像33ms,这排除了流行的SIFT(~ 300毫秒)[19],SURF(~ 300毫秒[18]),或最近的A-KAZE(~ 100毫秒)[35]。为了获得一般的位置识别能力,我们需要旋转不变性,这不包括BRIEF[16]和LDB[36]。
我们选择了ORB[9],它是带方向向多尺度的FAST角点,有一个256位描述符关联。它们的计算和匹配速度非常快,同时对视点具有良好的不变性。这使我们能够将它们与宽基线相匹配,从而提高BA的准确性。我们已经在[11]中展示了ORB在位置识别方面的良好性能。虽然我们当前的实现使用ORB,但提出的技术并不局限于这些特性。
B. 三个线程: 追踪, 局部建图和回环检测
我们的系统,见图1的概述,包含了三个并行运行的线程:跟踪、局部建图和回环检测。跟踪线程负责对每一帧相机进行定位,并决定何时插入一个新的关键帧。我们首先与前一帧进行初始特征匹配,并使用运动的BA来优化位姿。如果跟踪丢失(例如,由于遮挡或突然运动),则使用位置识别模块来进行全局重定位。一旦有了对相机位姿和特征匹配的初步估计,就可以使用系统维护的关键帧的共视图来提取局部可视化地图[见图2(a)和(b)]。然后,通过重投影来搜索与局部地图点的匹配,并通过所有匹配点再次优化相机位姿。最后,跟踪线程决定是否插入一个新的关键帧。所有的跟踪步骤将在第五部分中详细解释。第四节将介绍创建初始地图的新方法。
图1.ORB-SLAM系统概述,显示跟踪、跟踪和回环检测线程执行的所有步骤。还显示了地点识别模块和地图的主要组成部分。
图2.TUM RGB-D基准[38]中fr3_long_of fice_household序列的重建和图形。(a) 关键帧(蓝色),当前相机(绿色),地图点(黑色,红色),当前局部地图点(红色)。(b) 共视图。? 生成树(绿色)和回环检测(红色)。 (d) 本质图。
局部地图构建模块负责处理新的关键帧,对周围的相机位姿进行局部BA以优化重构。在共视图已连接的关键帧中搜索新的关键帧中ORB特征的匹配点,然后三角化新的地图点。有时尽管已经创建了新的点,但基于跟踪线程过程中新收集的信息,为了保证点的高质量,可能会根据点筛选策略临时删除一些点。局部地图构建模块也负责删除冗余的关键帧。我们将在第6章详细说明局部地图构建的步骤。
对每个新的关键帧都要进行回环搜索,以确认是否形成回环。如果检测到一个回环,我们计算一个相似变换,该变换查看回环累积漂移。然后,将回环的两侧对齐,并融合重复的点。最后,在相似性约束[6]上进行位姿图优化,以实现全局一致性。主要新颖之处在于,我们对共视图(即第III-D节中解释的共视图的稀疏子图)进行了优化。第VII节详细解释了回环检测和校正步骤。
我们使用g2o[37]中实现的Levenberg–Marquardt算法来执行所有优化。在附录中,我们描述了每个优化过程中涉及的误差项、成本函数和变量。
C. 地图点、关键帧及其选择标准
每个地图点
p
i
p_{i}
pi?存储以下内容:
- 1)它在世界坐标系中的三维位置
X
w
,
i
\mathbf{X}_{w, i}
Xw,i?;
- 2)视图方向
n
i
\mathbf{n}_{i}
ni?,它是其所有视图方向的平均单位向量(连接点与观察它的关键帧的光心的射线)。
- 3)代表性的ORB描述符
D
i
\mathbf{D}_{i}
Di?,与其他所有能观测到该点的关键帧中ORB描述子相比,该描述子的汉明距离最小
- 4)根据ORB特征的尺度不变性约束,观察点的距离中的最大
d
max
?
d_{\max }
dmax?和最小
d
min
?
d_{\min}
dmin?。
每个关键帧
K
i
K_{i}
Ki?存储以下内容:
- 1)相机姿态
T
i
w
\mathbf{T}_{i w}
Tiw?,是一种刚体变换,将点从世界变换到相机坐标系。
- 2)相机内参,包括焦距和主点。
- 3)从图像提取的所有ORB特征,不管其是否已经关联了地图点, 这些ORB特征点都经过畸变模型矫正过
地图点和关键帧的创建采用了宽松的策略,而后来非常严格的筛选机制负责检测冗余关键帧和错误匹配或不可跟踪的地图点。这允许在构建过程中进行灵活的地图扩展,从而提高在困难条件下(例如旋转、相机快速运动)的跟踪鲁棒性,同时其大小在不断地重新访问相同环境(即长时间操作)时受到限制。此外,与PTAM相比,我们的地图包含很少的局外点,但代价是包含更少的点。地图点和关键帧的帅选程序分别在第VI-B和VI-E节中说明。
D. 共视图和本质图
关键帧之间的共视信息在我们系统的一些任务中非常有用,它被表示为一个无向加权图,如论文[7]一样。每个节点是一个关键帧,如果两个关键帧共享相同的地图点(至少15个),那么它们之间就存在一条边,边的权重
θ
\theta
θ是共同地图点的数量。
为了矫正一个回环,我们进行了一个像论文[6]位那样位姿图的优化,优化方法延着位姿图将闭环回路的误差进行分散。为了不包括由共视图提供的所有边缘,这可能是非常密集的,我们建议建立一个本质图,保留所有的节点(关键帧),但减少边缘,仍然保留一个强大的网络,产生准确的结果。该系统从最初的关键帧开始逐步建立一棵生成树,它提供了一个边缘数量最少的连接的可视化图的子图。当插入新的关键帧时,它会包含在连接到共享最多点观察的关键帧的树中,并且当筛选策略删除某个关键帧时,系统会更新受该关键帧影响的连接。本质图包含生成树、具有高可见度(
θ
m
i
n
θ_{min}
θmin? = 100)的共视图图中的边的子集,以及回环边,从而形成一个强大的相机网络。图2显示了一个可视度图、生成树和相关本质图的例子。如第VIII-E节的实验所示,在进行位姿图优化时,解决方案非常准确,以至于全局BA优化几乎不能提高解决方案。本质图的效率和
θ
m
i
n
θ_{min}
θmin?的影响在第VIII-E节最后讨论。
E. 基于图像词袋模型的位置识别
系统嵌入了一个基于DBoW2[5]词袋位置识别模块,用于执行回环检测和重定位。视觉词汇只是描述空间的离散化,即视觉词典。词汇表是使用从大量图像中提取的ORB描述符离线创建的。如果图像足够通用,相同的词汇表可以用于不同的环境以获得良好的性能,如我们之前的工作[11]所示。系统以增量方式构建一个包含反向索引的数据库,该索引存储词汇表中每个可视单词的关键帧,因此可以非常高效地查询数据库。通过筛选过程删除关键帧时,数据库也会更新。
由于关键帧之间存在视觉重叠,因此在查询数据库时,不会存在唯一的高分关键帧。原始DBoW2考虑了这种重叠,将时间相近的图像的分数相加。这有一个限制,即不包括查看相同位置但在不同时间插入的关键帧。相反,我们将在共视图中连接的关键帧分组。此外,我们的数据库将返回分数高于最佳分数75%的所有关键帧匹配。
文献[5]中详细介绍了用于特征匹配的词袋表示的另一个好处。当我们想要计算两组ORB特征之间的对应关系时,我们可以暴力匹配视觉字典树上某一层(我们在6层里面选第2层)的相同节点(关键帧)里的特征,从而加快搜索速度。我们在搜索匹配以三角化新点时,以及在回环检测和重新位时使用此技巧。我们还通过方向一致性测试(详情参见[11])来细化对应关系,该测试丢弃了异常值,确保所有对应关系的一致旋转。
关键帧之间的共视信息在我们系统的一些任务中非常有用,它被表示为一个无向加权图,如论文[7]一样。每个节点是一个关键帧,如果两个关键帧共享相同的地图点(至少15个),那么它们之间就存在一条边,边的权重
θ
\theta
θ是共同地图点的数量。
IV. 地图自动初始化
地图初始化的目标是计算两个帧之间的相对姿态,以三角化一组初始地图点。该方法应独立于场景(平面或一般),并且不需要人为干预来选择良好的双视图配置,即具有显著视差的配置。我们建议并行计算两个几何模型:假设平面场景的单应矩阵和假设非平面场景的基础矩阵。然后,我们使用一种启发式方法来选择一个模型,并尝试用所选模型的特定方法恢复相对姿势。本文算法只有当两个视图之间的视差达到安全阈值时,才进行地图初始化。如果检测到低视差的情况或已知两视图模糊的情况(如论文[27]所示),则为了避免生成一个有缺陷的地图而推迟初始化。我们的算法步骤如下:
-
1)查找初始对应关系:在当前帧
F
c
F_{c}
Fc?中提取ORB特征(仅在最小比例),与在参考帧
F
r
F_{r}
Fr?搜索匹配点对$\mathbf{x}{c} \longleftrightarrow \mathbf{x}{r} $。如果没有找到足够的匹配项,请重置参考帧。 -
2)两个模型的并行计算:在两个线程上并行计算单应矩阵
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)
\mathbf{x}_{c}=\mathbf{H}_{c r} \mathbf{x}_{r}, \quad \mathbf{x}_{c}^{T} \mathbf{F}_{c r} \mathbf{x}_{r}=0 \tag{1}
xc?=Hcr?xr?,xcT?Fcr?xr?=0(1) 在文献[2]中详细解释了基于RANSAC的归一化DLT算法和8点算法计算原理。为了使两个模型的过程一致,两个模型的迭代次数都预先设置成一样,以及每次迭代使用的点:八个特征点用于基础矩阵,四个特征点用于单应矩阵。在每次迭代中,我们计算每个模型
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
,
?if?
d
2
<
T
M
0
,
?if?
d
2
≥
T
M
(2)
\begin{aligned} S_{M}=& \sum_{i}\left(\rho_{M}\left(d_{c r}^{2}\left(\mathbf{x}_{c}^{i}, \mathbf{x}_{r}^{i}, M\right)\right)\right.\\ &\left.+\rho_{M}\left(d_{r c}^{2}\left(\mathbf{x}_{c}^{i}, \mathbf{x}_{r}^{i}, M\right)\right)\right) \\ \rho_{M}\left(d^{2}\right)=&\left\{\begin{array}{lll} \Gamma-d^{2}, & \text { if } & d^{2}<T_{M} \\ 0, & \text { if } & d^{2} \geq T_{M} \end{array}\right. \end{aligned} \tag{2}
SM?=ρM?(d2)=?i∑?(ρM?(dcr2?(xci?,xri?,M))+ρM?(drc2?(xci?,xri?,M))){Γ?d2,0,??if??if??d2<TM?d2≥TM???(2)
其中
d
c
r
2
d_{c r}^{2}
dcr2?和
d
r
c
2
d_{r c}^{2}
drc2?是一帧到另一帧的对称传递误差,其计算方法参见文献[2]。
T
M
T_{M}
TM?是无效数据的排除阈值,它的依据是
χ
2
\chi^{2}
χ2测试的95%(
T
H
=
5.99
T_{H}=5.99
TH?=5.99,
T
F
=
3.84
T_{F}=3.84
TF?=3.84,假设在测量误差上有1个像素的标准偏差)。
Γ
\Gamma
Γ的定义等于
T
H
T_{H}
TH?,这样两个模型在有效数据上对于同一误差
d
d
d的分值相同,再次使过程保持一致。
我们保持单应矩阵和基本矩阵得分最高。如果找不到模型(没有足够的内联),我们将从步骤1重新计算该过程。
-
3)模型选择: 如果场景是平面的、接近平面的或有低视差的,可以用单应矩阵求解。然而,也可以找到一个基础矩阵,但这个问题没有得到很好的约束[2],任何试图从基础矩阵恢复运动的做法都会产生错误的结果。我们应该选择单应矩阵,因为重建方法将正确地从平面初始化,或者它将检测到低视差的情况不进行初始化。另一方面,对于非平面场景且有足够的视差的情况则可以通过基础矩阵来计算,而在这种情况下单应矩阵只有基于平面点或者低视差的匹配点才能找到。在这种情况下,我们应该选择基本矩阵。我们发现,我们利用如下强大的启发式进行计算:
R
H
=
S
H
S
H
+
S
F
(3)
R_{H}=\frac{S_{H}}{S_{H}+S_{F}} \tag{3}
RH?=SH?+SF?SH??(3) 如果
R
H
>
0.45
R_{H}>0.45
RH?>0.45,这种情况选择单应矩阵,这充分体现了二维平面和低视差情况。否则,我们就选择基础矩阵。 -
4)运动恢复中的运动和结构: 一旦选择了模型,我们将获取相关的运动状态。在单应矩阵的情况下,我们使用Faugeras和Lustman的在文献[23]方法提取了八个运动假设。该方法提出用cheriality测试来选择有效解。但是,如果低视差,这些测试就会失败,因为点很容易在相机的前面或后面移动,这可能导致选择错误的解。我们建议直接对这八种解进行三角化,并检查是否存在一种解,该解中的大多数点都在两台相机前面,且重投影误差较低。如果没有明确的解,我们不会初始化并从步骤1继续。这种解的消歧技术使得我们的初始化在低视差和双重模糊条件下具有鲁棒性,可以认为是我们方法鲁棒性的关键。
在基础矩阵的情况下,我们使用标定矩阵
K
K
K用下式将其转换为本质矩阵,
E
r
c
=
K
T
F
r
c
K
(4)
\mathbf{E}_{r c}=\mathbf{K}^{T} \mathbf{F}_{r c} \mathbf{K} \tag{4}
Erc?=KTFrc?K(4)
然后用文献[2]中奇异值分解方法计算出四个运动解。我们对这四个解进行三角化,以得到正确的解。
- 5)Bundle adjustment:
最后,我们执行完整的BA(详情见附录)以优化初始重建。如图3所示对论文[39]显示了户外NewCollege机器人图像序列中的一个具有挑战性的初始化例子。可以看出PTAM和LSD-SLAM是如何在一个平面内初始化所有的点的,而我们的方法则是等到有足够的视差时,从基础矩阵中正确地初始化。
图3、上图:PTAM,中图:LSD-SLAM,下图:ORB-SLAM,在NewCollege序列中初始化一段时间后[39]。PTAM和LSD-SLAM初始化了一个错误的平面地图,而我们的方法在检测到足够的视差时,已经从基础矩阵自动初始化了。根据手动选择的关键帧,PTAM也能够很好地初始化。
V. 跟踪
在本节中,我们将描述跟踪线程的步骤,这些步骤是使用相机的每一帧执行的。在几个步骤中提到的相机位姿优化只包括运动BA,详见附录。
A. ORB特征提取
我们以1.2的比例因子在八层图像金字塔上提取FAST角点。对于512×384到752×480像素的图像分辨率,我们发现适合提取1000个角点;对于更高的分辨率,如KITTI数据集[40]中的1241×376,我们提取2000个角点。为了确保均匀分布,我们在网格中划分每个尺度级别,试图在每个单元中提取至少五个角点。然后,我们检测每个单元中的角点,如果没有找到足够的角点,则调整搜索阈值。如果某些单元格不包含角点(无纹理或对比度低),则每个单元格保留的角点数量也会调整。然后在保留的快速角点上计算方向和ORB特征描述子。ORB特征描述子用于所有特征匹配,而不是像PTAM算法中那样根据图像区块的相关性进行搜索。
B. 通过前一图像帧估计相机的初始位姿
如果上一帧的跟踪成功,我们将使用匀速运动模型预测相机姿态,并对上一帧中观察到的地图点执行搜索。如果没有找到足够的匹配点(即,显然不是匀速运动模型),我们将在最后一帧中对其位置周围的地图点进行更广泛的搜索。然后利用找到的对应关系位姿进行优化。
C. 通过全局重定位来初始化位姿
如果跟踪丢失,我们将计算当前帧的词袋向量,并在识别数据库中查询候选关键帧以进行全局重定位。如第III-E节所述,我们计算每个关键帧中与地图点相关的ORB特征的对应关系。然后,我们对每个关键帧轮流执行RANSAC迭代,并尝试使用PnP算法找到相机位姿[41]。如果我们找到一个具有足够有效数据的相机位姿,我们将优化该位姿,并对候选关键帧的地图点执行更多匹配的搜索。最后,再次优化相机姿势,如果有足够的有效数据支持,跟踪过程将继续。
D. 跟踪局部地图
一旦我们有了相机位姿的估计和一组初始的特征匹配,我们就可以将地图投影到图像中,并搜索更多的地图点对应关系。为了降低大地图的复杂性,我们只投影一个局部地图。该局部地图包含与当前帧共享地图点的关键帧
K
1
\mathcal{K}_{1}
K1?,以及与共视图中的关键帧
K
1
\mathcal{K}_{1}
K1?相邻的
K
2
\mathcal{K}_{2}
K2?。局部地图还有一个参考关键帧
K
ref?
∈
K
1
K_{\text {ref }} \in \mathcal{K}_{1}
Kref??∈K1?,它与当前帧共享大多数地图点。现在,在当前帧中搜索
K
1
\mathcal{K}_{1}
K1?和
K
2
\mathcal{K}_{2}
K2?中看到的每个地图点,如下所示:
- 1) 计算当前帧中的地图点投影
x
\mathbf{x}
x。如果超出图像边缘,就将对应的地图点删除
- 2)计算当前观测射线
v
\mathbf{v}
v与地图点平均观测方向
n
\mathbf{n}
n之间的角度。 如果
v
?
n
<
cos
?
(
6
0
°
)
\mathbf{v} \cdot \mathbf{n}<\cos \left(60^{\circ}\right)
v?n<cos(60°),则将对应的地图点删除。
- 3)计算从地图点到相机中心的距离
d
d
d。如果超出了地图点的尺度不变区域,即
d
?
[
d
m
i
n
,
d
m
a
x
]
d \notin\left[d_{\mathrm{min}}, d_{\mathrm{max}}\right]
d∈/?[dmin?,dmax?],则删除该地图点。
- 4) 通过
d
/
d
min
?
d / d_{\min }
d/dmin?计算每帧中的尺度。
- 5) 对比地图点的特征描述子
D
D
D和当前帧中还未匹配的ORB特征,在预测的尺度层和靠近
x
\mathbf{x}
x的点作最优匹配。
相机位姿最后通过当前帧中获得所有的地图点进行优化。
E. 新关键帧决策
最后一步是决定当前帧是否可以作为关键帧。由于局部地图构建的过程中有一个机制去筛选冗余的关键帧,所以我们需要尽快地插入新的关键帧以保证跟踪线程对相机的运动更具鲁棒性,尤其是对旋转运动。要插入一个新的关键帧,必须满足以下所有条件。
- 1)上次全局重新定位必须超过20帧图像
- 2)局部地图处于空闲状态,或者从上次插入关键帧开始已超过20帧
- 3)当前帧跟踪至少50个地图点
- 4)当前帧跟踪的点数少于
K
r
e
f
K_{\mathrm{ref}}
Kref?的90%。
我们不像PTAM那样使用到其他关键帧的距离标准,而是施加最小的视图变换(条件4)。条件1确保良好的重新定位,条件3确保良好的跟踪。如果在局部地图处于忙碌状态时插入了关键帧(条件2的后半部分),则会发送一个信号来停止局部BA,以便它能够尽快处理新的关键帧。
VI. 局部建图
这章我们将描述根据每个新的关键帧
K
i
K_{i}
Ki?构建局部地图的步骤。
A. 关键帧插入
首先,我们更新共视图,为
K
i
K_{i}
Ki?添加一个新关键帧节点,并用其他关键帧更新共享地图点产生的边。然后,我们用具有大多数公共点的关键帧更新连接
K
i
K_{i}
Ki?的生成树。然后,我们计算关键帧的词袋,并利用三角化生成新的地图点。
B. 地图点筛选
为了保留在地图中,地图点必须在创建后的前三个关键帧期间通过严格测试,以确保它们是可跟踪的,并且不会被错误地三角化,即由于错误的数据而被三角化的。一个点必须满足这两个条件。
- 1) 跟踪必须在预测可见的25%以上的关键帧中找到该点。
- 2) 如果从地图点创建经过了多个关键帧,则它必须至少是能够被其他3个关键帧观测到。一旦地图点通过此测试,只有在任何时候从少于三个关键帧观察到它时,才能将其删除。当删除关键帧和局部BA排除异常观测值时,可能会发生这种情况。此策略使我们的地图包含很少的无效数据。
C. 新地图点创建
新的地图点是通过在共视图中对连接的关键帧
K
c
\mathcal{K}_{c}
Kc?中的ORB进行三角化来创建的。对于
K
i
K_{i}
Ki?中的每个不匹配的ORB,我们搜索与其他关键帧中其他不匹配的点的匹配。这种匹配是按照第III-E节的解释进行的,并丢弃那些不符合对极约束的匹配。ORB对被三角化,为了接受新的点,两个相机的深度信息、视差、重投影误差和尺度一致性被检查。最初,一个地图点是从两个关键帧中观察到的,但它可以在其他关键帧中匹配;因此,它被投射到其余连接的关键帧中,并按照第五部分-D节的详细内容搜索对应关系。
D. 局部BA
局部BA优化当前处理的关键帧
K
i
K_{i}
Ki?、共视图
K
c
K_{c}
Kc?中与其连接的所有关键帧以及这些关键帧看到的所有地图点。看到这些点但未连接到当前处理的关键帧的所有其他关键帧都包括在优化中,但保持固定。标记为无效的观测值将在优化的期间被丢弃。有关此优化的更多详细信息,请参见附录。
E.局部关键帧筛选
为了保持简洁的重建,局部地图试图检测多余的关键帧并删除它们。这是有好处的,因为BA的复杂性随着关键帧数量的增加而增加,而且还因为它可以在相同的环境中一直运行,因为关键帧的数量不会无限制地增长,除非场景中的视觉内容发生变化。我们放弃
K
c
K_{c}
Kc?中所有的关键帧,这些关键帧中90%的地图点至少在其他三个相同或更精细的关键帧中出现过。这个尺度条件保证了地图点保持在关键帧中,而它们是以最精确的方式测量的。这个政策的灵感来自于Tan等人[24]的工作中提出的策略,其中关键帧在变化检测过程中被删除了。
VIII. 实验
我们在NewCollege的大型机器人序列[39]中对我们的系统进行了广泛的实验验证,评估了系统的总体性能,在TUM RGB-D基准的16个手持室内序列[38]中,评估了定位精度、重定位和程序运行能力,并在KITTI数据集[40]的10辆车户外序列中,评估实时大场景下操作、定位精度和位姿图优化的效率。
我们的系统实时运行,并以获得的帧速率精确处理图像。我们使用Intel Core i7-4700MQ(四核@2.40 GHz)和8GB RAM进行了所有实验。ORB-SLAM有三个主线程,它们与来自ROS和操作系统的其他任务并行运行,这在结果中引入了一些随机性。出于这个原因,在一些实验中,我们报告了几次运行的中间结果。
图4、在NewCollege序列中检测到的回环示例。我们绘制了支持所发现的相似性变换对应关系。
图5、NewCollege序列中回环前后的映射。回环匹配以蓝色绘制,轨迹以绿色绘制,此时用于跟踪的局部地图以红色绘制。局部地图在闭合后会沿着环的两侧延伸。
A. 基于NewCollege数据集测试系统性能
NewCollege数据集[39]包含一个机器人穿越校园和邻近公园的2.2公里的序列。该序列是由一个双目相机以20帧/秒的速度和512×382的分辨率记录的。它包含几个回环和快速旋转,这使得该序列对单目视觉具有相当的挑战性。据我们所知,文献中没有其他单目系统能够处理这整个序列。例如,Strasdat等人[7],尽管能够回环检测并在大场景环境中工作,但只对这个序列的一小部分显示了单目结果。
图6、ORB-SLAM重建了NewCollege的完整序列。右侧较大的回环以相反方向遍历,未发现可视的回环;因此,它们并不完全对齐。
表一 NEWCOLLEGE的跟踪和建图时间
作为我们的回环程序的一个例子,我们在图4中展示了对一个具有支持相似变换有效数据的回环检测。图5显示了回环前后的重建情况。红色显示的是局部地图,环路闭合后的地图沿着环路闭合的两边延伸。图6显示了以真实帧率处理完整序列后的整个地图。右边的大回环没有完全对齐,因为它是以相反的方向穿越的,而且地方识别程序无法找到回环。
我们提取了实验中每个线程所花费时间的统计数据。表一显示了跟踪和局部建图的结果。跟踪工作的帧速率约为25–30 Hz,这是跟踪局部地图所需的最多时间。如果需要,可以减少此时间,以限制局部地图中包含的关键帧的数量。局部BA的时间根据机器人探索环境的状态变动,即在未探索环境下所需时间多,在已经探索过的环境下运行所需时间少,因为在未知环境中如果跟踪线程插入一个新的关键帧,BA优化会被中断,如第5部分E节所示。如果不需要插入新的关键帧,局部BA优化则会执行大量已经设置的迭代程序。
表II显示了找到的六个回路闭合的结果。可以看出回环检测是如何随着关键帧的数量呈次线性增加的。这是由于对数据库的高效查询,仅将图像与常见的单词进行比较,这证明了词袋模型在位置识别中的潜力。我们的本质图中包含的边缘是关键帧数量的5倍,它是一个稀疏图。
B. 基于TUM RGB-D标准库的定位精度
TUM RGB-D基准[38]是评估相机定位精度的优秀数据集,因为它提供了多个序列,这些序列具有通过外部运动捕捉系统获得的精确地面真实值。我们丢弃了那些我们认为不适用于纯单目SLAM系统的序列,因为它们包含强旋转、无纹理或无运动。
为了进行比较,我们选择了最近提出的直接法半稠密LSD-SLAM(论文[10])和经典算法PTAM[4]。我们还与RGBD-SLAM[43]生成的轨迹进行了比较,这些轨迹是为基准网站中的一些序列提供的。为了将ORB-SLAM、LSD-SLAM和PTAM与地面实况进行比较,我们使用相似性变换将关键帧的轨迹对齐,因为尺度是未知的,并测量绝对轨迹误差[38]。在RGBD-SLAM的情况下,我们用刚体变换来对齐轨迹,但也用相似性来检查比例是否恢复得很好。LSD-SLAM从随机深度值初始化,需要时间来收敛;因此,在与地面实况比较时,我们放弃了前十个关键帧。对于PTAM,我们手动选择了两个帧,从中获得了良好的初始化。表三显示了在所选16个序列中每个序列的5次执行的中间结果。
可以看出,ORB-SLAM可以处理除fr3_nostructure_texture_far (fr3_nstr_tex_ far)以外的所有序列。这是一个平面场景,因为相机相对于平面的轨迹有两种可能的解释,即文献[27]中描述的双重模糊。我们的初始化方法检测到模糊性,为了安全起见不进行初始化。PTAM初始化有时选择真正的解决方案,有时选择错误的解决方案,在这种情况下,错误是不可接受的。我们没有注意到LSD-SLAM有两次不同的重构,但是这个序列的错误非常多。在其余的序列中,PTAM和LSD-SLAM的鲁棒性都不如我们的方法,分别在8个和3个序列中丢失了跟踪。
就准确性而言,ORB-SLAM和PTAM在开放的轨迹中是相似的,而ORB-SLAM在检测大的回环时,如在序列fr3_nostructure_texture_near_withloop(fr3_nstr_tex_near)中取得了更高的准确性。最令人惊讶的结果是,PTAM和ORB-SLAM都明显比LSD-SLAM和RGBD-SLAM更准确。其中一个可能的原因是,他们将地图优化减少为位姿图优化,其中传感器的测量值被丢弃,而我们进行BA,同时通过传感器测量优化相机的姿态和地图的点位置,这是解决运动结构的经典标准算法[2]。我们在第九节B中进一步讨论这一结果。另一个有趣的结果是,LSD-SLAM对动态物体的鲁棒性似乎不如我们的系统,这在fr2_desk_with_person和fr3_walking_xyz中可以看到。
我们注意到RGBD-SLAM在fr2序列中存在尺度偏差,将轨迹对准7自由度显著降低了误差。最后,值得注意的是,Engel等人在论文[10]中提出在fr2_xyz中PTAM的精度低于LSD-SLAM, RMSE为24.28 cm。然而,这篇论文没有给出这些结果是如何获得的足够细节,而且我们也无法复现它们。
C. 基于TUM RGB-D标准数据库的重定位
我们在TUM RGB-D基准中进行了两个重定位的实验。在第一个实验中,我们用fr2_xyz序列的前30秒建立一个地图,对每一个连续的帧进行全局重定位,并评估恢复的位姿的准确性。我们用PTAM进行同样的实验来进行比较。图7显示了用于创建初始地图的关键帧,重定位的帧的位姿,以及这些帧的真值。可以看出,由于PTAM的重定位方法的不变性很小,它只能重定位附近关键帧的帧。表四显示了与地面实况有关的召回率和误差。ORB-SLAM比PTAM准确地重定位了一倍以上的帧。在第二个实验中,我们用序列fr3_sitting_xyz创建一个初始地图,并尝试重新定位fr3_walking_xyz的所有帧。这是一个具有挑战性的实验,因为由于人们在场景中移动,存在很大的遮挡。在这里,PTAM没有发现任何重新定位的情况,而我们的系统重定位了78%的帧,如表四所示。图8显示了我们的系统在这些实验中进行的具有挑战性的重定位的一些例子。
图7所示、fr2_xyz中的重定位实验。Map最初是在序列(KFs)的前30秒中创建的。目标是重新定位后续的帧。成功的重新定位?我们的系统和PTAM显示。ground truth (GT)仅在重新定位的框架中显示。
D. 基于TUM RGB-D标准数据集测试算法的运行时长
以前的重定位实验表明,我们的系统能够从非常不同的视角在地图中进行定位,并且在适度的动态环境下也能稳健地定位。这一特性与我们的关键帧筛选程序相结合,使我们能够在不同视角和一些动态变化下在同一环境中一直运行。
图8所示、我们的系统在重定位实验中成功地找到了具有挑战性的重定位(剧烈的尺度变化,动态对象)实例。
图9所示、在静态环境中进行实验,相机总是从不同的角度看同一个地方。PTAM总是插入关键帧,而ORB-SLAM能够删除冗余关键帧并维护一个一定大小的地图。
在一个完全静态的场景中,我们的系统能够保持关键帧的数量,即使相机从不同的角度看场景。我们在一个自定义序列中演示了它,相机在93秒内看着相同的桌子,但执行一个轨迹,使视点总是变化的。我们在图9中比较了我们的地图和由PTAM生成的关键帧数量的变化。可以看出,PTAM总是插入关键帧,而我们删除冗余关键帧的机制使其数量稳定在一个范围内。
虽然在静态情况下的正常操作应该是任何SLAM系统的要求,但更有趣的是发生动态变化的情况。我们通过连续运行fr3的动态序列来分析我们的系统在这种情况下的行为:sitting_xyz, sitting_halfsphere, sitting_rpy, walking_xyz, walking_halfspehere, and walking_rpy。所有的序列都将相机对准同一张桌子,但执行不同的轨迹,同时人们在移动并改变一些物体如椅子。图10(a)显示了地图中关键帧总数的变化,图10(b)显示了每个关键帧的创建和删除关键帧,显示了关键帧在地图中存活的时间。可以看出,在前两个序列中,由于第一次看到场景的所有视图,地图的大小不断增加。在图10(b)中,我们可以看到,在前两个序列中创建的几个关键帧在整个实验过程中都保留在地图中。在sitting_rpy和walking_xyz的序列中,地图没有增长,因为到目前为止创建的地图很好地解释了场景。相反,在最后两个序列中,更多的关键帧被插入,表明在场景中还有一些新的东西没有被表现出来,这可能是由于动态变化造成的。最后,图10?显示了关键帧的直方图,根据它们在序列创建时的剩余时间中的存活时间来计算。可以看出,大部分的关键帧在创建后不久就被筛选程序删除了,只有一小部分存活到实验结束。一方面,这表明我们的系统有一个关键帧生成策略,这在探索中执行突然的运动时非常有用。另一方面,系统最终能够从这些关键帧中选择一个小的代表性关键帧。
在整个实验中,我们已经证明了我们的地图是随着场景内容而增长的,而不是随着时间而增长的,并且能够存储场景的动态变化,这对于通过在环境中积累经验来执行一些场景理解是有用的。
图10所示、在TUM RGB-D基准的动态环境中进行长时间实验。(a)地图中关键帧数目的演变。(b)关键帧的创建和删除。每条水平线对应一个关键帧,从创建帧到删除帧。?所有生成关键帧的存活时间相对于实验剩余时间的直方图。
E. 基于KITTI数据集测试算法在大场景大回环下的性能对比
来自KITTI数据集[40]的里程测量基准包含了11个序列,这些序列来自一辆在居民区附近行驶的汽车,从GPS和Velodyne Laser Scanner激光扫描仪获得精确的地面情况。对于单目视觉来说,这是一个非常具有挑战性的数据集,因为快速旋转,有很多叶子的区域,这使得数据关联更加困难,并且相对较高的汽车速度,是10帧/秒记录的序列。我们以记录的真实帧率播放序列,ORB-SLAM能够处理除序列01以外的所有序列,序列01是一条高速公路,几乎没有可跟踪的近距离物体。序列00、02、05、06、07和09包含我们系统正确检测并关闭的回环。序列09包含一个回环,只能在序列末尾的几帧中检测到,我们的系统并不总是检测到它(提供的结果是检测到它的执行)。
图11和图12显示了我们的轨迹和地面情况的定性比较。在TUM RGB-D基准测试中,我们使用相似变换将系统的关键帧轨迹和地面真相对齐。我们可以将图11和12中的结果与Lim等人最近采用单目SLAM方法得到的序列00、05、06、07和08的结果进行定性比较[25,图10]。ORB-SLAM在所有这些序列中都能产生更精确的轨迹,但在08序列中它们似乎漂移更少。
图11所示。序列00、05和07来自KITTI数据集的里程计基准。(左)点和关键帧轨迹。(中)轨迹和地图。(右)全BA迭代20次后的轨迹。我们的系统的输出是相当准确的,但它可以通过一些BA的迭代略有改进
图12、来自KITTI数据集里程计基准的序列02、03、04、06、08、09和10中的ORB-SLAM关键帧轨迹。序列08不包含回路,漂移(尤其是尺度)未被校正。(a)序列02。(b)序列03。?序列04。(d)序列06。(e)序列08 (f)序列09。(g)序列10。
表五显示了每个序列中五个执行过程中关键帧轨迹的RMSE误差中值。我们还提供了地图的尺寸,以便将误差放在背景中。结果表明,我们的系统非常准确,轨迹误差通常在其尺寸的1%左右,有时更小,如序列03的误差为0.3%,或更高,如序列08的5%。在序列08中,没有回环,漂移不能被纠正,这清楚地表明需要回环检测以实现精确的重建。
在这个实验中,我们还检查了在每个序列的末尾执行20次全BA迭代(详情参见附录),可以在多大程度上改进重构。我们已经注意到,全BA的一些迭代在有回环的轨迹中略微提高了精度,但在开环轨迹中它的影响微不足道,这意味着我们的系统的输出已经非常精确。在任何情况下,如果需要最精确的结果,我们的算法提供了一组匹配,定义了一个强大的相机网络,和一个初始估计,使完整的BA在几次迭代中收敛。
最后讲一下我们算法的闭环检测和用于本质图边缘的
θ
m
i
n
θ_{min}
θmin?的效率。我们选择视频09(一段非常长的图像序列,在最后有一个闭环),然后评估不同的闭环检测算法。表6是关键帧轨迹RMSE和不同情况下没有闭环检测优化所用的时间,表中的相关内容包括:如果直接采用全局BA优化(20层或100层迭代)的情况,如果只用位姿图优化(10层迭代不同数量的边缘)的情况,如果先用位姿图优化再执行全局BA优化的情况。结果表明,在闭环检测之前,算法的RMSE误差较大,以至于BA优化没办法收敛,即便是迭代100次之后后误差仍旧非常大。另一方面,本质图优化收敛速度很快,而且结果也更精确。
θ
m
i
n
θ_{min}
θmin?对精度影响并不大,减少边缘的数量会明显降低精度。位姿图优化后再执行一个BA优化则可以增加精度,但时间也增加了。
IX. 结论和讨论
A. 结论
在本研究中,我们提出了一种新的单目SLAM系统,详细描述了其构建模块,并在公共数据集中进行了详尽的评估。我们的系统已经证明,它可以处理室内和室外场景、汽车、机器人和手持动作的序列。该系统的精度通常在小型室内场景下低于1厘米,在大型室外场景下为几米(一旦我们将尺度与地面实际情况对齐)。
目前,Klein和Murray[4]的PTAM被认为是最准确的单目SLAM方法。PTAM的后端是BA,这并不是巧合,众所周知,BA是离线结构从运动问题的经典方法[2]。PTAM和Mouragnon[3]的早期工作的主要成功之一是将这些知识带入机器人SLAM社区并展示其实时性能。我们工作的主要贡献是将PTAM的多功能性扩展到对该系统来说难以解决的环境中。为了实现这一目标,我们从头开始设计了一个新的单目SLAM系统,其中有一些新的想法和算法,但也结合了过去几年开发的优秀作品,如Gálvez-López和Tardós的回环检测[5],Strasdat等人的回环检测程序和共视图[6]、[7],Kuemmerle等人的优化框架g2o[37],以及Rubble等人的ORB特征[9]。据我们所知,没有其他系统能在这么多不同的场景下工作,并且有这么高的精确度。因此,我们的系统是目前最可靠和完整的单目SLAM解决方案。我们新的生成和删除关键帧的策略允许每隔几帧就创建一个关键帧,如果认为是多余的,最终会被删除。这种灵活的地图扩展在条件较差的探索轨迹中非常有用,即接近于纯旋转或快速运动。在同一环境中重复操作时,仅当场景的视觉内容发生变化时,地图才会增长,从而存储其不同视觉外观的历史记录。通过分析这段历史,可以得出长期建图的有趣结果。
最后,我们还演示了ORB特性具有足够的识别能力,可以从严重的视角变化中进行位置识别。此外,它们的提取和匹配速度非常快(不需要多线程或GPU加速),能够实现实时准确的跟踪和建图。
B. 离散/特征SLAM方法与稠密/直接SLAM方法对比
最近的实时单目SLAM算法,如DTAM[44]和LSD-SLAM[10],能够对环境进行稠密或半稠密的重建,同时通过直接对图像像素强度进行优化来定位相机。这些直接的方法不需要特征提取,因此避免了相应的人工匹配。它们对模糊、弱纹理环境和高频率纹理(如沥青)也更加稳健[45]。与我们的系统或PTAM的稀疏点图相比,它们更密集的重建可能对其他任务更有用,而不仅仅是相机定位。
然而,直接方法有他们自己的局限。首先,这些方法假设真实场景中的物体的像是由该物体本身的表面反射模型产生的,因此,算法采用的光度一致性寻找匹配点的思路就限制了匹配点之间的基线距离,通常都比特征匹配点的基线要窄。这对重构的精度影响很大,因为重构需要较宽的基线来减少深度的不确定性。如果直接建模不准确,则可能会受到快门,自动增益和自动曝光的影响(如TUM RGB-D 的对比测试)。最后,由于直接方法计算要求较高,因此为了满足计算速度,DTAM算法采用地图增量式扩张的方法,而LSD-SLAM则丢掉传感器测量信息,将地图优化简化为为对位姿图的优化。
第一行显示了没有回环的结果。BA中括号间的数表示Levenberg-Marquardt (LM)迭代次数,EG(本质图)中构建本质图的次数为
θ
m
i
n
θ_{min}
θmin?。所有EG优化都要执行10次LM迭代。
图13所示。kitti09中不同闭环策略的比较。(a)无回环。(b) BA(20)。?(100)。(d) EG (100) + BA(20)。
相比之下,基于特征的方法能够匹配宽基线的特征,这得益于其对视点和光照变化的良好不变性。BA通过传感器测量联合优化相机的位姿和地图点。在结构和运动估计方面,Torr和Zisserman[46]已经指出了基于特征的方法相对于直接方法的优点。在本研究中,我们提供了基于特征的方法在实时SLAM中具有卓越准确性的实验证据(见第八部分-b节)。我们认为未来的单目SLAM应该结合这两种方法的优点。
C. 未来工作
在无穷远点的跟踪中,我们的系统的精度仍然可以得到提高。这些点,没有足够的视差,我们的系统没有包含在地图中,但对相机的旋转非常有用[21]。
另一个的方法是将我们系统的稀疏地图升级为更密集和更有用的重建。由于我们的关键帧选择,关键帧包括一个紧凑的环境摘要,具有非常高的位姿精度和丰富的共视信息。因此,ORB-SLAM稀疏地图可以是一个很好的初始估计框架,在此基础上可以建立一个密集和精确的场景地图。这个方向的首次尝试在论文[47]中有详细描述。
附录:非线性优化
- 1)Bundle Adjustment[1]:地图点3d位置
X
w
,
j
∈
R
3
X_{w, j} \in \mathbb{R}^{3}
Xw,j?∈R3,关键帧位姿
T
i
w
∈
S
E
(
3
)
T_{i w} \in S E(3)
Tiw?∈SE(3),其中
w
w
w为世界坐标,对匹配的关键点
x
i
,
j
∈
R
2
\mathbf{x}_{i, j} \in \mathbb{R}^{2}
xi,j?∈R2的重投影误差进行优化,使之最小。在关键帧
i
i
i中,对地图点
j
j
j的观测的误差项为:
e
i
,
j
=
x
i
,
j
?
π
i
(
T
i
w
,
X
w
,
j
)
(5)
\mathbf{e}_{i, j}=\mathbf{x}_{i, j}-\pi_{i}\left(\mathbf{T}_{i w}, \mathbf{X}_{w, j}\right) \tag5
ei,j?=xi,j??πi?(Tiw?,Xw,j?)(5)
其中
π
i
π_{i}
πi?是投影函数:
π
i
(
T
i
w
,
X
w
,
j
)
a
m
p
;
=
[
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
a
m
p
;
y
i
,
j
a
m
p
;
z
i
,
j
]
T
a
m
p
;
=
R
i
w
X
w
,
j
+
t
i
w
(6)
\begin{aligned} \pi_{i}\left(\mathbf{T}_{i w}, \mathbf{X}_{w, j}\right) &=\left[\begin{array}{l} 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{array}\right] \\ {\left[\begin{array}{lll} x_{i, j} & y_{i, j} & z_{i, j} \end{array}\right]^{T} } &=\mathbf{R}_{i w} \mathbf{X}_{w, j}+\mathbf{t}_{i w} \end{aligned} \tag 6
πi?(Tiw?,Xw,j?)[xi,j??amp;yi,j??amp;zi,j??]T?amp;=[fi,u?zi,j?xi,j??+ci,u?fi,v?zi,j?yi,j??+ci,v??]amp;=Riw?Xw,j?+tiw??(6)
其中,
R
i
w
∈
S
O
(
3
)
R_{i w} \in S O(3)
Riw?∈SO(3)和
t
i
w
∈
R
3
\mathbf{t}_{i w} \in \mathbb{R}^{3}
tiw?∈R3分别是
T
i
w
T_{i w}
Tiw?的旋转和平移部分,
(
f
i
,
u
,
f
i
,
v
)
\left(f_{i, u}, f_{i, v}\right)
(fi,u?,fi,v?)和
(
c
i
,
u
,
c
i
,
v
)
\left(c_{i, u}, c_{i, v}\right)
(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}\left(\mathbf{e}_{i, j}^{T} \boldsymbol{\Omega}_{i, j}^{-1} \mathbf{e}_{i, j}\right) \tag7
C=i,j∑?ρh?(ei,jT?Ωi,j?1?ei,j?)(7)
其中
ρ
h
\rho_{h}
ρh?是Huber鲁棒损失函数,
Ω
i
,
j
=
δ
i
,
j
2
I
2
x
2
\Omega_{i, j}=\delta_{i, j}^{2} I_{2 x 2}
Ωi,j?=δi,j2?I2x2?是与检测到关键点的尺度相关的协方差矩阵。在完全BA的情况下(在第四节解释的地图初始化中使用,在第八部分 e节的实验中使用),我们优化所有的点和关键帧,除了第一个关键帧保持固定作为原点。在局部BA中(见章节VI-D),所有包含在局部区域中的点都被优化,而关键帧的子集是固定的。在位姿优化或仅运动的BA(见第五节)中,所有点都是固定的,只有相机的位姿是优化的。
- 2)基于Sim(3)约束的位姿图优化: 给定一个二元边的位姿图(见VII-D节),我们将边的误差定义为
e
i
,
j
=
log
?
Sim
?
(
3
)
(
S
i
j
S
j
w
S
i
w
?
1
)
(8)
\mathbf{e}_{i, j}=\log _{\operatorname{Sim}(3)}\left(\mathbf{S}_{i j} \mathbf{S}_{j w} \mathbf{S}_{i w}^{-1}\right) \tag8
ei,j?=logSim(3)?(Sij?Sjw?Siw?1?)(8)
其中,
S
i
j
S_{i j}
Sij?是在位姿图优化和设置比例因子为1之前,由SE(3)位姿计算出的两个关键帧之间的相对Sim(3)变换。对于回环边,这个相对变换用Horn[42]方法计算。
log
?
Sim
?
3
\log _{\operatorname{Sim} 3}
logSim3?[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}\left(\mathbf{e}_{i, j}^{T} \boldsymbol{\Lambda}_{i, j} \mathbf{e}_{i, j}\right) \tag9
C=i,j∑?(ei,jT?Λi,j?ei,j?)(9)
其中
Λ
i
,
j
\boldsymbol{\Lambda}_{i, j}
Λi,j?是边的信息矩阵,如[48],我们将其设为恒等式。我们修复回环关键帧来修复7个自由度。尽管这种方法是一个完整BA的粗略近似,我们在第八部分 e节中通过实验证明,它比BA有明显更快和更好的收敛性。
- 3)相对Sim(3)优化:给定关键帧1和关键帧2之间的一组n匹配
i
?
j
i \Rightarrow j
i?j(关键点及其相关的3D地图点),我们想要优化相对Sim(3)变换
S
12
\mathbf{S}_{12}
S12?(请参见VII-B部分),使两幅图像的重投影误差最小化:
a
m
p
;
e
1
=
x
1
,
i
?
π
1
(
S
12
,
X
2
,
j
)
a
m
p
;
e
2
=
x
2
,
j
?
π
2
(
S
12
?
1
,
X
1
,
i
)
(10)
\begin{aligned} &\mathbf{e}_{1}=\mathbf{x}_{1, i}-\pi_{1}\left(\mathbf{S}_{12}, \mathbf{X}_{2, j}\right) \\ &\mathbf{e}_{2}=\mathbf{x}_{2, j}-\pi_{2}\left(\mathbf{S}_{12}^{-1}, \mathbf{X}_{1, i}\right) \end{aligned}\tag{10}
?amp;e1?=x1,i??π1?(S12?,X2,j?)amp;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}\left(\rho_{h}\left(\mathbf{e}_{1}^{T} \boldsymbol{\Omega}_{1, i}^{-1} \mathbf{e}_{1}\right)+\rho_{h}\left(\mathbf{e}_{2}^{T} \boldsymbol{\Omega}_{2, j}^{-1} \mathbf{e}_{2}\right)\right) \tag{11}
C=n∑?(ρh?(e1T?Ω1,i?1?e1?)+ρh?(e2T?Ω2,j?1?e2?))(11)
其中
Ω
1
,
i
\mathbf{\Omega}_{1, i}
Ω1,i?和
Ω
2
,
i
\mathbf{\Omega}_{2, i}
Ω2,i?是与图像1和2中关键点被检测到的尺度相关的协方差矩阵。在这个优化中,点是固定的。
|