ORB-SLAM2论文整理

摘要

本文提出了一种基于特征的在各种场景下可以实时的单目SLAM系统。该系统对严重的运动杂波具有很强的鲁棒性,允许宽基线环路关闭和重新定位,并包括全自动初始化。

介绍

BA根据强大的匹配网络和好的初始值猜想下能够提供精确的相机定位估计以及稀疏的几何重建:

https://hal.inria.fr/inria-00548290/document

为了在不限制计算成本的情况下获得准确的结果,实时SLAM算法必须向BA提供以下特性:

  • 场景特征(地图点)在选定帧(关键帧)子集中的对应观察
  • 随着关键帧数量的增加,复杂性也在增加,因此选择关键帧应该避免不必要的冗余
  • 一个强大的关键帧和点的网络配置,产生准确的结果,即一个良好的传播一组关键帧观测点与显著视差和大量的闭环闭合匹配
  • 对非线性优化的关键帧姿态和点位置进行了初步估计
  • 在局部地图的构建中优化关注于到达可扩展性。
  • 能够执行快速的全局优化(例如,位姿图),以实时闭环检测

第一个实时的BA:
https://ieeexplore.ieee.org/document/1640781/

然后是第一个并行的实时定位和建图的PTAM:(缺点是没有闭环检测,重定位后视点的低不变性,地图引导需要人为干预。重点关注关键帧的筛选,特征匹配,三角化,对每一帧的相机定位和跟踪失败后的重定位

https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4538852
ORB-SLAM的主要贡献:

  • 利用ORB特征进行跟踪、建图、重定位和闭环检测。在明暗和视角变化时提供不变的特征。
  • 大型环境中的实时操作。由于使用了可共视图,跟踪和建图都集中在局部可共视区域,而不受全局地图大小的影响。
  • 基于位姿图优化的实时闭环,我们称之为本质图。它是由系统维护的生成树、闭环检测链接和来自共视图的强边构建。
  • 对视点和光照具有显著不变性的实时相机重定位。这允许从跟踪失败中恢复,还增强了地图重用。
  • 一种新的基于模型选择的自动鲁棒初始化过程,允许创建平面和非平面场景的初始映射。
  • 适者生存的地图点和关键帧选择方法,在地图点和关键帧生成时任意,但在剔除时有强限制性。由于丢弃了冗余关键帧,该策略提高了跟踪的鲁棒性,并可以长时间运行。

相关工作

A.位置识别

A comparison of loop closing techniques in
monocular SLAM

本文介绍了几种位置识别的方法,最后得到的结论是图像到图像的匹配优于地图到地图和图像到地图的匹配。

在基于图像的识别方法中,大量使用
词袋模型,比如概率方法FAB-MAP
DBoW2第一次从FAST特征点中获取BRIEF描述子的二进制词袋模型。具有旋转和尺度不变性。

B.地图初始化

单目SLAM需要一个程序来创建初始地图,因为深度无法从单个图像中恢复。

初始化的方法:

  • 假设局部场景平面性,并利用Faugeras and Lustman的方法从单应图中恢复相机的相对姿态。
  • 对于一般的场景,可以利用五点法计算基本矩阵。

本文提出了一种新的基于平面场景的单应性和非平面场景的基本矩阵模型选择的自动方法。(第四部分)
自动原则的方法基于Torr等人提出了一种模型选择的统计方法。基于类似的原理,我们开发了一种启发式初始化算法。

C.单目的同时定位和建图

单目slam一开始是基于滤波的方法:

在这种方法中,每一帧都经过滤波处理,共同估计地图特征位置和相机姿态。它在处理新信息较少的连续帧时存在计算量浪费和线性化误差积累的缺点。

slam还有基于关键帧的方法:
Real
time localization and 3D reconstruction
,
PTAM
仅使用选定的帧(关键帧)来估计地图允许执行计算成本高但准确的BA优化。PTAM原始版本后来进行了改进,增加了边缘特征、跟踪过程中的旋转估计步骤和更好的重定位方法。

Scale drift-aware large scale monocular SLAM是一种大场景下的单目SLAM系统,前端依赖于在GPU上运行的光流跟踪,利用FAST做匹配和运动优化的BA,后端采用基于滑窗的BA,用具有相似性约束的位姿图优化实现闭环检测。它可以修正单目相机中出现的尺度漂移。

Double
window optimisation for constant time visual SLAM
利用PTAM的前端,但仅在从可共视关系图检索的本地建图中执行跟踪。他们提出了一种双窗口优化后端,该后端在内部窗口中连续执行BA,在有限大小的外部窗口中执行位姿图。但是闭环仅在外部的窗口包括环形的所有帧的时候才有效。在本论文中,利用依赖于covisibility的本地建图,从covisibility graph建立pose graph的方法,将它们应用到完全重新设计的前端和后端,另外一个不同是我们没有使用特定的特征进行闭环检测(SURF),而是对相同的跟踪和建图特征进行位置识别,从而获得鲁棒的帧速率重定位和闭环检测。

CD-SLAM是一个包括闭环检测,重定位,大规模操作的应用于动态环境的很完整的系统。但是没有建图的初始化。缺少公共实现不允许我们对准确性、健壮性或大规模功能进行比较。

Parallel, real-time monocular visual odometry利用ORB特征做跟踪和一个短滑窗的后端BA。这个系统比较简单,没有重定位闭环检测等,可以看一看

LSD-SLAM利用直接法可以建立大规模的半稠密的地图,在没有GPU的情况下也可以实时的运行。但是仍需要特征做闭环检测,重定位精度低。

为每一帧每个点做BA优化是不可行的,最好的办法是保留尽可能多的点和关键帧做优化。PTAM方法是非常谨慎地插入关键帧,以避免计算复杂度的过度增长。我们的适者生存策略通过尽可能快地插入关键帧,然后删除冗余帧,以避免额外的成本,在困难的场景中实现了前所未有的健壮性。

系统概览

A.特征选择

ORB-SLAM设计的一个理念就是在跟踪建图,场景识别,闭环检测和重定位的过程中用同一种特征,**避免了像以前的工作一样,从近SLAM特征中插入识别特征的深度。**ORB要求特征检测小于33ms,SIFT(300ms), SUFT(300ms), A-KAZE(100ms)。为了有位置识别能力,还需要特征点具有旋转不变性,这包括了BRIEFLDB。最后我们选择了ORB,他具有多尺度的FAST角点和256位的描述子。计算和匹配速度极快,而且对视点具有良好的不变性。这使得我们可以用更宽的基线来匹配它们,从而提高BA的准确性

B.三线程:跟踪建图和闭环

跟踪是负责定位相机的每一帧,并决定何时插入一个新的关键帧。用特征点和前一帧做匹配然后用motion-only BA 优化相机位姿。如果跟踪突然失败,位置识别模块开始执行全局的重定位。**一旦相机姿态和特征匹配有了初始估计,就可以利用关键帧的covisibility graph恢复局部检索建图。**然后利用重投影搜索地图点,利用所有的匹配点重新做相机位姿优化。最后,跟踪线程决定是否插入新的关键帧。

局部建图处理新的关键帧,并执行局部BA,在摄像机姿态的环境中实现最优环境重建。在共视图的连通关键帧中搜索新关键帧中不匹配球体的新对应关系,对新点进行三角化。在创建后的一段时间内,根据跟踪过程中收集到的信息,应用苛刻的点筛选策略,只保留高质量的点。局部建图还负责剔除冗余关键帧。

对每一个新的关键帧进行闭环检测。如果检测到一个闭环,我们将计算一个相似性转换,该转换通知闭环中累积的漂移,将闭环两边对齐,并融合重复的点;最后,在相似度约束下进行位姿图优化,实现全局一致性。最新奇的地方是我们对Essential Graph和covisibility graph的稀疏子图进行了优化。使用在g2o[37]中实现的Levenberg-Marquardt算法进行所有优化。

C.地图点和关键帧的筛选

每个地图点存储以下内容:

1)在世界坐标系下的3D坐标值

