ORB-SLAM3:一个准确的开源库,用于可视化、视觉惯性和多映射SLAM
ORB_SLAM3的作者:卡洛斯·坎波斯、理查德·埃尔维拉、胡安·J·戈麦斯·罗德里格斯、何塞·M·M·蒙蒂尔、胡安·D·塔尔多斯
GitHub链接
https://github.com/UZ-SLAMLab/ORB_SLAM3
ORB-SLAM3 是首个能够使用针孔和鱼眼镜头模型,使用单目、立体和RGB-D相机执行视觉、视觉惯性和多图SLAM的实时SLAM库。在所有传感器配置下,ORB-SLAM3的坚固性与文献中最好的系统相当,且准确度显著提升。
下面演示在ubuntu20.04下的安装
ORB_SLAM3所需的依赖库
Eigen3
OpenCV4.2
Panolin0.5
boost
新系统装备
安装git
sudo apt update && sudo apt install -y build-essential cmake git安装vim编辑器
sudo apt update && sudo apt-get install vim安装gcc、g++
sudo apt update && sudo apt install build-essentialROS1_noetic版本安装
一键安装
使用鱼香ROS一键安装ROS1-noetic版本(ROS1-noetic桌面版)
wget http://fishros.com/install -O fishros && . fishros安装验证
分别打开三个终端,输入以下三条指令。
roscorerosrun turtlesim turtlesim_noderosrun turtlesim turtle_teleop_key若可控制小乌龟运动即证明ROS安装成功。

3.依赖库
Eigen3
C++ 里专门用来做【矩阵运算、向量计算、几何变换】的顶级数学库。
C++ 版的高性能 MATLAB / NumPy,专门给机器人、视觉、SLAM、控制算法用的。
安装
sudo apt updatesudo apt install libeigen3-dev -y
验证安装是否正确
pkg-config --modversion eigen3如果输出版本号(比如 3.3.7 或 3.3.9),说明安装成功。
或者:
ls /usr/include/eigen3/Eigen能看到很多头文件 = 安装成功。

OpenCV4.2
依赖安装
sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-devsudo apt install python3-dev python3-numpysudo apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-devsudo apt install libpng-dev libopenexr-dev libtiff-dev libwebp-dev
下载源码
git clone -b 4.2.0 https://github.com/opencv/opencv.git opencv-4.2.0CMake 配置
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_IPP=OFF ..编译命令
make -j$(nproc)安装
sudo make install验证安装成功
pkg-config --modversion opencv4# 输出 4.2.0,说明 C++ 库安装成功python3 -c "import cv2; print(cv2.__version__)"# 输出 4.2.0,说明 Python 绑定也正常工作

如果你未来要在 ROS 里用 OpenCV,只需要在 CMakeLists.txt 里加:
本项目采取别的修改方案,此处不进行
find_package(OpenCV REQUIRED)include_directories(${OpenCV_INCLUDE_DIRS})target_link_libraries(你的节点 ${OpenCV_LIBS})
Panolin0.5
Pangolin 是一个轻量级、跨平台的 C++ 开源图形库,专门为机器人 / 计算机视觉领域设计,用来做 3D 可视化、交互界面和视频输入输出。
依赖安装
sudo apt-get install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-devsudo apt-get install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev
下载Panolin v0.5
git clone https://github.com/stevenlovegrove/Pangolin.gitcd Pangolingit checkout v0.5
编译配置
cmake -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DBUILD_FFMPEG=OFF -DBUILD_PANGOLIN_VIDEO=OFF ..编译安装
make -j$(nproc)sudo make install
系统库配置
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/local-lib.confsudo ldconfig
测试代码 + 编译命令
1. 先创建测试文件(直接复制运行)
cat > test_pangolin.cpp << 'EOF'#include<pangolin/pangolin.h>int main() {pangolin::CreateWindowAndBind("Pangolin Test", 640, 480);glEnable(GL_DEPTH_TEST);pangolin::OpenGlRenderState s_cam(pangolin::ProjectionMatrix(640, 480, 420, 420, 320, 240, 0.2, 100),pangolin::ModelViewLookAt(-2, 2, -2, 0, 0, 0, pangolin::AxisY));pangolin::Handler3D handler(s_cam);pangolin::View &d_cam = pangolin::CreateDisplay().SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f/480.0f).SetHandler(&handler);while (!pangolin::ShouldQuit()) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);d_cam.Activate(s_cam);glClearColor(0.1f, 0.1f, 0.1f, 1.0f);pangolin::glDrawColouredCube();pangolin::FinishFrame();}return 0;}EOF
2.编译命令
g++ test_pangolin.cpp -o test_pangolin -lpangolin -lGL -lrt -I/usr/include/eigen33. 运行
./test_pangolin运行弹出 黑色窗口 + 彩色立方体 = 100% 成功

