ORB-SLAM3
V1.0,2021年12月22日
**作者:**卡洛斯·坎波斯、理查德·埃尔维拉、胡安·J·戈麦斯·罗德里格斯、何塞·MM·蒙蒂尔、胡安·D·塔多斯。
变更日志描述了每个版本的特性。
ORB-SLAM3 是首个能够使用单目、立体和 RGB-D相机执行视觉、视觉惯性和多地图 SLAM 的实时 SLAM 库,支持针孔和鱼眼镜头模型。在所有传感器配置下,ORB-SLAM3 的鲁棒性与文献中最佳系统相当,并且精度显著提升。
我们提供了在EuRoC 数据集中使用立体或单目(含 IMU 和单目)以及在TUM-VI 数据集中使用鱼眼立体或单目(含 IMU 和单目)运行 ORB-SLAM3 的示例。部分示例执行视频可在ORB-SLAM3 频道找到。
该软件基于Raul Mur-Artal、Juan D. Tardos、JMM Montiel和Dorian Galvez-Lopez ( DBoW2 )开发的ORB-SLAM2。
相关出版物:
[ORB-SLAM3] Carlos Campos、Richard Elvira、Juan J. Gómez Rodríguez、José MM Montiel 和 Juan D. Tardós,ORB-SLAM3:用于视觉、视觉惯性和多地图 SLAM 的精确开源库, IEEE 机器人**学报37(6):1874-1890,2021 年 12 月。PDF 。**
[IMU 初始化] Carlos Campos、JMM Montiel 和 Juan D. Tardós,视觉惯性初始化的纯惯性优化,ICRA 2020 . PDF
[ORBSLAM-Atlas] Richard Elvira、JMM Montiel 和 Juan D. Tardós, ORBSLAM- Atlas****:一个强大而准确的多地图系统,IROS 2019。PDF 。
[ORBSLAM-VI] Raúl Mur-Artal 和 Juan D. Tardós,《可重用地图的视觉惯性单目 SLAM》,IEEE 机器人与自动化快报,第 2 卷,第 2 期,第 796-803 页,2017 年**。PDF**。
[立体和 RGB-D] Raúl Mur-Artal 和 Juan D. Tardós。ORB -SLAM2:适用于单目、立体和 RGB-D 相机的开源 SLAM 系统。IEEE_机器人学报,_第 33 卷,第 5 期,第 1255-1262 页,2017 年**。PDF**。
[单目] Raúl Mur-Artal、José MM Montiel 和 Juan D. Tardós。ORB -SLAM:一种多功能且精确的单目 SLAM 系统。IEEE_机器人学报,_第 31 卷,第 5 期,第 1147-1163 页,2015 年。(2015 年 IEEE 机器人学报最佳论文奖)。PDF。
[DBoW2 位置识别] Dorian Gálvez-López 和 Juan D. Tardós。基于二进制词袋的快速图像序列位置识别方法。_《IEEE 机器人学报》,_第 28 卷,第 5 期,第 1188-1197 页,2012 年**。PDF**
1. 许可证
ORB-SLAM3 采用GPLv3 许可证发布。所有代码/库依赖项(及相关许可证)的列表,请参阅Dependencies.md。
如需用于商业用途的 ORB-SLAM3 闭源版本,请联系作者:orbslam (at) unizar (dot) es。
如果您在学术著作中使用 ORB-SLAM3,请引用:
@article{ORBSLAM3_TRO,
title={{ORB-SLAM3}: An Accurate Open-Source Library for Visual, Visual-Inertial
and Multi-Map {SLAM}},
author={Campos, Carlos AND Elvira, Richard AND G\´omez, Juan J. AND Montiel,
Jos\'e M. M. AND Tard\'os, Juan D.},
journal={IEEE Transactions on Robotics},
volume={37},
number={6},
pages={1874-1890},
year={2021}
}
2. 先决条件
我们已经在Ubuntu 16.04和18.04中测试了该库,但在其他平台上编译应该也很容易。功能强大的计算机(例如 i7)将确保实时性能并提供更稳定、更准确的结果。
C++11 或 C++0x 编译器
我们使用 C++11 的新线程和计时功能。
穿山甲
我们使用Pangolin来实现可视化和用户界面。下载和安装说明请访问:https://github.com/stevenlovegrove/Pangolin。
OpenCV
我们使用OpenCV来处理图像和特征。下载和安装说明可在http://opencv.org找到。至少需要 3.0 版本。已使用 OpenCV 3.2.0 和 4.4.0 进行测试。
特征3
g2o 所需(见下文)。下载和安装说明请访问:http://eigen.tuxfamily.org。至少需要 3.1.0 版本。
DBoW2 和 g2o(包含在第三方文件夹中)
我们使用修改版的DBoW2库进行位置识别,并使用g2o库进行非线性优化。这两个修改版库(均为 BSD 版本)均包含在_Thirdparty_文件夹中。
Python
用于计算轨迹与地面实况的对齐情况。需要 Numpy 模块。
- (win)http://www.python.org/downloads/windows
- (deb)
sudo apt install libpython2.7-dev
- (mac) 预装 osx
ROS(可选)
我们提供了一些使用 ROS 处理单目、单目惯性、立体、立体惯性或 RGB-D 相机输入的示例。这些示例的构建是可选的。这些示例已在 Ubuntu 18.04 系统上使用 ROS Melodic 进行了测试。
3.构建ORB-SLAM3库和示例
克隆存储库:
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
我们提供了一个脚本build.sh
来构建_第三方_库和_ORB-SLAM3_。请确保您已安装所有必需的依赖项(请参阅第 2 节)。执行以下命令:
cd ORB_SLAM3
chmod +x build.sh
./build.sh
这将 在_lib文件夹中创建_libORB_SLAM3.so ,并在_Examples_文件夹中创建可执行文件。
4. 使用相机运行 ORB-SLAM3
目录Examples
包含几个演示程序和校准文件,用于在所有传感器配置下运行 ORB-SLAM3,并搭载英特尔 Realsense 摄像头 T265 和 D435i。使用您自己的摄像头所需的步骤如下:
-
校准相机跟随
Calibration_Tutorial.pdf
并写入校准文件your_camera.yaml
-
修改提供的演示之一以适合您的特定相机型号,然后构建它
-
使用 USB3 或适当的接口将相机连接到计算机
-
运行 ORB-SLAM3。例如,对于我们的 D435i 相机,我们将执行:
./Examples/Stereo-Inertial/stereo_inertial_realsense_D435i Vocabulary/ORBvoc.txt ./Examples/Stereo-Inertial/RealSense_D435i.yaml
5. EuRoC 示例
EuRoC 数据集由两台针孔摄像机和一个惯性传感器记录。我们提供了一个示例脚本,用于在所有传感器配置下启动 EuRoC 序列。
-
从http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets下载序列(ASL 格式)
-
打开项目根目录中的脚本 “euroc_examples.sh”。将pathDatasetEuroc变量更改为指向数据集解压后的目录。
-
执行以下脚本来处理所有传感器配置的所有序列:
./euroc_examples
评估
EuRoC 为 IMU 主体参考中的每个序列提供地面实况。由于纯视觉执行报告的轨迹以左摄像头为中心,我们在“评估”文件夹中提供了地面实况到左摄像头参考的转换。视觉惯性轨迹使用数据集中的地面实况。
执行以下脚本来处理序列并计算 RMS ATE:
./euroc_eval_examples
6. TUM-VI 示例
TUM-VI 数据集由两个鱼眼相机和一个惯性传感器记录。
-
从https://vision.in.tum.de/data/datasets/visual-inertial-dataset下载一个序列并解压缩。
-
打开项目根目录中的脚本“tum_vi_examples.sh”。将pathDatasetTUM_VI变量更改为指向数据集解压后的目录。
-
执行以下脚本来处理所有传感器配置的所有序列:
./tum_vi_examples
评估
在 TUM-VI 中,地面真实值仅在所有序列开始和结束的房间中可用。因此,误差衡量的是序列末尾的漂移。
执行以下脚本来处理序列并计算 RMS ATE:
./tum_vi_eval_examples
7. ROS 示例
构建单声道、单惯性、立体声、立体声惯性和 RGB-D 节点
使用 ROS Melodic 和 ubuntu 18.04 进行测试。
- _将包含Examples/ROS/ORB_SLAM3_的路径添加到ROS_PACKAGE_PATH环境变量中。打开.bashrc文件:
gedit ~/.bashrc
并在末尾添加以下行。将 PATH 替换为您克隆 ORB_SLAM3 的文件夹:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM3/Examples/ROS
- 执行
build_ros.sh
脚本:
chmod +x build_ros.sh
./build_ros.sh
运行单眼节点
对于来自主题的单目输入,/camera/image_raw
请运行节点 ORB_SLAM3/Mono。您需要提供词汇表文件和设置文件。请参阅上面的单目示例。
rosrun ORB_SLAM3 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
运行单目惯性节点
对于来自主题的单目输入/camera/image_raw
和来自主题的惯性输入/imu
,运行节点 ORB_SLAM3/Mono_Inertial。将可选的第三个参数设置为 true 将对图像应用 CLAHE 均衡(主要针对 TUM-VI 数据集)。
rosrun ORB_SLAM3 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE [EQUALIZATION]
运行立体声节点
对于来自主题的立体输入/camera/left/image_raw
,/camera/right/image_raw
请运行节点 ORB_SLAM3/Stereo。您需要提供词汇表文件和设置文件。对于针孔相机模型,如果您提供校正矩阵(参见 Examples/Stereo/EuRoC.yaml 示例),节点将在线校正图像,否则必须对图像进行预校正。对于鱼眼相机模型,由于系统直接使用原始图像,因此无需校正:
rosrun ORB_SLAM3 Stereo PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE ONLINE_RECTIFICATION
运行立体惯性节点
/camera/left/image_raw
对于来自主题和 的立体输入/camera/right/image_raw
,以及来自主题 的惯性输入/imu
,运行节点 ORB_SLAM3/Stereo_Inertial。您需要提供词汇文件和设置文件,如果需要,还可以提供校正矩阵,其方式与立体情况类似:
rosrun ORB_SLAM3 Stereo_Inertial PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE ONLINE_RECTIFICATION [EQUALIZATION]
运行RGB_D节点
/camera/rgb/image_raw
对于来自主题和 的RGB-D 输入/camera/depth_registered/image_raw
,运行节点 ORB_SLAM3/RGBD。您需要提供词汇表文件和设置文件 。请参阅上面的 RGB-D 示例。
rosrun ORB_SLAM3 RGBD PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
**运行 ROS 示例:**从 EuRoC 数据集 ( http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets ) 下载一个 rosbag(例如 V1_02_medium.bag)。在终端上打开 3 个选项卡,并在每个选项卡上运行以下命令,以进行立体惯性配置:
roscore
rosrun ORB_SLAM3 Stereo_Inertial Vocabulary/ORBvoc.txt Examples/Stereo-Inertial/EuRoC.yaml true
rosbag play --pause V1_02_medium.bag /cam0/image_raw:=/camera/left/image_raw /cam1/image_raw:=/camera/right/image_raw /imu0:=/imu
一旦 ORB-SLAM3 加载了词汇表,请在 rosbag 选项卡中按下空格键。
**备注:**对于来自 TUM-VI 数据集的 rosbag,由于块大小问题,可能会出现一些播放问题。一种可能的解决方案是使用默认块大小重新打包它们,例如:
rosrun rosbag fastrebag.py dataset-room1_512_16.bag dataset-room1_512_16_small_chunks.bag
8. 运行时间分析
中的标志include\Config.h
可激活时间测量。需要取消注释该行#define REGISTER_TIMES
才能获取一次执行的时间统计信息,该统计信息显示在终端上并存储在文本文件 ( ExecTimeMean.txt
) 中。
9.校准
您可以在以下位置找到视觉惯性校准教程和有效配置文件内容的详细描述 Calibration_Tutorial.pdf