IC-GVINS如何在一个统一坐标系下融合IMU、视觉与GNSS:因子图优化完全指南
2026/8/25 9:21:41 网站建设 项目流程

IC-GVINS如何在一个统一坐标系下融合IMU、视觉与GNSS:因子图优化完全指南

【免费下载链接】IC-GVINSA Robust, Real-time, INS-Centric GNSS-Visual-Inertial Navigation System项目地址: https://gitcode.com/gh_mirrors/ic/IC-GVINS

IC-GVINS 是由武汉大学 i2Nav 团队开源的鲁棒、实时、INS 中心(INS-Centric)GNSS-视觉-惯性导航系统。它的核心思想是:以惯性导航系统(INS)为参考基准,将 IMU 预积分、GNSS 位置观测和相机重投影三类观测,统一转换到同一个世界坐标系中,再通过因子图优化(基于 Ceres Solver)实现紧耦合融合,从而在城市峡谷、GNSS 多路径等复杂环境下依然保持稳定、精准的定位。

一、为什么选"INS 中心":稳健性的来源 🧭

视觉导航容易受光照、纹理等复杂环境影响,而惯性导航不依赖外部环境。IC-GVINS 的设计哲学正是把最可靠的那一方作为"主角"

  • INS 主导:IMU 数据以 200 Hz 高频提供连续的状态外推,视觉与 GNSS 作为低频观测对 INS 进行"纠偏";
  • INS 辅助视觉:用精确的 INS 信息辅助特征跟踪与地标三角化,在剧烈运动下也不容易丢失跟踪(源码见ic_gvins/ic_gvins/tracking/tracking.cc);
  • GNSS 辅助初始化:利用 GNSS 快速完成航向与姿态初始化,避免纯视觉初始化失败带来的连锁崩溃;
  • 地球自转补偿:在 INS 预积分中显式补偿地球自转,可显著提升高等级 IMU 的长时间精度。

二、统一坐标系如何建立:局部 ENU 坐标系 + WGS84 🌍

因子图优化要求所有观测"说同一种语言"。IC-GVINS 的做法非常经典:

  1. 选原点:系统初始化时,以第一个有效 GNSS 的地理坐标(经度、纬度、高度,即 BLH 坐标)作为世界坐标系原点(见ic_gvins/ic_gvins/ic_gvins.ccintegration_config_.origin的赋值逻辑);
  2. 全局转局部:之后每帧 GNSS 观测都通过Earth::global2local()从 WGS84 大地坐标转换到以原点为参考的局部东北天(ENU)坐标系,再进入因子图;
  3. 局部转全局:优化完成后,再通过Earth::local2global()把局部状态映射回经纬高,输出标准航迹。

这些坐标与旋转矩阵的换算(含 WGS84 椭球参数、大地水准面曲率半径)都封装在 earth.h 中。另外,GNSS 天线与 IMU 之间存在物理距离,系统在因子中加入了杆臂改正antlever参数),把 GNSS 位置换算到 IMU 本体坐标系,这也是统一坐标系下"严丝合缝"的关键细节之一。

三、因子图优化"三大件":IMU 预积分、GNSS 因子与重投影因子 🧩

在滑动窗口内,Ceres Solver 求解一个非线性最小二乘问题,窗口中的变量是各时间节点的位姿、IMU 零偏与相机标定参数。约束(因子)主要由以下四部分构成:

因子类型作用核心文件
IMU 预积分因子把两个关键帧之间的一段 IMU 数据积分成一个位姿约束ic_gvins/ic_gvins/preintegration/preintegration_earth.h
GNSS 因子提供带杆臂改正的位置观测,按 GNSS 各轴标准差加权ic_gvins/ic_gvins/factors/gnss_factor.h
重投影因子将地图三维地标投影回图像,与观测像素比对ic_gvins/ic_gvins/factors/reprojection_factor.h
边缘化因子滑动窗口前移时,把旧信息压缩成先验,防止误差积累ic_gvins/ic_gvins/factors/marginalization_factor.h

整个优化流程(构建因子图 → 卡方剔除粗差 → 求解 → 边缘化 → 更新状态)都在 ic_gvins.cc 的runOptimization()线程中完成,与跟踪、融合线程并行,保证了实时性

💡 小贴士:窗口大小由配置项optimize_windows_size控制,默认 10 个关键帧;GNSS 与重投影粗差分别通过卡方检验(gnssOutlierCullingByChi2)自动剔除,这是系统"鲁棒"的又一层保险。

四、地球自转补偿:容易被忽视的精度增益 🌐

在 gvins.yaml 中有一个开关iswithearth: true,开启后:

  • 预积分方程中加入地球自转角速度项iewn与科里奥利项enwn(定义见 earth.h);
  • 使用PreintegrationEarth而非简单平地模型做 IMU 积分(preintegration/preintegration_earth.cc);
  • 对 MEMS 级别 IMU 的长窗口预积分误差有可测的改善,这也是团队另外一篇 IEEE Sensors Journal 论文的主题。

五、快速上手:一键运行官方数据集 🚀

环境要求:Ubuntu 18.04/20.04 + ROS + Ceres Solver 2.x + OpenCV 4(详见 README.md)。

mkdir ~/gvins_ws && cd ~/gvins_ws && mkdir src && cd src git clone https://gitcode.com/gh_mirrors/ic/IC-GVINS.git cd .. catkin_make -j8 -DCMAKE_BUILD_TYPE=Release source devel/setup.bash

运行官方演示数据集(修改配置文件与命令行中的路径即可):

roslaunch ic_gvins ic_gvins.launch configfile:=path/urban38/IC-GVINS/gvins.yaml rosbag play path/urban38/urban38.bag

官方开源了两套数据集:KAIST 复杂城市数据集(urban38/urban39,轨迹长达 11 公里)和团队自采机器人数据集(campus/building)。urban38 的轨迹示例如下:

机器人楼宇数据集(building)中大量 GNSS 遮挡场景,非常适合观察因子图在退化环境下的表现:

六、核心配置参数速查表 ⚙️

所有参数集中在 gvins.yaml,新手重点关注以下几项:

参数默认值说明
iswithearthtrue是否启用地球自转补偿(建议保持开启)
imudatarate200IMU 采样频率(Hz),需与数据一致
antleverGNSS 天线杆臂(IMU 前-右-下系,单位 m)
optimize_windows_size10因子图滑动窗口大小(关键帧数)
reprojection_error_std1.5重投影误差标准差(像素),用于优化与粗差剔除
gnssthreshold20GNSS 固定阈值抗差(m)
td_b_c0.0相机与 IMU 时间延时,支持在线估计

📌 用自己的数据时请牢记:IMU 必须为前-右-下坐标格式,且 IMU、相机、GNSS 需完成时间同步,并修改ic_gvins/launch/ic_gvins.launch中的话题名。

七、总结

IC-GVINS 给出了"多传感器融合导航"的一套清晰答卷:以 INS 为圆心、以局部 ENU 统一坐标系为画布、以因子图优化为画笔——IMU 预积分提供连续动态约束,GNSS 因子锚定全局位置,重投影因子注入视觉几何信息,边缘化与卡方剔除则让窗口滚动时的系统又稳又准。如果你想深入源码,建议按ic_gvins/ic_gvins/ic_gvins.cc(总控流程)→preintegration/(IMU 积分)→factors/(三类因子)的顺序阅读,一周内就能读懂整个融合闭环。

【免费下载链接】IC-GVINSA Robust, Real-time, INS-Centric GNSS-Visual-Inertial Navigation System项目地址: https://gitcode.com/gh_mirrors/ic/IC-GVINS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询