当前位置: 首页 > news >正文

保姆级教程:在Ubuntu 20.04 + ROS Noetic上从源码编译GVINS(含Ceres、Eigen版本避坑指南)

保姆级教程:在Ubuntu 20.04 + ROS Noetic上从源码编译GVINS(含Ceres、Eigen版本避坑指南)

视觉-惯性-GNSS紧耦合系统(GVINS)作为多传感器融合领域的前沿技术,正逐渐成为自动驾驶、无人机导航等场景的核心解决方案。本文将手把手带你完成从零开始的完整编译过程,特别针对Ubuntu 20.04和ROS Noetic环境中的版本陷阱提供深度解决方案。

1. 环境准备与系统配置

在开始编译GVINS之前,我们需要确保基础环境的正确性。Ubuntu 20.04 LTS作为长期支持版本,其稳定性使其成为开发的首选,但同时也带来了一些与旧版ROS的兼容性挑战。

必备组件清单

  • Ubuntu 20.04.6 LTS(推荐纯净安装)
  • ROS Noetic Ninjemys(完整桌面版安装)
  • GCC 9.4.0(默认编译器)
  • Python 3.8(系统自带)

提示:建议使用虚拟机或Docker容器进行环境隔离,避免污染主机系统。推荐分配至少4核CPU、8GB内存和50GB存储空间。

安装ROS Noetic的基础命令如下:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-noetic-desktop-full echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc

2. 关键依赖库的精确版本控制

GVINS对特定版本的依赖库极其敏感,这是大多数编译失败的根源。我们需要精确控制以下组件的版本:

依赖库要求版本兼容版本范围安装方式
Eigen3.3.33.3.x源码编译
Ceres1.12.01.12.x源码编译+补丁
gflags2.2.22.2.xapt安装
glog0.4.00.4.x源码编译

2.1 Eigen 3.3.3的降级安装

Ubuntu 20.04默认安装的Eigen版本过高,必须手动降级:

wget https://gitlab.com/libeigen/eigen/-/archive/3.3.3/eigen-3.3.3.tar.gz tar xzf eigen-3.3.3.tar.gz cd eigen-3.3.3 mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/eigen-3.3.3 sudo make install

配置环境变量确保系统优先使用指定版本:

echo 'export CMAKE_PREFIX_PATH=/usr/local/eigen-3.3.3:$CMAKE_PREFIX_PATH' >> ~/.bashrc source ~/.bashrc

验证安装是否成功:

pkg-config --modversion eigen3

2.2 Ceres 1.12.0的定制编译

Ceres的编译需要特别注意与Eigen版本的匹配:

sudo apt-get install -y libgoogle-glog-dev libgflags-dev libatlas-base-dev libsuitesparse-dev wget https://ceres-solver.googlesource.com/ceres-solver/+archive/1.12.0.tar.gz tar zxf 1.12.0.tar.gz mkdir ceres-bin && cd ceres-bin cmake ../ceres-solver-1.12.0 -DEIGEN_INCLUDE_DIR=/usr/local/eigen-3.3.3/include/eigen3 make -j$(nproc) sudo make install

常见问题解决方案:

  • 问题1Eigen::half' has not been declared
    • 解决方法:在CMake命令中添加-DCXX11=ON
  • 问题2cholmod.h not found
    • 解决方法:安装libcholmod3libsuitesparse-dev

3. gnss_comm包的编译与集成

gnss_comm作为GVINS的GNSS消息处理核心,需要特别注意其依赖关系:

cd ~/catkin_ws/src git clone https://github.com/HKUST-Aerial-Robotics/gnss_comm.git cd ~/catkin_ws rosdep install --from-paths src --ignore-src -y

编译时可能遇到的典型错误及修复:

  1. RTKLIB头文件缺失

    sudo apt-get install librtklib-dev
  2. C++11标准不兼容: 修改gnss_comm/CMakeLists.txt,添加:

    add_compile_options(-std=c++11) set(CMAKE_CXX_STANDARD 11)
  3. Boost版本冲突

    sudo apt-get install libboost-all-dev=1.71.0.0ubuntu2

4. GVINS的完整编译流程

现在我们可以开始GVINS本体的编译工作,以下是经过验证的完整步骤:

  1. 创建工作空间并获取源码:

    mkdir -p ~/gvins_ws/src cd ~/gvins_ws/src git clone https://github.com/HKUST-Aerial-Robotics/GVINS.git
  2. 初始化ROS工作区:

    cd ~/gvins_ws catkin init catkin config --extend /opt/ros/noetic catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
  3. 关键编译参数配置: 修改GVINS/CMakeLists.txt,确保包含以下内容:

    set(EIGEN3_INCLUDE_DIR /usr/local/eigen-3.3.3/include/eigen3) find_package(Eigen3 3.3.3 REQUIRED)
  4. 开始编译:

    catkin build gvins -j$(nproc) --no-status
  5. 环境变量设置:

    echo "source ~/gvins_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc

编译错误速查表

错误类型解决方案
Eigen版本不匹配检查EIGEN3_INCLUDE_DIR路径,确保指向3.3.3版本
Ceres符号冲突清理所有旧版Ceres,重新编译1.12.0版本
ROS消息生成失败运行rosdep install --from-paths src --ignore-src -y修复依赖
undefined reference错误检查链接顺序,确保所有库路径正确

5. 系统验证与测试

