保姆级教程:在Ubuntu 20.04 + ROS Noetic上从源码编译运行GVINS(含Ceres/Eigen版本避坑指南)
当视觉惯性里程计(VIO)遇上全球导航卫星系统(GNSS),会碰撞出怎样的火花?GVINS作为港科大最新开源的GNSS-Visual-Inertial紧耦合融合框架,为机器人定位领域带来了全新的解决方案。本文将带你从零开始,在Ubuntu 20.04和ROS Noetic环境下,一步步完成GVINS的编译部署,特别针对Ceres和Eigen版本冲突这一"拦路虎"提供详细解决方案。
1. 环境准备与依赖安装
在开始GVINS的编译之前,我们需要确保系统环境满足所有必要条件。不同于官方文档基于ROS Kinetic的说明,我们将针对Ubuntu 20.04和ROS Noetic进行适配。
1.1 系统基础环境配置
首先更新系统软件包并安装必要的工具链:
sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential cmake git wget接下来安装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 -y ros-noetic-desktop-full echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc1.2 关键依赖版本管理
GVINS对几个核心库有严格的版本要求,这是最容易出现问题的地方。我们需要特别注意:
| 依赖库 | 要求版本 | 常见问题 |
|---|---|---|
| Eigen | 3.3.3 | 高版本API不兼容 |
| Ceres | 1.12.0 | 编译错误 |
| C++ | 11标准 | 语法支持 |
提示:建议在虚拟环境或容器中操作,避免影响系统原有环境
2. 精准安装指定版本依赖
2.1 Eigen 3.3.3安装指南
Eigen的版本控制至关重要,高版本会导致GVINS编译失败。以下是安全安装方法:
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 .. sudo make install验证安装是否成功:
pkg-config --modversion eigen3如果显示不是3.3.3版本,可能需要手动卸载现有版本:
sudo rm -rf /usr/local/include/eigen3 sudo rm /usr/local/share/pkgconfig/eigen3.pc2.2 Ceres Solver 1.12.0编译安装
Ceres的安装相对复杂,需要先安装其依赖项:
sudo apt install -y libgoogle-glog-dev libgflags-dev libatlas-base-dev libsuitesparse-dev然后从源码编译Ceres:
wget https://ceres-solver.googlesource.com/ceres-solver/+archive/1.12.0.tar.gz tar xzf 1.12.0.tar.gz cd ceres-solver-1.12.0 mkdir build && cd build cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF make -j$(nproc) sudo make install3. GNSS通信包与GVINS源码编译
3.1 gnss_comm安装
gnss_comm是GVINS的GNSS通信基础包,需要先单独安装:
mkdir -p ~/gvins_ws/src cd ~/gvins_ws/src git clone https://github.com/HKUST-Aerial-Robotics/gnss_comm.git cd .. catkin_make source devel/setup.bash3.2 GVINS源码编译
现在可以开始GVINS本体的编译:
cd ~/gvins_ws/src git clone https://github.com/HKUST-Aerial-Robotics/GVINS.git cd .. catkin_make编译过程中常见的错误及解决方案:
Eigen版本不匹配错误:
error: 'Eigen::internal::array_size' has not been declared解决方法:确认Eigen 3.3.3已正确安装,并移除其他版本
Ceres相关错误:
undefined reference to `ceres::Problem::AddParameterBlock'解决方法:检查Ceres版本是否为1.12.0,并重新编译安装
C++11标准错误:
error: 'make_unique' is not a member of 'std'解决方法:在CMakeLists.txt中添加:
add_compile_options(-std=c++11)
4. 运行测试与实战调试
4.1 启动GVINS节点
编译成功后,可以尝试运行示例:
source ~/gvins_ws/devel/setup.bash roslaunch gvins visensor_f9p.launch在另一个终端中启动RViz可视化:
rviz -d ~/gvins_ws/src/GVINS/config/gvins_rviz_config.rviz4.2 使用示例数据集测试
如果需要测试实际数据,可以从GVINS-Dataset下载示例bag文件:
wget [数据集下载链接] -O ~/dataset.bag rosbag play ~/dataset.bag4.3 常见运行时问题排查
GNSS数据无法接收:
- 检查设备连接和权限
- 确认串口设置正确
VIO初始化失败:
- 确保环境有足够特征点
- 调整相机曝光参数
坐标系对齐问题:
- 检查ENU坐标系设置
- 确认GNSS天线杆臂值正确
注意:首次运行时可能需要较长时间初始化,特别是在GNSS信号较弱的区域
5. 进阶配置与性能优化
5.1 参数调优指南
GVINS的核心参数集中在config目录下的yaml文件中,几个关键参数:
# GNSS相关参数 gnss: antenna_delay: 0.0 # 天线延迟补偿 lever_arm: [0.1, 0.0, 0.2] # 杆臂值 # VIO相关参数 feature: max_cnt: 150 # 最大特征点数 min_dist: 30 # 特征点最小间距5.2 多传感器时间同步
对于高精度应用,需要确保各传感器时间同步:
- 使用PTP协议同步设备时钟
- 在launch文件中设置正确的时间戳偏移量
- 启用硬件触发模式减少抖动
5.3 系统性能监控
可以通过以下命令监控系统运行状态:
rostopic echo /gvins/status rqt_plot /gvins/pose/position/x:y:z6. 实际部署经验分享
在室内外过渡场景中,GVINS的表现尤为出色。我曾在一个仓库到停车场的测试中观察到,当机器人从GNSS信号良好的区域进入完全无GNSS的室内时,系统能够平滑过渡到纯VIO模式,而重新获得GNSS信号后又能快速修正累积误差。
几个实用小技巧:
- 在GNSS信号边缘区域,适当降低GNSS权重
- 对于固定场景,可以预先录制一段地图辅助初始化
- 定期校准IMU参数,特别是在温度变化大的环境中