[1] Mur-Artal R, Montiel J M M, Tardós J D. ORB-SLAM: A Versatile and Accurate Monocular SLAM System[J]. IEEE Transactions on Robotics, 2015, 31(5): 1147-1163.
为了方便阅读转自【泡泡机器人翻译专栏】ORB-SLAM:精确多功能单目SLAM系统(一) 同时做了一些小修改。
目录
摘要
I. 引言
II. 相关工作
A、位置识别
B、地图初始化
C、单目SLAM
III. 系统架构
A、特征选择
B、三个线程:追踪、局部地图构建和闭环检测
C、地图点、关键帧及其选择标准
D、Covisibility Graph和Essential Graph
E、基于图像词袋模型的位置识别
IV. 地图自动初始化
V.跟踪
A、ORB特征提取
B、通过前一帧图像估计相机初始位姿
C、通过全局重定位来初始化位姿
D、跟踪局部地图
E、新关键帧筛选策略
VI. 局部地图构建
A、关键帧插入
B、地图点云筛选
C、新地图点云创建
D、局部BA
E、局部关键帧筛选
VII. 闭环检测
A、候选关键帧
B、计算相似变换
C、回环融合
D、Essential Graph优化
VIII. 实验
A、基于Newcollege数据集测试系统性能
B、基于TUM RGB-D标准库的定位精度
C、基于TUM RGB-D标准数据库的重定位
D、基于TUM RGB-D标准数据集测试算法的运行生命
E、基于KITTI数据集测试算法在大场景大回环下的性能
IX. 结论和讨论
A、结论
B、离散/特征SLAM方法与稠密/直接SLAM方法对比
C、未来的工作
附录:非线性优化
本文提出的ORB-SLAM算法是一个基于特征点的单目SLAM系统,可以实时运行在狭小的室内环境和宽阔的室外环境中。该系统对剧烈运动具有鲁棒性,支持宽基线的闭环检测和重定位,以及全自动初始化。该系统是我们基于近年来的优秀算法重新设计的一个全新算法,其中SLAM的所有环节:跟踪,构图、重定位和回环检测都采用了相同的特征,并选用合适的特征点和关键帧选取策略,使系统具有很好的鲁棒性,生成精简、可追踪的地图。只有当场景内容改变时,地图大小才会增加,因此可以支持在同一个场景下的持续定位。在文章最后,我们选择公共数据集中的27个图像序列进行了测试。相比目前最新的单目SLAM算法,本文提出的ORB-SLAM性能优势明显。为了使更多人获益,公布了源码。
众所周知,光束平差法(Bundle Adjustment,BA)能够用于相机定位和稀疏几何重建[1-2],只要给定一个强大的匹配网络和好的初始估计,BA就能够给出精确的结果。但在很长的时间里,BA都被认为不适合于VSLAM之类的实时应用。VSLAM系统的目标是在重建环境的同时估计相机轨迹。目前,为了以较低的计算代价得到较精确的结果,实时SLAM系统必须为BA模块提供以下信息:
BA第一次实时应用是在Mouragon等人[3]提出的视觉里程计算法中,其次是在Klein和Murray的突破性工作——以并行线程分别处理tracking和mapping的PTAM[4]算法中。尽管受制于小场景的应用,PTAM算法对关键帧的选择,特征匹配,点的三角化,相机位姿估计,追踪失败后的重定位非常有效。然而,由于缺少闭环检测和对遮挡场景的处理,再加上其视图不变性差,在地图初始化时需要人工干预等多个因素,使得PTAM算法的应用受到了严重的限制。
在本文中,我们基于PTAM算法的主要框架,采用 Gálvez-López 和 Tardós [5]提出的 place recognition(场景/位置识别)算法,Strasdat 等人[6]提出的 scale-aware loop closing(具备尺度感知的闭环检测)算法以及文献[7-8]中的大尺度操作中 Covisibility 信息的使用,重新设计了一种新的单目SLAM系统ORB-SLAM,本文的贡献主要包括:
我们在公共数据集上对算法在室内和室外环境下的性能进行了详细的评估,包括手持设备、车辆和机器人。值得一提的是,与目前最新的直接法[10]相比——直接SLAM方法通过直接对像素点的灰度进行优化而不是最小化特征重投影误差,我们的方法能够实现更精确的摄像头定位精度。我们在文章的第IX-B部分讨论了基于特征的SLAM方法定位比直接法更准确的原因。
闭环检测和重定位的方法基于我们之前的论文[11]。系统最初的版本是论文[12]。本文中我们添加了初始化方法,Essential graph ,并完善了其他模块。我们详细了描述了系统的各个模块,并且开展了详细的实验验证。
据我们所知,这是目前最完整最可靠的单目SLAM系统,为了使更多人获益,我们将源码开放。视频演示和源码放在我们的项目网站上。
Williams等人在综述[13]中比较了几种基于场景的位置识别方法,即图像到图像的匹配,这种方法在大环境下比地图到地图或图像到地图的方法更准确。在场景匹配方法中,基于bags of words(词袋)[14]技术的方法以其高效率脱颖而出,比如概率方法FAB-MAP[15]。DBoW2[5]则首次使用了BRIEF描述子[16]生成的二进制词袋和非常高效的FAST特征检测算法[17]。与我们目前在词袋算法中使用的SURF和SIFT特征相比,FAST算法的运算时间减小了至少一个数量级。尽管FAST系统运行效率高、鲁棒性好,但是采用BRIEF描述子不具有旋转不变性和尺度不变性,因而限制了系统只能运行在同一平面内(否则会造成尺度变化),闭环检测也只能从相似的视角中进行。在我们之前的工作[11]中,我们提出了一个使用ORB特征检测子的DBoW2词袋位置识别器。ORB特征是一种具有旋转不变性和尺度不变性的二进制特征,因此,用它生成的快速识别器具有较好的视角不变性。我们在4组不同的数据集上证实了该位置识别器的high recall和鲁棒性,从10K图像数据库中提取一个候选闭合回路(包括特征提取)的运算时间少于39ms。在本文中,我们提出了一种改进版本的位置识别方法,在查询数据库时采用covisibility信息,返回多个假设,而不仅仅是最佳匹配结果。
单目SLAM系统需要设计专门的策略来生成初始化地图,因为单幅图像不具备深度信息。解决这个问题的一种方法是一开始跟踪一个已知结构的对象[20]。在滤波方法中,可以使用逆深度参数化[21]来初始化深度高度不确定的点,理想情况下,该参数会在后期逐渐收敛到真值。最近Engel提出的半稠密方法[10]中就采用类似的方法将像素的深度信息初始化为一个高方差的随机值。
如果从两个视角来初始化特征,就可以采用以下两种方法:一种是假设局部场景在同一平面内[4],[22],然后利用Faugeras等[23]提出的方法用单应性矩阵来重构摄像头相对位姿。第二种是将场景建模为通用情况(不一定为平面),通过Nister提出的五点法[26]来计算本质矩阵[24],[25],但该方法存在多解的问题。这两种摄像头位姿重构方法在低视差下都没有很好的约束,如果平面场景内的所有点都靠近摄像机的中心,则结果会出现双重歧义[27]。另一方面,非平面场景可以通过线性8点法[2]来计算基础矩阵,相机的相对位姿就可以无歧义地重构出来。
针对这一问题,我们在本文的第四部分提出了一个新的基于模型选择的自动初始化方法,对平面场景算法选择单应性矩阵,而对于非平面场景,选择基础矩阵。模型选择的方法可参考综述论文[28]。基于类似的理论,我们设计了一种启发式初始化算法,考虑到在接近退化情况(比如:平面,近平面,或是低视差)下选择基础矩阵进行位姿估计可能存在的问题,算法选择单应性计算。在平面的情况下,为了保险起见,如果解决方案存在双重歧义,算法将避免初始化,因为可能会因为选择错误而导致算法崩溃。因此,我们会延迟初始化过程,直到所选的模型在明显的视差下产生唯一解。
单目SLAM最初采用滤波框架[20],[21],[29],[30]来建模。在滤波法中,每一帧都通过滤波器联合估计地图特征位置和相机位姿。这样做带来的问题是在处理连续帧图像上会导致计算资源浪费和线性误差累积。另一种是基于关键帧的SLAM框架,即采用少数筛选过的图像(关键帧)来构建地图,因为构图不再与帧率相关联,基于关键帧的SLAM方法可以进行消耗计算资源但是精度更高的BA优化。Strasdar等人[31]证明了在相同的计算资源消耗下,基于关键帧的SLAM方法比滤波器方法定位精度更高。
最具代表性的基于关键帧的SLAM系统可能是由Klein和Murray等人提出的PTAM算法[4]。PTAM第一次将相机追踪和地图构建拆分成两个并行的线程运行,并成功应用于小环境的实时增强现实中。文献[32]对PTAM算法进行了改进,增加了边缘特征、在跟踪过程中增加了旋转估计步骤,以及更好的重定位方法。PTAM中的地图点通过图像块与FAST角点匹配,因此这些点仅适合于特征跟踪,并不适合用于后期的位置识别。而实际上,PTAM算法并没有进行大闭环检测,其重定位也仅仅是基于关键帧低分辨率缩略图的相关性进行的,因此视角不变性较差。
Strasdat等人在文献[6]中提出了一个基于GPU实现的大尺度单目SLAM系统,该系统前端采用光流法,其次用FAST特征匹配和运动BA;后端是基于滑动窗口的BA。闭环检测通过具有相似性约束的(7自由度)位姿图优化来进行,该方法可以矫正在单目SLAM系统中出现的尺度偏移问题。在本文中,我们也将采用这种7自由度位姿图优化方法,并将其应用到我们的Essential Graph中,更多细节将在第三部分D节里面描述。
Strasdat等人在文献[7]中采用了PTAM的前端,但其跟踪部分仅在一个从covisibility graph提取的局部地图中进行。他们提出了一个双窗口优化后端,在内部窗口中连续进行BA,在有限大小的外部窗口中构建位姿图。然而, 只有当外部窗口尺寸足够大到可以包含整个闭环回路的情况下,闭环检测才能起作用。在我们的算法中,吸收了Strasdat等人提出的基于covisibility的局部地图,并且通过covisibility map来构建位姿图的优势,重新设计前端和后端。另一个区别是,我们并没有使用特定的特征提取方法做闭环检测(SURF),而是基于相同的追踪和建图特征进行位置识别,获得具有鲁棒性的重定位和闭环检测。
Pirker等[33]提出了CD-SLAM方法,一个非常复杂的系统,包括闭环检测,重定位,大尺度操作以及对算法在动态环境运行所做的改进。但文中并没有提及地图初始化。无法复现导致我们无法对其精度、鲁棒性和大场景下的表现进行测试对比。
Song等[34]提出了使用ORB特征做追踪和滑窗BA作为后端的视觉里程计方法。相比之下,我们的方法更加全面,因为他们的算法中没有涉及全局重定位,闭环回路检测,而且地图也不能重用。他们还使用了相机到地面的真实距离来限制单目尺度漂移。
Lim等人在我们提交本文最初的版本[12]之后发表了论文[25],他们也采用相同的特征进行跟踪、建图和闭环检测。但是,由于Lim等人的算法选择的BRIEF描述子不具备尺度不变性,因此其算法运行受限在平面轨迹上。他们的算法仅从上一帧关键帧开始跟踪特征点,因此访问过的地图不能重用(这样的处理方式与视觉里程计很像),存在系统无限增长的问题。我们在第三部分E小节里面与该算法进行了定性比较。
Engel等[10]提出了LSD-SLAM算法,该算法可以构建大场景半稠密地图,选择了直接法(优化也是直接通过图像像素灰度进行)而不是基于特征的BA。算法的结果让人印象深刻,其在没有GPU加速的情况下实时构建了一个半稠密地图,相比基于特征的稀疏SLAM系统而言,LSD-SLAM方法在机器人领域有更大的应用潜力。然而,该算法的运行仍然需要基于特征做闭环检测,且相机定位的精度也明显低于PTAM和我们的算法,相关实验结果我们将在第8部分的B小节中展示,对该结果的讨论在文章IX部分B小节进行。
Forster等[22]提出了介于直接法和特征法之间的半直接视觉里程计SVO方法。该方法不需要对每帧图像都提取特征点,能够以很高的帧率运行,在四轴飞行器上取得了令人惊叹的定位效果。然而,SVO算法没有闭环检测,且目前主要基于下视摄像头运行。
最后,我们想讨论一下目前的关键帧选择方法。视觉SLAM算法不可能选择所有的云点和图像帧运行BA。因此,Strasdat等[31]证明最合理的选择是在只保留非冗余关键帧的时候尽可能多地保留点。PTAM非常谨慎地插入关键帧以避免运算量增长过大。然而,这种限制性的关键帧插入策略在算法运行困难的情况下可能会导致追踪失败。在本文中,我们选择一种更为合适的关键帧插入策略,当算法运行困难的时候选择尽快地插入关键帧,然后在后期将冗余的关键帧删除以避免额外的计算成本。
我们系统设计的中心思想是对SLAM系统的建图、跟踪、帧速率重定位以及闭环检测等模块都采用相同的特征,这将使得我们的系统更有效率,避免了像以往文章[6],[7]一样还需要额外插入一些识别性强的特征以用于后期的闭环检测。我们每张图像的特征提取远少于33毫秒,远小于目前的SIFT算法(~300ms),SURF算法(~300ms),或最近提出的A-KAZE算法(~100ms)。为了使算法的位置识别能力能更加通用化,我们需要提取的特征具备旋转不变性,而BRIEF和LDB不具备这样的特性。
为此,我们选择了ORB[9]特征,具有256位描述符的带方向的多尺度FAST角点。它们的计算和匹配速度非常快,同时具有视角旋转不变性。这样可以在更宽的基准线上匹配他们,增强了BA的精度。我们已经在[11]中演示了基于ORB特征的位置识别方法的良好性能。需要申明的是,虽然本文的方案中采用ORB算法,但所提出的技术并不仅限于该特征。
系统框架如图1所示,包括三个并行的线程:跟踪、局部地图构建和闭环回路检测。跟踪线程负责对每帧图像的相机位置进行定位,并决定什么时候插入新的关键帧。首先通过与前一帧图像进行匹配得到初始特征点,然后采用运动BA优化摄像头位姿。如果特征跟丢(比如由于遮挡或是突然运动),则由位置识别模块进行全局重定位。一旦获得最初的相机位姿估计和特征匹配,则使用由系统维护的关键帧的covisibility graph提取一个局部可视化地图,如图2(a)、(b)所示。然后通过重投影方法搜索当前帧与局部地图点对应的匹配点,并利用所有的匹配点优化当前相机位姿。最后,跟踪线程决定是否插入新的关键帧。所有的跟踪步骤将在第5部分详细阐述。创建初始化地图的新方法将在第4部分进行说明。
局部地图构建模块负责处理新的关键帧,对周围的相机位姿进行局部BA以优化重构。在covisibility graph已连接的关键帧中搜索新的关键帧中ORB特征的匹配点,然后三角化新的地图点。有时尽管已经创建了新的点云,但基于跟踪线程过程中新收集的信息,为了保证点云的高质量,可能会根据点云筛选策略临时删除一些点。局部地图构建模块也负责删除冗余的关键帧。我们将在第6部分详细说明局部地图构建的步骤。
对每个新的关键帧都要进行闭环搜索,以确认是否形成闭环。如果闭环被检测到,就计算相似变换来查看闭环的累积误差。这样闭环的两端就可以对齐,重复的云点就可以被融合。最后,为了确保全局地图的一致性,利用相似性约束[6]对位姿图进行优化。主要的创新之处在于,本文对Essential Graph进行优化,它是一个covisibility graph中的一个更稀疏的子图,更多细节将在第3部分D小节描述。闭环检测和校验步骤将在第7部分详细描述。
我们使用g2o[37]库中的Levenverg-Marquardt算法执行所有的优化。附录中描述了每次优化的误差,代价函数和变量。
对每个地图点pi保存以下信息:
对每个关键帧K_i保存以下信息:
一开始,地图点和关键帧的创建条件较为宽松,但是之后则会通过一个非常严格苛刻的筛选机制进行挑选,该机制会检测出冗余的关键帧和匹配错误的或不可跟踪的地图点进行删除。这样做的好处在于地图在构建过程中具有一定的灵活性,在外界条件比较困难的情况下(比如:旋转,相机快速运动),算法仍然可以实现鲁棒的跟踪,与此同时,当相机重访问同一个环境时,地图的尺度大小是可控的,有利于系统长期工作。与PTAM算法相比,我们构建的地图中基本不包含局外点,因为秉持的原则是很苛刻的,宁缺毋滥。地图云点和关键帧的筛选过程将在第6部分B节和E节分别说明。
关键帧之间的Covisibility信息在本系统中的几个模块上都非常有用,像论文[7]一样,我们将其表示成一个间接的权重图。图中每个节点代表一个关键帧,如果两个关键帧都能同时观测到地图云点中至少15个点,则这两个关键帧之间用一条边相连,我们用权重θ表示两个关键帧能共同观测到的云点数量。
为了校正闭环回路,我们像论文[6]一样做位姿图优化,沿着位姿图将闭环回路的误差进行分散。为了不包括由covisibility graph提供的可能非常密集的边,我们提出构建一个Essential Graph,该图保留了covisibility graph的所有节点(关键帧),但是边缘更少,仍旧保持一个强大的网络以获得精确的结果。系统从初始关键帧开始增量式地构建一个生成树,它是一个边缘数量最少的covisibility graph的子图像。当插入新的关键帧时,它被包含在链接到共享最多观测点的关键帧的树中,当一个关键帧被筛选策略剔除时,系统会更新受其影响的链接。Essential Graph包含了一个生成树,一个高可见性(θ_min=100)的covisibility graph边缘子集,以及闭环边,这样的组合共同构建了一个强大的相机网络。图2展示了一个covisibility graph,生成树和相关的essential graph的例子。在本文第8部分第E节的实验里,当算法运行位姿图优化时,可以达到即便是全局BA优化都很难达到的高精度的结果。essential graph的效果和θ_min对算法的影响将在第8部分E节讨论。
系统嵌入了基于DBoW2[5]的位置识别算法来执行闭环检测和重定位。视觉词汇(Visual words)是一个离散化的特征描述子空间,被称为视觉词典。这部视觉词典是通过从大量图像中提取ORB描述子离线创建的。如果图像的通用性足够强,那么同一部视觉词典在不同的环境下也能获得很好的性能,正如我们之前的论文[11]那样。SLAM系统增量式地构建一个数据库,该数据库中包含了一个反向指针,用于存储在关键帧中可以看到的视觉词典里的每个视觉单词,从而实现高效检索。当筛选机制剔除关键帧时,数据库也会更新。
由于关键帧之间存在视觉重叠,因此检索数据库时,可能返回的结果不止一个高分值的关键帧。原版的DBoW2考虑了这种重叠,将时间上接近的图像的分值相加。但这并没有包括在不同时间观测同一地点插入的关键帧。为了解决这一问题,我们将这些与covisibility graph相连的关键帧进行分类。另外,我们的数据库返回的是分值高于最佳分值75%的所有关键帧。
用词袋模型来表示特征匹配的另一个优势在论文[5]里有详细介绍。如果我们想计算两组ORB特征的对应关系,我们可以强制匹配在视觉字典树上某一层(我们在6层里面选第2层)的相同节点(关键帧)里的特征,加快搜索速度。在本文中,我们就利用这个小技巧来搜索匹配的特征点,用于三角化新的点云,闭环检测和重定位。我们还引入一个方向一致性测试来改进匹配点(具体如论文[11]),该测试丢弃无效数据来保证所有对应匹配点的旋转方向一致。
地图初始化的目的是计算两帧图像之间的相对位姿来三角化一组初始的地图云点。这个方法与场景无关(平面的或一般的)并且不需要人工干预选择良好的双视图配置,比如两幅图具有明显的视差。本文算法提出并行计算两个几何模型,一个是面向平面视图的单应性矩阵,另一个是面向非平面视图的基础矩阵。然后,采用启发式的方法选择模型,并使用所选的模型从两图像的相对位姿中对地图点云进行重构。本文算法只有当两个视图之间的视差达到安全阈值时,才进行地图初始化。如果检测到低视差的情况或已知两视图模糊的情况(如论文[27]所示),则为了避免生成一个有缺陷的地图而推迟初始化。算法的步骤是:
step1: 查找初始的匹配点对:
从当前帧 F_c 中提取ORB特征(只在最好的尺度上),与参考帧 F_r 搜索匹配点对 X_c——X_r。如果找不到足够的匹配点对,就重置参考帧。
step2: 并行计算两个模型:
在两个线程上分别采用归一化DLT算法和八点法并行计算单应性矩阵 H_cr 和基础矩阵 F_cr:
正如文献[2]中基于RANSAC的方案一样。为了使两个模型的计算流程尽量一致,将两个模型的迭代循环次数预先设置成一样,每次迭代的特征点数目也预先设置好:基础矩阵是8个特征点对,单应矩阵是4个特征点对。每次迭代中,我们给每个模型 M(H表示单应,F表示基础)计算一个分值S_M:
其中,dcr2和drc2是帧到帧之间的对称传递误差[2]。TM是无效数据的排除阈值,它的依据是X2测试的95%(TH=5.99, TF=3.84,假设在测量误差上有1个像素的标准偏差)。 Γ 等于TH,这样两个模型在有效数据上对于同一误差d的分值相同,同样使得运算流程保持一致。
我们从单映射矩阵和基础矩阵的计算中选择分值最高的,但如果两个模型分值都不高(没有足够的内点),则算法流程重启,从step1开始重新计算。
step3: 模型选择:
如果场景是平面,近平面或存在低视差的情况,则可以通过单应矩阵来求解。同样地,我们也可以找到一个基础矩阵,但问题是基础矩阵不能够很好的约束该问题[2],而且从基础矩阵中计算得到的运动结果是错误的。在这种情况下,我们应该选择单应矩阵才能保证地图初始的正确性,或者因为检测到低视差情况而拒绝初始化。另一方面,对于有足够视差的非平面场景则可以通过基础矩阵来计算,而单应矩阵只有基于平面点或者低视差的匹配点才能找到。因此,在这种情况下我们应该选择基础矩阵。我们利用如下强壮的启发式进行计算:
如果RH>0.45 , 这表示二维平面和低视差的情况,我们将选择计算单应矩阵。其他情况选择基础矩阵。
Step 4: 运动和从运动到结构的重构
一旦选择好模型,我们就可以获得相应的运动状态。如果选择单应矩阵,我们按照Faugeras方法[23]提取8种运动假设。该方法提出用cheriality测试来选择有效解。然而,如果在低视差的情况下,这些测试就会失效,因为云点很容易在相机前或后移动,导致选解错误。我们提出的方法是直接按这8种解将二维点三角化,然后检查是否有一种解可以使得所有的云点都位于两个相机的前面,其视差最大且重投影误差较小。如果没有得到一个明确的解,就不执行初始化,重新从第一步开始。这种方法使初始化程序在低视差和两个交叉的视图情况下更具鲁棒性,这也是我们整个算法体现鲁棒性的关键所在。
在基础矩阵的情况下,我们使用标定矩阵K用下式将其转换为本质矩阵:
然后用文献[2]中的奇异值分解方法计算4个运动解。然后如上文所述,将四个解用于三角化特征点,选择单应性重建。
Step 5: Bundle adjustment
最后我们执行一个全局BA,详细优化过程见附录,以优化初始重构得到的点云地图。
图3所示是论文[39]中室外NewCollege机器人图像序列进行地图初始化的一次具有挑战性的演示。从图中可以看出,PTAM算法和LSD-SLAM算法对位于同一平面上的所有点都进行了初始化,而我们的方法是当两幅图像有足够视差之后才进行初始化,并基于基础矩阵得到了正确的结果。
这一部分详细介绍了跟踪线程在每帧图像上执行的步骤。在运动BA等几个步骤中都提到了相机位姿优化,详见附录。
我们在8层图像金字塔上提取FAST角点,金字塔图像尺度因子为1.2。我们发现如果图像分辨率在512*384到752*480,提取1000个角点比较合适,如果是KITTI数据集[40]等分别率较高的图像,则提取2000个角点。为了确保特征点均匀分布,我们将每层图像分成网格,每格提取至少5个角点。然后检测每格角点,如果角点数量不够,就调整阈值。如果某些单元格内检测不出角点(无纹理或者低对比度),则其对应提取的角点数量也相应减少。最后,根据保留的FAST角点计算方向和ORB特征描述子。ORB特征描述子将用于算法后续所有的特征匹配,而不是像PTAM算法中那样根据图像块的相关性进行搜索。
如果上一帧图像跟踪成功,就用匀速运动模型来预测相机当前位置(即认为摄像头处于匀速运动),然后搜索上一帧图像中的特征点在地图中的对应云点与当前帧图像的匹配点,最后利用搜索到的匹配点对当前相机的位姿进一步优化(我是真的看不明白这个语法)。如果没有找到足够的匹配点对(比如运动模型失效,非匀速运动),我们就加大搜索范围,搜索地图云点附近的点在当前帧图像中是否有匹配点。然后通过寻找到的对应匹配点对优化当前时刻的相机位姿。
如果扩大了搜索范围还跟踪不到特征点(那么运动模型已经失效),则计算当前帧图像的词袋向量,并利用BoW词典选取若干关键帧作为备选匹配帧(这样可以加快匹配速度);然后,在每个备选关键帧中计算与地图云点相对应的ORB特征,如第三部分E节所述。接着,对每个备选关键帧轮流执行RANSAC迭代求解尝试用PnP算法[41]计算当前帧位姿。如果能找到一个涵盖足够多有效点的姿态,就对该姿态进行优化,搜索该关键帧对应的更多匹配云点。最后,基于所有找到的匹配点对相机位置进行进一步优化,如果有效数据足够多,跟踪程序将继续执行。
一旦获得了相机初始位姿和一组初始特征匹配点,就可以将更多的地图云点投影到图像上以寻找更多的匹配点。为了降低大地图的复杂性,只投影局部地图。该局部地图包含一组关键帧K1,它们和当前关键帧有共同的地图云点,还包括在covisibility graph中与关键帧K1相邻的一组关键帧K2。这个局部地图中还有一个参考关键帧Kref∈K1,它与当前帧具有最多的共享地图云点。在当前帧中对K1, K2中均可见的每个地图云点进行搜索:
最后通过当前帧中获得的所有地图云点对相机位姿进行优化。(这个环节的目的是在当前帧和局部地图之间找到更多的匹配点对,来优化当前帧的位姿)。
最后一步是决定当前帧是否可以作为关键帧。由于局部地图构建过程中存在筛选剔除冗余关键帧机制,所以需要尽快地插入新关键帧,以保证跟踪线程对相机运动的鲁棒性,尤其是旋转运动。根据以下要求插入新的关键帧:
与PTAM中用关键帧之间的距离作为判断标准不同,我们加入一个最小的视图变换(条件4)。条件1确保一个好的重定位,条件3保证好的跟踪。如果在局部地图构建处于忙状态(条件2的后半部分)的时候插入关键帧,就会发信号去暂停局部BA,这样就可以尽可能快地去处理新的关键帧。
这部分主要描述根据每个新的关键帧Ki构建局部地图的步骤。
首先更新covisibility graph,具体包括:添加一个关键帧节点Ki,检查与Ki有共同云点的其他关键帧,用边线连接。然后,更新生成树上与Ki有最多共享点的其他关键帧的链接。计算表示该关键帧的词袋,并利用三角法生成新的地图云点。
三角化的云点要保留在地图中,必须在其创建后的前三个关键帧中通过一个严格的测试,确保留下的云点都是可跟踪的,不是由于错误的数据而被三角化的。一个云点必须满足如下条件:
一旦一个地图云点通过测试,只有在被少于3个关键帧观测到的情况下才能移除它。这样的情况在关键帧被删除以及局部BA排除异值点的情况下发生。这个策略使得我们的地图包含很少的无效数据。
通过对covisibility graph中相连的关键帧Кc中的ORB特征点进行三角化来创建新的地图云点。对Ki中每个未匹配的ORB特征,我们在其他关键帧的未匹配云点中进行查找,看是否有匹配上的特征点。匹配过程详见第三部分第E节,然后将那些不满足对级约束的匹配点删除。ORB特征点对三角化后,需要对其在摄像头坐标系中的深度信息,视差,重投影误差和尺度一致性进行审查,通过后则将其作为新点插入地图。起初,一个地图云点被2个关键帧观测到,但它可以被其他关键帧中的点匹配到,所以它可以映射到其他相连的关键帧中,搜索算法详见第5部分D节。
局部BA主要对 当前处理的关键帧Ki,所有在covisibility graph中与Ki连接的其他关键帧Kc,以及这些关键帧观测到的地图云点 进行优化。所有其他能够观测到这些云点、但不与当前处理帧Ki相连的关键帧 会被保留在优化线程中,但保持不变。优化期间以及优化后,所有被标记为无效的观测数据会被丢弃,优化细节详见附录。
为了使重构保持简洁,局部地图构建尽量检测和丢弃冗余的关键帧。这是有益的,因为BA的复杂度随着关键帧数量的增加而增加,当算法在同一场景下运行时,关键帧的数量不会无限增长,除非场景内容改变,这也增强了系统的可持续性。如果关键帧Kc中90%的点都可以被其他至少三个相同或者尺度更小的关键帧同时观测到,那认为Kc的存在是冗余的,丢弃。尺度条件确保地图点维护可以最精确测量出它们的关键帧。这个策略受[24]启发,作者经过一系列变化检测后将关键帧删除。
闭环检测线程抽取Ki——最后一帧局部地图关键帧,用于检测和闭合回环。具体步骤如下:
首先,计算Ki的词袋向量和它在covisibility graph中相邻图像(θmin=30)的相似度,保留最低分值Smin。然后,我们检索图像识别数据库,丢弃分值低于Smin的关键帧。这是和DBoW2中均值化分值类似的可以获得好的鲁棒性的操作,DBoW2中计算的是前一帧图像,而本文使用的是covisibility信息。此外,所有连接到Ki的关键帧都会从结果中删除。为了获得候选回环,我们必须连续检测3个一致的候选回环(covisibility graph中相连的关键帧)。如果有多个与Ki相似的地方,就可能有多个候选回环。
单目SLAM系统有7个自由度:3个平移,3个旋转,1个尺度因子[6]。为了闭合回环,需要计算从当前关键帧Ki到回环关键帧KL的相似变换,以获得回环的累积误差。计算相似变换也可以作为回环的几何验证。
首先,计算 当前关键帧中地图点对应的ORB特征 与 候选回环关键帧 的对应关系,详见第3部分E节。此时,我们有了每个候选回环关键帧的3D-3D对应关系。对每个候选回环执行RANSAC迭代,用Horn方法[42]寻找相似变换。如果用足够多的有效数据找到了相似变换Sil,就优化它(见附录),并搜索更多的对应关系。然后再次优化。如果Sil有足够的有效数据,就接受KL回环。
回环矫正的第一步是融合重复的地图云点,并在covisibility graph中插入与回环相关的的新边缘。首先,通过相似变换Sil矫正当前关键帧位姿Tiw,这种矫正方法应用于所有与Ki相邻的关键帧,连接变换,这样回环两端就可以对齐。然后,回环关键帧及其邻居 能观测到的所有地图云点 都投影到Ki 及其近邻中,并在映射的区域附近小范围内搜索它的对应匹配点,如第5部分D节所述。将所有匹配的地图云点和计算Sil过程中的有效数据进行融合。融合过程中更新所有的关键帧在covisibility graph中的边缘,创建的新边缘将用于回环检测。
为了有效地闭合回环,我们通过Essential Graph优化位姿图,如第三部分D节所示,这样可以将回环闭合的误差分散到图像中去。优化程序通过相似变换校正尺度漂移[6]。误差和成本计算见附录。优化过后,每一个地图云点都根据 其中一个观测到它的关键帧 的校正 进行变换。
我们采用NewCollege[39]的大场景机器人图像序列对本文提出的系统进行了较全面的实验评估,首先采用TUM的16个室内手持RGB-D数据集[38]对系统总体性能进行评估,包括算法的定位精度,重定位和程序长时间运行能力;然后,用KITTI的10个汽车户外图像数据集[40],评估算法在大场景下的实时性能、定位精度和位姿图优化效率。
算法运行在Intel Core i7-4700MQ (4核 2.40GHz)和8GB RAM的实验平台上,运算速率可达到实时,且以帧率对图像进行准确处理。ORB-SLAM有3个主线程,它们和其他ROS线程并行运行,由于引入了ROS操作系统,因此算法结果具有一定的随机性,针对这个原因,我们在一些实验中公布了算法运行的中间结果。
NewCollege数据集[39]包含一个穿越校园和邻近公园的2.2km机器人图像序列。该图像序列由双目相机拍摄,帧率为20fps,分辨率512x382。图像序列中包含多个对单目视觉定位具有挑战性的回环和快速旋转。据我们所知,目前没有单目系统可以处理这一整个图像序列。尽管[7]可以实现回环检测,也可以应用于大场景环境,但只能显示小部分序列图像的单目结果。
如图4显示的是我们的算法检测到的闭环,从图中可以看出,我们选择的有效数据点都支持相似性变换。
图5则对比了回环闭合前后的环境地图重构状况。其中,红色标注的是局部地图,回环检测后可以看到其两端扩展到连接整个运行轨迹。
图6 实时帧率的完整序列全局重建地图。右边的大回环从相反的方向穿过,位置识别程序没有发现可视的闭环,因此它们并没有对齐。
我们统计了ORB_SLAM算法每个线程所用的时间。表1显示了算法跟踪和局部构图的时间。可以看出,跟踪的帧率大概在25-30Hz,这是跟踪局部地图所需的最多时间。如果需要,可以通过减少局部地图中所包含的关键帧数量即可减少这一部分所用的时间。局部地图构建线程中耗时最多的是局部BA优化。局部BA的时间根据机器人探索环境的状态变动,即在未探索环境下所需时间多,在已经探索过的环境下运行所需时间少,因为在未知环境中如果跟踪线程插入一个新的关键帧,BA优化会被中断,如第5部分E节所示。如果不需要插入新的关键帧,局部BA优化则会执行大量已经设置的迭代程序。
表2显示了6个闭合回路的结果。可以看出回环检测是如何随关键帧数量的增多而提前增加。这主要是由于高效的数据库检索,表2中只比较了具有相同图像单词的图像子集,由此可见用于位置识别词袋模型的潜力。我们的Essential Graoh中包含的边缘是关键帧数量的5倍,它是一个稀疏图。
TUM RGB-D数据集[38]是一个用于估计摄像头定位精度的优秀数据库,它提供了许多包括外部运动捕捉系统提供的对应轨迹真值的图像序列。我们去掉了那些 包含强烈的旋转、没有纹理或没有运动的不适合纯单目SLAM系统的图像序列。
为了验证算法性能,我们选择了直接法半稠密LSD-SLAM[10]和PTAM[4]作为对比。除此之外,我们还比较了RGBD-SLAM[43]的轨迹。为了将ORB-SLAM,LSD-SLAM和PTAM的轨迹与地面真值进行比较,我们使用相似变换对齐关键帧轨迹,在尺度未知的情况下,检测轨迹的绝对误差[38]。对RGBD-SLAM,通过相机坐标变换来对齐轨迹,也采用同样的方法检测尺度是否重构良好。LSD-SLAM从随机深度值开始初始化,需要时间收敛,因此与基准对比的时候,我们丢掉了前10个关键帧。对于PTAM,我们手动选择了两个关键帧获得了良好的初始化。表3 是对我们选择的16个图像序列运行5次的中间结果。
从表中可以看出,ORB-SLAM可以处理除 fr3_nostructure_texture_far (fr3_nstr_tex_far)以外所有的图像序列。这是一个平面的场景,相机的轨迹在这种情况下有两种可能,正如[27]所述。我们的初始化方法检测到这种模棱两可的情况,为保证算法安全运行而拒绝初始化。PTAM初始化有时会选择对的方案,有些可能会选择错的方案,且导致的错误可能不能接受。我们没有发现LSD-SLAM的2种不同重构方案,但在这个图像序列中出现非常多的错误。针对其他的图像序列,PTAM和LSD-SLAM的鲁棒性都比我们的方法差,且分别有八组序列和三组序列中地图点容易跟踪丢失。
关于精度问题,没有回环检测时,ORB-SLAM和PTAM的定位精度相当,但回环检测成功后,ORB-SLAM在图像序列fr3_nostructure_texture_near_withloop (fr3_nstr_tex_near)中表现出了更高的定位精度。非常意外的一个结果是PTAM和ORB-SLAM表现出的精度都非常明显地高于LSD-SLAM和RGBD-SLAM。很可能是它们将地图的优化过程简化为一个丢弃传感器测量信息的单纯的姿态图优化过程,但在我们的算法中,采用BA优化,同时通过传感器测量联合优化相机的姿态和地图的云点位置,这是解决运动到结构[2]的经典标准算法。结果讨论详见第9部分B节。另一个有趣的结果是在 fr2_desk_with_person 和 fr3_walking_xyz 图像序列中,LSD-SLAM对动态物体的鲁棒性相比ORB-SLAM差一些。
我们注意到RGBD-SLAM在图像序列fr2上有一个尺度偏差,用7自由度对齐轨迹则误差明显降低。Engle等[10]提出在f2_xyz 上PTAM的精度比LSD-SLAM低,RMSE是24.28cm。但是论文没有给出足够的细节说明这些结果是如何获得的,因此我们无法复现。
我们在TUM RGB-D数据集上进行了两组重定位实验。在第一个实验中,我们选择fr2_xyz图像序列的前30秒构建了一个地图,然后对后来的每一帧图像都进行全局重定位,并评估重构出来的相机位姿精度。对PTAM进行了相同实验。图7所示是用来创建初始地图的关键帧、重定位的图像帧位姿 和这些帧对应的地面真值。从图中可以看出PTAM只能够对关键帧附近的图像帧进行重定位,这是因为其重定位方法的不变性较小。表4显示了PTAM和ORB_SLAM相对地面真值的误差。可以看出,相比PTAM,ORB-SLAM可以更精准地定位2倍以上的图像帧。在第2个实验中,我们采用fr3_sitting_xyz图像序列来初始化地图,然后用fr3_walking_xyz图像序列重定位所有的图像帧。这是一个颇具挑战性的实验,由于图像中有人移动,会造成图像局部区域的遮挡。在该试验中,PTAM没有实现重定位,而ORB-SLAM重定位了78%的图像帧,如表4所示。图8显示了ORB-SLAM重定位的一些实验图例。
之前的重定位实验表明我们的系统可以从不同的视角定位地图,在中等动态环境中的鲁棒性也较好。这个特性和关键帧筛选过程相结合,使得算法能相同环境中的不同视角以及局部动态环境中长期运行。
在全静态场景下,即使相机从不同视角观测场景,ORB-SLAM也可以使关键帧数量保持在一个有限的水平内。我们在一个自定义的图像序列中验证了这一点:手持相机在93秒内拍摄同一张桌子,但视角一直变换,形成一个轨迹。对比我们地图的关键帧数量和PTAM生成的关键帧,如图9所示。可以看到PTAM一直都在插入关键帧,而ORB-SLAM会删除冗余的关键帧,将其总数保持在一个稳定的范围内。
能在静态环境下长期运行是任何SLAM系统的基本要求,更引人关注的是动态环境下的情况。我们分析了ORB-SLAM在几个fr3图像序列(sitting_xyz, sitting_halfsphere, sitting_rpy,walking_xyz, walking_halfspehere, walking_rpy)下的表现。所有视频中的相机都对着桌子,但运动轨迹不同,拍摄场景人为移动椅子等物体。图10(a)所示是ORB_SLAM生成的地图中关键帧总数量的变化,图10(b)所示为从图像帧中创建或删除关键帧,从中可以看出关键帧的存在时间。可以看出,前2个图像序列中,地图的大小随着场景中的内容第一次被观测到。图10(b)是在整个试验中,这两个图像序列为了维持地图所创建的关键帧。在sitting_rpy和walking_xyz中,地图通过已有场景创建,大小没有增长。相反,在最后两个视频中,有更多的关键帧插入,这表明可能由于场景的动态变化有一些之前没有发现的东西显现出来了。图10(c)是关键帧的柱状图,根据它们的存在时相对于序列创建时的剩余时间。可以看出,大量的关键帧都被删除了,只有一小部分能够存活到实验结束。一方面,这说明ORB-SLAM有一个通用的关键帧生成策略,这在未知环境下非常有用。另一方面,系统最终会生成一个小的子集来代表这些关键帧。
在这些长期实验中,系统的地图随着场景内容增加而增加,而不是随着时间增长,它能够存储场景动态变化,对场景的理解非常有用。
KITTI里程计数据集包括11个序列,通过一辆在住宅区行驶的汽车用一个GPS和一个Velodyne Laser Scanner采集,精度非常高。这个数据集对单目系统非常有挑战性,因为视频中有快速旋转,区域内有大量树叶,使得数据关联难度更大,而且车速相对较快,视频记录的频率为10fps。ORB-SLAM能够以实际帧率处理 除01外其它所有的视频,因为序列01是一条高速公路,几乎没有可跟踪的近距离物体。视频00,02,05,06,07,09,有闭环回路,系统可以检测到,并使它闭合。其中视频09包含一个只能在视频的最后几个图像帧里检测到的闭环,并不是每次都能成功检测到(结果显示的是针对其被检测到的运行情况)。
对于轨迹与地面真值的定性比较如图11和图12所示。在TUM RGB-D数据集中,我们通过相似变换对齐轨迹的关键帧和地面真值。图11是定性比较的结果,图12是[25]中的最新单目SLAM在序列00,05,06,07和08上的执行结果。除了08有一些偏移以外,ORB-SLAM在这些视频上的轨迹都很精准。
表5显示了在每个序列中执行5次以上的关键帧轨迹的RMSE中值误差。我们基于地图尺寸提供了轨迹的误差。结果表明我们的轨迹误差是地图尺寸的1%左右,最低的是视频03的0.3%,最高的是视频08的5%。视频08没有闭环,无法校正漂移,这说明需要闭环才能获得更精确的重构。
在本次实验中,我们还测试了20次迭代的全局BA可以在多大程度上优化地图重构,详见附录。我们还注意到全局BA优化可以稍微增加闭环轨迹的精度,但在开环轨迹中作用很小,这意味着我们的系统已经非常精确了。如果有些应用需要非常精确的结果,我们的算法会提供一组匹配,定义一个比较强的相机网络,一个初始估计,这样可以减少全局BA优化的迭代次数。
最后讲一下我们算法的闭环检测的效率和用于essential graph边缘的θmin的影响。我们选择视频09(一段非常长的图像序列,在最后有一个闭环),然后评估不同的闭环检测算法。表6是关键帧轨迹RMSE和不同情况下优化所用的时间,包括:没有闭环检测、直接采用全局BA优化(20层或100层迭代)、只用位姿图优化(不同数量边缘的10层迭代)、先用位姿图优化再执行全局BA优化。图13展示了不同方案的输出轨迹。结果表明,在闭环检测之前,RMSE误差较大,BA优化无法收敛。即便是迭代100次之后误差依然很大。另一方面,essential graph优化收敛速度很快,而且结果也更精确。θmin对精度影响并不大,减少边缘的数量会明显减少时间。位姿图优化后再执行一个BA优化则可以增加精度,但耗时也随之增加。
本文中,我们提出了一个新的单目SLAM系统,并详细介绍了其组成模块,并使用公共数据集对其性能进行了全方位的测试。实验结果显示,我们的系统可以处理室内与室外的图像序列,能够用于汽车、机器人和手持设备上。其定位精度在室内小场景中约为1厘米,室外大场景的应用是几米(前提是尺度与真实轨迹对齐)。
PTAM[4]被认为是目前最精准的单目实时SLAM。PTAM后端是BA优化,这是离线SFM(从运动到结构)问题[2]的经典解法。PTAM和Mouragnon[3]早期作品的主要贡献是将BA算法引入到机器人SLAM框架下,并证明了其良好的实时性。而本文的主要贡献是将PTAM算法的适用性进一步扩展,使其可以应用于原来不可应用的场景下。为了实现这一目标,我们从头设计了一种新的单目SALM系统,引入了新的想法和算法,同时也结合了最近几年的优秀方案,比如[5]中的闭环检测,[6],[7]中提出的的闭环检测程序和covisibility graph,[37]中提出的g2o优化框架以及ORB特征[9]。就我们所知,没有哪种方案能够在如此多的情况下依然还能达到ORB_SLAM的精度。ORB_SLAM方法是目前为止最可靠最完整的单目SLAM系统。我们提出的新的关键帧生成和删除策略,允许每隔几帧就创建一个关键帧,当关键帧冗余时就丢弃。这样灵活的构图方式在外界条件很差的情况下可以保证系统正常运行,比如相机作纯旋转运动或快速移动。当算法在相同场景下运行时,地图在只有拍摄到新内容的情况下才会增长,可以从我们的长期构图结果中看到这个特性。
最后,我们还展示了ORB特征具有很好的识别能力,可识别剧烈视角变换情况下的场景信息。此外,它们的提取和匹配速度很快(不需要多线程或GPU加速),能够满足跟踪和建图的实时精度。
最近,DTAM[44]和LSD-SLAM[10]提出了一种实时单目SALM算法,算法直接利用图像像素的亮度信息进行摄像头的定位与优化,并重构稠密或半稠密的环境地图。这类方法即为直接法,直接方法不需要特征提取,可以避免人工匹配。同时,直接法对图像模糊,弱纹理环境和高频纹理环境[45]的鲁棒性更好。与由ORB-SLAM或PTAM算法构成的稀疏地图相比,稠密/直接法SLAM对相机定位之外的其他应用任务可能用途更广泛。
直接法也有局限。首先,直接法假设真实场景中的物体的像是由该物体本身的表面反射模型产生的。光度一致性寻找匹配点的思路就限制了匹配点之间的基线距离,通常都比特征匹配点的基线要窄。这对重构的精度影响很大,因为重构需要较宽的基线来减少深度的不确定性。如果直接法建模不准确,可能会受到快门,自动增益和自动曝光的影响(如TUM RGB-D 的对比测试)。最后,直接法计算要求较高,为了满足计算速度,DTAM采用地图增量式扩张的方法,而LSD-SLAM则丢掉传感器测量信息,将地图优化降低为对位姿图的优化。
相比之下,特征法可以在更宽的基线上匹配特征,主要得益于特征匹配算法较好的视角和光照不变特性。在传感器测量值层面上使用BA联合优化相机位姿和地图点。在运动结构估计中,[46]指出了特征法相比直接法的优势。本文中的实验也证实了特征法在实时SLAM中具有更高的精度,详见第8部分B节。未来单目SLAM应该会整合两种最好的方法。
我们系统的精度可以通过结合无限远点跟踪来进一步增强。这些点在视差足够大的情况下是看不到的,也没有包含在本文算法构建的地图中,但对相机的旋转非常有用[21]。
另外一种方法是将稀疏地图更新到一个更加稠密的地图。得益于我们的关键帧选择机制,关键帧组成了一个具有高精度位姿和丰富的covisibility信息的紧凑地图。所以,ORB-SLAM稀疏地图是一个非常优秀的初始估计框架,比稠密地图更好。这个方向的首次尝试在论文[47]中有详细描述。
地图云点3D位置 Xw,j∈R3,关键帧位姿Tiw∈SE(3)
W表示世界坐标,通过匹配的关键点Xi,j∈R2减少重投影误差。
地图云点j在关键帧i中的误差是:
其中πi是影射函数:
其中,Riw∈SO(3),tiw∈R3,分别表示Tiw的旋转和平移部分
(fi,u , fi,v),(ci,u , ci,v)分别是相机i的焦点距离和主点。
代价函数:
ρh是Huber鲁棒代价函数,Ωi,j=δi,j2I2x2是协方差矩阵,与检测关键点的尺度有关。在全局捆集调整中(在初始化地图中),我们优化了所有云点和关键帧。