保姆级教程:在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 ~/.bashrc2. 关键依赖库的精确版本控制
GVINS对特定版本的依赖库极其敏感,这是大多数编译失败的根源。我们需要精确控制以下组件的版本:
| 依赖库 | 要求版本 | 兼容版本范围 | 安装方式 |
|---|---|---|---|
| Eigen | 3.3.3 | 3.3.x | 源码编译 |
| Ceres | 1.12.0 | 1.12.x | 源码编译+补丁 |
| gflags | 2.2.2 | 2.2.x | apt安装 |
| glog | 0.4.0 | 0.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 eigen32.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常见问题解决方案:
- 问题1:
Eigen::half' has not been declared- 解决方法:在CMake命令中添加
-DCXX11=ON
- 解决方法:在CMake命令中添加
- 问题2:
cholmod.h not found- 解决方法:安装
libcholmod3和libsuitesparse-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编译时可能遇到的典型错误及修复:
RTKLIB头文件缺失:
sudo apt-get install librtklib-devC++11标准不兼容: 修改
gnss_comm/CMakeLists.txt,添加:add_compile_options(-std=c++11) set(CMAKE_CXX_STANDARD 11)Boost版本冲突:
sudo apt-get install libboost-all-dev=1.71.0.0ubuntu2
4. GVINS的完整编译流程
现在我们可以开始GVINS本体的编译工作,以下是经过验证的完整步骤:
创建工作空间并获取源码:
mkdir -p ~/gvins_ws/src cd ~/gvins_ws/src git clone https://github.com/HKUST-Aerial-Robotics/GVINS.git初始化ROS工作区:
cd ~/gvins_ws catkin init catkin config --extend /opt/ros/noetic catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release关键编译参数配置: 修改
GVINS/CMakeLists.txt,确保包含以下内容:set(EIGEN3_INCLUDE_DIR /usr/local/eigen-3.3.3/include/eigen3) find_package(Eigen3 3.3.3 REQUIRED)开始编译:
catkin build gvins -j$(nproc) --no-status环境变量设置:
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. 系统验证与测试
完成编译后,我们可以通过官方提供的示例数据进行系统验证:
下载测试数据集:
wget https://github.com/HKUST-Aerial-Robotics/GVINS-Dataset/releases/download/v1.0/sports_field.bag启动GVINS节点:
roslaunch gvins visensor_f9p.launch在另一个终端中播放数据:
rosbag play --clock sports_field.bag可视化结果:
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- 视觉前端参数
关键参数调优指南:
GNSS权重调整:
gnss: pseudo_weight: 1.0 # 伪距权重 doppler_weight: 0.1 # 多普勒权重 position_weight: 0.01 # 位置权重视觉惯性参数:
visual: max_solve_time: 0.04 # 单帧最大处理时间(秒) min_init_parallax: 10 # 初始化所需最小视差(像素)融合策略选择:
fusion: enable_gnss: true # 启用GNSS融合 enable_loop: false # 禁用闭环检测
对于希望进行二次开发的用户,建议从以下模块入手:
gnss_processor.cpp- GNSS原始数据处理核心optimization.cpp- 紧耦合优化器实现visualizer.cpp- Rviz可视化接口
7. 实际部署注意事项
将GVINS部署到实际系统时,需要特别注意以下方面:
传感器标定:
- IMU与相机的时间同步误差应小于1ms
- 相机内参标定建议使用Kalibr工具
- GNSS天线相位中心需要精确测量
实时性保障:
sudo apt-get install linux-lowlatency sudo tuned-adm profile latency-performance内存管理:
- 长期运行时建议启用内存池:
// 在system.cpp中添加 Eigen::initParallel(); Eigen::setNbThreads(4);多设备兼容性测试:
- 测试过的GNSS接收器清单:
- u-blox F9P
- NovAtel OEM7
- Trimble BD982
- 测试过的GNSS接收器清单:
在工业级应用中,我们还需要考虑:
- 数据持久化方案
- 异常恢复机制
- 网络延迟补偿
- 多节点协同定位
