想象你是一位“现场版天气预报员”,面前不是蓝天白云,而是一面布满小窗的控制台。窗外,风速仪的叶片在抖,百叶箱里的温度计在跳,头顶雷达屏幕上的回波像被风吹散的蒲公英,忽浓忽淡。你心里清楚:这些仪器没有一个完全可靠——有的反应迟缓,有的报数偏大,有的被工地扬尘干扰得心烦意乱。但你依然要在下午三点前报出“今天到底会不会下雨”。这就是传感器世界里的日常:我们永远无法直接看到“真实状态”,只能透过一层层噪声去猜。而这篇教程要讲的卡尔曼滤波与互补滤波,就是帮你从吵闹的传感器读数中“看出真相”的两件利器。前者像一位精于计算的老预报员,把物理模型和实况观测揉在一起,步步修正;后者像一对黄金搭档,一个盯短时变化,一个抓长期趋势,取长补短。读完这篇文章,你会拥有给无人机、机器人、汽车“把脉”的能力。
在AIoT软硬件协作中,滤波算法是连接传感器原始读数与上层智能决策的“第一道翻译官”。掌握它,能让你在机器人、无人机、自动驾驶的工程落地中占据核心位置,这是物联网架构师与边缘智能工程师的必备内功。
可视化演示
展示卡尔曼滤波预测-更新循环、噪声协方差整定与卡尔曼增益调节,以及互补滤波在传感器融合中的对比效果。
本节配有交互动效(进入视口后自动加载,约 3KB)。
卡尔曼滤波预测-更新循环 预测阶段:基于状态转移方程外推状态与协方差 更新阶段:用观测值修正预测,计算最优估计 x_k = A*x_{k-1} + B*u_k; P_k = A*P*A^T + Q
滤波思想概述
窗外明明在下雨,可你的耳朵里还混着隔壁工地洒水车的哗哗声、楼下空调外机的嗡嗡声——你听到的“雨声”从来不是纯粹的雨声。传感器的世界也一样:陀螺仪用久了会像老手表的发条一样慢慢漂移,加速度计被电机一震就像被拍了一下的旧收音机,读数乱跳。我们想知道无人机真实的倾斜角、汽车真实的速度,可拿到手的只有被噪声污染的测量值。所谓滤波,就是从这锅“噪声粥”里把真实状态重新捞出来的手艺。
技术上看,传感器测量可以写成这样一个简单关系:测量值 = 真实值 + 噪声。如果我们知道一些物理规律,比如“无人机上一秒的角速度是这么多,那这一秒角度大概转过这么多”,就不要浪费这些信息。把物理规律称为“模型”,把传感器读数称为“观测”,滤波要做的事就是:模型先猜一个,观测再修正一下。下面这个式子就是观测模型的数学表达:
所以,滤波器的本质就是“天气预报员”的工作台:一边是物理课本(模型),一边是实时观测(传感器),你的判断力就是滤波算法——给模型和观测分别打分,再决定信几分。明白了这个目标,我们就能进入卡尔曼滤波的世界了。
- 观测向量 z传感器送给你的原始读数,例如加速度计测出的倾角。它是我们唯一能直接拿到的东西,但混着噪声。
- 状态向量 x你真正关心的物理量,例如无人机的俯仰角和翻滚角。它藏在观测背后,需要被估计。
- 观测矩阵 H一台“翻译机”,把不同量纲的状态翻译成观测的量纲。若状态本来就等于观测,H 就是单位阵。
- 噪声 v传感器自身的不完美造成的误差,常见来源有电磁干扰、温度漂移和量化误差。滤波的本质就是想办法抑制 v 的影响。
卡尔曼原理
老预报员每天的开工流程其实无比固定:早晨先用气象模型推演“今天应该是什么天气”——这叫预测;中午雷达和温度计的读数回传,他对照实况修正自己的判断——这叫更新。第二天,把修正过的最优判断作为新起点,再次推演、再次修正。日复一日,这个“预测-修正”的循环就是卡尔曼滤波的骨架。
卡尔曼滤波把“状态”看成一个待估计的数或向量,比如无人机当前的角度。它维护两样东西:状态的估计值 $\hat{x}$,以及对这份估计的“信心”——协方差 $P$。每个周期分成两步:预测步用运动模型推演状态向前走一步,更新步用传感器观测把状态的偏差掰回来。掰回来的力度由卡尔曼增益 $K$ 决定:$K$ 越大,越听传感器;$K$ 越小,越信模型。先看预测步:
预测毕竟只是“猜”,接下来要用观测修正。更新步的公式是:
你看,这个循环和“天气预报员的日常”完全同构:模型推演是预测,看实况是更新,而卡尔曼增益就是老预报员的“经验系数”——他知道哪个测站可靠、哪个设备该打折,于是自动分配信任度。预测与更新周而复始,估计就越来越接近真相。但这套“信任分配”到底怎么算出 K?这正是下一节数学推导要回答的问题。
- 残差计算先用 H 把预测状态翻译成“预测的读数”,再与真实读数 z_k 相减,差值越大说明预测越偏。
- 增益加权K 是一个介于 0 到 1 之间的“信任系数”,它把残差按比例吸收进估计值。K 接近 1 时几乎完全相信观测,接近 0 时几乎忽略观测。
- 后验估计把修正量加到预测值上,得到本时刻的最优判断,它将作为下一轮预测的起点。
数学推导
预报员有多相信自己昨天的判断?如果昨天报得极准、设备也稳定,今天他的初判就有底气;可如果昨晚来了一场强对流,他会猛然意识到“原来我的模型也会漏掉突发情况”,信心随之下滑。卡尔曼滤波里,这个“信心”由协方差矩阵 P 表达——P 越小,估计越确定;P 越大,心里越没底。预测步里,信心会自然流失;更新步里,观测会重新注入信心。
预测步的协方差传播公式如下:
更新步的信心变化则依赖于卡尔曼增益:
参数整定
\displaystyle K = \frac{P + Q}{P + Q + R}
> 当 Q 远大于 R 时 K 趋近于 1,滤波器几乎完全相信测量;当 Q 远小于 R 时 K 趋近于 0,滤波器几乎完全相信模型。调参的本质就是调整这个比值。1. 预测方差叠加:$P + Q$ 是对本轮预测不确定度的总估计,Q 越大,这个值越膨胀,说明模型越"靠不住"。$$P_{pred} = P + Q$$2. 总不确定度:$P + Q + R$ 把测量风险也加进来,构成"总的不确定性预算"。$$S = P_{pred} + R$$3. 信任比例:K 就是"该信测量多少"的直接产物。看懂这个式子,就理解了为什么说 Q 和 R 是"信任度的旋钮"。$$K = \frac{P_{pred}}{S}$$调参就像调"信任天平",没有放之四海皆准的数值,只有理解每个旋钮含义后的反复试错。值得记住的实操口诀是:静止偏差大,先查 R;动态跟不紧,再调 Q。这背后是对传感器性格和模型适用边界的理解——知道什么时候该怪谁,才能调出既平滑又灵敏的滤波曲线。互补滤波
如果卡尔曼滤波是“精算师”,那互补滤波就是“草台班子里的黄金搭档”。陀螺仪是个“急性子”:响应极快,高频段数据漂亮,可惜记性不好,角度靠积分算,积分久了就漂得没边。加速度计是个“慢性子”:长期水准极稳,因为无论你怎么晃,重力方向就在那里,它总能把你拉回正确答案;但它受不了高频振动,无人机电机一震它就哆嗦。互补滤波的做法很朴素:让急性子负责高频段,让慢性子负责低频段,两者一拼就是全频段的真相。
互补滤波在姿态估计里只用一个系数 α(通常取 0.95~0.99)。它把陀螺仪的角度积分结果高通处理,把加速度计算出的倾角低通处理,再相加。离散形式写出来就是:
互补滤波的哲学是“扬长避短”——它不需要建立精确的噪声模型,不需要矩阵求逆,一个 α 就能在绝大多数嵌入式平台上跑得飞快。与卡尔曼滤波相比,它损失了最优性和不确定度输出,却换来了可观的简单与鲁棒。在算力紧张的飞控单片机上,这性价比让人无法拒绝。
- 陀螺仪积分项上一时刻角度加上角速度乘以时间步长,这是陀螺仪贡献的短时增量。α 接近 1 时,这一项占绝对主导。
- 加速度计修正项实测倾角乘以权重 $(1-\alpha)$,它像一根“橡皮筋”,把长期漂移的积分结果缓缓拉回正确方向。
- 加权合成两项相加,本质是对“高频可信的陀螺仪”和“低频可信的加速度计”做频域互补,所以叫互补滤波。
工程实践
回到无人机航拍现场。一架四旋翼悬停在空中,被风吹得微微摇摆,飞控必须知道“现在的俯仰角是多少”。它手里有两份情报:陀螺仪说“角速度这么转”,积分可得角度,短时准、长时漂;加速度计说“重力方向在那”,分解可得倾角,平稳准、动态抖。姿态滤波要做的,就是把这两份各有缺陷的情报合成一份可信的角度。
在小四轴场景,MPU6050 加互补滤波是经典组合:互补滤波计算量小,一个 α 调完,悬停稳、打舵跟手。而在高精度惯性导航中,GPS 与 IMU 的组合导航偏爱卡尔曼滤波——GPS 低频高精度但会中断,IMU 高频但会漂移,卡尔曼滤波能用 IMU 填补 GPS 中断的空窗期。其融合框架可以简化为:
工程调试的经验之谈:静止调 R,动态调 Q。先让无人机静止,把 R 调到静态偏差小于 0.5°;再手动晃动机体,观察动态跟随——“发飘”就增大 Q,“发钝”就减小 R。这就像老预报员的笔记本,密密麻麻记录着每个传感器的脾气。无论是互补滤波还是卡尔曼滤波,真正的功夫都在理解传感器性格和模型适用边界上,滤波器本身只是一把好用的工具罢了。
- IMU 递推$f_{IMU}(\hat{x}_{k-1})$ 是惯性导航的预测步,用陀螺仪和加速度计积分出当前位姿,短时间精度高。
- GPS 观测修正$z_{GPS} - h(\hat{x}_{k})$ 是 GPS 读数与预测位置的残差,$h$ 把状态映射到 GPS 坐标系。
- 融合输出增益 K 自动权衡 IMU 的漂移程度与 GPS 的噪声水平,输出平滑又可信的位姿估计。
AI 应用场景
无人机飞控姿态估计
阶段:数据预处理与状态估计
解决的问题:传统飞控直接使用陀螺仪积分会导致角度漂移,直接使用加速度计又会被振动噪声干扰得无法读取。互补滤波或卡尔曼滤波将两者融合,输出平滑、低延迟的姿态角,让飞控的 PID 控制环获得稳定反馈。
具体案例:Pixhawk 开源飞控在姿态模式中,对 MPU6050 的陀螺仪与加速度计数据执行互补滤波(或 EKF2 卡尔曼滤波),融合出俯仰、翻滚、偏航角。用户手动推油门时,滤波输出能快速跟随姿态变化而不抖动,悬停时角度误差稳定在 0.5° 以内。
自动驾驶组合导航
阶段:多传感器融合定位
解决的问题:GPS 更新频率只有 10Hz 且受高楼遮挡,IMU 虽然有 100Hz 但积分会漂移。单独使用任何一个都无法满足自动驾驶对连续高精度位姿的需求。卡尔曼滤波把 GPS 的绝对定位精度与 IMU 的高频连续性结合起来,输出 100Hz 平滑轨迹。
具体案例:某自动驾驶测试车在通过高架桥下时 GPS 信号丢失约 20 秒,组合导航系统依靠 IMU 预测步继续递推位姿,P 矩阵逐渐增大;驶出桥洞后 GPS 信号恢复,残差出现脉冲,滤波器快速收敛,车辆保持在车道中央未发生偏差。
智能手环步态识别
阶段:信号清洗与特征提取
解决的问题:手环加速度计在跑步时充满剧烈波动,直接做阈值检测会频繁误判。卡尔曼滤波先对加速度信号做平滑,保留步频能量同时剔除瞬时冲击,再送入步态分类器,识别准确率显著提升。
具体案例:某智能手环在跑步模式下,对三轴加速度计数据应用一维卡尔曼滤波(Q=0.01,R=0.1),滤波后信号方差下降约 60%,步数计数的误差从 ±15% 降至 ±3%。
Python 演示
# -*- coding: utf-8 -*-# 无人机姿态估计演示: 互补滤波 vs 卡尔曼滤波# 模拟 MPU6050 的陀螺仪角速度和加速度计倾角数据import mathimport random def kalman_update(z, x_est, p_est, Q, R): # 一维卡尔曼滤波: 预测 + 更新 x_pred = x_est p_pred = p_est + Q K = p_pred / (p_pred + R) x_new = x_pred + K * (z - x_pred) p_new = (1 - K) * p_pred return x_new, p_new def complementary(angle, gyro_rate, accel_angle, dt, alpha): # 互补滤波: 陀螺仪积分(高通) + 加速度计倾角(低通) return alpha * (angle + gyro_rate * dt) + (1 - alpha) * accel_angle def simulate(): random.seed(7) dt = 0.01 T = 500 alpha = 0.98 q, r = 0.001, 0.05 true_angle = 0.0 gyro_int = 0.0 kf_angle = 0.0 kf_p = 1.0 cf_angle = 0.0 print("t 真实角 陀螺仪积分 互补滤波 卡尔曼滤波") for i in range(T): true_angle = 30.0 * math.sin(i * dt * 2.0) # 陀螺仪测量: 真实角速度 + 恒定偏差 + 噪声 gyro_rate = 60.0 * math.cos(i * dt * 2.0) + 0.5 + random.uniform(-0.3, 0.3) gyro_int += gyro_rate * dt # 加速度计测倾角: 真实角 + 振动噪声 accel_angle = true_angle + random.uniform(-2.5, 2.5) cf_angle = complementary(cf_angle, gyro_rate, accel_angle, dt, alpha) kf_angle, kf_p = kalman_update(accel_angle, kf_angle, kf_p, q, r) if i % 50 == 0: print("%5.2f %7.2f %8.2f %8.2f %8.2f" % (i * dt, true_angle, gyro_int, cf_angle, kf_angle)) if __name__ == "__main__": simulate()
gyro_rate = 60.0 * math.cos(i * dt * 2.0) + 0.5 + random.uniform(-0.3, 0.3)陀螺仪角速度包含恒定偏差 0.5,模拟真实器件的零偏,这正是积分漂移的根源gyro_int += gyro_rate * dt一个“天真”的纯积分:角度越积越偏,用来作为对照组展示不滤波的后果K = p_pred / (p_pred + R)卡尔曼增益:预测不确定度占总不确定度的比例,决定观测修正的力度x_new = x_pred + K * (z - x_pred)状态更新:在预测基础上按 K 吸收观测残差,是卡尔曼滤波的核心一行p_new = (1 - K) * p_pred信心压缩:观测注入后估计协方差减小,表示对状态更有把握cf_angle = alpha * (angle + gyro_rate * dt) + (1 - alpha) * accel_angle互补滤波的一行核心:α 控制陀螺仪积分与加速度计修正的权重
常见误区
误区我经常把 Q 调得很大、R 也调得很大,觉得滤波效果不好就继续拧,结果曲线要么剧烈抖动要么迟钝得追不上真实值,完全靠运气。
正解Q 和 R 背后有明确的物理意义。Q 是过程噪声协方差,代表“模型描述世界的马虎程度”;R 是测量噪声协方差,代表“传感器读数的可信度”。调大 Q 等于告诉滤波器“模型不可靠,多听传感器”,输出会更容易被噪声带跑;调大 R 等于告诉它“传感器噪声太大,多靠模型”,输出会变平滑但滞后。正确做法是先估算 R(用静态数据方差),固定 R 后只调 Q,观察动态响应。
为何常见:很多教程只给“Q小R大更平滑,Q大R小更灵敏”这类经验口诀,让人误以为它们是互不相关的万能旋钮,而忽略了它们是噪声特性的物理解释。
误区课本上说卡尔曼滤波假设高斯噪声、线性系统,我实际测的 IMU 噪声看起来一点都不“高斯”,所以觉得这算法只能停留在论文里。
正解高斯线性假设是卡尔曼滤波“最优性”的充分条件,不是必要条件。工程上只要噪声近似零均值、协方差可以估计,卡尔曼滤波依然能给出很好的次优估计。实际 IMU 的随机游走噪声、GPS 的伪距噪声,在大多数工况下都能近似建模为高斯。如果噪声偏离严重,还有扩展卡尔曼(EKF)和无迹卡尔曼(UKF)等改进方案兜底。
为何常见:教科书为了推导最优性,会先强调理想假设;初学者容易把充分条件当成必要条件,误以为工程环境不满足假设就等于算法不适用。
误区卡尔曼滤波听起来“高大上”,互补滤波只是一个加权平均的经验公式,做产品不用卡尔曼会显得技术含量不够。
正解两者适用场景不同,并没有高下之分。互补滤波的计算量只有卡尔曼的十分之一,不需要噪声协方差建模,一个 α 即可完成调参,在 MCU 上极具竞争力;卡尔曼滤波能融合多源异构传感器、输出不确定度,适合组合导航等对精度和置信度要求高的场景。早期 APM、大量量产飞控都用互补滤波,悬停效果非常稳定。“最优”是数学意义上的,工程上还要考虑资源、鲁棒性和开发效率。
为何常见:“最优”的名声让工程师产生路径依赖,忽略了小型嵌入式平台上计算资源和模型复杂度带来的实际成本。
误区我第一次写卡尔曼滤波,把 P 初始化为 0,心想“什么都不知道就用 0 表示没误差”,结果前几十步估计值几乎不动,收敛非常慢。
正解P=0 的含义是“我百分之百确定初始状态就是 0”,这会让滤波器非常抗拒观测的修正。初始估计不准时,P 应该设置成较大的正值(如与 R 同量级或更大),表示“我不太确定初始值,请尽快用观测教我”。这样 K 一开始就很大,滤波器会在几个周期内快速收敛到真实值附近。
为何常见:直觉上“没有信息就不该有不确度”,不理解 P 本质上是“信心的倒数”——信心为零,意味着修改量也为零,反而学不到任何东西。
误区加速度计静止时能精确测出重力方向,反正重力永远朝下,直接用反正切算出倾角不就行了吗?滤波只是增加复杂度。
正解静止时是对的,但无人机飞行时电机振动会叠加大量高频干扰,机动加减速还会产生惯性力,让加速度计把“重力方向”和“惯性力方向”搞混,直接算出的倾角会剧烈跳动。陀螺仪的意义在于短时积分提供平滑的高频角度趋势,加速度计则负责修正长期漂移。滤波不是多余,而是把两路各有缺陷的信号互补起来。
为何常见:新手常在静态桌面实验验证算法,误把静态体验推广到动态场景,忽略了飞行振动和机动过载对加速度计的致命干扰。
面试题
Q1. 卡尔曼滤波的两个核心步骤是?
- A.训练与推理
- B.预测与更新← 正确答案
- C.编码与解码
- D.采样与量化
答案:B。预测(Predict)用状态转移方程推算先验,更新(Update)用观测修正得到后验,两者循环构成卡尔曼滤波的主循环。训练/推理是机器学习术语,编码/解码是通信术语,采样/量化是 ADC 概念,都与卡尔曼滤波的主循环无关。
Q2. 卡尔曼增益 K 越接近 0,说明滤波器?
- A.越相信传感器观测
- B.越相信模型预测← 正确答案
- C.系统已经发散
- D.传感器噪声恰好为零
答案:B。K = P_pred/(P_pred+R),K→0 说明 P_pred 远小于 R,即预测方差小或测量噪声大,此时滤波器认为模型更可信,观测基本不参与修正。若系统发散,P 会爆炸式增长,K 反而趋近于 1。
Q3. 增大过程噪声协方差 Q,滤波器的响应会?
- A.更平滑但更滞后
- B.更灵敏但更易受噪声影响← 正确答案
- C.输出完全不受影响
- D.滤波器立即发散
答案:B。Q 增大使 P_pred 增大,进而 K 增大,观测修正力度变强,输出更“跟手”但也会把更多测量噪声引入估计。增大 Q 在本质上等于告诉滤波器“模型不可靠,多听传感器”,而选项 A 是减小 Q 或增大 R 的效果。
Q4. 互补滤波中 α=0.98 通常表示?
- A.98% 信任加速度计
- B.98% 信任陀螺仪← 正确答案
- C.滤波器截止频率为 0.98Hz
- D.陀螺仪偏差为 0.98°
答案:B。α 越接近 1,angle ≈ angle + gyro·dt 占据绝对主导,即陀螺仪短时积分权重极大,加速度计只以 2% 的权重缓慢修正长期漂移。α 是权重系数,不是截止频率也不是偏差量,所以 C、D 均错误。
Q5. 陀螺仪的角度积分结果随时间推移会?
- A.越来越精准
- B.逐步漂移← 正确答案
- C.保持恒定不变
- D.周期振荡
答案:B。陀螺仪存在微小零偏与随机噪声,积分是累加过程,任何微小偏差都会随时间的推移被不断累积,形成“积分漂移”。因此陀螺仪适合短时高频测量,长期必须用加速度计等绝对参考来修正。
Q6. 一维卡尔曼滤波中,如果测量噪声方差 R 远大于预测方差 P_pred,则?
- A.K 趋近于 1
- B.K 趋近于 0← 正确答案
- C.估计值等于测量值
- D.系统不稳定
答案:B。K = P_pred/(P_pred+R),R 远大于 P_pred 时分母远大于分子,K→0,滤波器几乎不修正预测。此时估计值主要由模型预测决定,而不是测量值,所以 C 是 K→1 的行为。
Q7. 关于协方差矩阵 P 的初始化,正确做法是?
- A.一律置零矩阵
- B.设为较大初始不确定度← 正确答案
- C.永远设为标量 1
- D.不需要初始化
答案:B。P 表示对初始状态估计的信心,置零等于“百分百确定初始值”,会让滤波器抗拒观测修正、收敛极慢。工程上应设为较大的正定矩阵(如单位阵乘以适当量级),表示“初始状态不确定,请用观测教我”,滤波器会快速收敛。
Q8. 与卡尔曼滤波相比,互补滤波的优势有?
- A.计算量小,适合低算力 MCU← 正确答案
- B.无需精确噪声协方差模型← 正确答案
- C.能输出不确定度协方差
- D.核心参数只有一个 α← 正确答案
答案:ABD。互补滤波没有矩阵求逆运算,计算量远小于卡尔曼滤波;不需要对 Q 和 R 建模,核心参数只有 α,调参直观。但互补滤波不输出协方差/不确定度,C 是卡尔曼滤波的优势而非互补滤波的优势。
Q9. 无人机姿态融合中,加速度计的主要缺点是?
- A.高频振动下噪声大← 正确答案
- B.长期积分会漂移
- C.机动时受惯性加速度干扰← 正确答案
- D.固有采样率偏低
答案:AC。加速度计靠重力方向解算倾角,电机振动会将高频噪声灌入读数,机动加减速产生的惯性力也会污染重力线索,故 A、C 正确。长期积分漂移是陀螺仪的问题,与加速度计无关;采样率低不是加速度计的固有缺点。
Q10. 惯性导航中卡尔曼滤波融合 GPS 与 IMU 时,以下说法正确的是?
- A.GPS 更新频率低但长期稳定← 正确答案
- B.IMU 更新频率高但短期会漂移← 正确答案
- C.滤波后位置估计通常比单独 GPS 更平滑← 正确答案
- D.GPS 丢失时滤波只能停止工作
答案:ABC。GPS 提供绝对位置,更新率低但无长期漂移;IMU 更新率高但积分会漂移,两者互补,滤波输出兼顾平滑与准确,A、B、C 均正确。GPS 丢失时卡尔曼滤波仍可依靠 IMU 预测步继续递推,只是 P 会不断增大、精度逐渐下降,而不是立即停止,D 错误。