卡尔曼滤波介绍

本文详细介绍了卡尔曼滤波的基本概念和数学模型,包括系统模型、基本假设、噪声特性、状态估计和增益矩阵。卡尔曼滤波是一种有效的线性和非线性滤波方法,广泛应用于系统状态估计。文章通过实例解释了预测估计、后验估计和平滑估计的区别,并给出了离散卡尔曼滤波的算法步骤。
摘要由CSDN通过智能技术生成

卡尔曼滤波介绍

卡尔曼滤波顾名思义是一种滤波方法,可以用于线性滤波和非线性滤波。卡尔曼滤波分为很多类,主要应用于线性滤波的是一般卡尔曼滤波,应用于非线性的有延申卡尔曼滤波(Extended Kalman Filter)无损卡尔曼滤波(Unscented Kalman Filter) 、以及粒子滤波器(Particle Kalman Filter)

这篇主要说一说啥是一般卡尔曼滤波

卡尔曼滤波的基本模型

基本假设

假设现在又线性的离散时间系统:
x k = F k − 1 x k − 1 + G k − 1 u k − 1 + w k − 1 y k = H k x k + v k (1) \tag{1} \begin{aligned} x_{k} &=F_{k-1} x_{k-1}+G_{k-1} u_{k-1}+w_{k-1}\\ y_{k} &=H_{k} x_{k}+v_{k} \end{aligned} xkyk=Fk1xk1+Gk1uk1+wk1=Hkxk+vk(1)

系统固有的

对于这个系统描述方程,各个矩阵的描述如下:

F k − 1 F_{k-1} Fk1: 系统转化矩阵,将系统状态从时刻间 k − 1 k-1 k1转化到时刻 k k k时的状态。

G k − 1 G_{k-1} Gk1:系统控制矩阵,转化外部施加的控制量 u k u_k uk 到系统中。

H k H_k Hk :测量转化矩阵,将系统状态量转化成可测量量,比如电路中某个原件承载电压值这个状态量,可以通过流经此原件的电流和原件的电阻值乘积得到, H k H_k Hk的作用就是将某些状态量转化到可直接测量的测量空间去。

y k y_k yk :时刻 k k k时系统的测量值。

w k − 1 w_{k-1} wk1 : k − 1 k-1 k1时刻系统的噪音,也是矩阵。

v k − 1 v_{k-1} vk1: k − 1 k-1 k1时刻对系统观测时产生的噪音干扰,和 w k − 1 w_{k-1} wk1性质一样。

噪音

其中的 w k w_k wk v k v_k vk 都是零均值、不相关的白噪音(即为一般的高斯白噪音),而且二者都有已知的协方差矩阵 Q k Q_k Qk R k R_k Rk ,其满足的分布分别为:
w k ∼ ( 0 , Q k ) v k ∼ ( 0 , R k ) E [ w k w j T ] = Q k δ k − ȷ E [ v k v j T ] = R k δ k − j E [ v k w ȷ T ] = 0 (2) \begin{aligned}\tag{2} w_{k} & \sim\left(0, Q_{k}\right) \\ v_{k} & \sim\left(0, R_{k}\right) \\ E\left[w_{k} w_{j}^{T}\right] &=Q_{k} \delta_{k-\jmath} \\ E\left[v_{k} v_{j}^{T}\right] &=R_{k} \delta_{k-j} \\ E\left[v_{k} w_{\jmath}^{T}\right] &=0 \end{aligned} wkvkE[wkwjT]E[vkvjT]E[vkwȷT](0,Qk)(0,Rk)=Qkδkȷ=Rkδkj=0(2)
“ ∼ ( a , b ) " “\sim(a,b)" (a,b)" 符号表示的是 “服从均值为 a a a,方差为 b b b的高斯分布” , E [ w k w j T ] E\left[w_{k} w_{j}^{T}\right] E[wkwjT] 表示的是括号内二者的联合期望 δ k − j \delta_{k-j} δkj 则是Kronecker delta function的函数,其简明意义是k=j的时候 δ k − j \delta_{k-j} δkj = 1,反之则为 δ k − j \delta_{k-j} δkj = 0。

