← 返回博客首页
卡尔曼滤波的推导
在实际系统中,真实状态通常无法直接获得。运动模型可以预测状态如何变化,但模型总会有误差;传感器可以提供观测,但观测同样受到噪声影响。因此,状态估计的核心问题是:如何把这两类都不完全可靠的信息融合起来?
卡尔曼滤波正是为了解决这个问题。它先根据运动模型得到状态预测,再根据预测和观测各自的不确定性计算修正量,而不是简单地把传感器读数平均到状态里。本文从这个基本问题出发,推导线性 Kalman Filter(KF)的更新公式,并把结果推广到 Extended Kalman Filter(EKF)。
阅读路线: 先看第 1 节建立问题和符号;第 2 节先把一轮 KF 的完整流程走通;第 3~5 节推导 Kalman 增益;第 6 节说明 EKF 如何把非线性模型变成局部线性模型。读完本文后,可以继续阅读 ESKF 入门:从状态预测到误差注入,了解旋转状态为什么需要在误差空间中更新。
摘要
设我们要估计一个随时间变化、又无法直接观察的状态 xk。运动模型告诉我们状态下一步大概会到哪里,传感器观测则提供了另一条带噪信息。Kalman Filter 将这两条信息表示为概率分布,并递归地完成两件事:
- 用系统模型传播状态均值和协方差,得到先验预测;
- 用观测残差修正预测,并得到不确定性更小的后验估计。
本文的核心推导是:假设状态更新具有形式
x^k+=x^k−+Kk(zk−Hkx^k−),其中 Kk 是待求的 Kalman 增益。把更新后的误差写成预测误差和观测噪声的函数,再最小化后验协方差,就能得到
Kk=Pk−Hk⊤(HkPk−Hk⊤+Rk)−1.EKF 的变化只有一处核心思想:当状态转移或观测模型非线性时,在当前预测点附近取一阶 Taylor 展开,用 Jacobian 代替线性模型中的 Fk 和 Hk。
关键词: Kalman Filter;KF;EKF;状态估计;协方差;Kalman 增益
1. 先把问题说清楚
1.1 我们要估计什么
在时刻 k,xk 表示需要估计的状态。它可以是一个标量,也可以是一个向量。例如:
- 一维系统中的位置;
- 机器人在世界坐标系中的位置和速度;
- 传感器的零偏;
- 惯性导航中的位置、速度和姿态。
状态通常不能被传感器直接、无噪声地读出来。我们只能利用上一时刻的估计、控制输入和当前观测,逐步逼近真实状态。
1.2 两个模型和两个噪声
离散时间的线性状态转移模型写成
xk=Fkxk−1+Bkuk+wk,其中:
- Fk 是状态转移矩阵,描述状态如何随时间变化;
- uk 是控制输入,Bk 把控制输入映射到状态空间;
- wk 是过程噪声,表示模型不完美、未建模扰动等因素。
观测模型写成
zk=Hkxk+vk,其中:
- zk 是传感器观测;
- Hk 是状态到观测空间的映射;
- vk 是观测噪声。
通常假设两类噪声都是零均值高斯噪声:
wk∼N(0,Qk),vk∼N(0,Rk),并且过程噪声与观测噪声相互独立。Qk 和 Rk 分别描述模型不确定性和传感器不确定性。
这里需要区分两个层次。后文 Kalman 增益的协方差推导,主要使用的是噪声的零均值、协方差以及独立性;即使噪声不是高斯分布,这些公式仍然给出最优线性估计器。在线性模型、初始状态为高斯分布且过程噪声和观测噪声均为高斯分布时,状态的后验分布仍然是高斯分布,此时 Kalman 更新不仅是最优线性估计,也是条件均值意义下的最小均方误差估计。实际噪声如果明显偏离高斯分布,Kalman 滤波仍可作为近似方法使用,但对异常值和重尾噪声的处理能力会下降。
1.3 预测、观测与估计的记号
本文用上标 − 表示“融合当前观测之前”的预测值,用上标 + 表示“融合当前观测之后”的更新值:
x^k−和Pk−:预测状态及其协方差,x^k+和Pk+:更新状态及其协方差.协方差不是状态本身的误差,而是误差的二阶统计量。若估计误差定义为
ek=xk−x^k,则协方差为
Pk=E[ekek⊤].因此,P 越大表示估计越不确定,P 越小表示估计越确定。
2. 一轮 Kalman Filter 做了什么
2.1 预测状态和预测协方差
假设上一时刻已经得到后验估计 (x^k−1+,Pk−1+)。先利用状态转移模型预测当前状态:
x^k−=Fkx^k−1++Bkuk.预测误差由上一时刻误差和过程噪声共同产生:
ek−=Fkek−1++wk.在误差与过程噪声独立的假设下,预测协方差为
Pk−=FkPk−1+Fk⊤+Qk.这一步的含义是:状态按照模型向前走,不确定性也随之传播,同时增加模型噪声带来的不确定性。
2.2 计算观测残差
根据预测状态,先计算传感器应该观测到的值:
z^k=Hkx^k−.实际观测与预测观测之差称为观测残差,也叫 innovation:
rk=zk−z^k=zk−Hkx^k−.“观测减预测”是本文的残差约定。后面的 Hk、Kalman 增益和状态修正都基于这个方向。
2.3 用 Kalman 增益修正状态
更新状态的形式为
x^k+=x^k−+Kkrk.这里 Kk 把观测空间中的残差转换成状态空间中的修正量。它不是凭经验选择的权重,而是由预测协方差、观测模型和观测噪声共同决定的矩阵。
更新协方差可以写成 Joseph 形式:
Pk+=(I−KkHk)Pk−(I−KkHk)⊤+KkRkKk⊤.在理想的精确算术下,它等价于更简洁的形式:
Pk+=(I−KkHk)Pk−.工程实现中,Joseph 形式通常更有利于保持协方差的对称性和半正定性。到这里,一轮 KF 可以压缩为:
预测:更新:x^k−=Fkx^k−1++Bkuk,Pk−=FkPk−1+Fk⊤+Qk,rk=zk−Hkx^k−,Kk=Pk−Hk⊤(HkPk−Hk⊤+Rk)−1,x^k+=x^k−+Kkrk.后面要做的事情,就是解释这个 Kk 为什么是这样的形式。
3. 先从误差看更新公式
为了避免下标干扰,下面暂时省略时间下标,记
x− 为预测状态,x+ 为更新状态.3.1 假设更新结构
在线性观测模型下,我们假设更新具有如下形式:
x+=x−+K(z−Hx−).这个形式很自然:保留预测状态,再根据观测残差增加一个修正量。现在唯一还没有确定的量就是 K。
3.2 定义预测误差和更新误差
定义真实状态相对于估计状态的误差:
e−=x−x−,e+=x−x+.观测模型为
z=Hx+v.将更新式代入 e+:
e+=x−[x−+K(z−Hx−)]=(x−x−)−K(Hx+v−Hx−)=e−−K(He−+v).于是,更新后的误差为
e+=(I−KH)e−−Kv.这一步是整个推导的桥梁:它把更新误差写成了 K 的函数。只要能写出更新误差的协方差,就能寻找使不确定性最小的 K。
4. 推导更新后的协方差
4.1 展开误差的二阶矩
由协方差定义,
P+=E[e+(e+)⊤].令
A=I−KH,则 e+=Ae−−Kv。代入并展开:
P+==E[(Ae−−Kv)(Ae−−Kv)⊤]AE[e−(e−)⊤]A⊤−AE[e−v⊤]K⊤−KE[ve−⊤]A⊤+KE[vv⊤]K⊤.这里使用了常量矩阵可以移出期望的性质。
4.2 使用独立噪声假设
预测误差和当前观测噪声相互独立,因此
E[e−v⊤]=0,E[ve−⊤]=0.另外,
E[e−(e−)⊤]=P−,E[vv⊤]=R.代回上式,得到
P+=(I−KH)P−(I−KH)⊤+KRK⊤.这就是后验协方差关于 K 的表达式。注意它包含两种作用:K 越大,预测误差被消除得越多;但观测噪声通过 KRK⊤ 进入状态的程度也越大。Kalman 增益正是在这两者之间取得最优平衡。
5. 求出 Kalman 增益
5.1 把矩阵最小化变成标量最小化
严格地说,协方差是矩阵,不能直接说“让矩阵最小”。这里的目标是让后验误差在协方差意义下尽可能小。常用做法是最小化后验协方差的迹:
J(K)=tr(P+).协方差的迹是各个状态分量方差之和,因此可以把它理解为总均方不确定性。对于本问题,得到的最优 K 同时也是协方差意义下的最优线性估计增益。
将 P+ 展开:
P+=P−−KHP−−P−H⊤K⊤+KHP−H⊤K⊤+KRK⊤.定义观测残差的协方差
S≜HP−H⊤+R.S 也叫 innovation covariance,因为它正是残差 r=z−Hx− 的协方差:
E[rr⊤]=E[(He−+v)(He−+v)⊤]=HP−H⊤+R=S.利用迹的线性、循环和转置不变性,J(K) 可以写成
J(K)=tr(P−)−2tr(KHP−)+tr(KSK⊤).5.2 对 K 求导
由于 S 是对称矩阵,常用的矩阵求导规则为
∂K∂tr(KA)=A⊤,以及
∂K∂tr(KSK⊤)=2KS.因此,
∂K∂J=−2P−H⊤+2KS.令导数为零:
KS=P−H⊤.当 S 可逆时,得到
K=P−H⊤(HP−H⊤+R)−1.这就是 Kalman 增益。
5.3 从公式理解 Kalman 增益
Kalman 增益公式中的三个部分各有明确含义:
- P−H⊤:预测状态误差与观测残差之间的相关性。状态越能解释残差,修正就越应该传回该状态方向;
- HP−H⊤:预测不确定性投影到观测空间后的大小;
- R:观测自身的噪声协方差。
因此:
- 当 R 很大时,传感器不可靠,K 变小,滤波器更相信预测;
- 当 P− 很大时,预测不可靠,滤波器更愿意使用观测;
- 当某个状态方向对观测不敏感时,H 在该方向上的信息不足,观测不会直接修正它。
一维例子
假设状态和观测都是标量,且观测模型为 z=x+v,此时 H=1,Kalman 增益变为
K=P−+RP−.如果预测方差 P− 远大于观测方差 R,则 K 接近 1,更新结果更靠近观测;如果观测噪声远大于预测不确定性,则 K 接近 0,更新结果更靠近预测:
x+=(1−K)x−+Kz.这说明 Kalman Filter 的“加权融合”直觉是对的,但真正的权重来自协方差,而不是手工指定。
6. 从 KF 推广到 EKF
6.1 非线性状态和观测模型
现实系统通常不是线性的。非线性模型写成
xk=f(xk−1,uk)+wk,zk=h(xk)+vk.此时不能直接使用固定的 F 和 H。EKF 的做法是在当前估计附近进行一阶线性化。
6.2 对状态转移模型线性化
在上一时刻的后验估计 x^k−1+ 附近展开 f:
f(xk−1,uk)≈f(x^k−1+,uk)+Fk(xk−1−x^k−1+),其中状态转移 Jacobian 为
Fk=∂x∂f(x,uk)x=x^k−1+.因此,EKF 的预测状态和协方差写成
x^k−=f(x^k−1+,uk),Pk−=FkPk−1+Fk⊤+Qk.严格来说,非线性模型中的过程噪声也可能通过 Jacobian 进入状态。若模型写成 f(x,u,w),则还需要对 w 求 Jacobian,得到噪声输入矩阵 Gk:
Pk−=FkPk−1+Fk⊤+GkQkGk⊤.6.3 对观测模型线性化
在预测状态 x^k− 附近展开观测模型:
h(xk)≈h(x^k−)+Hk(xk−x^k−),其中观测 Jacobian 为
Hk=∂x∂h(x)x=x^k−.于是 EKF 仍然使用与 KF 相同的更新结构:
rk=zk−h(x^k−),Sk=HkPk−Hk⊤+Rk,Kk=Pk−Hk⊤Sk−1,x^k+=x^k−+Kkrk,Pk+=(I−KkHk)Pk−(I−KkHk)⊤+KkRkKk⊤.所以,KF 和 EKF 的差异可以概括为:
| 内容 |
KF |
EKF |
| 状态转移 |
xk=Fkxk−1+Bkuk+wk |
xk=f(xk−1,uk)+wk |
| 观测模型 |
zk=Hkxk+vk |
zk=h(xk)+vk |
| 预测 Jacobian |
已知的 Fk |
在当前估计处计算 ∂f/∂x |
| 观测 Jacobian |
已知的 Hk |
在当前预测处计算 ∂h/∂x |
| 更新公式 |
线性模型下的 Kalman 更新 |
使用局部线性模型的 Kalman 更新 |
EKF 并不是把非线性问题精确地变成线性问题。它只在当前估计附近使用一阶近似,因此当初始误差很大、非线性很强或噪声分布明显偏离高斯时,线性化误差可能导致滤波器表现变差。
7. 一次完整推导后的检查清单
实现或阅读 KF/EKF 代码时,可以按下面的顺序检查:
- 状态和坐标是否定义清楚? 明确每个状态分量的单位、坐标系和排列顺序。
- 残差方向是否统一? 本文使用 r=z−z^;如果代码使用相反方向,H 和更新公式也必须同步改变。
- Q 和 R 的含义是否混淆? Q 描述过程模型噪声,R 描述观测噪声。
- Jacobian 的线性化点是否正确? 预测 Jacobian 通常在上一时刻后验状态处计算,观测 Jacobian 通常在当前预测状态处计算。
- 矩阵维度是否匹配? 若状态维度为 n、观测维度为 m,则 P∈Rn×n、H∈Rm×n、R∈Rm×m、K∈Rn×m。
- 是否直接求逆? 公式写作 S−1 便于理解,但数值实现通常通过 Cholesky 分解或线性方程求解完成,不直接构造逆矩阵。
- 协方差是否保持对称? 可以在数值误差允许范围内使用 P←(P+P⊤)/2,并优先考虑 Joseph 形式。
对于含姿态的机器人状态,普通 EKF 的加性更新还不够,需要定义合法的旋转误差和注入方式。ESKF 将完整状态和局部误差分开维护,并在误差空间中进行 Kalman 更新,具体过程见 ESKF 入门。
8. 总结
本文沿着一条主线完成了推导:
- 用状态转移模型得到预测状态 x^− 和预测协方差 P−;
- 用观测模型计算残差 r=z−Hx^−;
- 从误差关系 e+=(I−KH)e−−Kv 推出后验协方差;
- 最小化后验不确定性,得到
K=P−H⊤(HP−H⊤+R)−1;
- 对非线性模型在当前估计附近求 Jacobian,就得到 EKF。
最值得记住的不是某一行公式,而是 Kalman Filter 的信息流:模型负责预测,观测负责约束,协方差决定两者如何融合。 K 只是这条原则在高斯线性估计中的具体结果。
参考资料
- R. E. Kalman, “A New Approach to Linear Filtering and Prediction Problems,” 1960.
- Greg Welch and Gary Bishop, An Introduction to the Kalman Filter.
- ESKF 入门:从状态预测到误差注入