· updated Jan 27, 2025 · 21 min read
笔记:ORB-SLAM3 论文阅读
论文全称:ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM.
首先回顾一下历史:ORB-SLAM 首次在 2015 年被提出,它的改进版 ORB-SLAM2 在 2017 年被提出,同年提出了 ORB-SLAM-VI,时隔 3 年,ORB-SLAM3 横空出世,朋友圈、学术群里到处都在热议这个挂在 arXiv 才不到 3 天的论文。好奇心的驱使下,本人偷瞄了一下论文,就在这里总结一下吧。
摘要
ORB-SLAM3 实现了基于视觉惯导紧耦合,同时能够对多地图进行复用;另外支持单目/双目/RGB-D 作为输入,支持针孔以及鱼眼相机模型。
本文第一个创新点是提出了一种基于特征点法的视觉惯导紧耦合 SLAM 系统,这套系统在很大程度上使用了最大后验估计对状态量进行求解,即使是在系统初始化阶段亦是如此。这套系统可在大/小/室内/室外各种环境下鲁棒实时运行,相较于之前的算法有 2~5 倍的精度提升。
本文第二个主要创新点在于提出了多地图复用系统,这套系统使用了一种高召回率的场景识别算法。正是依赖于这一点,ORB-SLAM3 能够有效应对长时弱纹理的环境:若系统丢失,它重新开始建图并在当经过之前走过的地点时与原来的地图无缝融合。另外,相比于其它仅用到之前一段时间内信息的 VO 方案,本文提出的方案用到之前所有时刻的信息。这样可以利用到很久之前或者来自不同地图的信息。
实验表明,本文提出的算法在学术领域已有的 SLAM 系统中表现最优(这句话说得很严谨,没有提到工业界,因为没开源)。
系统总览
ORB-SLAM3 基于 ORB-SLAM2 以及 ORB-SLAM-VI 进行改进,上图是其系统框图。这基本上保持了与 ORB-SLAM2 类似的框架,同时增加了前述的几个创新点,接下来对其中主要步骤进行简要说明。
Atlas(地图集)
所谓 Atlas 就是一种多地图的表示形式,多地图由不相连的地图组成。可以看到,它由 active map 以及 non-active map 组成。其中 active map 被 Tracking thread(追踪线程)用作定位,它被连续优化同时会加入新的关键帧。系统会构建基于 DBoW2 的关键帧数据库,可以用来做重定位/闭环以及地图融合。
Tracking thread(追踪线程)
与 ORB-SLAM2 类似,该线程用来处理传感器信息,计算当前帧相对于 active map 的位姿以及最小化匹配到的地图点的重投影误差。该线程决定何时当前帧被判定为关键帧。在 VI 模式下,机体的速度以及 IMU 的 bias 通过优化惯导残差被估计。当系统追踪丢失后,会触发重定位模式,即当前帧在所有的 Altas 进行重定位;若重定位成功,当前帧恢复追踪状态;否则,经过一段时间(超过 5 秒),当前的 active map 会被存储为 non-active map,同时开启新的建图过程。
Local Mapping thread(局部建图线程)
向 active map 中新增/删减/优化关键帧以及地图点,上述的操作是通过维护一个靠近当前帧的局部窗口的关键帧进行实现。与此同时,IMU 的参数被初始化然后被该线程通过本文提出的最大后验估计技术进行求解。
Loop and map merging thread(闭环和地图融合线程)
该线程检测 active map 与整个 Atlas 是否有共同的区域,若共同的区域同属于 active map,此时进行闭环矫正;若共同的区域属于不同的 map,那么这些 map 就会被融合(融合为 1 个),并变为 active map。BA 被一个独立的线程执行(不损害实时性),用来修正地图。
相机模型
重定位
ORB-SLAM 假设所有系统组件都符合针孔模型。对于重定位这项任务,ORB-SLAM 基于 EPnP 算法建立 PnP 求解器进行解算位姿,其中所有的公式都假设相机为标定好的针孔相机。为适配本文的方法,作者使用了一种独立于相机模型的求解器:Maximum Likelihood Perspective-n-Point algorithm (MLPnP)(最大后验 PnP 算法)。该算法实现了相机模型与求解算法的解耦,相机模型只是用来提供投影射线作为输入。
非矫正双目 SLAM
几乎所有的 SLAM 系统都假设双目图像是已经被矫正的,这里的矫正是指,使用相同的焦距将两个图像转换为针孔投影,且像平面共面,同时与水平对极线对齐,从而可以通过查看图像中的同一行进行特征匹配。然而,这个假设是极其严格的,在很多应用中,这个假设通常难以满足或者不合适使用。例如,矫正(一对基线较大的相机)双目相机或双目鱼眼镜头将需要对其拍摄的图像进行严格的图像裁剪,从而失去了大视场角的优势,所以我们需要更快的环境映射方式以应对遮挡等情况。
本文设计的系统并不依赖于图像的矫正,而是将双目设备看作两个单目相机,于是有如下约束:
- 两个单目相机之间存在一个固有的 SE(3) 变换(即双目外参);
- 两个单目相机之间存在共视;
上述两个约束可以用来有效地估计尺度。按照这种思路,ORB-SLAM3 可估计 6DOF 刚体机体位姿,注意,机体位于某一个相机或者 IMU 上。另外,若两个相机之间存在共视,我们可以通过三角化恢复路标点的尺度。注意:仅在首次看到该区域的路标点时进行三角化,其它时刻只使用单目信息。
VI SLAM
之前的 ORB-SLAM-VI 受限于针孔相机/初始化时间太长以及无法应对某些挑战场景。本文设计了一种快速准确 IMU 初始化技术,以及开发了一种单目/双目惯导 SLAM,支持针孔以及鱼眼相机图像作为输入。
原理
纯视觉 SLAM 的状态量仅有当前帧的位姿,而在 VI-SLAM 中,增加了一些需要被估计的状态量。除了机体在世界系下的位姿(这里是指)还有速度,以及陀螺仪和加速度计的 bias:。我们将这些状态量合在一起构成了如下状态向量:
对于视觉惯导 SLAM 而言,我们通过对 IMU 的测量进行预积分,可以获得连续两帧(如第到第帧)之间的相对位姿测量:
:
:
以及整个测量向量的信息矩阵。于是给定上述预积分项以及状态向量以及,我们就可以得到如下 IMU 残差:
此外,除了 IMU 残差还有帧与 3D 点之间的视觉残差,即重投影误差:
其中是 3D 路标点在当前帧上的投影,信息矩阵为,表示机体系到相机的刚体变换。给定个关键帧及其状态量,同时给定个 3D 点集,它的状态量为,于是该优化问题可表示为 IMU 残差以及重投影误差的组合,具体如下形式:
其中表示观测到第个 3D 点的关键帧集合。这个优化可以用因子图进行表示,如图 2a。
IMU 初始化
这一步的目的是获取 IMU 参数较好的初始值:速度/重力向以及 Bias。本文的工作重点是设计一种快速准确的 IMU 初始化算法。文中提到如下 3 个见解:
- 纯单目 SLAM 可以提供非常准确的初始地图,问题是尺度未知。首先求解 vision-only 问题可以提升 IMU 初始化的性能。
- 如果将尺度 scale 显式表示为优化变量,而不是使用 BA 的隐式表示,则 scale 收敛得更快。
- 若在 IMU 初始化过程中忽略传感器不确定性会产生大量不可预测的错误。
根据以上三点,本文设计了如下基于最大后验估计的 IMU 初始化算法,主要分为如下三个步骤:
Step1: Vision-only MAP Estimation
进行单目 SLAM,按照关键帧速率 4Hz 持续运行 2s,然后我们可以得到按比例缩放的地图,包括个关键帧以及上百个地图点,然后通过 Visual-Only BA 进行优化,因子图如图 2b。于是可以得到优化后的轨迹,其中上划线表示按比例缩放的变量(即尺度未定)。
Step2: Inertial-only MAP Estimation
这一步的目的是获得 IMU 参数最优估计。利用以及这些关键帧之间的 IMU 测量,IMU 的参数可以放在一起构成状态向量:
其中的表示尺度因子,表示重力向,由两个角度表示,重力向量在世界系下的表示为,其中,是重力大小模值;表示加速度计以及陀螺仪的 bias,在初始化阶段可以假设该值为常数;表示从首帧到末尾帧的无尺度机体速度。此时,我们有 IMU 的测量,于是 MAP 估计问题中的需要被最大化的后验分布为:
具体地,表示似然,表示先验,考虑到 IMU 测量之间 iid,于是最大后验概率估计问题可以表示为如下形式:
对上式取负对数并且假设 IMU 预积分以及先验分布服从高斯分布,于是最终的优化问题可以表示为:
这个优化问题的因子图表示为图 2c,可以看到上式中不包含视觉残差,而是多了一个先验的残差项用来约束 IMU 的 bias 需要接近于 0。由于上述优化在流形上进行,重力向在优化过程中的更新需要构建一个”retraction”:
其中表示从到指数映射。为了保证优化过程中尺度因子保持正数,尺度因子的更新形式为如下形式:
Inertial-only MAP Estimation 完成之后,帧位姿/速度以及 3D 点根据估计的尺度进行调整,同时将轴对齐重力向。
Step3: Visual-Inertial MAP Estimation
一旦视觉以及 IMU 有了较好的估计后,进行一个 VI 联合优化进一步对这些参数进行精化,优化因子图见图 2a。作者在 EuRoC 数据集上进行测试发现上述初始化方式非常有效,可达到 2 秒内仅 5% 的误差。为了进一步提升初始估计精度,初始化后会进行 5~15 秒的 VI BA 优化,这样可以收敛到仅 1% 的尺度误差。相较于 ORB-SLAM-VI 需要 15 秒才获得首个尺度因子更加快速。经过了这些 BA 操作之后,我们就认为这个 map 是 mature(成熟的),意思就是尺度/IMU 参数/重力向已经被较好地估计完成。
追踪与建图
追踪过程借鉴了 ORB-SLAM-VI 的思路:追踪过程解决了简化版的 VI 优化问题,只优化最后两帧位姿,同时保持地图点固定。
建图过程是为了解决全图优化问题,若图的规模比较大,这个问题会变得很棘手。本文采用了滑动窗口的思想,即维护了关键帧与地图点的滑动窗口,同时包括它们的共视关键帧,只是在优化时需要保持这些关键帧固定状态。
慢速运动不能为 IMU 参数的提供好的可观性,会使初始化无法在仅 15 秒内收敛到精确的结果。为了应对这种情况,本文基于修改版“Inertial-only MAP Estimation”提出了一种尺度精化技术:所有插入的关键帧都参与优化,但优化量只有重力向以及尺度因子,优化因子图见图 2d,在这种情况下 bias 为常数的假设就不再成立。我们使用了每帧的估计量并固定它们。上述的这种操作非常高效,在 Local Mapping 线程每隔 10 秒执行一次,直到 Map 中有 100 个关键帧或者从初始化起已经过了 75 秒。
鲁棒性以及追踪丢失
快速运动/无纹理/遮挡等会导致系统丢失,ORB-SLAM 采用了基于词袋的场景识别进行重定位。本文的 VI 系统在追踪到少于 15 个特征点时就会视觉丢失(visually lost),鲁棒性体现在如下两点:
- 短期丢失:通过 IMU 读数对当前帧状态进行估计,地图点根据估计的位姿投影到当前帧后设置较大搜索窗口进行匹配。大多数情况下,通过这种方式能够恢复系统位姿。若超过 5 秒仍未重定位成功,则进入下一个状态;
- 长期丢失:新的 VI 地图会被重新初始化,并成为 active map。
地图融合与闭环
前文的介绍可知,短期以及中期数据关联可以通过 Tracking 以及 Local Mapping 进行完成。而对于长期的数据关联,可通过重定位以及闭环实现。
ORB-SLAM 采用的基于视觉词袋场景识别的重定位,若候选关键帧只有 1 个,召回率为 5080%。为了应对假阳性的出现,算法使用了时域校验以及几何校验,这两种手段能够使精确率达到 100% 的同时召回率为 3040%。至关重要的是,时域连续性检测将使场景识别滞后至少 3 个关键帧,同时召回率较低,这都是目前存在的问题。
为了应对这个问题,本文提出一种新的场景识别(召回率得到改善)以及多地图数据关联算法。一旦 Local Mapping 线程创建了关键帧,场景识别算法就会被激活并且寻找该帧在 Atlas 中的数据关联。若匹配的关键帧在 active map 中,则进行闭环;否则,则进行多地图间的数据关联,即将 active map 与匹配的 map 进行融合。一旦这个新的关键帧与匹配地图间的相对位姿被计算出,就定义一个局部窗口,这个局部窗口包括匹配的关键帧以及这个关键帧的共视关键帧。在这个局部窗口中,我们会寻找中期数据关联,以提高闭环以及地图融合的精度。这个改进使得 ORB-SLAM3 比 ORB-SLAM2 具有更高的精度。
场景识别
此处较为简单,与 ORB-SLAM2 基本类似,只是增加了重力向校验的步骤。具体地,计算出了当前关键帧在 matched map(可能是 active map 或者其它地图)中的位姿,检验 pitch(俯仰角)和 roll(横滚角)是否小于一定阈值来对场景识别结果进行校验。
视觉地图融合
当场景识别成功后,位于 active map 中的当前关键帧与位于 active map 中的当前关键帧产生了多地图的数据关联,此时会进行地图融合。在此过程中,必须格外小心,以确保跟踪线程可以迅速重用中的信息,以避免地图重复。
由于可能包含许多元素,融合它们可能需要很长时间,因此融合分为两个步骤。首先,在由和的邻域定义的 welding window(焊接窗口)中执行融合,随后在第二阶段,通过位姿图优化将校正传播到融合图的其余部分。具体过程如下:
step1: Welding window assembly
Welding window 包括当前关键帧及其共视帧,以及其共视帧,以及被这些关键帧观测的地图点。在将它们包含在 Welding window 中之前,属于的关键帧和地图点通过进行变换,以使其与对齐。
step2: 融合
与融合为一个新的 active map。为了要删除重复的点,关键帧主动搜索匹配中的点。对于每个匹配点,都会删除中的点,并保留中的点,并累积删除点的所有观测值,同时更新共视图以及本质图。
step3: Welding bundle adjustment
Welding window 范围内的所有关键帧进行局部 BA 优化(见下图)。为了确定尺度自由度,观测到的那些关键帧需要保持固定。优化完成后,Welding window 区域中包含的所有关键帧都可以用于跟踪,实现地图的快速/准确复用。
位姿图优化
位姿图利用本质图在融合后的地图范围进行优化,Welding window 范围内的关键帧保持固定。这一步的意义在于分摊误差。
视觉惯导地图融合
与上述纯视觉地图融合步骤类似,只是修改了步骤 1 和 3,具体如下:
step1: VI welding window assembly
若 active map 是 mature 的,与纯视觉类似,将对地图进行变换,与对齐。若 active map 不是 mature 的,将对地图进行变换,与对齐。
step2: 同上
step3: VI welding bundle adjustment
active 关键帧及其前 5 个时间连续的关键帧的位姿,速度和 bias 参与优化,对于中的及其前 5 个时间连续的关键帧的位姿,速度和 bias 也参与优化,详细见下图。对于,优化中包括但不固定在紧接局部窗口之前的那一关键帧位姿,而对于,局部窗口之前的那一关键帧,但其姿势仍然参与优化。所有这些关键帧看到的所有地图点以及观测这些地图点的关键帧姿势也都进行优化。所有关键帧和地图点都通过重投影误差项(作为约束因子,下图中的蓝色小方块)进行关联。
闭环
闭环校正算法类似于地图融合,但是在这种情况下,当前关键帧以及匹配关键帧都同属于 active map。welding window 是由匹配的关键帧组合而成/重复的 3D 点被融合/更新共视图以及本质图的连接关系。下一步是姿势图优化(PG),以均分误差。由于闭环增加了中期/长期数据关联,此时进行全局 BA。在 VI 情况下,仅在关键帧的数量低于阈值时才执行全局 BA,以避免巨大的计算量。
实验结果
实验主要分为如下部分:
- EuRoC 单一会话(地图):11 个场景中的每个序列产生一个地图;传感器配置:单目,单目+IMU,双目以及双目+IMU;
- TUM-VI 数据:比较单目/双目鱼眼 VI 配置下的表现;
- 多次会话,上述所有数据;
EuRoC 单次会话
VI SLAM 以及 TUM-VI 数据集
多地图
总结
基于 ORB-SLAM/ORB-SLAM2 以及 ORB-SLAM-VI,本文提出了 ORB-SLAM3,它是一个功能更加完整,性能更加出众的 SLAM 系统。这使得该系统更加适合长时/大规模 SLAM 实际应用。
实验结果表明,ORB-SLAM3 是第一个能够有效利用短期,中期,长期和多地图数据关联的视觉和视觉惯性系统,其精度水平已经超出了现有系统。实验结果还表明,关于精度,使用所有这些类型的数据关联的能力会超过其他选择,如使用直接方法代替特征点法或对局部 BA 执行关键帧边缘化,而不是像我们那样假设一组外部静态关键帧。
关于鲁棒性,直接法在低纹理环境中可能更鲁棒,但仅限于短期和中期数据关联。另一方面,匹配特征描述符可以成功解决长期和多地图数据关联问题,但与使用光度信息的 Lucas-Kanade 相比,跟踪功能似乎不那么可靠。在直接法中使用这四种数据关联方式是一个非常有趣的研究领域,我们目前正在根据这个想法探索从人体内部的内窥镜图像构建地图。
在四种不同的传感器配置中,双目惯导 SLAM 提供了最可靠,最准确的解决方案。此外,惯性传感器允许以 IMU 速率估算姿势,IMU 速率比帧速率高几个数量级,这可能也会在某些领域发挥优势(如 AR/MR 等领域)。对于设备体积/成本受限等应用,可以选择使用单目惯导方案,精度与鲁棒性并不会下降多少。
在慢速运动或没有旋转和俯仰旋转的应用中,例如平坦区域中的汽车,IMU 传感器可能难以初始化。在这些情况下,推荐使用双目 SLAM。或者,使用 CNN 进行单目深度恢复的最新研究成果为单目 SLAM 恢复尺度提供了良好的前景,但是需要保证在同样的环境中对网络进行了训练(泛化性问题)。