注:知识复习 C o v [ X , Y ] = E [ X Y ] − E [ X ] E [ Y ] Cov[X,Y] = E[XY] - E[X]E[Y] Cov[X,Y]=E[XY]E[X]E[Y],对于均值为 0的高斯分布后两项为0

上式表明,对于噪音的协方差矩阵, w k w_k wk v k v_k vk 都是对角矩阵,而二者也是独立的( E [ v k w j T ] = 0 E[v_{k} w_{j}^{T}]=0 E[vkwjT]=0)。

Q k Q_{k} Qk表示系统状态受到的噪音扰动的协方差:

Q k = E ( w k w k T ) = [ σ 1 2 ⋯ 0 ⋮ ⋮ 0 ⋯ σ k 2 ] (3) \begin{aligned}\tag{3} Q_k &=E\left(w_k w_k^{T}\right) \\ &=\left[\begin{array}{ccc} \sigma_{1}^{2} & \cdots & 0 \\ \vdots & & \vdots \\ 0 & \cdots & \sigma_{k}^{2} \end{array}\right] \end{aligned} Qk=E(wkwkT)=σ1200σk2(3)

R k R_{k} Rk 代表测量误差的协方差:
R k = E ( v k v k T ) = [ σ 1 2 ⋯ 0 ⋮ ⋮ 0 ⋯ σ k 2 ] (4) \begin{aligned}\tag{4} R_k &=E\left(v_k v_k^{T}\right) \\ &=\left[\begin{array}{ccc} \sigma_{1}^{2} & \cdots & 0 \\ \vdots & & \vdots \\ 0 & \cdots & \sigma_{k}^{2} \end{array}\right] \end{aligned} Rk=E(vkvkT)=σ1200σk2(4)

制定一个小目标 – get next time state x k x_k xk

对于式子 ( 1 ) (1) (1)来说,卡尔曼滤波的总体目标是估计状态量 x k x_k xk , 那么如何估计呢?这就要用到我们已知的系统动力学性质和对系统的测量量 y k y_k yk 。这里变量的角标 k k k代表的是各个离散的时刻。如果我们现在知道所有 k k k时刻之前以及 k k k时刻的的测量量 y 1 , y 2 , y 3 . . . y k y_1,y_2,y_3 ...y_k y1,y2,y3...yk,那么我们就可以估计一个对现在时刻的状态的估计状态,称之为后验估计(posteriori estimate)(顾名思义,相当于知道后再估计、检验)。
x ^ k + = E [ x k ∣ y 1 , y 2 , ⋯   , y k ] = a  posteriori estimate  (5) \hat{x}_{k}^{+}=E\left[x_{k} \mid y_{1}, y_{2}, \cdots, y_{k}\right]=a\text { posteriori estimate } \tag{5} x^k+=E[xky1,y2,,yk]=a posteriori estimate (5)
注意,这里的上角标** + + +号表示的是后验**,意思是估计所用的依赖信息包含时刻 k k k的测量值的出来的估计量。

同理,我们可以得到先验估计(priori estimate):
x ^ k − = E [ x k ∣ y 1 , y 2 , ⋯   , y k − 1 ] = a  priori estimate  (6) \hat{x}_{k}^{-}=E\left[x_{k} \mid y_{1}, y_{2}, \cdots, y_{k-1}\right]=a \text { priori estimate } \tag{6} x^k=E[xky1,y2,,yk1]=a priori estimate (6)
以上两个估计都是在已经获得了测量结果的时刻 k k k以及之前时刻的估计,那么如果我们有了 k k k个时刻的样本,以及 k k k时刻之后的 N N N个样本,这时候我们对 k k k时刻的估计值则称之为平滑估计 (smoothed estimate)
x ^ k ∣ k + N = E [ x k ∣ y 1 , y 2 , ⋯   , y k , ⋯   , y k + N ] =  smoothed estimate  (7) \hat{x}_{k \mid k+N}=E\left[x_{k} \mid y_{1}, y_{2}, \cdots, y_{k}, \cdots, y_{k+N}\right]=\text { smoothed estimate } \tag{7} x^kk+N=E[xky1,y2,,yk,,yk+N]= smoothed estimate (7)
平滑估计之所以称之为smoothed,原因在于已经知道了想要估计时刻之后的 N N N个样本的测量值。

