IMU 卡尔曼滤波调试
IMU 调试中的卡尔曼滤波算法(通俗讲解 + 代码逻辑)
卡尔曼滤波是 IMU(惯性测量单元)调试中最核心的融合算法之一,核心作用是把陀螺仪(易漂移但动态准)和加速度计(静态准但动态噪)的角度数据融合,得到精准、稳定的角度值。它不像一阶滞后滤波那样 “简单加权”,而是通过 “预测 - 修正” 的闭环,动态判断两个传感器的可信度,最终输出最优估计值。
一、卡尔曼滤波的核心思想(通俗版)
先记住一句话:卡尔曼滤波 = 先猜(预测)→ 再看(观测)→ 修正猜测(融合),而且 “猜” 和 “看” 的权重会根据各自的误差动态调整。
举个生活例子(对应 IMU 角度融合)
假设你要知道 IMU 模块的实际倾斜角度(比如水平为 0°),就像你要估测一个杯子的实际温度:
-
陀螺仪(预测):像你根据 “上一秒杯子温度 + 室温变化趋势” 猜当前温度 —— 能跟踪变化(动态准),但猜久了会偏差(比如陀螺仪漂移,积分越久角度误差越大);
-
加速度计(观测):像你用温度计测杯子温度 —— 静态时准(水平时加速度计测重力方向算角度超准),但动态时 “手抖”(IMU 晃动时加速度计会混入运动加速度,角度值跳变);
-
卡尔曼滤波:像你结合 “猜测值” 和 “温度计读数”,如果温度计本身不准(比如坏了,观测误差大),就多信猜测;如果猜测的趋势明显错了(比如室温没变化但你猜温度涨了,预测误差大),就多信温度计 —— 最终得到最接近真实的温度(角度)。
二、一维卡尔曼滤波(IMU 角度融合专用)
IMU 角度融合用一维卡尔曼滤波就够了(不用复杂的矩阵运算),先讲核心公式(简化版),再对应到 IMU 场景:
核心变量说明(先记牢)
| 变量 | 通俗解释(IMU 角度场景) | 符号 |
|---|---|---|
| 最优估计值 | 滤波后最终输出的角度(最接近真实值) | Xk |
| 预测值 | 用陀螺仪积分得到的角度(仅靠预测) | Xk' |
| 观测值 | 加速度计计算的角度(仅靠观测) | Zk |
| 过程噪声 Q | 陀螺仪的 “不可信度”(Q 越大,越不信陀螺仪) | Q |
| 观测噪声 R | 加速度计的 “不可信度”(R 越大,越不信加速度计) | R |
| 误差协方差 P | 最优估计值的误差(P 越小,估计越准) | P |
| 卡尔曼增益 K | 融合权重(K 越大,越信观测;K 越小,越信预测) | K |
5 个核心步骤(预测→修正)
步骤 1:预测(仅靠陀螺仪)
-
角度预测:Xk' = Xk_{last} + omega times dt
(omega= 陀螺仪角速度,dt= 采样周期,Xk_{last}= 上一次最优角度)
-
误差预测:Pk' = Pk_{last} + Q
(预测的误差会变大,因为陀螺仪有漂移)
步骤 2:计算卡尔曼增益(判断谁更可信)
-
K = Pk' / (Pk' + R)
(如果 Pk' 大(预测误差大),K≈1,多信观测;如果 R 大(观测误差大),K≈0,多信预测)
步骤 3:修正(融合预测和观测)
-
最优角度更新:Xk = Xk' + K times (Zk - Xk')
(用增益 K 调整,把观测值的误差 “补” 到预测值里)
步骤 4:更新误差协方差(优化下一次预测)
-
Pk = (1 - K) times Pk'
(融合后误差变小,下一次预测更准)
通俗对应 IMU 场景
比如:
-
静态时(IMU 不动):陀螺仪角速度≈0,预测值基本不变,但加速度计观测值准→K 变大,最优角度贴近加速度计;
-
动态时(IMU 快速晃动):加速度计观测值跳变(噪声大)→R 相对变大,K 变小,最优角度贴近陀螺仪(动态跟踪准)。
三、IMU 角度融合的卡尔曼滤波代码逻辑(单片机 C 语言版)
适配 STM32/51 等单片机,核心逻辑清晰,注释详细,可直接嵌入 IMU 采集流程:
代码前提
-
已实现陀螺仪角速度读取(
gyro_read(),单位:rad/s); -
已实现加速度计角度计算(
acc_angle_calc(),单位:rad); -
采样周期
dt:比如 10ms(0.01s),需和实际采样频率匹配。
核心代码
#include "math.h"
// 卡尔曼滤波参数(IMU调试重点调这两个!)
#define Q 0.001f // 过程噪声(陀螺仪漂移系数):静态飘移大则调大,比如0.005f
#define R 0.1f // 观测噪声(加速度计噪声):动态晃动大则调大,比如0.5f
// 卡尔曼滤波全局变量
float kalman_Xk = 0.0f; // 当前最优角度(初始值:IMU水平时设0)
float kalman_Pk = 0.1f; // 初始误差协方差(随便设个小值即可)
float dt = 0.01f; // 采样周期(10ms,根据实际定时器调整)
/**
* @brief 一维卡尔曼滤波(IMU角度融合)
* @return 滤波后的最优角度(rad)
*/
float kalman_filter_imu(void) {
// ---------------------- 步骤1:预测(陀螺仪积分) ----------------------
float gyro_w = gyro_read(); // 读取陀螺仪角速度(rad/s)
float Xk_prime = kalman_Xk + gyro_w * dt; // 预测角度
float Pk_prime = kalman_Pk + Q; // 预测误差协方差
// ---------------------- 步骤2:计算卡尔曼增益 ----------------------
float K = Pk_prime / (Pk_prime + R);
// ---------------------- 步骤3:读取加速度计观测值 ----------------------
float Zk = acc_angle_calc(); // 加速度计计算的角度(rad)
// ---------------------- 步骤4:修正(融合预测和观测) ----------------------
kalman_Xk = Xk_prime + K * (Zk - Xk_prime); // 更新最优角度
// ---------------------- 步骤5:更新误差协方差 ----------------------
kalman_Pk = (1 - K) * Pk_prime;
// 返回最优角度(可转角度制:kalman_Xk * 180/M_PI)
return kalman_Xk;
}
// 【辅助函数示例】加速度计角度计算(以X轴为例)
float acc_angle_calc(void) {
// 读取加速度计X/Y/Z轴数据(单位:m/s²)
float acc_x = acc_read_x();
float acc_z = acc_read_z();
// 计算倾斜角度:arctan(acc_x/acc_z)(水平时acc_x=0,角度=0)
float angle = atan2(acc_x, acc_z);
return angle;
}
// 【主循环调用示例】
void main(void) {
// 初始化IMU、定时器(10ms中断)
imu_init();
timer_init(10); // 10ms触发一次采样
while(1) {
if (timer_flag) { // 10ms到,触发滤波
float angle = kalman_filter_imu(); // 得到最优角度
timer_flag = 0;
}
}
}
四、IMU 调试中卡尔曼滤波的调参技巧(关键!)
新手最头疼的是调 Q 和 R,记住 “先定趋势,再微调”:
1. 初始参数(参考值)
-
静态调试(IMU 放水平不动):
Q=0.0010.005,R=0.10.3 → 最优角度应稳定在 0 附近,无明显漂移;
-
动态调试(IMU 缓慢晃动):
Q=0.0050.01,R=0.30.8 → 角度能跟得上晃动,无明显跳变。
2. 调参口诀
-
角度漂移严重(静态时慢慢偏):增大 Q(让滤波更不信陀螺仪,多信加速度计);
-
角度跳变严重(动态时抖):增大 R(让滤波更不信加速度计,多信陀螺仪);
-
角度响应慢(动态时跟不上):减小 Q(多信陀螺仪,提升动态跟踪)。
3. 调试步骤
-
先把 IMU 放水平,运行代码看最优角度:如果一直飘,调大 Q;
-
再缓慢晃动 IMU,看角度是否跟得上:如果跳变,调大 R;如果跟得慢,调小 Q;
-
最后快速晃动,验证动态稳定性(只要不严重跳变、不滞后即可)。
五、卡尔曼滤波 vs 一阶滞后滤波(IMU 场景)
| 特性 | 卡尔曼滤波 | 一阶滞后滤波 |
|---|---|---|
| 核心逻辑 | 动态加权(信度实时调整) | 固定加权(α 固定) |
| IMU 适配性 | 动态 / 静态都优 | 静态优,动态易滞后 / 跳变 |
| 代码复杂度 | 中等(一维无压力) | 极低 |
| 调参难度 | 稍高(Q/R) | 极低(α) |
| 适用场景 | 高精度 IMU 融合(如云台、无人机) | 低精度场景(如简易倾角计) |
六、总结
IMU 调试中的卡尔曼滤波不用搞懂复杂的矩阵理论,一维版本核心就是 “预测 - 修正”+“动态加权”:
-
用陀螺仪做 “预测”,解决加速度计动态噪声问题;
-
用加速度计做 “观测”,解决陀螺仪漂移问题;
-
用卡尔曼增益动态调整权重,兼顾静态精度和动态跟踪。
代码逻辑可直接复用,重点是调 Q 和 R—— 记住 “Q 管陀螺仪,R 管加速度计”,根据实际动静场景微调,就能得到稳定的角度值。

浙公网安备 33010602011771号