原论文:ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAMCarlos Campos, Richard Elvira, Juan J. Gómez Rodríguez, José M. M. Montiel, Juan D. TardósarXiv:2007.11898
代码开源地址:https://github.com/UZ-SLAMLab/ORB_SLAM3
YouTube 视频订阅:https://www.youtube.com/channel/UCXVt-kXG6T95Z4tVaYlU80QORB-SLAM3
ORB-SLAM3摘要
本文介绍了ORB-SLAM3,这一个首创能够基于视觉/视觉惯导/多地图的SLAM系统,可以使用单目,双目,RGBD相机(针孔/鱼眼相机模型)。
第一个创新点,它完全依赖最大后验MAP估计,进行基于特征点的视觉惯导紧融合,在IMU初始化阶段也是如此。
此系统可以实时地鲁棒地在或大或小,室内室外环境中运行,比之前的系统精度提高2-5倍。
第二个主要创新是多地图系统,基于提高了召回率的场景重识别方法,使得ORB-SLAM3可以在不佳的环境中长时间运行。当发生丢失时,它创建新地图,当重新到访建立过地图的地点,新地图回无缝地合并到老地图中。对比只用前几秒信息的视觉里程计系统,ORB-SLAM3是第一个能够在所有阶段重新利用之前所有信息的系统。基于co-visible关键帧的Bundle adjustment方法,使得即使两个信息其相隔的时间很远,或者来自于之前的建图阶段。也能够有较高的是差来提高准确度。
我们的实验表明,在利用所有传感器时,ORB-SLAM3和最好的系统鲁棒性相同,并且显著地更加精确。
值得注意的是,我们的双目惯导SLAM系统,在EuRoc飞行器数据集上达到了3.6cm的准确度,在TUM-VI手持快速运动的数据集(代表AR/VR场景设置)上达到9mm的精度。为了进益SLAM发展,我们公开了ORB-SLAM3代码
ORB-SLAM3最大的accuracy的提升来源于monocular/stereo + IMU的MAP initialization(也是作者几个月前的工作:https://arxiv.org/abs/2003.05766),简单说一下就是三步:
1. 在key frames上用bundle adjustment的Visual MAP;
2. Inertial的trajectory的MAP;
3. visual-inertial MAP,并且要是跑一个完完整整的visual-inertial bundle adjustment 5~10秒钟会更加精确。
另一个作者说的小贡献,就是在loop closure问题上,他们依然用了DBoW2作为database来寻找相似的keyframes,写了一个包括RANSAC的6步的很复杂的步骤来保证确实是一个有效的loop closure,逻辑比ORB-SLAM2更清晰更复杂,识别出来之后他们会visual inertial map merging。
总的来说跟ORB-SLAM2基本一脉相承,ATE结果也惊人的好,再一次带领大家把monocular/stereo + IMU SLAM这个领域做到无事可做的地步。
ORB-SLAM 系列是一个 feature-based 的 SLAM 系统,关于 feature-based、a geometric BA that minimizes feature reprojection error 这些与其他类型的区别、优缺点等就不在这里赘述。随着 loop-closing 技术在一些 VO 系统中慢慢被引进,VO 与 SLAM 系统两者之间的差异正在逐渐模糊。但是在作者的理念中,SLAM 是:一个移动的对象建立起环境的地图并且实时计算自己在地图中的位姿;而 VO 的重点是估计自身的运动(ego-motion)。注意这点,map 部分被认为是 SLAM 中非常重要、具有灵魂东西。feature-based 的 map 给 SLAM 过程带来了很大的好处,主要体现在可以将与历史数据之间的约束加入到 BA 之中。这里指的历史数据关联,被作者分为了三类:
Short-term data association
Mid-term data association
Long-term data association
ORB-SLAM3 同时利用了这三种 data association,并且还加入了 multi-map data association。这样就允许来自之前的子地图的信息来进行 match 和 BA。这样以来实现 SLAM 的终极目标:建图并用来提供高精度的定位。作者也提到,This is essentially a system paper。最大的贡献就是 ORB-SLAM3 它本身。The most complete and accurate visual,visual-inerial and multi-map SLAM system to date。具体的 contributions 如下:
作者分别从 Visual SLAM、Visual-Inertial SLAM、Multi-Map SLAM 几个方面描述相关工作,并做了一些与其他系统具体的实验对比,比如在 EuRoC 数据集的多场景操作,精度比 VINS-Mono 高 3.2 倍。具体这里不再赘述请移步原论文。这里主要贴出作者与其他著名系统之间的对比:
还是那句话:It is a full multi-map and multi-session sys- tem able to work in pure visual or visual-inertial modes with monocular, stereo or RGB-D sensors, using pin-hole and fisheye camera models.ORB-SLAM3 基于 ORB-SLAM2 和 VI-ORB-SLAM 构建。整个系统流程和 ORB-SLAM2 相似。主要分以下几个部分:
ORB-SLAM3 想要在系统中将相机模型给抽象出来,将所有与相机模型相关的参数给剥离出来(如projection and unprojection functions, Jacobian, etc)形成单独的模块。作者实现了经典的 pinhole 针孔相机模型与 Kannala-Brandt 鱼眼相机模型。
ORB-SLAM 之前做重定位通过 ePnP 做的,但 ePnP 需要 pinhole。所以在这个系统中,为了兼顾鱼眼相机模型,采用了 MLPnP:Maximum Likelihood Perspective-n-Point algorithm。该算法以反投影的光线(rays)为输入,所以提供个反投影模型鱼眼相机就可以用了。
目前很多双目系统都假设了一个很理想的双目:同样的焦距、成像平面在同一平面上、aligned with horizontal epipolar lines(这样一目的 feature 在另一目的同一行中寻找即可)。鱼眼的话,做 rectifying 视野范围会大大减小,丧失了其本身的优势。但是实际场景通常不是这么理想的,并且不依赖 rectifying,因此可以考虑:
这样做三角化和 BA 比较高效,估计 6 自由度姿态也通过先在双目与 IMU 中的一个上做,其他的通过刚体位姿变换即可。当处于双目共同观测区域的 landmarks 通过双目进行三角化,不再共同区域的就正常的 multi-view 进行三角化即可。
这一块就比较 formulation 了。和常见的很像,IMU 预积分、构建残差项等等。优化的状态变量:
IMU 预积分:
相机 pose 与 landmark 3D 点的视觉重投影误差:
最终优化:
几种情况下的因子图:
关于剩下的 IMU 初始化、回环等模块,这些是大坑,后续在接下来的文章中详细补充。
作者做了大量的实验对比,在大多数场景下 ORB-SLAM3 具有最好的结果。详细实验设置请移步原论文,这里贴出概括性的结果对比表格。Single-session SLAM on EuRoC
Visual-Inertial SLAM on TUM-VI Benchmark
image
image
Multi-session SLAM
image
参考链接:https://www.jianshu.com/p/3e2001a37fa5
运行ORB-SLAM3的示例
数据集:
1 [EuRoC数据集] (http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets) 使用立体或单目,有或没有IMU;
2 [TUM-VI数据集](https://vision.in.tum.de/data/datasets/visual-inertial-dataset) 使用鱼眼,立体或单眼,带或不带IMU。
一些执行示例的视频可以在[ORB-SLAM3频道]找到(https://www.youtube.com/channel/UCXVt-kXG6T95Z4tVaYlU80Q).
EuRoC数据集与TUM-VI数据集主要是非鱼眼与鱼眼的相机模型.---pinhole 和 fisheye (针孔相机模型与鱼眼相机模型)。
#4。EuRoC示例
[EuRoC数据集]用两个针孔摄像机和一个惯性传感器记录。我们提供了一个在所有传感器配置中启动eurc序列的示例脚本。
1从下载序列(ASL格式)http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
2在项目的根上,打开脚本“euroc_examples.sh“。将**pathDatasetEuroc**变量更改为指向已解压缩数据集的目录。
3执行以下脚本以处理所有传感器配置的所有序列:
```
./euroc_examples
```
##评价
EuRoC为IMU主体参考中的每个序列提供基本真实性。由于纯视觉执行报告以左摄像头为中心的轨迹,我们在“评估”文件夹中提供了地面真实到左摄像头参考的转换。视觉惯性轨迹使用来自数据集的地面真实情况。
执行以下脚本以处理序列并计算RMS ATE:
```
./euroc_eval_examples
```
#5。TUM-VI示例
[TUM-VI数据集]用两个鱼眼摄像机和一个惯性传感器记录下来。
1从下载序列(https://vision.in.tum.de/data/datasets/visual-inertial-dataset然后解压缩它。
2打开脚本“tum_vi_examples.sh“在项目的根上。将**pathDatasetTUM_VI**变量更改为指向已解压缩数据集的目录。
3执行以下脚本以处理所有传感器配置的所有序列:
```
./tum_vi_examples
```
##评价
在TUM-VI中,地面真相只在所有序列开始和结束的房间中可用。因此,误差测量序列末尾的漂移。
执行以下脚本以处理序列并计算RMS ATE:
```
./tum_vi_eval_examples
```
./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ./Datasets/EuRoC/MH05 ./Examples/Monocular/EuRoC_TimeStamps/MH05.txt dataset-MH05_mono