最后我们想要预测 k k k时刻的系统状态量,但是我们目前手上只有 k k k时刻之前 M M M步到初始时刻的测量量,那么这时候我们利用这些测量量做出的估计称之为预测估计(predicted estimate)
x ^ k ∣ k − M = E [ x k ∣ y 1 , y 2 , ⋯   , y k − M ] =  predicted estimate  (8) \hat{x}_{k \mid k-M}=E\left[x_{k} \mid y_{1}, y_{2}, \cdots, y_{k-M}\right]=\text { predicted estimate } \tag{8} x^kkM=E[xky1,y2,,ykM]= predicted estimate (8)
一张图帮你弄懂这些估计量代表的含义:
在这里插入图片描述

预测类型

上图表示,如果我们现在只有五个测量值拿在手里,那么对第一个时刻的估计值是smoothed estimate,对第五个时刻的估计值是posteriori estimate,对第六个时刻的估计值是 a priori estimate, 对第九个时刻的估计值是prediction。其实,a priori estimate 也是prediction,只不过由于和已知时刻的测量值的时刻挨得比较近。

卡尔曼滤波的基本原则从这里也可以略知一二,其大概总的原理,就是在 k k k时刻即将到来之前,我们基于 k k k时刻以前对系统的测量值,对系统的状态做出一个 k k k时刻的预测值,也就是 x ^ k − \hat{x}_{k}^{-} x^k ,当 k k k时刻到来的时候,我们反手一掏,拿到了 k k k时刻的测量值,再结合之前时刻的测量值,这时候就得到了 k k k时刻的后验估计值 x ^ k + \hat{x}_{k}^{+} x^k+ ,而实现循环预测的基本原则则是,我们利用前一时刻的后验估计值,“扔到”前一时刻的系统里,得出来后一时刻的先验。

简而言之,就是我们在下一时刻到来前,利用现在时刻我们所有拥有的信息,估计出来系统的后验值(不管先验后验,都是估计值哦,不是真实值),放到现在时刻的系统里面,经过神奇的运作,我们就得到了未经下一时刻测量值证实的一个对系统状态的猜测和估计,这个估计就是下一时刻系统状态的先验(理论上讲,系统下一时刻的实际值,应该是这一时刻的实际值放在下一时刻的系统中,才能得到下一时刻的实际值,对于估计而言,我们利用这种方法对下一时刻系统进行估计)。

来个示意图:

在这里插入图片描述

时刻转化

用方程表示则为:
x ^ k − = F k − 1 x ^ k − 1 + + G k − 1 u k − 1 (9) \hat{x}_{k}^{-}=F_{k-1} \hat{x}_{k-1}^{+}+G_{k-1} u_{k-1} \tag{9} x^k=Fk1x^k1++Gk1uk1(9)
上式称之为更新公式,非常形象,通过系统对预测状态更新,有那味儿了,但是初始状态是怎么样的呢?往前推:
x ^ 1 − = F 0 x ^ 0 + + G 0 u 0 (10) \hat{x}_{1}^{-}=F_{0} \hat{x}_{0}^{+}+G_{0} u_{0}\tag{10} x^1=F0x^0++G0u0(10)
可以看出来,我们必须要拥有一个初始的后验值,这个后验值我们直接用初始时刻的测量值 x ^ 0 + = E ( x 0 ) \hat{x}_{0}^{+} = E(x_0) x^0+=E(x0)

评价小目标的达成度 P k P_k Pk

