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
编译成功标志
  1. [100%] Built target mono_tum

  2. [100%] Built target mono_inertial_tum_vi

  3. [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数据 → 开始定位建图


四、关键注意事项

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

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