2)观测的方向n_i,是观测点和相机光心的射线

3)代表ORB描述子的D_i

4)根据尺度不变性可以看到的该点的最大尺寸和最小尺寸d_min, d_max

每个关键帧存储的:

相机的位姿T_iw(把刚体从世界坐标系转换到相机坐标系)
相机的内参

在帧中提取的所有ORB特征,无论是否与一个地图点相关联,如果提供一个失真模型,则该点的坐标是不失真的

地图点和关键帧是用很宽松的方法生成的,之后还要进行很严格的剔除机制来检测冗余关键帧和错误匹配或不可跟踪的地图点。

D.Covisibility Graph and Essential Graph

Covisibility(共视)信息用无向权重图的方法表示:

https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6126517

每个节点都是一个关键帧,如果两个关键帧之间同时观测到大于15个的地图点,他们之间就有一个边,权重的值是共视的地图点的数量。

为了修正一个闭环,我们执行位姿图优化,
沿着图分配闭环的误差这可能是非常密集的,所以本文建立Essential Graph,保留所有的节点(关键帧),但更少的边缘,仍然保留一个强大的网络,产生准确的结果。该系统从初始关键帧开始,逐步构建一个生成树,生成树提供了具有最小边数的共视图的连通子图。当插入一个新的关键帧时,它被包含在链接到具有最多共视点的关键帧的树中,当一个关键帧被剔除策略删除时,系统更新受该关键帧影响的链接。Essential Graph 包含最小生成树,从共视图中得到的边的子集有很强的共视关系(大于100个共视点)。闭环的边,形成了强大的摄像网络