说了这么多,我们到此得到了我们的目标,即 k k k时刻的系统状态估计值。但是到目前为止,我们并不知道我们对系统各个时刻的估计是否正确,或者说有多大的置信度 ,于是我们引入一个专门估计各个时刻估计置信度的变量 P P P ,即系统估计值错误的方差
P k − = E [ ( x k − x ^ k − ) ( x k − x ^ k − ) T ] P k + = E [ ( x k − x ^ k + ) ( x k − x ^ k + ) T ] (11) \begin{array}{l}\tag{11} P_{k}^{-}=E\left[\left(x_{k}-\hat{x}_{k}^{-}\right)\left(x_{k}-\hat{x}_{k}^{-}\right)^{T}\right] \\\\ P_{k}^{+}=E\left[\left(x_{k}-\hat{x}_{k}^{+}\right)\left(x_{k}-\hat{x}_{k}^{+}\right)^{T}\right] \end{array} Pk=E[(xkx^k)(xkx^k)T]Pk+=E[(xkx^k+)(xkx^k+)T](11)
对于零时刻:
P 0 + = E [ ( x 0 − x ˉ 0 ) ( x 0 − x ˉ 0 ) T ] = E [ ( x 0 − x ^ 0 + ) ( x 0 − x ^ 0 + ) T ] (12) \begin{aligned}\tag{12} P_{0}^{+} &=E\left[\left(x_{0}-\bar{x}_{0}\right)\left(x_{0}-\bar{x}_{0}\right)^{T}\right] \\\\ &=E\left[\left(x_{0}-\hat{x}_{0}^{+}\right)\left(x_{0}-\hat{x}_{0}^{+}\right)^{T}\right] \end{aligned} P0+=E[(x0xˉ0)(x0xˉ0)T]=E[(x0x^0+)(x0x^0+)T](12)
其中 x ˉ 0 \bar{x}_0 xˉ0 表示的时零时刻系统状态的均值,表示为:
x ˉ k = E ( x k ) = F k − 1 x ˉ k − 1 + G k − 1 u k − 1 (13) \begin{aligned}\tag{13} \bar{x}_{k} &=E\left(x_{k}\right) \\ &=F_{k-1} \bar{x}_{k-1}+G_{k-1} u_{k-1} \end{aligned} xˉk=E(xk)=Fk1xˉk1+Gk1uk1(13)
然后结合公式 10 10 10 对状态值的递推估计,我们可以直接利用其思想得到状态值方差的递推式:

P k − = F k − 1 P k − 1 + F k − 1 T + Q k − 1 (14) P_{k}^{-}=F_{k-1} P_{k-1}^{+} F_{k-1}^{T}+Q_{k-1}\tag{14} Pk=Fk1Pk1+Fk1T+Qk1(14)
但其实公式 14 14 14来源于状态值和状态方差的扩散,即:
P k = F k − 1 P k − 1 F k − 1 T + Q k − 1 (15) P_k = F_{k-1} P_{k-1} F_{k-1}^{T}+Q_{k-1}\tag{15} Pk=Fk1Pk1Fk1T+Qk1(15)
而公式 15 15 15来源于状态递推:
x ˉ k = E ( x k ) = F k − 1 x ˉ k − 1 + G k − 1 u k − 1 (16) \begin{aligned}\tag{16} \bar{x}_{k} &=E\left(x_{k}\right) \\ &=F_{k-1} \bar{x}_{k-1}+G_{k-1} u_{k-1} \end{aligned} xˉk=E(xk)=Fk1xˉk1+Gk1uk1(16)
然后我们结合公式 1 1 1和公式 14 14 14可以得到中间的一个公式:
( x k − x ˉ k ) ( ⋯   ) T = ( F k − 1 x k − 1 + G k − 1 u k − 1 + w k − 1 − x ˉ k ) ( ⋯   ) T = [ F k − 1 ( x k − 1 − x ˉ k − 1 ) + w k − 1 ] [ ⋯   ] T = F k − 1 ( x k − 1 − x ˉ k − 1 ) ( x k − 1 − x ˉ k − 1 ) T F k − 1 T + w k − 1 w k − 1 T + F k − 1 ( x k − 1 − x ˉ k − 1 ) w k − 1 T + w k − 1 ( x k − 1 − x ˉ k − 1 ) T F k − 1 T (17) \begin{aligned}\tag{17} \left(x_{k}-\bar{x}_{k}\right)(\cdots)^{T} &=\left(F_{k-1} x_{k-1}+G_{k-1} u_{k-1}+w_{k-1}-\bar{x}_{k}\right)(\cdots)^{T} \\\\ &=\left[F_{k-1}\left(x_{k-1}-\bar{x}_{k-1}\right)+w_{k-1}\right][\cdots]^{T} \\\\ &=F_{k-1}\left(x_{k-1}-\bar{x}_{k-1}\right)\left(x_{k-1}-\bar{x}_{k-1}\right)^{T} F_{k-1}^{T} \\\\ &+ w_{k-1}w_{k-1}^{T} + F_{k-1}(x_{k-1}-\bar{x}_{k-1})w_{k-1}^{T} \\\\ &+ w_{k-1}\left(x_{k-1}-\bar{x}_{k-1}\right)^{T} F_{k-1}^{T} \end{aligned} (xkxˉk)()T=(Fk1xk1+Gk1uk1+wk1xˉk)()T=[Fk1(xk1xˉk1)+wk1][]T=Fk1(xk1xˉk1)(xk1xˉk1)TFk1T+wk1wk1T+Fk1(xk1xˉk1)wk1T+wk1(xk1xˉk1)TFk1T(17)
最终我们可以得到公式 P k P_k Pk:
P k = E [ ( x k − x ˉ k ) ( ⋯   ) T ] = F k − 1 P k − 1 F k − 1 T + Q k − 1 (18) \begin{aligned}\tag{18} P_{k} &=E\left[\left(x_{k}-\bar{x}_{k}\right)(\cdots)^{T}\right] \\ &=F_{k-1} P_{k-1} F_{k-1}^{T}+Q_{k-1} \end{aligned} Pk=E[(xkxˉk)()T]=Fk1Pk1Fk1T+Qk1(18)
经过上述一系列推导,我们可以知道的是,当 P k P_k Pk越小的时候,不管是 P k + P_{k}^+ Pk+还是 P k − P_{k}^- Pk ,都表明估计值的不确定性越小,也就是说其估计错误越小,估计值越准确。

