卡尔曼滤波算法及其扩展

Junity 发布于 22 小时前 30 次阅读 最后更新于 22 小时前 1012 字 预计阅读时间: 5 分钟


卡尔曼滤波算法是一种在 理论模型实际测量 都存在误差时,通过综合理论上的预测值和实际的观测值来获得对当下更准确估计 的方法。

误差

在卡尔曼滤波中存在两种误差:

  • 因为理论模型不够精确导致的 模型误差
  • 因为测量手段不够精确导致的 测量误差

卡尔曼滤波的主要思想,就是根据模型误差和测量误差的强度,将预测值和观测值融合,从而尽可能地减小误差。

卡尔曼滤波

卡尔曼滤波假设信号满足下面的形式:

xk=Fkxk1+Bkuk+wkzk=Hkxk+vk

其中 wkvk 是噪声,xk 是信号的真实值,zk 是信号的观测值。由于不可能得知 xk 的精确值,我们用 x^k 来表示 k 时刻对 x 的估计值,用 Pk 来表示估计误差 ek=xkx^k 的协方差矩阵。此外,为了描述观测噪声的强度,我们用 Rk 来表示 vk 的协方差矩阵。

在一个新的时间 k 上,我们知道的就是观测值 zk 和上一个时刻的估计值 x^k1 。把上一个时刻代入公式,就得到了一个包含理论误差和策略误差的估计值,暂且记作 x^k :

x^k=Fkx^k1+Bkuk

同样的,我们把这个先验估计的误差记为 ek ,记它的协方差为 Pk ,那么有 Pk=FkPk1FkT+Qk

x^k 代入观测值的公式,可以得到: zk=Hkx^k 。实际的观测值是 zk ,我们称它俩的差为 创新(innovation) ,因为这个差值可以提示我们怎么调整 x^k 。我们把创新记作 y~k

y~k=zkHkx^k

可以看出,创新来源于 理论误差测量误差 。现在我们希望从创新中分解出理论误差,并用这个误差来更新 x^k ,即:

x^k=x^k+Kk(zkHkx^k)

这个 Kk 就是从创新中分解出理论误差的算子。接下来就考虑如何算出这个 Kk 。一个重要的结论是: 当 Cov(ek,y~k)0 时,说明 y~k 的某种线性组合可以用来使 ek 减小。 因此 最优线性估计的误差与用于矫正的信息不相关 ,即 Cov(ek,y~k)=0
那么:

Cov(ek,y~k)=Cov(xkx^k,zkHkx^k)=Cov(xkx^kKk(zkHkx^k),zkHkx^k)=Cov(ek,zkHkx^k)KkCov(zkHkx^k,zkHkx^k)=0

zkHkxk=Hk(xkx^k)+vk=Hkek+vk ,因此 Cov(ek,zkHkx^k)=PkHT ,同理 Cov(zkHkx^k,zkHkx^k)=HPkHT+Rk。则:

PkHT=Kk(HPkHT+Rk)

所以

Kk=PkHT(HPkHT+Rk)1

然后可以得到:

Pk=Cov(ek)=Cov(xkx^k)=Cov(ekKk(zkHkx^k))=Cov(ekKk(Hkxk+vkHkx^k))=Cov((IKkHk)ekKkvk)=(IKkHk)Pk(IKkHk)T+KkRkKkT

扩展卡尔曼滤波算法(EKF)

在上面的卡尔曼滤波算法中,我们只考虑了线性模型下的情况。但真实世界往往是非线性的,这就引入了扩展卡尔曼滤波。扩展卡尔曼滤波的核心是用非线性函数的一阶雅可比矩阵来将函数近似为一个线性函数。

假设非线性模型如下:

xk=f(xk1,uk)+wkzk=h(xk)+vk

扩展卡尔曼滤波的过程如下:

  1. 计算 Fk : Fk=fx|x^k1,uk
  2. 传播先验协方差 : Pk=FkPk1FkT+Qk
  3. 用模型来计算先验估计 :x^k=f(x^k1,uk)
  4. 计算 Hk : Hk=hx|x^k
  5. 计算卡尔曼增益:Kk=PkHT(HPkHT+Rk)1
  6. 计算创新 : y~k=zkh(x^k)
  7. 计算后验估计:x^k=x^k+Kky~k
  8. 更新Pk : Pk=(IKkHk)Pk(IKkHk)T+KkRkKkT

可以看出,EKF的流程和朴素卡尔曼滤波几乎一模一样,区别只是EKF将 KkHk 换成了雅可比矩阵。

此作者没有提供个人介绍。
最后更新于 2025-09-17