上一篇文章,我们提到了卡尔曼滤波的发散问题,并说明了,导致卡尔曼滤波发散的原因一般有两种,一种是由于模型建立不够准确,导致的发散,另一种是计算过程由于累计误差效应,导致增益矩阵P失去对称性或正定性而造成的发散。
而且,上一篇文章对第一种情况提出了一些解决措施,主要思路就是认为近期的观测量更可靠一些,并逐渐忘记之间的观测对滤波的影响,也就是衰减记忆法和限定记忆法。
在这篇文章,我们讨论针对滤波器发散另一种原因可以采取的抑制措施。这里先介绍一种,也就是平方根滤波。不过在介绍这种滤波之前,我们需要先介绍一种对滤波器的处理方法:序贯处理。
一. 序贯处理
先解释一下为什么要有序贯处理。还记得卡尔曼滤波的基本方程吧。当中求解增益矩阵的那个方程长这个样子: K k = P k / k − 1 H k T ( H k P k / k − 1 H k T + R k ) − 1 K_k=P_{k/k-1}H_k^T(H_kP_{k/k-1}H_k^T+R_k)^{-1} Kk=Pk/k−1HkT(HkPk/k−1HkT+Rk)−1
里面涉及了矩阵求逆的计算,要知道矩阵求逆的计算量是相当大的,观察这个方程,当 Z k Z_k Zk的维数很大时,矩阵求逆的计算量会极具增加,一般来讲,求逆的计算量与矩阵阶数的三次方成正比。而序贯处理就可以理解将高阶矩阵求逆转化为低阶矩阵求逆的算法。
当然,这是有条件的。序贯处理的条件是观测量 Z k Z_k Zk的方差矩阵 R k R_k Rk是对角矩阵。而这一条件在几乎绝大多数情况下卡尔曼滤波都是满足的。
下面可以说明一下什么是序贯处理了。首先想一下,为什么绝大多数系统的 R k R_k Rk是对角矩阵呢,那是因为 Z k Z_k Zk里的量测值之间都是不相关的。那么好了,如果我们把每个量测值单独看成一次量测,那么,对应的 K k = P k / k − 1 H k T ( H k P k / k − 1 H k T + R k ) − 1 K_k=P_{k/k-1}H_k^T(H_kP_{k/k-1}H_k^T+R_k)^{-1} Kk=Pk/k−1HkT(HkPk/k−1HkT+Rk)−1这个方程里的求逆就会变成除法,这样不就避免了高阶矩阵求逆了吗。就是这个道理。于是我们就有了下面这套算法。
先定义量测向量 Z k Z_k Zk是个r维的向量, Z k i Z_k^i Zki是它的第i个量测值, H k i H_k^i Hki是 H k H_k Hk的第i行, R k i R_k^i Rki是 Z k i Z_k^i Zki的方差。
K k i = P k i − 1 H k i T ( H k i P k i − 1 H k i T + R k i ) − 1 K_k^i=P_k^{i-1}H_k^{iT}(H_k^iP_k^{i-1}H_k^{iT}+R_k^i)^{-1} Kki=Pki−1HkiT(HkiPki−1HkiT+Rki)−1 X ^ k i = X ^ k i − 1 + K k i ( Z k i − H k i X ^ k i − 1 ) \hat X_k^i=\hat X_k^{i-1}+K_k^i(Z_k^i-H_k^i\hat X_k^{i-1}) X^ki=X^ki−1+Kki(Zki−HkiX^

本文探讨卡尔曼滤波中的发散问题及解决方案,重点介绍了序贯处理与平方根滤波技术,旨在减少计算误差,提高滤波器稳定性。
最低0.47元/天 解锁文章
705

被折叠的 条评论
为什么被折叠?