完成编译后,我们可以通过官方提供的示例数据进行系统验证:

  1. 下载测试数据集:

    wget https://github.com/HKUST-Aerial-Robotics/GVINS-Dataset/releases/download/v1.0/sports_field.bag
  2. 启动GVINS节点:

    roslaunch gvins visensor_f9p.launch
  3. 在另一个终端中播放数据:

    rosbag play --clock sports_field.bag
  4. 可视化结果:

    rviz -d ~/gvins_ws/src/GVINS/config/gvins_rviz_config.rviz

性能优化建议:

  • 对于低配设备,可以修改launch文件中的参数:
    <param name="image_width" value="640" /> <param name="image_height" value="480" /> <param name="max_num_features" value="100" />
  • 启用多线程优化:
    export OMP_NUM_THREADS=$(nproc)

6. 高级配置与自定义开发

GVINS提供了丰富的参数配置接口,主要配置文件位于:

  • GVINS/config/gnss_imu_config.yaml- GNSS/IMU相关参数
  • GVINS/config/visual_config.yaml- 视觉前端参数

关键参数调优指南

  1. GNSS权重调整

    gnss: pseudo_weight: 1.0 # 伪距权重 doppler_weight: 0.1 # 多普勒权重 position_weight: 0.01 # 位置权重
  2. 视觉惯性参数

    visual: max_solve_time: 0.04 # 单帧最大处理时间(秒) min_init_parallax: 10 # 初始化所需最小视差(像素)
  3. 融合策略选择

    fusion: enable_gnss: true # 启用GNSS融合 enable_loop: false # 禁用闭环检测

对于希望进行二次开发的用户,建议从以下模块入手:

  • gnss_processor.cpp- GNSS原始数据处理核心
  • optimization.cpp- 紧耦合优化器实现
  • visualizer.cpp- Rviz可视化接口

7. 实际部署注意事项

将GVINS部署到实际系统时,需要特别注意以下方面:

  1. 传感器标定

    • IMU与相机的时间同步误差应小于1ms
    • 相机内参标定建议使用Kalibr工具
    • GNSS天线相位中心需要精确测量
  2. 实时性保障

    sudo apt-get install linux-lowlatency sudo tuned-adm profile latency-performance
  3. 内存管理

    • 长期运行时建议启用内存池:
    // 在system.cpp中添加 Eigen::initParallel(); Eigen::setNbThreads(4);
  4. 多设备兼容性测试

    • 测试过的GNSS接收器清单:
      • u-blox F9P
      • NovAtel OEM7
      • Trimble BD982

在工业级应用中,我们还需要考虑:

  • 数据持久化方案
  • 异常恢复机制
  • 网络延迟补偿
  • 多节点协同定位
http://www.jsqmd.com/news/694342/

相关文章:

  • 【安卓学习之myt】git常用命令(+矢量图+歌曲宝)
  • 从零到自动化:用Jenkins+Git打造你的第一个CI/CD流水线(实战演练)
  • Qwen3-14B企业级日志管理:推理请求记录+敏感词过滤+审计追踪
  • 拼车行程存证程序,行程,费用,路线上链,发生纠纷可追溯,防止绕路,临时加价。
  • ExplorerPatcher完全卸载指南:告别资源管理器修改工具的正确方式
  • 2026 广州搬家服务质量榜出炉!新华网街头采访百万街坊,这五家凭实力领跑 - 广州搬家老班长
  • 5分钟部署vs3天配置:轻量级PaaS如何碾压Kubernetes?
  • 从零到一:IAR嵌入式工程搭建与高效配置全流程解析
  • 算法寻优之爬山法:从局部最优到全局视野的探索
  • 如何用Electron快速开发跨平台社交API集成工具:从0到1完整指南
  • 《PySide6 GUI开发指南:QML核心与实践》 第九篇:跨平台开发——一次编写,多端运行
  • 海南最推荐的住家阿姨服务平台有哪些?2026年海口等地市场选择前五排名 - 十大品牌榜
  • Blast网站序列比对以及进化树的构建
  • 2025 GitHub Docs性能优化实战:从卡顿到毫秒级响应的蜕变
  • Esptool:揭秘ESP芯片固件编程的3个高级技巧与实战指南
  • 容器迁移 java 应用 OOM 事件
  • 从‘手动挡’到‘自动挡’:PyTorch实现MLP的两种姿势对比(含完整代码与性能分析)
  • WebPlotDigitizer完全指南:3步从图表图像提取精准数据的终极解决方案
  • Qwen3.5-4B-AWQ参数详解:temperature/top_p/max_tokens调优指南
  • 海南最推荐的做饭阿姨公司服务机构有哪些?2026年海口等地市场选择前五排名 - 十大品牌榜
  • 会员积分链上管理程序,积分发行,消耗过期规划上链,平台无法随意清零,篡改规则。
  • 从一道经典C语言题出发:手把手教你封装gcd和lcm函数,提升代码复用性
  • Navicat无限试用终极指南:macOS版14天限制一键破解方案
  • 别再写满屏的if(user!=null)了!用JDK1.8的Optional优雅处理空值,附SpringBoot实战案例
  • notion(模块化数字工作台)笔记
  • AI Agent Harness Engineering 的监控大盘设计:核心指标与异常预警
  • 婚礼礼金记账程序,礼金记录链式存储,公开透明避免账目不清,亲友误会。
  • ESP-IDF C++ RTTI实战指南:突破类型限制的终极解决方案
  • CLIP ViT-H-14保姆级部署指南:2.5GB本地模型+CUDA加速+Web界面
  • 终极Dokploy API文档生成指南:Swagger UI与OpenAPI规范快速上手