E.重定位的词袋模型

该系统嵌入了一个基于DBoW2的词袋位置识别模块,实现了循环检测和重定位。视觉词汇是用离散化的方法描述空间。视觉词汇是从多幅图像中的ORB描述子中离线生成的。系统逐渐生成一个包含转化的索引的数据库,其中存储了词典中的视觉词汇,在哪个关键帧中出现。这样就可以非常高效地查询数据库。当筛选过程删除关键帧时,数据库也会更新。

词袋模型考虑了关键帧的重叠,及时把闭环的图像的分数增大,这有一个限制,即不包括查看相同位置的关键帧,而是在不同的时间插入,相反,我们将连接在共可见图中的关键帧分组。此外,我们的数据库返回所有得分高于最佳得分的75%的关键帧匹配。

当我们想要计算两组ORB特性之间的对应关系时,我们可以将蛮力限制为仅匹配词汇表树中相同节点上的那些特性
,加快搜索速度。当我们寻找新点做三角化,闭环检测和重定位时可以用这个方法。我们还使用方向一致性测试 来细化对应关系,该测试丢弃异常值,确保所有对应关系的一致旋转。

四 自动建图初始化

地图初始化的目的是计算两帧间匹配点通过三角化得到地图点。这种方法应该独立于场景(平面或一般),不需要人工干预就可以选择好的双视图配置。

本系统并行计算两个模型:假设平面场景的单应性矩阵和假设非平面场景的基本矩阵。然后,我们使用启发式的方法来选择一个模型,并试图恢复相对的姿态与特定的方法为所选择的模型。该方法只在确定双视图配置是安全的情况下初始化,检测低视差情况和双平面模糊,避免初始化损坏的建图。

本文的初始化步骤:

  • 找到初始的对应点:在当前帧检测ORB特征(仅在最好的尺度下)并在下下一帧找到其对应点,如果没有足够的匹配点就重置下一帧。
  • 并行计算两个模型:两个线程并行计算单应矩阵和基础矩阵。利用直接线性法和八点法分别计算他们,正如RANSAC方案中的[2]所解释的那样。为了使这两个模型相匹配。对于两个模型迭代的次数是有相同的前缀的,在每次迭代中使用的点,八个点算基础矩阵,四个点算单应矩阵也是一样的,在每次迭代后给两个模型一个评分:
