单个传感器很难同时兼顾响应速度、长期稳定性和抗干扰能力。IMU 更新快但会漂移,编码器能提供直接位置参考,视觉观测更接近目标却通常延迟更大。卡尔曼滤波的任务,是让这些信息在同一个状态模型中各司其职。
为什么需要多传感器融合
三类观测各有缺陷:IMU 高频但有噪声和漂移,视觉测量较慢且有延迟,编码器精度有限但能提供直接角度参考。
卡尔曼滤波不是简单平均。它用系统模型预测状态,再根据每种测量的不确定性决定本次应修正多少。
四维状态的物理意义
设计稿选择四个状态:角度、角速度、角加速度和陀螺仪偏置。
x = [angle, angular_velocity, angular_acceleration, gyro_bias]ᵀ角度描述云台当前方向;角速度和角加速度支撑短期运动预测;偏置用于估计陀螺仪在静止时仍存在的慢变化零偏。
状态维度越多并不天然更准。若角加速度模型与实际机构不符,增加状态反而会放大建模误差。
预测步骤
预测使用上一拍状态和时间间隔 dt 推算当前状态:
x⁻ = F·x + B·uP⁻ = F·P·Fᵀ + QF 是状态转移矩阵,P 是估计协方差,Q 是过程噪声。预测时间越长或模型越不可信,P⁻ 应增长,表示当前估计的不确定性增加。
真实实现必须使用测量时间戳计算 dt。把视觉、IMU 和编码器强行按同一个固定周期处理,会掩盖异步到达和通信延迟。
测量更新步骤
新测量到达后,滤波器先计算创新,也就是“测量与预测相差多少”:
y = z - H·x⁻S = H·P⁻·Hᵀ + RK = P⁻·Hᵀ·S⁻¹x = x⁻ + K·yP = (I-K·H)·P⁻H 说明某个传感器观测状态中的哪些分量,R 表示测量噪声。R 越小,滤波器越相信这次测量;P⁻ 越大,滤波器越愿意让测量纠正预测。
编码器、IMU 与视觉如何异步融合
不同传感器应使用各自的更新函数。高频 IMU 到来时可以先预测,再用角速度或姿态观测更新;编码器和视觉到达时各自使用对应 H、R 更新。
IMU 到达 → predict(dt) → update_imu()编码器到达 → predict(dt) → update_encoder()视觉结果到达 → predict(dt) → update_vision()同一时间段内不能重复预测。工程上应维护统一的最后预测时间,并清楚区分测量采样时刻与数据接收时刻。
视觉延迟若明显,直接用当前状态更新会把旧画面当成当前测量。当前示例只给出异步融合思路,没有实现历史状态回放或延迟补偿。
噪声矩阵如何理解
Q 不是传感器噪声,而是系统模型无法解释的运动变化;R 才是对应测量的不确定性。
调参应基于静态日志、动态残差和时间戳统计。只凭“输出抖不抖”调矩阵,可能得到看似平滑但严重滞后的估计。
协方差还应保持对称、半正定。代码实现中可定期检查对角线是否为负、是否出现 NaN,并在矩阵求逆前检查创新协方差是否接近奇异。
从数学公式到 MCU 代码还缺什么
示例给出 KalmanFilter、4×4 协方差和预测/更新代码,但缺少完整头文件、矩阵库、初始化参数、构建配置和单元测试。
它应被视为设计参考。要迁移到 MSPM0G35XX,还需决定矩阵存储、浮点性能、异常测量剔除、时间戳来源和传感器坐标变换。
示例中出现的 100 Hz、STM32F4 和性能评价没有对应日志与测试脚本,不能作为当前小车的性能结论。
推荐落地顺序
- 先建立每种传感器的原始数据和时间戳日志。
- 单独验证角度、角速度和编码器方向一致。
- 在离线数据上验证预测与单传感器更新。
- 加入创新门限,拒绝明显异常测量。
- 再接入实时调度器,记录运行时间和周期抖动。
- 最后才让估计结果进入控制器。
落地到小车前还要确认什么
| 检查项 | 当前设计 | 落地要求 |
|---|---|---|
| 状态模型 | 角度、角速度、角加速度和陀螺仪偏置 | 先验证每个状态是否可观测、单位是否一致 |
| 异步更新 | 为不同传感器保留独立更新入口 | 用统一单调时钟管理预测时刻 |
| 代码完整性 | 只有矩阵和流程示例 | 补齐矩阵运算、初始化、异常处理和单元测试 |
| 实时运行 | 尚无当前小车的调用记录 | 测量执行时间后再放入周期任务 |
| 性能评价 | 缺少统一测试条件 | 使用当前传感器日志和真值基准重新评估 |
本篇总结
- 四状态模型同时估计角度、角速度、角加速度和陀螺仪偏置。
- 预测负责按运动模型推进状态,测量更新负责按不确定性纠偏。
- 异步融合必须认真处理时间戳,视觉延迟不能被固定周期掩盖。
Q/R应从日志和残差统计得到,而不是只追求曲线平滑。- 数学设计落地到 MCU 前,仍需完整接口、矩阵实现、异常处理和上板验证。