卡尔曼滤波(Kalman Filter)
1.背景
现实世界中存在很多不确定性,主要体现在
(1)不存在完美的数学模型
(2)系统的扰动不可控并且很难建模
(3)测量传感器存在误差
卡尔曼滤波算法作为一个在存在不确定性的情况下对系统状态进行估计和预测的强大工具,被广泛应用于诸如目标跟踪、导航和控制等场景。
2.数据融合的例子
首先看一个数据融合的例子,如下图所示,其中红色的高斯分布 N ( μ f , σ f ) N\left ( \mu_f, \sigma_f \right ) N(μf,σf) 代表预测的小车的位置,蓝色的高斯分布 N ( μ g , σ g ) N\left ( \mu_g, \sigma_g \right ) N(μg,σg) 代表测量的小车的位置。直观上讲,真实的小车位置更有可能出现在两个高斯分布相重合的地方,即数据融合后绿色的高斯分布 N ( μ f g , σ f g ) N\left ( \mu_{fg}, \sigma_{fg} \right ) N(μfg,σfg) 所在的位置。
绿色的高斯分布可通过红色的高斯分布与蓝色的高斯分布进行乘积得到。其中
μ f g = μ f σ g 2 + μ g σ f 2 σ f 2 + σ g 2 = μ f + σ f 2 σ f 2 + σ g 2 ( μ g − μ f ) (1) \mu_{fg} = \frac{\mu_f \sigma_g^2 + \mu_g \sigma_f^2}{\sigma_f^2 + \sigma_g^2} = \mu_f + \frac{\sigma_f^2}{\sigma_f^2 + \sigma_g^2} \left(\mu_g - \mu_f \right) \tag{1} μfg=σf2+σg2μfσg2+μgσf2=μf+σf2+σg2σf2(μg−μf)(1)
σ f g 2 = σ f 2 σ g 2 σ f 2 + σ g 2 = σ f 2 − σ f 4 σ f 2 + σ g 2 (2) \sigma_{fg}^2 = \frac{\sigma_f^2 \sigma_g^2}{\sigma_f^2 + \sigma_g^2} = \sigma_f^2 - \frac{\sigma_f^4}{\sigma_f^2 + \sigma_g^2} \tag{2} σfg2=σf2+σg2σf2σg2=σf2−σf2+σg2σf4(2)
可以看出, μ g < μ f g < μ f \mu_{g}<\mu_{fg}<\mu_{f} μg<μfg<μf, σ f g 2 < σ f 2 \sigma_{fg}^2<\sigma_f^2 σfg2<σf2 且 σ f g 2 < σ g 2 \sigma_{fg}^2<\sigma_g^2 σfg2<σg2。这相当于在 μ g \mu_{g} μg 和 μ f \mu_{f} μf 之间取了一个权衡值,更小的方差意味着更准确的估计。如果令
k = σ f 2 σ f 2 + σ g 2 (3) k = \frac{\sigma_f^2}{\sigma_f^2 + \sigma_g^2} \tag{3} k=σf2+σg2σf2(3)
则公式(1)和(2)可重写为如下形式
μ
f
g
=
μ
f
+
k
(
μ
g
−
μ
f
)
(4)
\mu_{fg} = \mu_f + k \left(\mu_g - \mu_f \right) \tag{4}
μfg=μf+k(μg−μf)(4)
σ f g 2 = ( 1 − k ) σ f 2 (5) \sigma_{fg}^2 = (1-k)\sigma_f^2 \tag{5} σfg2=(1−k)σf2(5)
以上是一维的情况,如果是多维空间,公式(3)、(4)和(5)可进一步扩展为如下的矩阵形式
K = Σ f ( Σ f + Σ g ) − 1 (6) K = \Sigma_f \left( \Sigma_f + \Sigma_g \right)^{-1} \tag{6} K=Σf(Σf+Σg)−1(6)
μ f g = μ f + K ( μ g − μ f ) (7) \boldsymbol{\mu }_{fg} = \boldsymbol{\mu }_f + K \left(\boldsymbol{\mu }_g - \boldsymbol{\mu }_f \right) \tag{7} μfg=μf+K(μg−μf)(7)
Σ f g = ( I − K ) Σ f (8) \Sigma_{fg} = (I-K)\Sigma_f \tag{8} Σfg=(I−K)Σf(8)
其中, K K K 就是卡尔曼增益(Kalman Gain)。
3.卡尔曼滤波的基本模型
假设离散线性动态系统的模型如下
x k = A x k − 1 + B u k + ω k − 1 (9) \mathbf{x }_k = A \mathbf{x }_{k-1} + B \mathbf{u }_k + \boldsymbol{\omega}_{k-1} \tag{9} xk=Axk−1+Buk+ωk−1(9)
z k = H x k + ν k (10) \mathbf{z }_k = H \mathbf{x }_{k} + \boldsymbol{\nu }_{k} \tag{10} zk=Hxk+νk(10)
其中
ω
∼
N
(
0
,
Q
)
\boldsymbol{\omega} \sim N\left( 0,Q \right)
ω∼N(0,Q) 代表过程噪声(process noise);
ν
∼
N
(
0
,
R
)
\boldsymbol{\nu} \sim N\left( 0,R \right)
ν∼N(0,R) 代表测量噪声(measurement noise);
x
k
\mathbf{x }_k
xk 为系统状态向量,是状态的真实值,实际中是一个未知量,在上一节的例子中,可以看作是小车的真实位置,卡尔曼滤波算法的目的就是要获得尽可能准确的
x
k
\mathbf{x }_k
xk 估计值;
u
k
\mathbf{u }_k
uk 为系统输入,实际中为已知量;
z
k
\mathbf{z }_k
zk 为系统状态向量的观测,在上一节的例子中,可以看作是测量小车位置的传感器读数。
H
H
H 为状态观测矩阵,其作用可以是从现实中的物理量比如位置变成传感器输出的值,也可以作为选择矩阵,因为传感器并不一定对所有状态变量的测量都能够满足,有些状态变量无法输出。
4. 卡尔曼滤波的公式推导
4.1. 预测的分布(预测阶段)
为了得到估计的状态信息的高斯分布,需要知道 k k k 时刻的两个信息:
(1)先验状态估计值(prior state estimate) x ^ k − \hat{\mathbf{x}}^-_k x^k− (可看作对 x k \mathbf{x}_k xk 估计的均值),可由状态预测方程得到
x ^ k − = A x ^ k − 1 + B u k (11) \color{red}{\hat{\mathbf{x}}^-_k = A \hat{\mathbf{x}}_{k-1} + B \mathbf{u }_k} \tag{11} x^k−=Ax^k−1+Buk(11)
其中 x ^ k − 1 \hat{\mathbf{x}}_{k-1} x^k−1 为 k − 1 k-1 k−1 时刻的后验状态估计值(posteriori state estimate)。
(2)真实值与预测值之间的协方差矩阵 P k − = E ( e k − e k − T ) P_k^- = E\left( \mathbf{e}^-_k \mathbf{e}^{-\text{T}}_k \right) Pk−=E(ek−ek−T) ,其中 e k − = x k − x ^ k − \mathbf{e}^-_k = \mathbf{x}_k - \hat{\mathbf{x}}^-_k ek−=xk−x^k− 为先验状态误差向量。
e k − = x k − x ^ k − = A x k − 1 + B u k + ω k − 1 − ( A x ^ k − 1 + B u k ) = A ( x k − 1 − x ^ k − 1 ) + ω k − 1 = A e k − 1 + ω k − 1 (12) \begin{aligned} \mathbf{e}^-_k &= \mathbf{x}_k - \hat{\mathbf{x}}^-_k \\ &= A \mathbf{x }_{k-1} + B \mathbf{u }_k + \boldsymbol{\omega}_{k-1}-\left( A \hat{\mathbf{x}}_{k-1} + B \mathbf{u }_k \right) \\ &= A \left( \mathbf{x}_{k-1} - \hat{\mathbf{x}}_{k-1} \right) + \boldsymbol{\omega}_{k-1} \\ &= A\mathbf{e}_{k-1} + \boldsymbol{\omega}_{k-1} \end{aligned} \tag{12} ek−=xk−x^k−=Axk−1+Buk+ωk−1−(Ax^k−1+Buk)=A(xk−1−x^k−1)+ωk−1=Aek−1+ωk−1(12)
P k − = E ( e k − e k − T ) = E ( ( A e k − 1 + ω k − 1 ) ( A e k − 1 + ω k − 1 ) T ) = E ( A e k − 1 e k − 1 T A T + A e k − 1 ω k − 1 T + ω k − 1 e k − 1 T A T + ω k − 1 ω k − 1 T ) = A E ( e k − 1 e k − 1 T ) A T + E ( ω k − 1 ω k − 1 T ) = A P k − 1 A T + Q (13) \begin{aligned} \color{red}{P_k^-} &= E\left( \mathbf{e}^-_k \mathbf{e}^{-\text{T}}_k \right) \\ &= E\left( \left( A\mathbf{e}_{k-1} + \boldsymbol{\omega}_{k-1} \right) \left( A\mathbf{e}_{k-1} + \boldsymbol{\omega}_{k-1} \right)^{\text{T}} \right) \\ &= E\left( A\mathbf{e}_{k-1}\mathbf{e}_{k-1}^{\text{T}}A^{\text{T}} + A\mathbf{e}_{k-1}\boldsymbol{\omega}_{k-1}^{\text{T}} + \boldsymbol{\omega}_{k-1}\mathbf{e}_{k-1}^{\text{T}}A^{\text{T}} + \boldsymbol{\omega}_{k-1}\boldsymbol{\omega}_{k-1}^{\text{T}} \right) \\ &= AE\left(\mathbf{e}_{k-1}\mathbf{e}_{k-1}^{\text{T}}\right)A^{\text{T}} + E\left(\boldsymbol{\omega}_{k-1}\boldsymbol{\omega}_{k-1}^{\text{T}} \right) \\ &\color{red}{= AP_{k-1}A^{\text{T}} + Q} \end{aligned} \tag{13} Pk−=E(ek−ek−T)=E((Aek−1+ωk−1)(Aek−1+ωk−1)T)=E(Aek−1ek−1TAT+Aek−1ωk−1T+ωk−1ek−1TAT+ωk−1ωk−1T)=AE(ek−1ek−1T)AT+E(ωk−1ωk−1T)=APk−1AT+Q(13)
其中 P k − 1 = E ( e k − 1 e k − 1 T ) P_{k-1} = E\left(\mathbf{e}_{k-1}\mathbf{e}_{k-1}^{\text{T}}\right) Pk−1=E(ek−1ek−1T) 为 k − 1 k-1 k−1 时刻真实值与最优估计值之间的协方差矩阵, e k − 1 = x k − 1 − x ^ k − 1 \mathbf{e}_{k-1} = \mathbf{x}_{k-1} - \hat{\mathbf{x}}_{k-1} ek−1=xk−1−x^k−1 为 k − 1 k-1 k−1 时刻后验状态误差向量。
因此, k k k 时刻估计的状态信息的高斯分布为 N ( x ^ k − , P k − ) N\left( \hat{\mathbf{x}}^-_k, P_k^- \right) N(x^k−,Pk−),将其通过状态观测矩阵 H H H 进行转换可得 N ( H x ^ k − , H P k − H T ) N\left( H\hat{\mathbf{x}}^-_k, H P_k^-H^{\text{T}} \right) N(Hx^k−,HPk−HT)
4.2. 测量的分布
根据公式(10)可知, k k k 时刻的测量值对应的高斯分布为 N ( z k , R ) N\left( \mathbf{z}_k, R \right) N(zk,R)。
4.3. 预测分布和测量分布进行数据融合(校正阶段)
记 k k k 时刻的后验状态估计值为 x ^ k \hat{\mathbf{x}}_k x^k,真实值与最优估计值之间的协方差为 P k P_k Pk,将其通过状态观测矩阵 H H H 进行转换可得 N ( H x ^ k , H P k H T ) N\left( H\hat{\mathbf{x}}_k, H P_kH^{\text{T}} \right) N(Hx^k,HPkHT)。对预测的分布 N ( H x ^ k − , H P k − H T ) N\left( H\hat{\mathbf{x}}^-_k, HP_k^-H^{\text{T}} \right) N(Hx^k−,HPk−HT) 和测量的分布 N ( z k , R ) N\left( \mathbf{z}_k, R \right) N(zk,R) 按照公式(6)、(7)和(8)进行数据融合可得
G k = H P k − H T ( H P k − H T + R ) − 1 (14) G_k = HP_k^-H^{\text{T}} \left( HP_k^-H^{\text{T}} + R \right)^{-1} \tag{14} Gk=HPk−HT(HPk−HT+R)−1(14)
H x ^ k = H x ^ k − + G k ( z k − H x ^ k − ) (15) H\hat{\mathbf{x}}_k = H\hat{\mathbf{x}}^-_k + G_k \left(\mathbf{z}_k - H\hat{\mathbf{x}}^-_k \right) \tag{15} Hx^k=Hx^k−+Gk(zk−Hx^k−)(15)
H P k H T = ( I − G k ) H P k − H T (16) HP_kH^{\text{T}} = (I-G_k)HP_k^-H^{\text{T}} \tag{16} HPkHT=(I−Gk)HPk−HT(16)
令 G k = H K k G_k = HK_k Gk=HKk,则
K k = P k − H T ( H P k − H T + R ) − 1 (17) \color{red}{K_k = P_k^-H^{\text{T}} \left( HP_k^-H^{\text{T}} + R \right)^{-1}} \tag{17} Kk=Pk−HT(HPk−HT+R)−1(17)
x ^ k = x ^ k − + K k ( z k − H x ^ k − ) (18) \color{red}{\hat{\mathbf{x}}_k = \hat{\mathbf{x}}^-_k + K_k \left(\mathbf{z}_k - H\hat{\mathbf{x}}^-_k \right)} \tag{18} x^k=x^k−+Kk(zk−Hx^k−)(18)
P k = ( I − K k H ) P k − (19) \color{red}{P_k = (I-K_k H)P_k^-} \tag{19} Pk=(I−KkH)Pk−(19)
5. 算法步骤总结
初始化
x
^
0
\hat{\mathbf{x}}_0
x^0 和
P
0
P_0
P0。
预测:
(1)先验状态估计值
x
^
k
−
=
A
x
^
k
−
1
+
B
u
k
\color{red}{\hat{\mathbf{x}}^-_k = A \hat{\mathbf{x}}_{k-1} + B \mathbf{u }_k}
x^k−=Ax^k−1+Buk
(2)先验误差协方差
P
k
−
=
A
P
k
−
1
A
T
+
Q
\color{red}{P_k^- = AP_{k-1}A^{\text{T}} + Q}
Pk−=APk−1AT+Q
校正:
(3)卡尔曼增益
K
k
=
P
k
−
H
T
(
H
P
k
−
H
T
+
R
)
−
1
\color{red}{K_k = P_k^-H^{\text{T}} \left( HP_k^-H^{\text{T}} + R \right)^{-1}}
Kk=Pk−HT(HPk−HT+R)−1
(4)后验状态估计值
x
^
k
=
x
^
k
−
+
K
k
(
z
k
−
H
x
^
k
−
)
\color{red}{\hat{\mathbf{x}}_k = \hat{\mathbf{x}}^-_k + K_k \left(\mathbf{z}_k - H\hat{\mathbf{x}}^-_k \right)}
x^k=x^k−+Kk(zk−Hx^k−)
(5)更新误差协方差
P
k
=
(
I
−
K
k
H
)
P
k
−
\color{red}{P_k = (I-K_k H)P_k^-}
Pk=(I−KkH)Pk−