估计增益矩阵 K k K_k Kk – the Estimator Gain Matrix

接下来是卡尔曼滤波的重头戏了,估计增益矩阵 ,正是这个参数,将时刻间的估计值和测量值联系起来。

首先对于线性系统言, K k K_k Kk 可以表示对测量值和估计值的信任系数

让我们去掉上下脚标来看状态系统更新。
y k = H k x + v k (19) \tag{19} \begin{aligned} y_{k} &=H_{k} x+v_{k} \\ \end{aligned} yk=Hkx+vk(19)

x ^ k = x ^ k − 1 + K k ( y k − H k x ^ k − 1 ) (20) \tag{20} \hat{x}_{k} =\hat{x}_{k-1}+K_{k}\left(y_{k}-H_{k} \hat{x}_{k-1}\right) x^k=x^k1+Kk(ykHkx^k1)(20)

公式 20 20 20表明 k k k 时刻的状态估计值由 k − 1 k-1 k1时刻的状态估计值加上与实际状态测量值的差值然后乘以一个系数得到的,这个系数就是时刻 k k k的估计增益矩阵,也称为卡尔曼增益

对于带角标的系统更新方程:
x ^ k + = x ^ k − + K k ( y k − H k x ^ k − ) (21) \tag{21} \hat{x}_{k}^{+}=\hat{x}_{k}^{-}+K_{k}\left(y_{k}-H_{k} \hat{x}_{k}^{-}\right) x^k+=x^k+Kk(ykHkx^k)(21)

再来一个图表示:

在这里插入图片描述

卡尔曼增益(图中z即为y)

卡尔曼增益的推导比较繁琐,这里不再仔细推导,但是其最终形式有很多种体现,其中比较经常使用的有:
K k = P k − H k T ( H k P k − H k T + R k ) − 1 (22) \tag{22} K_{k}=P_{k}^{-} H_{k}^{T}\left(H_{k} P_{k}^{-} H_{k}^{T}+R_{k}\right)^{-1} \\ Kk=PkHkT(HkPkHkT+Rk)1(22)

K k = P k + H k T R k − 1 (23) \tag{23} K_{k}=P_{k}^{+} H_{k}^{T} R_{k}^{-1} Kk=Pk+HkTRk1(23)

公式 22 22 22 相比于公式 23 23 23而言,只需要先验估计,但是却需要求加和矩阵的逆,而矩阵的逆并不一定存在。