d cr和d rc是对称的两帧之间的转换误差,**T M是基于x^2为95%时的外点剔除阈值**(T H=5.99,T F=3.84,假设标准差为一个像素值),定义Γ等于T H保证这两种模型在其边缘区域的d值相同,这也是为了使过程等价。 我们保存单应矩阵和基础矩阵中得分高的那个,如果没有模型可以得到,我们重复步骤1。 - 模型选择:如果场景是平面的,几乎是平面的,或者视差很小。我们应该利用单应矩阵,因为重建方法将从一个平面正确初始化。基础矩阵对该问题并没有很好地约束,它将检测到低视差情况,并拒绝初始化;具有足够视差的非平面场景只能用基本矩阵来解释,但如果匹配项位于平面上或视差较低(它们距离较远),也可以用单应性来解释匹配项的子集。在这种情况下,我们应该选择基本矩阵。我们发现一个鲁棒启发式是计算:
当R H > 0.45选择单应矩阵,可以充分捕捉平面和低视差情况。其他情况,我们选择基本矩阵。 - 运动和运动结构恢复:一旦一个模型被选择,我们检测相关的运动假设。当使用单应矩阵的时候,我们利用[Faugeras and Lustman](http://xueshu.baidu.com/usercenter/paper/show?paperid=b594a8f0f619ad07a31cedd2868357c9&site=xueshu_se&hitarticle=1)检测八个点的运动假设。该方法提出了用真实性检测来选择有效的解决方案。然而,如果视差很低,这些测试就会失败,因为点很容易在摄像机的前后移动,这可能会导致选择错误的解决方案。**我们建议直接对这8个解进行三角剖分,并检查是否存在一个解,其视差最大,且在摄像机前和重投影误差最小。**。如果没有好的解决方案,就不初始化从(1)开始。这种消除歧义的解决方案使初始化在小的视差和双重模糊结构的时候鲁棒的初始化。在基本矩阵的情况下,利用K把它转换成本质矩阵:

然后用奇异值分解方法检索了四个运动假设。对四个解进行三角化,并选择进行单应性重建。

  • BA:最后执行完整的BA来优化初始地图

五 跟踪

A.ORB检测

在八个尺度上检测FAST角点,尺度因子为1.2。对于512×384到752×480像素的图像分辨率,我们发现适合提取1000个角点。对于1241×376的KITTI数据集,检测2000个角点。为了保证均匀分布,我们在网格中划分每个尺度级别,每个单元格至少提取5个角 ,通过每个网格中检测到的角点的数量来调整检测器的阈值和每个网格的角点数目。最后通过保留的角点计算方向和描述子。
B.通过以前的帧初始化位姿

如果上一帧跟踪成功,利用恒速模型预测相机的位姿,对最后一帧中观察到的地图点进行引导搜索。如果没有找到足够的点,我们在上一帧关键点更大范围内搜索他们的位置,最后通过匹配点优化相机的位姿。
C.从重定位中恢复相机的位姿
如果跟踪失败,我们把该帧转换为词袋然后检索用于全局重定位的关键帧候选的重识别数据库。计算每个关键帧中与地图点关联的ORB的匹配点,然后,我们对每个关键帧执行交替RANSAC迭代,并尝试使用PnP算法找到一个相机姿态。如果找到了一个有足够多inliers的相机位姿,我们寻找更多的匹配点来优化相机位姿。
D.跟踪局部地图
一旦我们有了相机的位姿估计和一组匹配点,我们可以将地图投影到帧中,搜索更多的地图对应点。为了限制在大规模建图中的复杂度,我们只投影到局部地图上。这个局部地图包含了一组关键帧K1和当前帧共享地图点。还有一组在共视图中和K1相邻的关键帧K2。在局部地图中也有参考帧Kref属于K1。现在每一个在K1和K2中看到的地图点都被保留在当前帧中。
1)在当前帧中计算x地图点的重投影,如果它超过了边界就剔除
2)计算当前视线v与地图点平均可视方向n之间的角度。如果v·n < cos(60◦)则放弃。
3)计算从地图点到相机中心的距离d。如果超出映射点d /∈[dmin,dmax]的尺度不变性区域,则丢弃。
4)用d/dmin的比值计算坐标系中的尺度。
5)与在当前帧中没有匹配到的ORB特征点比较地图点中的描述子,并将地图点与最佳匹配点关联。
相机位姿通过当前帧中所有的特征点进行优化。
E.关键帧的检测
因为在local mapping中有冗余关键帧检测的机制,所以我们可以尽可能快的插入关键帧,这使得系统在相机移动和旋转的时候跟踪的更鲁棒。
插入关键帧的策略:
1)从上次重定位开始必须有超过20帧passed
2)local mapping是空闲的,或者从上次的关键帧插入已经过去了20帧
3)当前帧至少跟踪到了50个点
4)当前帧跟踪到少于参考帧90%的点