在 ROS / C++ 项目 里使用 Pangolin,只需要在 CMakeLists.txt 加:
本项目采取别的修改方案,此处不进行
find_package(Pangolin REQUIRED)include_directories(${Pangolin_INCLUDE_DIRS})target_link_libraries(你的节点 ${Pangolin_LIBRARIES})
boost
Boost 就是 C++ 的 “万能增强工具箱”,补全 C++ 原生没有的超级实用功能!
依赖安装
sudo apt updatesudo apt install build-essential libicu-dev python3-dev
下载解压
wget https://archives.boost.io/release/1.77.0/source/boost_1_77_0.tar.bz2tar -xvf boost_1_77_0.tar.bz2cd boost_1_77_0
编译安装
sudo ./bootstrap.shsudo ./b2 install
验证路径
/usr/local/include/boost//usr/local/lib/libboost_*.so
测试代码 + 编译命令
第一步:创建测试文件
cat > boost_test.cpp << 'EOF'#include<iostream>#include<boost/version.hpp>#include<boost/thread.hpp>void hello() {std::cout << "Hello from Boost thread!" << std::endl;}int main() {std::cout << "Boost version: " << BOOST_VERSION << std::endl;boost::thread t(hello);t.join();return 0;}EOF
第二步:编译并运行
g++ boost_test.cpp -o boost_test -lboost_thread -lboost_system -pthread./boost_test
成功输出:
Boost version: 107700Hello from Boost thread!

ORB_SLAM3的源码编译
下载ORB_SLAM3
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3 --depth=1如果这个上面下载不行,那用下面这个
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3进入目录
首先在ORB_SLAM3文件下打开CMakeLists.txt
OpenCV 修改(必改)
# 原来find_package(OpenCV 4.4 REQUIRED)# 改成find_package(OpenCV 4.2 REQUIRED)


Eigen3版本号
# 原来find_package(Eigen3 3.1.0 REQUIRED)# 改成find_package(Eigen3 REQUIRED)


Pangolin 链接错误
在 target_link_libraries 里 加 -lrt


改完以后记得点保存
mono_euroc.cc 里的 false 改 true
操作:把 false 改成 true,运行时就能看到可视化界面了。
进入 ORB_SLAM3 文件夹
打开 Examples 文件夹
打开 Monocular 文件夹
找到 mono_euroc.cc
双击用文本编辑器打开


记得保存
编译命令
开始 分步编译(顺序绝对不能乱)
1. 编译 DBoW2
cd ~/ORB_SLAM3/Thirdparty/DBoW2mkdir build && cd buildcmake ..make -j4
2. 编译 g2o
cd ~/ORB_SLAM3/Thirdparty/g2omkdir build && cd buildcmake ..make -j4
3. 编译 Sophus
cd ~/ORB_SLAM3/Thirdparty/Sophusmkdir build && cd buildcmake ..make -j4
4. 编译 ORB-SLAM3 主程序
cd ~/ORB_SLAM3mkdir build && cd buildcmake ..make -j4
编译成功标志
[100%] Built target mono_tum[100%] Built target mono_inertial_tum_vi[100%] Built target mono_inertial_euroc

