简介:这份文档面向正在学习状态估计、信号处理或控制算法的读者,系统梳理卡尔曼滤波从离散状态方程、观测方程到完整递推公式的推导脉络,帮助理解预测与校正两步迭代背后的最小均方误差思想。全文围绕状态预测、卡尔曼增益求解、误差协方差更新等关键环节展开,并给出矩阵求导与协方差化简的中间步骤,适合希望摆脱公式死记、真正吃透算法原理的初学者与工程实践者。资源为单个docx文件,压缩包约23KB,篇幅紧凑、便于打印或随查随用。目前已有1956人学习下载,可作为课程笔记、论文推导参考或工程实现前的理论铺垫,读者能从中获得从建模假设到增益公式的完整推导链条与清晰的变量符号说明。
1. 卡尔曼滤波算法到底在算什么:从猜体重说起
你站上体重秤,数字跳来跳去,最后停在 70.3 公斤。你心里其实有个预期:昨天是 70.0,今天没多吃,大概也就 70 上下。于是你不会把 70.3 当成铁板钉钉的事实,也不会完全无视它,而是心里默默折中一下:大概 70.1 吧。这个“折中”的动作,就是卡尔曼滤波算法每天在你脑子里干的事。
卡尔曼滤波算法是一套用数学写成的“折中规则”:它同时相信两样东西——你对系统下一步会怎样的预测,以及传感器给你的实际观测,然后按各自的可信程度加权,得出一个更接近真实状态的估计。它之所以值得搞懂,是因为现实里的数据几乎都带噪声,而它给出的是“最小均方误差”意义下的最优估计,不是拍脑袋的平滑。
这份资料把整套推导从状态方程一路写到协方差更新,适合想弄明白公式背后每一步为什么成立的人。
2. 为什么需要卡尔曼滤波:预测和观测都不能全信
2.1 两个都不靠谱的信息源
先看一个具体场景。某实验室做小车定位,车上装了轮速计和 GPS。轮速计短时间很准,但会累积漂移;GPS 绝对位置不漂,但每次跳几米。你单独信轮速计,十分钟后车“跑”到墙外面去了;单独信 GPS,轨迹像喝醉了酒。
卡尔曼滤波算法的出发点就是承认:预测有误差,观测也有误差,而且这两种误差都可以用高斯分布描述。预测误差的协方差记作 P,观测噪声的协方差记作 R。谁的方差小,谁就更可信,融合时权重就更大。这不是玄学,是可以用公式算出来的比例。
打个比方,你有两个朋友给你报天气,一个平时十次对八次,一个十次对五次,你自然会多听前者的。卡尔曼增益 K 就是那个“听谁多一点”的系数,而且它每个时刻都会重新算,因为可信度会变。
2.2 递归结构:不需要存下全部历史
很多滤波方法要把过去所有数据攒起来一起算,数据一多就吃不消。卡尔曼滤波算法是递归的:每个时刻只需要上一时刻的估计值 $\hat{x}{k-1}$ 和它的协方差 $P{k-1}$,加上当前观测 $z_k$,就能算出当前估计。
用资料里的状态预测方程说:
$$x_k = A x_{k-1} + B u_k + w_k$$
这里 $A$ 是状态转移矩阵,描述“没有外界干预时状态怎么自然演化”;$u_k$ 是控制输入,$B$ 把它换算成对状态的影响;$w_k$ 是过程噪声,均值为 0、协方差为 $Q$。观测方程则是:
$$z_k = H x_k + v_k$$
$H$ 是测量矩阵,把状态空间映射到观测空间;$v_k$ 是测量噪声,均值为 0、协方差为 $R$。
提示:$Q$ 和 $R$ 不是从数据里“学”出来的,通常要人为设定。设得离谱,滤波结果就会翻车,这是初学者最常见的踩坑点。
递归的好处是内存恒定、计算量恒定,特别适合在线估计——传感器每来一帧数据,就算一轮,不用等攒够一批。这也是它在导航、跟踪、信号处理里长期占位置的原因。
2.3 最小均方误差:优化的目标是什么
资料里反复出现一句话:卡尔曼的本质是最小均方差估计。翻译成大白话:估计值和真实值之间的误差是一个随机变量,我们希望它的平方的期望尽可能小。
误差定义为 $e_k = x_k - \hat{x}_k$,它的协方差矩阵 $P_k = E[e_k e_k^T]$。均方误差就是 $P_k$ 的迹(对角线元素之和)。所以“让估计最优”就变成“让 $P_k$ 的迹最小”。
关键一步是对卡尔曼增益 $K_k$ 求导并令其为零。资料里用了两个矩阵微分公式,最终解出:
$$K_k = P'_k H^T (H P'_k H^T + R)^{-1}$$
这个式子的结构很值得看一眼:分子 $P'_k H^T$ 代表“预测的不确定度经过观测映射后的部分”,分母 $H P'_k H^T + R$ 是“预测在观测空间的不确定度加上观测噪声”。预测越不确定,$K_k$ 越大,越偏向观测;观测噪声越大,$K_k$ 越小,越偏向预测。这就是加权折中的数学形态。
3. 卡尔曼滤波算法的五个核心公式:预测与校正怎么分工
3.1 预测步:先按模型往前推
每个时刻开始,先做预测。状态预测:
$$\hat{x}'k = A \hat{x}{k-1} + B u_k$$
协方差预测:
$$P'k = A P{k-1} A^T + Q$$
第一式是“按物理规律推一步”,第二式是“不确定度也跟着传播,并且加上过程噪声”。注意 $Q$ 是加在后面的:即使模型完全确定,过程噪声也会让预测变得更不确定,所以 $P'$ 通常比上一时刻的 $P$ 大。
用一段伪代码把预测步写清楚:
# 预测步:输入上一时刻估计 x_prev、协方差 P_prev、控制量 u x_pred = A @ x_prev + B @ u # 状态外推 P_pred = A @ P_prev @ A.T + Q # 协方差外推,Q 为过程噪声协方差参数说明:A的维度是 n×n,B是 n×m,u是 m×1;Q必须对称半正定,否则协方差可能算出负特征值,后续求逆会出问题。这一段没有用到观测,所以哪怕传感器暂时没数据,预测步照样能跑。
3.2 校正步:拿观测来修正
观测残差(也叫新息):
$$\tilde{z}_k = z_k - H \hat{x}'_k$$
它衡量“实际看到的”和“按预测应该看到的”差多少。然后算增益、更新状态、更新协方差:
$$K_k = P'_k H^T (H P'_k H^T + R)^{-1}$$ $$\hat{x}_k = \hat{x}'_k + K_k \tilde{z}_k$$ $$P_k = (I - K_k H) P'_k$$
对应代码:
# 校正步:输入观测 z、预测结果 x_pred / P_pred innovation = z - H @ x_pred # 新息 S = H @ P_pred @ H.T + R # 新息协方差 K = P_pred @ H.T @ inv(S) # 卡尔曼增益 x_est = x_pred + K @ innovation # 状态更新 P_est = (I - K @ H) @ P_pred # 协方差更新S的逆是整套算法里计算量最大的地方,维度等于观测维度而不是状态维度,所以观测少的时候很划算。P_est用简化式 $(I-KH)P'$ 即可,资料里也推导了它和展开式等价。
3.3 增益 K 的直觉:一个可以手算的例子
设状态是一维位置,$A=1$,$H=1$,$Q=0.01$,$R=1$,上一时刻 $P=0.01$。预测后 $P' = 0.01 + 0.01 = 0.02$。增益:
$$K = 0.02 / (0.02 + 1) \approx 0.0196$$
意思是这次观测只被采信不到 2%,因为观测噪声远大于预测不确定度。反过来,若 $R=0.001$,则 $K \approx 0.02/0.021 \approx 0.95$,几乎全听观测的。
这个手算例子说明:卡尔曼增益不是固定参数,它随 $P$ 和 $R$ 动态变化。系统刚启动时 $P$ 往往设得大,$K$ 接近 1,快速跟上观测;稳定后 $P$ 变小,$K$ 也变小,输出变得平滑。很多人以为滤波器“越跑越迟钝”是 bug,其实这是设计使然。
3.4 协方差更新为什么能简化
资料里从完整式 $P_k = (I-KH)P'(I-KH)^T + K R K^T$ 出发,代入 $K$ 的表达式,化简得到 $P_k = (I-KH)P'$。这一步不是近似,是精确等价,前提是 $K$ 取最优值。
理解它的意义在于:完整式在数值上更稳定(始终对称正定),简化式计算更省。工程上常见做法是用简化式算、再强制对称化 $P \leftarrow (P+P^T)/2$,防止浮点误差累积导致不对称。这是血泪经验,不是理论要求。
4. 易混概念辨析:卡尔曼滤波常被误解的四个地方
4.1 卡尔曼滤波 vs 低通滤波
易混点:两者都能让曲线变平滑,看起来效果差不多。
为什么混:一阶低通也是“新值按比例混旧值”,形式上跟卡尔曼更新式 $\hat{x}_k = \hat{x}'_k + K(z-H\hat{x}'_k)$ 很像。
怎么区分:低通的系数是固定的,卡尔曼的 $K$ 每步由 $P$、$Q$、$R$ 算出来,会随系统不确定度自适应。低通不知道你的物理模型,卡尔曼显式用了 $A$、$B$、$H$。判断标准:如果你的系统有明确的动态方程、噪声统计可估,卡尔曼更合适;如果只是想去毛刺、没有模型,低通更省事。
4.2 过程噪声 Q vs 测量噪声 R
易混点:两个都是“噪声协方差”,初学时容易随便填。
为什么混:符号相近,都出现在协方差递推里。
怎么区分:$Q$ 描述“模型本身有多不准”,加在预测协方差上;$R$ 描述“传感器有多不准”,出现在增益分母里。$Q$ 调大,滤波器更信观测、响应更快但更抖;$R$ 调大,更信预测、更平滑但可能滞后。调参时先估 $R$(传感器手册或静态数据),再调 $Q$,顺序反了会白折腾。
4.3 预测值 vs 估计值
易混点:资料里用上标区分 $\hat{x}'_k$(预测)和 $\hat{x}_k$(估计),读公式时容易看串。
为什么混:两者都带“hat”,只差一个撇号。
怎么区分:预测值是“还没看观测”的结果,估计值是“看完观测并融合后”的结果。协方差同理,$P'$ 是预测误差协方差,$P$ 是估计误差协方差,且通常 $P < P'$,因为观测带来了新信息。写代码时变量名一定要分开,混用是调试时最隐蔽的 bug 来源之一。
4.4 卡尔曼滤波 vs 最小二乘
易混点:都叫“最优估计”,都涉及误差平方和。
为什么混:目标函数形式接近。
怎么区分:最小二乘通常是一次性批处理,假设参数不变;卡尔曼是递归的,带状态演化模型,适合动态系统。静态标定用最小二乘,在线跟踪用卡尔曼。两者在特定条件下可以互相转化,但不是同一个东西。
5. 什么时候该用、什么时候别用:一个调参翻车的教训
先说该用的场景。系统能用线性(或近似线性)状态方程描述,噪声大致服从高斯分布,需要在线、逐帧地估计状态——这三条同时满足时,卡尔曼滤波算法是很自然的选择。比如某图像处理 Demo 里跟踪一个运动目标,状态是位置和速度,观测是检测框中心,$A$ 描述匀速运动,$H$ 取位置映射,这套结构直接套公式就能跑。
再说别用的情况。系统强非线性时,标准卡尔曼的线性假设会失效,得换扩展卡尔曼或无迹卡尔曼,但那是另一套推导,不能指望原公式硬扛。噪声明显非高斯、有大量离群点时,均方误差准则本身就不合适,中位数类方法更稳。还有一种常被忽略:状态维度很高而观测很少时,协方差矩阵求逆和传播的计算量会上去,此时要评估实时性是否够。
下面这张表把边界收一收:
| 判断维度 | 适合用 | 不建议直接用 |
|---|---|---|
| 系统模型 | 线性或可线性化 | 强非线性且无近似手段 |
| 噪声分布 | 近似高斯、零均值 | 重尾、含大量离群点 |
| 数据方式 | 在线逐帧 | 只有一批静态数据 |
| 实时要求 | 观测维度不高 | 超高维且算力紧张 |
我自己的踩坑经历是这样的:某次做小车轨迹平滑,$Q$ 随手填了个 1,$R$ 按传感器手册填 0.01,结果输出几乎完全跟着观测跳,平滑等于没做。排查半天才意识到 $Q$ 比 $R$ 大了两个数量级,增益接近 1,预测被彻底架空。后来改成先静态采一段数据估 $R$,再把 $Q$ 从很小往上试,看残差是否白化,才把曲线压稳。从那以后我每次配卡尔曼参数,都强制先跑一遍“只预测不校正”的对照,确认模型外推本身不离谱,再开校正。
这份资料把从状态方程到增益求导、协方差化简的每一步都写全了,公式之间的衔接没有跳步,适合对着推一遍、把每个符号的来历弄清楚。需要完整推导文档的话,按文末方式获取即可。希望帮到你。
本文还有配套的精品资源,点击获取