在移动机器人定位领域,传感器融合软件始终是核心技术之一。传统方案如 robot_localization 虽然应用广泛,但在原生 ECEF GPS 融合、IMU 偏置估计以及自适应噪声协方差等方面存在明显短板。FusionCore 作为 ROS 2 Jazzy 原生开发的传感器融合 SDK,采用无迹卡尔曼滤波(UKF)实现 IMU、轮式编码器与 GPS 的深度融合,其自适应噪声估计与在线调参能力使其在 NCLT 数据集测试中取得了 5/6 序列的最优表现。本文将从工程实现角度深入解析其架构设计,重点探讨多传感器时间同步、滤波算法选型、关键参数配置以及实时性优化的实战要点。
UKF 滤波器核心实现与状态向量设计
FusionCore 的核心滤波算法采用无迹卡尔曼滤波器(Unscented Kalman Filter),使用 45 个 Sigma 点来近似非线性变换后的概率分布。相比传统的扩展卡尔曼滤波(EKF),UKF 对非线性系统的状态估计具有更高的精度,且无需计算雅可比矩阵,这在 IMU 积分等强非线性操作中尤为重要。FusionCore 的状态向量设计为 22 维,包含位置(x, y, z)、姿态(四元数 qw, qx, qy, qz)、线速度、角速度、线加速度以及陀螺仪偏置(x, y, z)和加速度计偏置(x, y, z)。这种设计使得滤波器能够在线估计 IMU 传感器偏置,无需繁琐的静态校准流程。
状态向量的四元数表示避免了欧拉角的奇异性问题,特别适用于三维空间中的姿态估计。在 UKF 预测步骤中,系统噪声矩阵 Q 的参数通过 ukf.q_position、ukf.q_velocity、ukf.q_angular_vel、ukf.q_acceleration、ukf.q_gyro_bias 和 ukf.q_accel_bias 等参数配置。需要特别注意的是,ukf.q_orientation 仅用于四元数正则化,官方建议设置为 1.0e-9,过大的值会破坏四元数数学性质并导致航向漂移和 Z 轴上升。
滤波器以 100Hz 的频率发布融合后的里程计数据,这一高频率确保了与 Nav2 路径规划子系统的实时性兼容。在 configure 阶段,FusionCore 会验证所有必需的 TF 变换是否存在,缺失的变换会打印精确的修复命令,这避免了传统方案中常见的静默失败问题。
IMU 外参标定与坐标系转换
IMU 几乎从不安装在机器人基座中心(base_link)位置,因此精确的坐标变换对于融合精度至关重要。FusionCore 通过读取 IMU 消息的 frame_id 字段,利用 TF 树查询到 base_link 的旋转变换,在融合前将角速度和线加速度转换到基座坐标系。这一过程对用户透明,但需要确保 TF 变换关系在启动时已正确发布。
在参数配置层面,IMU 噪声参数直接影响滤波器的融合效果。imu.gyro_noise(单位 rad/s)和 imu.accel_noise(单位 m/s²)应从 IMU 数据手册获取典型值作为初始参考。对于 6 轴 IMU(如常见的 MPU6050、BMI088),由于缺少磁力计,航向角只能通过陀螺仪积分推算,存在固有漂移,此时应设置 imu.has_magnetometer: false。对于 9 轴 IMU(如 BNO085、VectorNav、XSense),可以融合磁力计提供的绝对航向信息,显著改善长时间运行时的航向精度。
部分 IMU 报告的是原始比力(包含重力),而 FusionCore 默认假设输入为去除重力后的值。如果机器人在静止状态下出现 Z 轴漂移,可将 imu.remove_gravitational_acceleration 设置为 true,滤波器将利用当前姿态估计值从线加速度中移除重力分量。初始化阶段的偏置估计对滤波性能有显著影响,设置 init.stationary_window: 2.0 可使滤波器在启动前采集 2 秒静止 IMU 数据直接估计偏置,将启动瞬态从约 10cm 降低到 1cm 以下。
GPS 融合与天线杆臂修正
FusionCore 的 GPS 融合采用原生 ECEF(Earth-Centered, Earth-Fixed)坐标系,通过 PROJ 库实现任意坐标参考系统(CRS)的转换。默认配置将输入的 WGS84 经纬度(EPSG:4326)转换为 ECEF(EPSG:4978)进行内部计算,再转换到 ENU(East-North-Up)局部坐标系输出。这种设计使得滤波器能够在全球范围内工作,无需手动设置固定坐标原点。
天线杆臂(lever arm)修正是一个关键的工程细节。GPS 天线通常安装在机器人顶部或前方,其位置与 base_link 存在明显偏移。如果不进行杆臂修正,天线读取的坐标对应的是一条与基座不同的轨迹。FusionCore 通过公式 p_antenna = p_base + R * lever_arm 进行修正,其中 R 是当前姿态的旋转矩阵。杆臂参数通过 gnss.lever_arm_x/y/z 配置,单位为米。需要特别强调的是,杆臂修正仅在航向已被独立来源验证后才会激活,包括:双天线 heading 消息、9 轴 IMU 的绝对航向、或机器人移动距离超过 5 米且速度大于 0.2 m/s 且角速度小于 0.3 rad/s 的 GPS 航迹。在航向未验证时,即使配置了杆臂参数,滤波器也会自动禁用修正,以避免引入更大的误差。
GPS 质量门控是另一个重要特性。FusionCore 根据 sensor_msgs/NavSatFix.status 映射到内部 fix type 枚举,通过 gnss.min_fix_type 参数设置最低可接受的 GPS 质量:1 为普通 GPS,2 为 DGPS,4 为 RTK_FIXED。默认接受任何有效 GPS 修复,设置 min_fix_type: 4 可强制要求 RTK 固定解。需要注意 NavSatFix 状态字段没有 RTK_FLOAT 选项,因此设置 3 实际上会静默饿死滤波器。
轮式编码器配置与零速更新
轮式编码器为融合系统提供相对里程信息,其噪声参数通过 encoder.vel_noise(m/s)和 encoder.yaw_noise(rad/s)配置。对于差速驱动机器人,编码器积分可以直接推算位置和航向;对于全向移动机器人(如 Mecanum 轮),运动模型需要额外的横向速度预测,当前版本明确指出不提供 Mecanum 驱动运动模型。
零速更新(ZUPT)是静止状态下的关键功能。当编码器速度低于 0.05 m/s 且角速度低于 0.05 rad/s 时,FusionCore 会融合一个零速度伪测量,噪声矩阵非常紧凑。这有效抑制了 IMU 噪声在静止状态下累积为虚假速度向量。所有 MEMS IMU 都存在微小的加速度计和陀螺仪偏置,这些偏置在启动时未知,会在 60 秒左右的运行过程中逐渐被估计,导致启动阶段存在一定的位置偏移。通过前述的静止初始化窗口可以显著改善这一瞬态性能。
自适应噪声协方差的在线估计
FusionCore 最显著的技术特性之一是自适应噪声协方差估计。传统方案要求用户手动调整过程噪声矩阵 Q 和测量噪声矩阵 R 的参数,这需要丰富的经验和对传感器特性的深入理解。FusionCore 通过跟踪 50 个样本的滑动窗口创新序列(innovation sequence),从实际数据中估计真实噪声协方差,然后使用指数移动平均(EMA)以 alpha=0.01 的速率逐渐更新 R 矩阵。经过几分钟运行后,R 会自动收敛到真实传感器特性,用户无需手动调参。
这一特性通过 adaptive.imu、adaptive.encoder、adaptive.gnss 开关控制,adaptive.window 设置滑动窗口大小,adaptive.alpha 控制收敛速度。实际部署时建议先启用自适应噪声观察收敛行为,待稳定后可以锁定特定传感器的自适应以获得更可预测的行为。
异常值剔除与延迟补偿
Mahalanobis 距离检验是 FusionCore 异常值剔除的核心机制。在融合任何 GPS 修复前,滤波器计算测量 innovations 与其协方差矩阵的 Mahalanobis 距离 d² = νᵀ · S⁻¹ · ν,并与 99.9% 置信度的卡方阈值比较。默认阈值分别为:GNSS 位置 16.27(3 自由度)、航向 10.83(1 自由度)、编码器 11.34(3 自由度)、IMU 15.09(6 自由度)。超出阈值的测量将被拒绝而不会更新滤波器状态。测试中注入 500 米 GPS 跳变后观察到位置零变化,验证了剔除机制的有效性。
GPS 测量通常存在数十毫秒到数百毫秒的延迟,直接融合会导致显著的位置误差。FusionCore 维护 100 条 IMU 消息(100Hz 下为 1 秒)的环形缓冲区,当延迟的 GPS 修复到达时,滤波器恢复到修复时刻最近的快照状态,重新融合该修复,然后重放缓冲区中的所有 IMU 消息向前推进到当前时刻。这种完全延迟补偿消除了运动模型近似误差,支持高达 500ms 的延迟。
实时性能与诊断监控
FusionCore 设计为 100Hz 融合频率,计算复杂度主要来自 UKF 的 Sigma 点传播和矩阵运算。C++17 实现确保了计算效率,UKF 核心包含 39 个单元测试验证数值稳定性,包括 P 矩阵对称化、Cholesky 分解的 identity-shift 修复、角速度方差封顶等保护机制。
诊断功能通过 /diagnostics 主题以 1Hz 频率发布,兼容 rqt_robot_monitor 和 Nav2。四个状态条目分别对应 IMU、编码器、GNSS 和滤波器,每个条目显示 OK 或 WARN 状态、异常值计数、航向来源、行驶距离、位置不确定度和更新计数。传感器掉线检测独立跟踪每个传感器的最后更新时间,超过 stale_timeout(默认 1.0 秒)后返回 SensorHealth::STALE,滤波器继续利用剩余传感器运行,待掉线传感器恢复后自动重连。
配置模板与迁移路径
FusionCore 提供了针对主流硬件平台的预配置模板:Clearpath Husky A200 搭配 Microstrain 3DM-GX5-25 IMU 和 u-blox F9P GPS、BNO085 配合 M8N GPS 的通用差速驱动配置、以及 Duatic Mecanum 机械臂的无 GPS 配置。每个硬件配置可与环境预设(env_open.yaml、env_urban.yaml、env_canopy.yaml)组合,根据运行场景调整 GPS 信任级别而无需修改硬件参数。
从 robot_localization 迁移时需注意 topic 映射:FusionCore 的 /fusion/odom 对应原 odom 主题,/fusion/pose 对应 pose 主题,odom -> base_link TF 语义相同但实现更完善。官方文档提供了完整的参数对照表和分步迁移指南,确保平滑过渡。
资料来源
本文技术细节主要参考 FusionCore 官方 GitHub 仓库(manankharwar/FusionCore),该仓库包含完整的架构说明、基准测试结果、配置示例和集成测试代码。