ORB-SLAM3
Changelog描述了每个版本的特点。
ORB-SLAM3是第一个实时SLAM库,能够使用针孔和鱼眼镜头模型,用单眼、立体和RGB-D相机执行视觉、视觉-惯性和多地图SLAM。在所有的传感器配置中,ORB-SLAM3与文献中最好的系统一样健壮,并且明显更准确。
我们提供了在EuRoC数据集中使用立体或单眼,带或不带IMU,以及在TUM-VI数据集中使用鱼眼立体或单眼,带或不带IMU运行ORB-SLAM3的例子。一些例子的执行视频可以在ORB-SLAM3频道找到。
该软件基于Raul Mur-Artal,Juan D. Tardos,J. M. M. Montiel和Dorian Galvez-Lopez(DBoW2)开发的ORB-SLAM2。
相关出版物。
[ORB-SLAM3] Carlos Campos, Richard Elvira, Juan J. Gómez Rodríguez, José M. M. Montiel and Juan D. Tardós,ORB-SLAM3:用于视觉、视觉-惯性和多地图SLAM的精确的开源库,IEEE机器人反应37(6):1874-1890,2021年12月。 PDF。
[IMU初始化] Carlos Campos, J. M. M. Montiel and Juan D. Tardós,Inertial-Only Optimization for Visual-Inertial Initialization,ICRA 2020.PDF
[ORBSLAM-Atlas] Richard Elvira, J. M. M. Montiel and Juan D. Tardós,ORBSLAM-Atlas: a robust and accurate multi-map system,IROS 2019.PDF。
[ORBSLAM-VI] Raúl Mur-Artal, and Juan D. Tardós,Visual-inertial monocular SLAM with map reuse, IEEE Robotics and Automation Letters, vol. 2 no. 2, pp.796-803, 2017。PDF。
[立体和RGB-D] Raúl Mur-Artal 和 Juan D. Tardós.ORB-SLAM2:一个用于单眼、立体和RGB-D相机的开源SLAM系统。*IEEE Transactions on Robotics,*vol. 33, no.5, pp. 1255-1262, 2017.PDF。
[单眼] Raúl Mur-Artal, José M. M. Montiel 和 Juan D. Tardós.ORB-SLAM:一个多功能和准确的单眼SLAM系统。*IEEE Transactions on Robotics,*vol. 31, no.5, pp. 1147-1163, 2015.(2015年IEEE Transactions on Robotics最佳论文奖)。PDF。
[DBoW2位置识别] Dorian Gálvez-López和Juan D. Tardós。用于图像序列中快速地点识别的二进制词包。*IEEE Transactions on Robotics,*vol. 28, no.5, pp. 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
我们使用Pangolin来实现可视化和用户界面。下载和安装说明可以在以下网站找到:https://github.com/stevenlovegrove/Pangolin。
OpenCV
我们使用OpenCV来处理图像和特征。下载和安装说明见:http://opencv.org。 至少需要3.0版本。用OpenCV 3.2.0和4.4.0测试。
Eigen3
g2o要求的(见下文)。下载和安装说明见:http://eigen.tuxfamily.org。 至少需要3.1.0。
DBoW2和g2o (包含在第三方文件夹中)
我们使用修改后的DBoW2库来进行位置识别,使用g2o库来进行非线性优化。这两个修改过的库(都是BSD的)都包含在Thirdparty文件夹中。
Numpy
需要计算轨迹与地面实况的一致性。需要Numpy模块。
- (win)www.python.org/downloads/w…
- (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 包含几个演示程序和校准文件,以便在所有的传感器配置中用英特尔Realsense相机T265和D435i运行ORB-SLAM3。使用你自己的相机需要的步骤是。
-
按照
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序列。
-
从projects.asl.ethz.ch/datasets/do…下载一个序列(ASL格式)。
-
在项目的根部打开脚本 "euroc_examples.sh"。改变pathDatasetEuroc变量以指向数据集已被解压缩的目录。
-
执行以下脚本以处理所有传感器配置的所有序列。
./euroc_examples
评估
EuRoC为每个序列提供了IMU身体参考的基础真理。由于纯视觉执行报告了以左摄像头为中心的轨迹,我们在 "评估 "文件夹中提供了基础真理到左摄像头参考的转换。视觉-惯性轨迹使用数据集中的地面实况。
执行下面的脚本来处理序列并计算RMS ATE。
./euroc_eval_examples
6.TUM-VI例子
TUM-VI数据集是用两个鱼眼相机和一个惯性传感器记录的。
-
从vision.in.tum.de/data/datase…下载一个序列并解压。
-
打开项目根目录下的脚本 "tum_vi_examples.sh"。改变pathDatasetTUM_VI变量,使其指向数据集被解压缩的目录。
-
执行以下脚本来处理所有传感器配置的所有序列。
./tum_vi_examples
评估
在TUM-VI中,只有在所有序列开始和结束的房间里才有地面真实。因此,误差测量的是序列结束时的漂移。
执行以下脚本来处理序列并计算有效值ATE。
./tum_vi_eval_examples
7.ROS实例
为单声道、单惯性、立体声、立体惯性和RGB-D建立节点
用ROS Melodic和ubuntu 18.04测试。
- 将包括Examples/ROS/ORB_SLAM3在内的路径添加到 ROS_PACKAGE_PATH 环境变量。打开.bashrc文件。
gedit ~/.bashrc
并在最后添加以下一行。用你克隆ORB_SLAM3的文件夹替换PATH。
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 示例),节点将在线重新计算图像,否则图像必须预先矫正。对于FishEye相机模型来说,由于系统使用的是原始图像,所以不需要进行矫正。
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 和/camera/depth_registered/image_raw 的RGB-D输入,运行节点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