1. 环境准备:从零搭建GVINS开发环境
第一次接触GVINS这类多传感器融合定位系统时,最头疼的就是环境配置。我去年在Ubuntu 18.04上部署时就踩了不少坑,后来发现其实只要按步骤来,90%的问题都能避免。下面我会用最直白的语言,带你一步步搞定这个"技术活"。
GVINS需要的基础环境包括ROS、Eigen、Ceres Solver和gnss_comm。这里有个小技巧:建议使用Ubuntu 18.04 + ROS Melodic的组合,因为这是官方测试最充分的版本。我试过在Ubuntu 20.04上也能跑,但需要额外处理一些依赖冲突。
先说说ROS安装。很多教程会让你用apt-get直接装,但我建议用清华源或中科大的镜像源,速度会快很多。安装完成后,记得检查/opt/ros/melodic/setup.bash是否存在,这是验证ROS是否装好的关键标志。我第一次安装时就漏了这个检查,结果后面各种报错。
Eigen和Ceres Solver的安装也有讲究。Eigen建议用3.3.7版本,太新的版本可能会有兼容性问题。Ceres Solver最好从源码编译,记得加上-DBUILD_TESTING=OFF和-DBUILD_EXAMPLES=OFF选项,能节省不少编译时间。我实测下来,这样配置比直接apt安装要稳定得多。
2. 源码获取与工作空间配置
GVINS的源码放在HKUST的GitHub仓库里,直接克隆就行。但有个细节要注意:建议把gnss_comm的代码也一起下载,放在GVINS源码的同级目录。我第一次尝试时没注意这个,结果编译时各种找不到头文件。
创建工作空间的步骤很关键:
- 新建一个文件夹,比如
gvins_ws - 在里面创建
src目录 - 把下载的GVINS源码和gnss_comm都放进
src
这里有个实用技巧:我习惯用tree -L 2命令检查目录结构是否正确。正确的结构应该是:
gvins_ws/ └── src/ ├── GVINS/ └── gnss_comm/3. 编译GVINS:避坑指南
编译环节是最容易出问题的部分。首先确保你已经source /opt/ros/melodic/setup.bash,然后进入gvins_ws目录执行catkin_make。
常见的几个报错和解决方法:
- 找不到Eigen3:修改CMakeLists.txt,明确指定Eigen3路径
- Ceres版本冲突:删除系统自带的Ceres,全部用源码编译的版本
- gnss_comm链接错误:检查是否放在了正确位置
编译成功后,你会看到build、devel和src三个目录。这里有个小技巧:把source devel/setup.bash加到.bashrc里,这样每次打开终端都不用重新source了。
4. 运行GVINS:完整流程解析
运行GVINS需要三个终端窗口同时工作:
- GVINS主程序:运行
roslaunch gvins visensor_f9p.launch - RVIZ可视化:运行
rviz -d src/config/gvins_rviz_config.rviz - 数据播放:用
rosbag play播放数据集
这里有个实用技巧:先启动RVIZ,再启动GVINS主程序,最后播放数据,这样能避免时间戳不同步的问题。我第一次运行时顺序搞反了,结果RVIZ里什么都显示不出来。
配置文件visensor_left_f9p_config.yaml需要特别注意两个参数:
output_path: 结果输出目录use_gnss: 是否使用GNSS数据
5. 数据集工具使用技巧
GVINS配套的数据集工具很实用,但使用时有几个注意事项:
- 编译前要修改
bag2rinex.cpp和bag2rtk_solution.cpp里的文件路径 - 输出文件名要写全,不能只写目录
- 路径中最好不要有中文或空格
我常用的转换命令是:
rosrun gvins_dataset_toolkit bag2rinex rosrun gvins_dataset_toolkit bag2rtk_solution转换完成后,可以用EVO工具评估轨迹精度。这里有个小技巧:先用evo_traj查看轨迹,再用evo_ape计算绝对位姿误差。我第一次评估时直接用了evo_ape,结果因为坐标系没对齐导致误差特别大。
6. 常见问题排查手册
根据我的踩坑经验,整理了几个最常见的问题:
问题1:编译时报错"Could not find a package configuration file..."解决方法:检查是否漏装了依赖,特别是gnss_comm是否放在了正确位置
问题2:运行时提示"Failed to load nodelet"解决方法:确认是否source了工作空间的setup.bash
问题3:RVIZ中看不到轨迹解决方法:检查时间同步,确保先启动RVIZ再播放数据
问题4:GNSS数据无法融合解决方法:检查配置文件中的use_gnss参数和GNSS天线参数
遇到问题时,建议先看终端输出的错误信息,90%的问题都能从中找到线索。实在解决不了,可以去GitHub的issue区搜索,大概率有人遇到过类似问题。
7. 性能优化建议
想让GVINS跑得更流畅?试试这几个优化技巧:
- 关闭调试输出:修改launch文件中的
output="screen"为output="log" - 使用IMU内参标定:能显著提高融合精度
- 调整优化频率:在配置文件中修改
optimization_frequency参数 - 使用更高性能的GNSS接收机:如U-blox F9P
我在Jetson Xavier上实测发现,经过这些优化后,CPU占用率能从90%降到60%左右,而且定位精度也有提升。特别是在GNSS信号不好的区域,优化后的系统表现明显更稳定。
最后提醒一点:多传感器系统的标定非常重要。建议先用Kalibr工具做好相机-IMU标定,再用专业设备做GNSS天线杆臂标定。我刚开始时偷懒用了默认参数,结果定位误差大了将近一倍。