要复刻(复现)ORB-SLAM2 这个经典的 SLAM 项目,你需要一个 Linux 环境(强烈推荐 Ubuntu 16.04, 18.04 或 20.04)。虽然项目文档写的是支持 Ubuntu 12/14/16,但在较新的系统(如 20.04)上编译需要修改少量代码。
以下是基于你提供的文档以及实际开发经验总结的保姆级复刻步骤:
第一步:环境准备
ORB-SLAM2 高度依赖 Linux 库。如果你使用的是 Windows,建议使用 WSL2 或 虚拟机(VMware/VirtualBox) 安装 Ubuntu。
基础工具安装(打开终端执行):
1 | sudo apt-get update |
第二步:安装核心依赖库
根据文档,你需要安装以下几个关键库。
1. 安装 Pangolin (用于可视化)
这是最容易出错的一步,需要从源码编译。
1 | # 安装 Pangolin 的依赖 |
2. 安装 OpenCV (图像处理)
Ubuntu 通常自带 OpenCV 库。你可以先尝试安装系统自带版本:
1 | sudo apt-get install libopencv-dev |
注意:ORB-SLAM2 原生支持 OpenCV 2.4 或 3.x。如果你是 Ubuntu 20.04,默认安装的是 OpenCV 4,可能需要修改 CMakeLists.txt(见下文“常见坑点”)。
3. 安装 Eigen3 (矩阵计算)
1 | sudo apt-get install libeigen-dev |
第三步:下载与编译 ORB-SLAM2
1. 克隆代码
1 | cd ~ |
2. 修改代码(关键步骤:针对较新系统)
如果你使用的是 Ubuntu 18.04 或 20.04 及更新的编译器,直接编译会报错 usleep 未定义。你需要手动修改几个文件:
找到以下文件:
src/System.ccsrc/Tracking.ccsrc/LocalMapping.ccsrc/LoopClosing.ccsrc/Viewer.ccExamples/Monocular/mono_tum.cc(以及其他你打算运行的 Examples 下的 .cc 文件)
在这些文件的顶部添加一行代码:
1 |
3. 执行编译脚本
项目提供了一个脚本一键编译第三方库(DBoW2, g2o)和主项目。
1 | chmod +x build.sh |
如果编译成功,终端最后会显示 [100%] Built target ...,并且在 lib 目录下生成 libORB_SLAM2.so。
第四步:下载数据集并运行
为了验证是否成功,我们需要跑通一个 Demo。这里以 TUM 数据集(单目模式) 为例,因为它比较小且容易下载。
1. 下载数据集
前往 TUM 数据集官网。
下载 rgbd_dataset_freiburg1_xyz (缩写为 fr1_xyz)。
2. 运行命令
假设你把下载的数据集解压到了 Downloads 文件夹。
回到 ORB_SLAM2 项目根目录,执行:
1 | ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml /home/你的用户名/Downloads/rgbd_dataset_freiburg1_xyz |
(注意:路径需要替换为你实际的解压路径)
预期结果:
- 会弹出一个 Pangolin 的可视化窗口。
- 你会看到绿色的相机轨迹在移动,红色的特征点在生成。
常见坑点与解决方案
OpenCV 4 报错
- 现象:编译时提示找不到 OpenCV 或者 API 不兼容。
- 解决:打开
CMakeLists.txt,将find_package(OpenCV 3.0 REQUIRED)改为find_package(OpenCV REQUIRED)。同时,在代码中某些使用CV_LOAD_IMAGE_UNCHANGED的地方,可能需要改为cv::IMREAD_UNCHANGED(OpenCV 4 的新标准)。
编译卡死
- 现象:电脑卡住不动。
- 解决:
make -j会占用所有 CPU 核心。如果内存不够,请手动修改build.sh,将make -j改为make -j2或make -j4。
ROS 模式
- 如果你需要运行 ROS 示例,必须先安装 ROS(如 Melodic 或 Noetic),并配置环境变量
ROS_PACKAGE_PATH。然后执行./build_ros.sh。这通常比纯 C++ 版本更复杂,建议先跑通纯 C++ 版本。
- 如果你需要运行 ROS 示例,必须先安装 ROS(如 Melodic 或 Noetic),并配置环境变量
总结
复刻的核心流程是:装依赖 (Pangolin 是重点) -> 改源码 (加 unistd.h) -> 编译 -> 下数据 -> 运行。
如果你在编译过程中遇到具体的报错信息,可以随时发给我,我帮你分析具体原因。