局部地图

对每一个新的关键帧建图
A.关键帧插入
首先,更新更新共视图,为Ki插入新的节点,利用其他关键帧更新共享地图点产生的边。然后更新Ki有最多的共视点的生成树。然后计算代表着关键帧的词袋,这会帮助我们在新的地图点三角化的时候完成数据关联。
B.最近地图点的剔除
地图点要保留在地图中,必须在创建后的前三个关键帧中通过严格的测试。必须保证他们被跟踪而且没有错误的三角化,为了避免虚假的数据关联,一个点必须满足两个条件:

  • 跟踪必须在超过25%的帧中找到预测可见的点
  • 一个地图点至少能在三个关键帧中观测到

通过测试的点只能在它被少于连续三个关键帧观测到的时候剔除(当关键帧被剔除,局部BA进行外点剔除的时候会发生)
C.新地图点的创建
通过三角化相关共视帧的ORB创建新的地图点,对于没有匹配的点,在其他帧中搜索没有被匹配的特征点,丢弃那些不满足极外约束的匹配。ORB特征点对进行三角化,并对新点、相机的正深度、视差、重投影误差和比例尺一致性进行检查。开始一个地图点可以在两帧中被观测到,之后它会被其他帧观测到。因此,将其投影到其余连接的关键帧中,并在V-D节中详细搜索对应关系。
D.局部BA
局部BA优化的是现在正在处理的关键帧和与该关键帧在共视图中连接的其他关键帧和这些关键帧中的地图点。其他关键帧和地图点保持不变。在优化的中间和最后剔除那些被标记为外点的特征点(具体间附录)
E.局部关键帧剔除
为了保持小的重建规模,局部建图不断检测并删除冗余的关键帧(剔除那些90%的地图点至少在其他三个关键帧中以相同或更细的比例出现),尺度确保保持在关键帧地图点可以被精确测量。灵感来源:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6671781

闭环检测

闭环检测用局部建图中的最后一帧来检测闭环。
A.闭环候选帧检测
首先计算当前帧和所有它临近的共视帧(角度最小为30度)的相似度,保留最低的评分。然后,我们查询识别数据库并丢弃所有得分低于最低评分的关键帧。这是一个类似的操作,目的是获得健壮性,就像DBoW2中的规范化得分一样。所有直接连接到Ki的关键帧都将从结果中丢弃。为了得到一个闭环,我们必须连续检测三个闭环候选(连接在共视图上的关键帧)。
B.计算相似性变换
在单目SLAM中有七个自由度,三个旋转,三个平移和一个尺度。因此为了关闭一个闭环,需要计算一个从Ki转换到闭环帧Kl的相似性转换矩阵告诉我们这个闭环过程中累计的误差。这种相似性的计算也将作为闭环的几何验证。
利用RANSAC迭代计算闭环帧和当前帧变换,如果我们找到了有很多Inliers的相似变换,优化它。
C.闭环融合
闭环矫正的第一步是融合重复的地图点,在共视图中插入新的边。
当前帧的位姿Tiw通过相似变换Sil纠正,Ki所有的相邻帧被修正,所以闭环两边对齐。闭环和闭环相邻帧的所有地图点投影到闭环帧。它的匹配项在投影周围的一个狭窄区域内进行搜索。将所有匹配的地图点与Sil计算中相应的点进行融合。融合中涉及的所有关键帧都将更新它们在共视图中的边缘,从而有效地创建附加闭环的边缘。
D.基本图优化
为了得到闭环,我们对基本图进行位姿图优化,它沿着图分布闭环的误差。优化是通过相似变换来纠正尺度漂移。在优化之后,每个地图点都根据观察它的一个关键帧的校正而转换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值