资讯详情

ORB SLAM2环境搭建避坑指南:从依赖安装到自定义数据集运行

📅 2026/10/25 11:57:49 | 华诺云谱 👁 阅读
ORB SLAM2环境搭建避坑指南:从依赖安装到自定义数据集运行
简介这份资源面向希望用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.04OpenCV 选 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-devlibeigen3-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_TYPERelease \ -DCMAKE_INSTALL_PREFIX/usr/local \ -DBUILD_opencv_python2OFF \ -DBUILD_opencv_python3OFF .. make -j$(nproc) sudo make install sudo ldconfigCMAKE_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_TYPERelease .. 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 i1 for f in $(ls *.jpg | sort -V); do printf -v new %06d.png $i convert $f $new # 需要 ImageMagick或改用 cp 保持原格式 i$((i1)) 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.txtfx、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大小约 145MBmd5sum和官方一致路径用绝对路径试一次排除相对路径问题。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 21 | head -20 # 3. 自己的数据跑通重点看前 30 帧是否完成初始化 ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt \ /path/to/my_camera.yaml /path/to/my_images 21 | grep -i initialize第一条命令如果输出not found说明某个库没进ldconfig缓存sudo ldconfig后再试。第二条命令正常会看到New Map created with ... points之类的初始化日志。第三条命令如果前 30 帧内没有出现初始化成功的信息基本可以判定是相机配置或图片序列的问题回到第 4 章逐项核对。我自己的习惯是每次换机器或重装系统都先把这三条命令走一遍再动业务数据因为 ORB SLAM2 的报错太安静等跑到一半崩了再回头查时间成本翻倍。从那以后我每次配完这套环境都强制先跑官方 TUM 序列确认基线再碰自己的图片。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