乐于分享
好东西不私藏

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

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-essential

ROS1_noetic版本安装

一键安装

使用鱼香ROS一键安装ROS1-noetic版本(ROS1-noetic桌面版)

wget http://fishros.com/install -O fishros && . fishros

安装验证

分别打开三个终端,输入以下三条指令。

roscore
rosrun turtlesim turtlesim_node
rosrun 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.0

CMake 配置

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/eigen3
3. 运行
./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.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/你的用户名/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数据 → 开始定位建图

四、关键注意事项

  1. 路径不能错
    :所有文件路径必须和命令一致
  2. 目录结构必须标准
    :数据集必须包含 mav0/cam0 + mav0/imu0 + 根目录 times.txt
  3. yaml 文件匹配
    :跑自己数据时,必须替换为自己的标定文件
  4. 时间戳单位
    :必须是纳秒整数(我们的脚本已自动处理)

主编:吴杰鸿

校验:张凯怡,杜虞展懿

审阅:郭文浩

相关学习资料