ORB_SLAM3
ORB_SLAM3
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
wget http://fishros.com/install -O fishros && . fishros
安装vim编辑器
1. sudo apt update && sudo apt-get install vim
安装gcc、g++
1. sudo apt update && sudo apt install build-essential
ROS1_noetic版本安装
一键安装
使用鱼香ROS一键安装ROS1-noetic版本(ROS1-noetic桌面版)
1. wget http://fishros.com/install-O fishros &&. fishros
安装验证
分别打开三个终端,输入以下三条指令。
1. roscore
1. rosrun turtlesim turtlesim_node
1. rosrun turtlesim turtle_teleop_key
若可控制小乌龟运动即证明ROS安装成功。
3.依赖库
Eigen3
C++ 里专门用来做【矩阵运算、向量计算、几何变换】的顶级数学库。
C++ 版的高性能 MATLAB / NumPy,专门给机器人、视觉、SLAM、控制算法用的。
安装
1. sudo apt update
2. sudo apt install libeigen3-dev -y
验证安装是否正确
1. pkg-config \--modversion eigen3
如果输出版本号(比如 3.3.7 或 3.3.9),说明安装成功。
或者:
1. ls /usr/include/eigen3/Eigen
能看到很多头文件 = 安装成功。

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

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

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

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


Eigen3版本号
1. \# 原来
2. find_package(Eigen3 3.1.0 REQUIRED)
3.
4. \# 改成
5. 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
1. cd \~/ORB_SLAM3/Thirdparty/DBoW2
2. mkdir build && cd build
3. cmake ..
4. make -j4
2. 编译 g2o
1. cd \~/ORB_SLAM3/Thirdparty/g2o
2. mkdir build && cd build
3. cmake ..
4. make -j4
3. 编译 Sophus
1. cd \~/ORB_SLAM3/Thirdparty/Sophus
2. mkdir build && cd build
3. cmake ..
4. make -j4
4. 编译 ORB-SLAM3 主程序
1. cd \~/ORB_SLAM3
2. mkdir build && cd build
3. cmake ..
4. 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为例,
下好后终端
1. mkdir -p \~/bags
2. mv MH_01_easy.bag \~/bags/
一键导出脚本
cat > export_bag_data.py << 'EOF'
import rosbag
import cv2
import os
import sys
from sensor_msgs.msg import Image, Imu
from cv_bridge import CvBridge
def 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.txt
f_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.x
wy = msg.angular_velocity.y
wz = msg.angular_velocity.z
ax = msg.linear_acceleration.x
ay = msg.linear_acceleration.y
az = 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/jie/bags/MH_01_easy.bag"
OUTPUT_DIR = "/home/jie/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 话题
# -------------------------------------------------
运行
1. 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

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
二、逐行/逐参数 超详细解读
1. 切换工作目录
cd ~/ORB_SLAM3
- 作用:进入 ORB-SLAM3 的根目录
- 原因:程序依赖的词典、配置文件都在这个目录下,必须先切换过来,否则会报「文件不存在」错误
2. 核心:运行可执行程序
./Examples/Monocular-Inertial/mono_inertial_euroc \
./:表示运行当前目录下的程序Examples/Monocular-Inertial/:单目+惯性(IMU)融合的示例文件夹mono_inertial_euroc:专门适配 EuRoC 数据集的单目惯性可执行文件\:命令换行符(方便阅读,不影响执行)
3. 参数1:ORB 特征词典(必备)
./Vocabulary/ORBvoc.txt \
- 作用:ORB-SLAM3 的特征匹配词典(训练好的字典文件)
- 重要性:没有这个文件,程序无法识别图像特征点,直接崩溃
- 固定不变:所有数据集、所有模式都用同一个词典
4. 参数2:传感器配置文件(相机+IMU标定)
./Examples/Monocular-Inertial/EuRoC.yaml \
- 作用:存放 EuRoC 数据集的相机内参 + IMU 标定参数
- 包含内容:相机焦距、主点、去畸变参数、IMU 噪声、陀螺仪/加速度计偏置
- 替换规则:跑自己数据集时,必须改成自己的标定 yaml 文件
5. 参数3:数据集根目录
./datasets/MH01 \
- 作用:告诉程序数据集的总文件夹
- 程序会自动从这里读取:
- 相机图片:
mav0/cam0/data/ - IMU 数据:
mav0/imu0/data.csv
- 相机图片:
6. 参数4:图像时间戳文件
./datasets/MH01/times.txt
- 作用:存储所有图像的纳秒级时间戳,按顺序排列
- 关键作用:程序根据时间戳同步图像和 IMU 数据
- 我们修复的核心:之前程序崩溃,就是这个文件格式/路径错误导致的
三、命令执行逻辑(一句话总结)
切换到ORB-SLAM3目录 → 运行单目惯性程序 → 加载特征词典 → 加载相机IMU参数 → 读取MH01数据集 → 根据时间戳同步图像和IMU数据 → 开始定位建图
四、关键注意事项
- 路径不能错:所有文件路径必须和命令一致
- 目录结构必须标准:数据集必须包含
mav0/cam0+mav0/imu0+ 根目录times.txt - yaml 文件匹配:跑自己数据时,必须替换为自己的标定文件
- 时间戳单位:必须是纳秒整数(我们的脚本已自动处理)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)