ORB-SLAM3 测试数据获取与运行
推荐EuRoC MAV 数据集(最适配 ORB-SLAM3)
EuRoC MAV 是苏黎世联邦理工(ETH Zurich)发布的视觉惯性 SLAM 标准基准数据集,也是ORB-SLAM3 项目的经典测试用例。
EuRoC MAV 是视觉惯性 SLAM 的标准基准,数据质量高、场景丰富、难度合理,是入门与评测的首选数据集。
官网入口(ETH ASL):https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
打开浏览器,访问这个网盘链接:
链接:https://pan.baidu.com/s/1Mo-rsHCoXP6F8Swsaky3TA
提取码:bdib
找到 MH_01_easy.bag或 V1_01_easy.bag,下载到你的Ubuntu里。
以MH_01_easy.bag为例,
下好后终端
mkdir -p ~/bagsmv MH_01_easy.bag ~/bags/
一键导出脚本
cat > export_bag_data.py << 'EOF'import rosbagimport cv2import osimport sysfrom sensor_msgs.msg import Image, Imufrom cv_bridge import CvBridgedef export_bag_to_dataset(bag_path, output_root, cam_topic, imu_topic):# 相机输出目录cam0_dir = os.path.join(output_root, "mav0/cam0/data")os.makedirs(cam0_dir, exist_ok=True)# 相机时间戳文件(单目惯性模式需要放在根目录)times_file = os.path.join(output_root, "times.txt")# IMU输出目录imu0_dir = os.path.join(output_root, "mav0/imu0")os.makedirs(imu0_dir, exist_ok=True)imu_file = os.path.join(imu0_dir, "data.csv")bridge = CvBridge()# --------------------------# 导出相机数据# --------------------------print("📷 正在导出相机图片和时间戳...")with rosbag.Bag(bag_path, 'r') as bag, open(times_file, 'w') as f_times:for topic, msg, t in bag.read_messages(topics=[cam_topic]):# 转成OpenCV格式图片img = bridge.imgmsg_to_cv2(msg, desired_encoding='mono8')# 时间戳转纳秒ts = msg.header.stamp.to_nsec()# 保存图片img_path = os.path.join(cam0_dir, f"{ts}.png")cv2.imwrite(img_path, img)# 写入times.txtf_times.write(f"{ts}\n")print("✅ 相机数据导出完成!")# --------------------------# 导出并转换IMU数据(直接生成ORB-SLAM3格式)# --------------------------print("📊 正在导出并转换IMU数据...")with rosbag.Bag(bag_path, 'r') as bag, open(imu_file, 'w') as f_imu:for topic, msg, t in bag.read_messages(topics=[imu_topic]):# 时间戳(纳秒)ts = msg.header.stamp.to_nsec()# 角速度和加速度wx = msg.angular_velocity.xwy = msg.angular_velocity.ywz = msg.angular_velocity.zax = msg.linear_acceleration.xay = msg.linear_acceleration.yaz = msg.linear_acceleration.z# 写入ORB-SLAM3标准格式f_imu.write(f"{ts},{wx},{wy},{wz},{ax},{ay},{az}\n")print("✅ IMU数据导出完成!")print(f"\n🎉 全部导出完成!数据集目录:{output_root}")print("📁 目录结构:")print(" mav0/cam0/data 相机图片")print(" mav0/imu0/data.csv IMU数据")print(" times.txt 时间戳文件")if __name__ == "__main__":# ------------ 在这里修改你的路径和话题!------------BAG_PATH = "/home/你的用户名/bags/MH_01_easy.bag"OUTPUT_DIR = "/home/你的用户名/ORB_SLAM3/datasets/MH01"CAM_TOPIC = "/cam0/image_raw"IMU_TOPIC = "/imu0"# -------------------------------------------------export_bag_to_dataset(BAG_PATH, OUTPUT_DIR, CAM_TOPIC, IMU_TOPIC)EOF
修改路径与话题
打开 export_bag_data.py,修改以下 4 项:
# ------------ 在这里修改你的路径和话题!------------BAG_PATH = "/home/xxx/bags/your.bag" # 你的 bag 路径OUTPUT_DIR = "/home/xxx/ORB_SLAM3/datasets/xxx" # 输出目录CAM_TOPIC = "/cam0/image_raw" # 相机话题IMU_TOPIC = "/imu0" # IMU 话题# -------------------------------------------------
运行
python3 export_bag_data.py输出成功示例:
📷 正在导出相机图片和时间戳…
✅ 相机数据导出完成!
📊 正在导出并转换IMU数据…
✅ IMU数据导出完成!
🎉 全部导出完成!
最终目录结构
MH01/
├── times.txt <— 根目录时间戳(必须)
└── mav0/
├── cam0/
│ └── data/
│ ├── 1234567890123456789.png
│ └── …
└── imu0/
└── data.csv <— 无表头、纯纳秒时间戳
运行 ORB-SLAM3
cd ~/ORB_SLAM3./Examples/Monocular-Inertial/mono_inertial_euroc \./Vocabulary/ORBvoc.txt \./Examples/Monocular-Inertial/EuRoC.yaml \./datasets/MH01 \./datasets/MH01/times.txt