离散卡尔曼滤波算法

最后让我们总结一下卡尔曼滤波算法

第一步,系统模型为:
x k = F k − 1 x k − 1 + G k − 1 u k − 1 + w k − 1 y k = H k x k + v k E ( w k w j T ) = Q k δ k − ȷ E ( v k v j T ) = R k δ k − ȷ E ( w k v ȷ T ) = 0 (24) \tag{24} \begin{aligned} x_{k} &=F_{k-1} x_{k-1}+G_{k-1} u_{k-1}+w_{k-1} \\ y_{k} &=H_{k} x_{k}+v_{k} \\ E\left(w_{k} w_{j}^{T}\right) &=Q_{k} \delta_{k-\jmath} \\ E\left(v_{k} v_{j}^{T}\right) &=R_{k} \delta_{k-\jmath} \\ E\left(w_{k} v_{\jmath}^{T}\right) &=0 \end{aligned} xkykE(wkwjT)E(vkvjT)E(wkvȷT)=Fk1xk1+Gk1uk1+wk1=Hkxk+vk=Qkδkȷ=Rkδkȷ=0(24)
第二步,初始化滤波模型初始状态:
x ^ 0 + = E ( x 0 ) P 0 + = E [ ( x 0 − x ^ 0 + ) ( x 0 − x ^ 0 + ) T ] (25) \tag{25} \begin{aligned} \hat{x}_{0}^{+} &=E\left(x_{0}\right) \\ P_{0}^{+} &=E\left[\left(x_{0}-\hat{x}_{0}^{+}\right)\left(x_{0}-\hat{x}_{0}^{+}\right)^{T}\right] \end{aligned} x^0+P0+=E(x0)=E[(x0x^0+)(x0x^0+)T](25)
第三步,递推:
P k − = F k − 1 P k − 1 + F k − 1 T + Q k − 1 K k = P k − H k T ( H k P k − H k T + R k ) − 1 = P k + H k T R k − 1 x ^ k − = F k − 1 x ^ k − 1 + + G k − 1 u k − 1 =  a priori state estimate  x ^ k + = x ^ k − + K k ( y k − H k x ^ k − ) = a posteriori state estimate  P k + = ( I − K k H k ) P k − ( I − K k H k ) T + K k R k K k T = [ ( P k − ) − 1 + H k T R k − 1 H k ] − 1 = ( I − K k H k ) P k − (26) \tag{26} \begin{aligned} P_{k}^{-} &=F_{k-1} P_{k-1}^{+} F_{k-1}^{T}+Q_{k-1} \\ K_{k} &=P_{k}^{-} H_{k}^{T}\left(H_{k} P_{k}^{-} H_{k}^{T}+R_{k}\right)^{-1}\\ &=P_{k}^{+} H_{k}^{T} R_{k}^{-1} \\ \hat{x}_{k}^{-} &=F_{k-1} \hat{x}_{k-1}^{+}+G_{k-1} u_{k-1}=\text { a priori state estimate } \\ \hat{x}_{k}^{+} &=\hat{x}_{k}^{-}+K_{k}\left(y_{k}-H_{k} \hat{x}_{k}^{-}\right)=\text {a posteriori state estimate } \\ P_{k}^{+} &=\left(I-K_{k} H_{k}\right) P_{k}^{-}\left(I-K_{k} H_{k}\right)^{T}+K_{k} R_{k} K_{k}^{T} \\ &=\left[\left(P_{k}^{-}\right)^{-1}+H_{k}^{T} R_{k}^{-1} H_{k}\right]^{-1} \\ &=\left(I-K_{k} H_{k}\right) P_{k}^{-} \end{aligned} PkKkx^kx^k+Pk+=Fk1Pk1+Fk1T+Qk1=PkHkT(HkPkHkT+Rk)1=Pk+HkTRk1=Fk1x^k1++Gk1uk1= a priori state estimate =x^k+Kk(ykHkx^k)=a posteriori state estimate =(IKkHk)Pk(IKkHk)T+KkRkKkT=[(Pk)1+HkTRk1Hk]1=(IKkHk)Pk(26)
打完收工,下次说卡尔曼滤波的性质。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sheldon123z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值