☰
ORB SLAM2环境搭建避坑指南:从依赖安装到自定义数据集运行
2026/10/25 11:56:40 网站建设 项目流程

简介:这份资源面向希望用ORB SLAM2跑通自定义图片序列的视觉SLAM学习者,解决从视频抽帧到生成rgb.txt、再到加载自有数据集运行定位建图的完整链路问题,适合已了解ORB SLAM2基本流程、需要动手实践的中级开发者。压缩包为gz格式,共4个文件,约4.38MB,包含Python脚本、示例视频与rgb.txt时间戳文件,可配合官方示例完成图片序列的读取与配置。已有5382人学习下载,说明该流程在入门实践中需求较高。资源价值在于把视频转图片序列、按格式生成rgb.txt、修改TUM示例配置并运行自有数据这一整套准备工作打包呈现,读者可据此对照检查时间戳格式、文件命名顺序与参数设置,减少在数据准备环节反复试错的成本,快速把ORB SLAM2应用到自己的拍摄场景中。

1. 从一次“编译过了却跑不起来”说起:ORB SLAM2 环境搭建到底难在哪

ORB SLAM2 这套东西,第一次装的人十个里有八个会卡在同一类问题上:代码编译通过了,示例数据集也能跑,可一旦换成自己的图片序列,要么卡在词典加载,要么直接段错误退出,终端里连一句像样的报错都不给。我见过最典型的一次,是某开发者把Examples/Monocular下的可执行文件直接指向自己拍的图片目录,结果程序读了两帧就崩,查了半天才发现是图片命名格式和配置文件里的相机参数对不上。这类问题不是代码写错了,而是环境、依赖、配置文件三者没有对齐。这篇笔记面向的是手里已经有一组按顺序命名的图片、想用 ORB SLAM2 跑通自己数据集的开发者,从系统依赖、Pangolin、OpenCV、Eigen、DBoW2 一路装到配置文件改写和验证,把版本取舍和踩坑点都摊开讲清楚。装这套环境的核心不是“装得上”,而是“装完之后能稳定复现同一组结果”。

2. 装前把版本钉死:Ubuntu、OpenCV、Pangolin 的取舍

ORB SLAM2 是个对版本相当敏感的老项目,源码最后一次大更新停在 2017 年前后,它默认的编译环境是 Ubuntu 14.04/16.04 加 OpenCV 3.2 左右。现在多数人手里是 Ubuntu 20.04 或 22.04,直接照官方 README 走大概率会在 Pangolin 和 OpenCV 4 上翻车。我的建议是:系统用 Ubuntu 20.04,OpenCV 选 3.4.x 或 4.5.x 二选一,Pangolin 用 v0.6 而不是最新的 v0.8/v0.9。原因很直接——Pangolin v0.8 之后改了头文件路径和 CMake 导出方式,ORB SLAM2 的CMakeLists.txt里写死的find_package(Pangolin REQUIRED)会找不到库,报一堆undefined reference。

2.1 系统依赖一次装齐

先把编译工具链和 ORB SLAM2 必需的几个库装上,这一步漏一个后面就要重来:

sudo apt update sudo apt install -y build-essential cmake git libgtk2.0-dev pkg-config \ libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev \ libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev \ libeigen3-dev libboost-all-dev libssl-dev

libeigen3-dev提供 Eigen3 头文件,ORB SLAM2 的位姿运算全靠它;libboost-all-dev是 DBoW2 的依赖;libssl-dev在部分 OpenCV 版本编译时会用到。libtbb2在 Ubuntu 22.04 上已经改名成libtbb2不存在,需要换成libtbb-dev,这是 20.04 和 22.04 的一个明显分界,装之前先lsb_release -a确认系统版本。

2.2 OpenCV 版本怎么选

OpenCV 4 和 ORB SLAM2 的兼容性是个老话题。ORB SLAM2 源码里用了CV_LOAD_IMAGE_UNCHANGED这类 OpenCV 3 的宏,OpenCV 4 已经删掉,直接编译会报错。两条路:一是装 OpenCV 3.4.16,省心;二是装 OpenCV 4.5.x,然后手动改源码里的宏。我一般选前者,因为 ORB SLAM2 本身不需要 OpenCV 4 的新特性,装 3.4 能少改一堆文件。

# 以 OpenCV 3.4.16 为例,源码编译安装到 /usr/local cd ~/src wget -O opencv-3.4.16.tar.gz https://github.com/opencv/opencv/archive/3.4.16.tar.gz tar -xzf opencv-3.4.16.tar.gz && cd opencv-3.4.16 mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DBUILD_opencv_python2=OFF \ -DBUILD_opencv_python3=OFF .. make -j$(nproc) sudo make install sudo ldconfig