以下视频来源于江汉jie 已关注 关注 重播 分享 赞
ORB-SLAM3 单目惯性运行命令 完整解读
这是运行 ORB-SLAM3 单目+IMU融合定位 程序的完整命令,我逐行、逐参数给你拆解,让你完全理解每一段的作用。
一、完整命令
cd ~/ORB_SLAM3./Examples/Monocular-Inertial/mono_inertial_euroc \./Vocabulary/ORBvoc.txt \./Examples/Monocular-Inertial/EuRoC.yaml \./datasets/MH01 \./datasets/MH01/times.txt
二、逐行/逐参数 超详细解读
切换工作目录
cd ~/ORB_SLAM3- 作用
:进入 ORB-SLAM3 的根目录 - 原因
:程序依赖的词典、配置文件都在这个目录下,必须先切换过来,否则会报「文件不存在」错误
核心:运行可执行程序
./Examples/Monocular-Inertial/mono_inertial_euroc \./:表示运行当前目录下的程序 Examples/Monocular-Inertial/:单目+惯性(IMU)融合的示例文件夹 mono_inertial_euroc:专门适配 EuRoC 数据集的单目惯性可执行文件 \:命令换行符(方便阅读,不影响执行)
参数1:ORB 特征词典(必备)
./Vocabulary/ORBvoc.txt \- 作用
:ORB-SLAM3 的特征匹配词典(训练好的字典文件) - 重要性
:没有这个文件,程序无法识别图像特征点,直接崩溃 - 固定不变
:所有数据集、所有模式都用同一个词典
参数2:传感器配置文件(相机+IMU标定)
./Examples/Monocular-Inertial/EuRoC.yaml \- 作用
:存放 EuRoC 数据集的相机内参 + IMU 标定参数 包含内容:相机焦距、主点、去畸变参数、IMU 噪声、陀螺仪/加速度计偏置 - 替换规则
:跑自己数据集时,必须改成自己的标定 yaml 文件
参数3:数据集根目录
./datasets/MH01 \- 作用
:告诉程序数据集的总文件夹 程序会自动从这里读取: 相机图片: mav0/cam0/data/IMU 数据: mav0/imu0/data.csv
参数4:图像时间戳文件
./datasets/MH01/times.txt- 作用
:存储所有图像的纳秒级时间戳,按顺序排列 - 关键作用
:程序根据时间戳同步图像和 IMU 数据 - 我们修复的核心
:之前程序崩溃,就是这个文件格式/路径错误导致的
三、命令执行逻辑(一句话总结)
切换到ORB-SLAM3目录 → 运行单目惯性程序 → 加载特征词典 → 加载相机IMU参数 → 读取MH01数据集 → 根据时间戳同步图像和IMU数据 → 开始定位建图
四、关键注意事项
- 路径不能错
:所有文件路径必须和命令一致 - 目录结构必须标准
:数据集必须包含 mav0/cam0+mav0/imu0+ 根目录times.txt - yaml 文件匹配
:跑自己数据时,必须替换为自己的标定文件 - 时间戳单位
:必须是纳秒整数(我们的脚本已自动处理)
主编:吴杰鸿
校验:张凯怡,杜虞展懿
审阅:郭文浩
夜雨聆风