保姆级避坑指南:在Ubuntu 20.04上从零编译ORB-SLAM3(解决内存爆满、OpenCV版本等疑难杂症)
2026/6/6 18:28:11 网站建设 项目流程

从零构建ORB-SLAM3:Ubuntu 20.04深度避坑实战手册

当你在深夜的实验室第三次面对满屏红色报错信息时,或许会想起第一次听说ORB-SLAM3时那个充满希望的下午。作为目前最先进的视觉SLAM系统之一,ORB-SLAM3的编译过程堪称开发者们的"成人礼"——它不仅考验技术功底,更是对耐心和问题解决能力的终极测试。本文将带你穿越这片雷区,用血泪经验铺就一条安全通道。

1. 环境准备:避开依赖地狱的陷阱

在Ubuntu 20.04上搭建ORB-SLAM3开发环境就像在雷区跳舞,每个依赖项都可能成为绊倒你的陷阱。我们先从最基础的依赖项开始排雷。

关键依赖清单:

  • CMake ≥ 3.5
  • Git
  • Python 2.7
  • OpenCV 3.4.x(非4.x!)
  • Eigen3 3.3.4+
  • Pangolin
  • Boost ≥ 1.65

警告:OpenCV版本选择是第一个大坑。官方说支持3.2+,但实测4.x版本会因.pc文件缺失导致编译失败,强烈建议使用3.4.16这个经过充分验证的版本。

安装基础工具链时,建议先更新软件源:

sudo apt-get update && sudo apt-get upgrade -y sudo apt-get install -y build-essential cmake git wget unzip

对于OpenCV 3.4.16的安装,这里有个已验证的快速方案:

wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.16.zip unzip opencv.zip && cd opencv-3.4.16 mkdir build && cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_CUDA=OFF \ -D BUILD_EXAMPLES=OFF \ -D BUILD_opencv_apps=OFF .. make -j$(nproc) && sudo make install

2. 内存优化:8GB机器也能编译的秘诀

ORB-SLAM3的编译过程堪称内存杀手,特别是在使用make -j并行编译时。以下是实测有效的内存优化方案:

编译策略对比表:

编译方式内存占用耗时适用场景
make -j$(nproc)16GB+10min工作站
make -j48GB25min主流笔记本
make -j24GB45min低配虚拟机
make (单线程)2GB90min最后手段

如果遇到内存不足崩溃,可以手动修改build.sh

# 将原版中的make -j替换为: make -j2 # 根据你的内存调整数字

更彻底的解决方案是配置swap空间(对虚拟机特别有效):

sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile free -h # 验证swap是否生效

3. OpenCV与Eigen的暗坑破解

当系统存在多个OpenCV版本时,ORB-SLAM3总会神奇地找到错误的那一个。这里有个诊断技巧:

pkg-config --modversion opencv # 检查当前生效版本

如果返回版本不对,可以强制指定路径:

# 在ORB-SLAM3的CMakeLists.txt中添加: set(OpenCV_DIR "/usr/local/opencv-3.4.16/share/OpenCV")

Eigen3的路径问题同样棘手。Ubuntu 20.04默认安装的Eigen3位置可能不被识别,建议源码安装:

git clone https://gitlab.com/libeigen/eigen.git cd eigen && mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local sudo make install

验证Eigen3安装位置:

# 应该显示/usr/local/include/eigen3 echo '#include <eigen3/Eigen/Dense>' | gcc -v -E - 2>&1 | grep eigen3

4. 编译错误急救指南

当遇到最令人崩溃的operator/相关错误时,修改以下文件:

文件列表及补丁位置:

  1. src/LocalMapping.cc
  2. src/CameraModels/KannalaBrandt8.cpp
  3. src/CameraModels/Pinhole.cpp

在每个文件的开头添加:

namespace cv { template<typename _Tp, int m, int n> static inline Matx<_Tp, m, n> operator/(const Matx<_Tp, m, n>& a, float alpha) { return Matx<_Tp, m, n>(a, 1.f/alpha, Matx_ScaleOp()); } }

如果遇到undefined reference to boost::system::generic_category()这类链接错误,需要检查Boost版本:

# 确保安装了libboost-system-dev sudo apt-get install libboost-system-dev libboost-filesystem-dev

5. 数据集测试实战技巧

EuRoC数据集下载慢得令人发指,这里有个加速方案:

# 使用aria2多线程下载 aria2c -x16 -s16 https://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/vicon_room1/V1_01_easy/V1_01_easy.zip

数据集目录结构应该如下:

ORB_SLAM3/ ├── dataset/ │ └── MH01/ │ └── mav0/ │ ├── cam0/ │ ├── imu0/ │ └── state_groundtruth_estimate0/ └── Examples/ └── Monocular/ ├── mono_euroc └── EuRoC.yaml

运行测试时,建议修改启动脚本:

# 在Examples目录下执行: ./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt \ ./Monocular/EuRoC.yaml \ ../dataset/MH01 \ ./Monocular/EuRoC_TimeStamps/MH01.txt \ MH01_Results

6. 性能调优与可视化

提升Pangolin的渲染性能:

# 安装必要的图形驱动 sudo apt-get install libgl1-mesa-dev libglew-dev

对于虚拟机用户,建议启用3D加速:

  1. VMware设置 → 显示器 → 加速3D图形
  2. 客户机安装VMware Tools:
sudo apt-get install open-vm-tools-desktop

实时监控系统资源:

# 在单独终端运行 watch -n1 "free -h; echo; sensors; echo; uptime"

7. 深度问题排查工具箱

当一切都不工作时,按这个顺序检查:

  1. 版本验证

    opencv_version # 应该返回3.4.x pkg-config --modversion eigen3 # 应该≥3.3.4
  2. 路径检查

    # 确保这些路径存在 ls /usr/local/include/opencv2 ls /usr/local/include/eigen3
  3. 环境变量

    # 应该包含/usr/local/lib echo $LD_LIBRARY_PATH
  4. 符号链接修复

    sudo ldconfig -v | grep -i opencv # 检查链接是否正确

对于顽固的编译错误,可以尝试核武器方案——完全清理后重建:

cd ORB_SLAM3 rm -rf build/ Thirdparty/DBoW2/build/ Thirdparty/g2o/build/ ./build.sh

8. 长期维护建议

保持ORB-SLAM3可维护性的几个技巧:

环境隔离方案对比:

方案优点缺点
Docker完全隔离图形性能差
LXC容器轻量级配置复杂
虚拟机完全隔离资源占用大
单独用户简单隔离不彻底

推荐使用Docker方案:

FROM ubuntu:20.04 RUN apt-get update && apt-get install -y \ git cmake libopencv-dev libeigen3-dev libboost-all-dev WORKDIR /app RUN git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git WORKDIR /app/ORB_SLAM3 RUN ./build.sh

定期更新子模块:

git submodule update --init --recursive

在经历无数次深夜调试后,我发现最稳定的组合是:OpenCV 3.4.16 + Eigen 3.3.7 + Boost 1.71。当所有组件版本形成完美默契时,那个绿色的"Build Successful"提示比任何咖啡都更提神。

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

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

立即咨询