CMAKE_INSTALL_PREFIX=/usr/local是默认路径,装完pkg-config --modversion opencv应该输出3.4.16。关掉 Python 绑定是因为 ORB SLAM2 用不到,开着只会拖慢编译。sudo ldconfig不能省,否则运行时会报error while loading shared libraries: libopencv_core.so.3.4。

2.3 Pangolin 选 v0.6 并锁死

Pangolin 负责可视化窗口,ORB SLAM2 的Viewer模块强依赖它。v0.6 是最后一个和 ORB SLAM2 默认 CMake 配置兼容的版本:

cd ~/src git clone --branch v0.6 https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc) sudo make install

装完检查/usr/local/lib下有没有libpango_core.so,有就说明装对了。如果之前装过 v0.8,先sudo make uninstall清掉,否则新旧库混在一起,链接阶段会挑错版本。

3. 编译 ORB SLAM2 本体:Eigen、DBoW2 与 CMake 的配合

依赖齐了之后,ORB SLAM2 本体的编译反而简单,但有几个 CMake 层面的细节容易忽略。源码里Thirdparty/DBoW2和Thirdparty/g2o是作为子目录一起编的,不需要单独装,但它们的编译选项受顶层CMakeLists.txt控制。

3.1 拉源码与目录结构确认

cd ~/src git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2 cd ORB_SLAM2 ls

正常应该看到Examples、include、src、Thirdparty、Vocabulary几个目录。Vocabulary/ORBvoc.txt是词典文件,压缩包形式存在,首次运行会自动解压,但如果磁盘空间不足会解压失败且不报错,后面加载词典时直接崩。确认df -h剩余空间大于 1GB。

3.2 编译脚本里的两个坑

ORB SLAM2 自带build.sh,但它默认make -j不带核数,老机器上会跑很久,新机器上又可能因为并行度过高把内存吃满导致c++: internal compiler error: Killed。我一般手动改:

cd ~/src/ORB_SLAM2 # 修改 build.sh 中的 make 并行度,避免内存不足 sed -i 's/make -j/make -j4/g' build.sh chmod +x build.sh ./build.sh

-j4是保守值,8GB 内存的机器用-j4比较稳,16GB 以上可以-j8。如果编译到g2o时报Eigen相关错误,多半是 Eigen 版本太新(3.4 之后改了模板),常见做法是降级到 Eigen 3.3.7,或者给 g2o 的 CMake 加-DEIGEN3_INCLUDE_DIR指向旧版本头文件。

3.3 编译产物验证

编译完成后,Examples/Monocular下应该有mono_tum、mono_kitti等可执行文件。先别急着跑自己的数据,用官方 TUM 示例验证环境是否真的通了:

cd ~/src/ORB_SLAM2 ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt \ Examples/Monocular/TUM1.yaml \ /path/to/rgbd_dataset_freiburg1_xyz

如果弹出 Pangolin 窗口并看到轨迹逐渐生成,说明 OpenCV、Pangolin、Eigen、DBoW2 全部链接正确。这一步跑不通,后面改配置文件都是白费。

4. 把自己的图片序列接进去:配置文件与目录结构改写

官方示例跑通之后,真正的工作才开始——让 ORB SLAM2 读你自己的图片。ORB SLAM2 的单目模式要求输入是一个目录,里面图片按字典序排列,且配置文件里的相机内参必须和拍摄设备匹配。

4.1 图片命名与目录组织

ORB SLAM2 的LoadImages函数用cv::glob按路径排序读取,所以图片名必须是等长数字,比如000001.png、000002.png,不能是1.png、10.png、2.png这种。我一般统一重命名:

# 把任意命名的图片序列重命名为 6 位补零格式 cd /path/to/my_images i=1 for f in $(ls *.jpg | sort -V); do printf -v new "%06d.png" $i convert "$f" "$new" # 需要 ImageMagick,或改用 cp 保持原格式 i=$((i+1)) done

如果原图是 jpg 且不想转格式,把convert换成cp "$f" "$new"即可,但配置文件里的扩展名要对应改。sort -V是关键,普通sort会把10排在2前面,导致时间顺序错乱,轨迹直接飞掉。

4.2 相机配置文件逐项改

以Examples/Monocular/TUM1.yaml为模板复制一份,改这几个字段:

%YAML:1.0 # 相机内参,必须和实际拍摄设备一致 Camera.fx: 517.3 Camera.fy: 516.5 Camera.cx: 318.6 Camera.cy: 255.3 # 畸变系数,手机拍摄一般 k1 k2 非零 Camera.k1: 0.2624 Camera.k2: -0.9531 Camera.p1: -0.0054 Camera.p2: 0.0026 # 图像尺寸 Camera.width: 640 Camera.height: 480 # 帧率,影响时间戳步进 Camera.fps: 30.0 # 是否彩色,0 表示灰度 Camera.RGB: 1 # 词典路径,相对路径以可执行文件运行目录为准 ORBvoc.txt: Vocabulary/ORBvoc.txt

fx、fy、cx、cy四个内参如果填错,表现是轨迹尺度明显不对或者初始化失败。没有标定板的话,手机拍摄可以用近似值,但误差会体现在轨迹漂移上。Camera.RGB: 1表示输入是彩色图,ORB SLAM2 内部会转灰度;如果输入本身就是灰度图,设成 0 能省一次转换。

4.3 运行命令与参数含义

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt \ /path/to/my_camera.yaml \ /path/to/my_images

第一个参数是词典,第二个是相机配置,第三个是图片目录。注意mono_tum这个可执行文件内部对时间戳的处理是按文件名顺序递增的,如果你的图片采集帧率不均匀,轨迹会有轻微抖动,这是单目模式的固有特性,不是配置错误。

5. 避坑与排查:五个真实翻车现场

5.1 现象:运行即报Segmentation fault,无其他输出

原因多半是词典文件没解压成功或路径写错。ORBvoc.txt实际是压缩格式,程序启动时调用loadFromTextFile解压,如果文件不完整会直接崩。解决:确认Vocabulary/ORBvoc.txt大小约 145MB,md5sum和官方一致;路径用绝对路径试一次,排除相对路径问题。

5.2 现象:Pangolin 窗口黑屏,终端刷GL error

原因是在无图形界面的服务器上跑,或者 Pangolin 编译时没链接 OpenGL。解决:确认有显示环境(echo $DISPLAY非空);服务器场景下 ORB SLAM2 的可视化本身就跑不了,需要改源码关掉 Viewer,或者用xvfb虚拟帧缓冲,但后者性能很差,只适合验证。

5.3 现象:轨迹尺度明显偏小或偏大

原因是相机配置文件里的fx、fy和实际设备不符。单目 SLAM 没有绝对尺度,但内参错误会导致特征点三角化深度异常。解决:用棋盘格标定一次,或者拿官方 TUM 配置对比自己设备的分辨率和视场角,按比例缩放内参。

5.4 现象:编译时报undefined reference to cv::imread

原因是 OpenCV 装了多个版本,CMake 找到了头文件但链接到了旧库。解决:pkg-config --modversion opencv确认版本,CMakeLists.txt里显式写find_package(OpenCV 3.4 REQUIRED),清理build目录重新cmake。

5.5 现象:跑自己的数据时跟踪丢失特别快

原因是图片序列的纹理太少或者运动过快,ORB 特征点提取不够。解决:检查图片是否过曝或模糊;适当降低ORBextractor的阈值(改include/ORBextractor.h里的构造参数),但这是治标,根本还是采集时保证纹理和重叠。

6. 装完怎么验证跑通:三条命令定生死

环境装没装对,不用靠感觉,跑三条命令就能确认。第一条验证依赖链接,第二条验证官方数据,第三条验证自己的数据。

# 1. 检查动态库链接是否完整 ldd Examples/Monocular/mono_tum | grep -E "opencv|pango|Eigen" | grep "not found" # 无输出 = 全部链接正常 # 2. 官方 TUM 数据跑通,观察终端是否输出跟踪状态 ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt \ Examples/Monocular/TUM1.yaml \ /path/to/rgbd_dataset_freiburg1_xyz 2>&1 | head -20 # 3. 自己的数据跑通,重点看前 30 帧是否完成初始化 ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt \ /path/to/my_camera.yaml /path/to/my_images 2>&1 | grep -i "initialize"

第一条命令如果输出not found,说明某个库没进ldconfig缓存,sudo ldconfig后再试。第二条命令正常会看到New Map created with ... points之类的初始化日志。第三条命令如果前 30 帧内没有出现初始化成功的信息,基本可以判定是相机配置或图片序列的问题,回到第 4 章逐项核对。

我自己的习惯是每次换机器或重装系统,都先把这三条命令走一遍再动业务数据,因为 ORB SLAM2 的报错太安静,等跑到一半崩了再回头查,时间成本翻倍。从那以后我每次配完这套环境,都强制先跑官方 TUM 序列确认基线,再碰自己的图片。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询