1 什么是卡尔曼滤波
最近在阅读APM的源码,督导了姿态解算的部分,了解到姿态结算是依靠卡尔曼扩展滤波器(EKF)解算出位置的。然后笔者就去了解了卡尔曼滤波的相关知识。笔者的简单理解就是卡尔曼滤波就是计算出从你当前的位置到达目标位置的最优算法。比如说一个四旋翼无人机,你想让他从当前位置飞到100m外的目标地点(固定的),我们简单的认为只需要导航就可以了啊,但是实际情况下导航在引导无人机从当前位置到目标位置的过程中,会遇到很多噪音,这样可能会使无人机偏离目标地点。有人说可以依靠数学模型计算出目标位置,但实际情况中有很多例子很难建出具体的数学模型,就算能建出具体的模型,但是在迭代的过程中有误差的话,会使这个误差越来越大,偏离目标地点。所以这就引出了卡尔曼滤波,它会结合传感器的测量值与数学模型的估算值得到最优估算状态。然后区分一下卡尔曼滤波和扩展卡尔曼滤波的区别,卡尔曼滤波主要用在线性系统中,扩展卡尔曼滤波主要用在非线性系统中(在APM姿态解算中主要用到扩展卡尔曼滤波(EKF))。本文将用最简单的例子介绍一下卡尔曼滤波器。
卡尔曼滤波使用的三个前提
- (1)系统是可观测的
- (2)系统为线性系统,能够写出下一时刻的状态预测方程
- (3)假设系统的噪声统计特性可观测
2 实例分析
2.1 数学模型的创建
我们举一个最简单的例子,一个小车在水平面上做匀速直线运动和匀加速直线运动(加速度为a)两种情况,让小车到达目标位置。
首先建立匀速直线运动小车的数学模型:
p
k
=
p
k
−
1
+
v
.
Δ
t
p_{k}=p_{k-1}+v.\Delta{t}
pk=pk−1+v.Δt
v
k
=
v
k
−
1
v_k=v_{k-1}
vk=vk−1
- 其中状态量用 x = [ x k v k ] x=\begin{bmatrix}x_k\\v_k\end{bmatrix} x=[xkvk]来表示
- 状态量估算量用 x ^ = [ p k v k ] \hat{x}=\begin{bmatrix}p_k\\v_k\end{bmatrix} x^=[pkvk]
匀加速直线运动小车的数学模型:
p
k
=
p
k
−
1
+
v
.
Δ
t
+
1
2
Δ
t
2
p_{k}=p_{k-1}+v.\Delta{t}+\frac{1}{2}\Delta{t}^2
pk=pk−1+v.Δt+21Δt2
v
k
=
v
k
−
1
+
a
Δ
t
v_k=v_{k-1}+a\Delta{t}
vk=vk−1+aΔt
将这两个数学模型转化为线性空间形式:
x
^
k
=
F
k
X
^
k
−
1
+
B
k
u
k
\hat{x}_k=F_k\hat{X}_{k-1}+B_ku_k
x^k=FkX^k−1+Bkuk
其中:
- 转换矩阵 F k = [ 1 Δ t 0 1 ] F_k=\begin{bmatrix} 1 & \Delta{t} \\ 0 & 1\\ \end{bmatrix} Fk=[10Δt1]
- 控制矩阵 B k = [ 1 2 Δ t 2 Δ t ] B_k=\begin{bmatrix}\frac{1}{2}\Delta{t}^2 \\ \Delta{t}\\ \end{bmatrix} Bk=[21Δt2Δt]
- u代表输入量,这里即为a
如果有噪声的话,且知道噪声的分布情况
w
k
w_k
wk~
N
(
0
,
Q
k
)
N(0,Q_k)
N(0,Qk)
那么:
x
^
k
=
F
k
x
^
k
−
1
+
B
k
u
k
+
w
k
(1)
\hat{x}_k=F_k\hat{x}_{k-1}+B_ku_k+w_k\tag{1}
x^k=Fkx^k−1+Bkuk+wk(1)
P
k
=
F
k
P
k
−
1
F
k
T
+
Q
k
(2)
P_k=F_kP_{k-1}F_k^T+Q_k\tag{2}
Pk=FkPk−1FkT+Qk(2)
其中:
-
P
k
P_k
Pk为协方差矩阵
P
k
=
[
Σ
P
P
Σ
P
V
Σ
V
P
Σ
V
V
]
P_k=\begin{bmatrix}\Sigma_{PP}&\Sigma_{PV} \\ \Sigma_{VP}& \Sigma_{VV}\\ \end{bmatrix}
Pk=[ΣPPΣVPΣPVΣVV]
如果不了解什么是协方差的话可以查看一下wiki:https://zh.wikipedia.org/wiki/%E5%8D%8F%E6%96%B9%E5%B7%AE - 这里用到了协方差矩阵的一个基本性质:
C o v ( x ) = Σ Cov(x)=\Sigma Cov(x)=Σ
C o v ( A x ) = A Σ A T Cov(Ax)=A\Sigma A^T Cov(Ax)=AΣAT - (2)式就是由(1)式两边求协方差得到的。
这样我们就得到了小车在数学模型下的分布:
x x x~ N ( x ^ k , P k ) N(\hat x_k,P_k) N(x^k,Pk)
其中: - x ^ k \hat x_k x^k为期望
- P k P_k Pk为方差
2.2 投影到传感器上
我们上面已经说过了,单靠数学模型是远远不够的,我们还要根据传感器监测到的数据,和数学模型预测出的数据进行整合,得到最优算法。那么我们首先要将传感器测得的数据与数学模型预测的数据放在一个坐标系下。
假设我们已经知道从数学模型到测量模型下的转换矩为
H
k
H_k
Hk,可得:
- u e x p e d i c t e d = H k x ^ k u_{expedicted}=H_k\hat x_k uexpedicted=Hkx^k
- Σ e x p e c t e d = H k P k H k T \Sigma_{expected}=H_kP_kH_k^T Σexpected=HkPkHkT
可得:
X
e
x
p
e
d
i
c
t
e
d
X_{expedicted}
Xexpedicted~
N
(
H
k
x
^
k
,
H
k
P
k
H
k
T
)
N(H_k\hat x_k,H_kP_kH_k^T)
N(Hkx^k,HkPkHkT)
而传感器上测得的状态量符合:
Y
m
e
a
s
u
r
m
e
n
t
Y_{measurment}
Ymeasurment~
N
(
z
k
,
R
k
)
N(z_k,R_k)
N(zk,Rk) (其中Noise:
v
k
v_k
vk~
N
(
0
,
R
k
)
N(0,R_k)
N(0,Rk))
2.3 应用卡尔曼得到最优估计
由2.2我们得到了传感器和数学模型两个分布,接下来到了最重要的环节,就是利用卡尔曼滤波将两个分布整合,得到一个最优分布。具体做法就是 将 两 个 正 太 分 布 相 乘 \color{red}{将两个正太分布相乘} 将两个正太分布相乘。下面我们要补充一个知识点,就是如何将两个正态分布相乘:
- X~ N ( μ 1 , σ 1 2 ) N(\mu_1,\sigma_1^2) N(μ1,σ12)
- Y~ N ( μ 2 , σ 2 2 ) N(\mu_2,\sigma_2^2) N(μ2,σ22)
对于二者相乘新的分布为:
- k= σ 1 2 σ 1 2 + σ 2 2 \frac{\sigma_1^2}{\sigma_1^2+\sigma_2^2} σ12+σ22σ12
- μ ′ = μ 1 + k ( μ 2 − μ 1 ) \mu^ {'}=\mu_1+k(\mu_2-\mu_1) μ′=μ1+k(μ2−μ1)
- σ 1 ′ 2 = σ 1 2 + k σ 1 2 \sigma_1^{'2}=\sigma_1^2+k\sigma_1^2 σ1′2=σ12+kσ12
转化为矩阵形式:
- K ′ K^{'} K′= Σ 1 Σ 1 + Σ 2 \frac{\Sigma_1}{\Sigma_1+\Sigma_2} Σ1+Σ2Σ1
- μ ⃗ ′ = μ ⃗ 1 + K ′ ( μ ⃗ 2 − μ ⃗ 1 ) \vec\mu^ {'}=\vec\mu_1+K^{'}(\vec\mu_2-\vec\mu_1) μ′=μ1+K′(μ2−μ1)
- Σ 1 ′ = Σ 1 + K ′ Σ 1 ′ \Sigma_1^{'}=\Sigma_1+K^{'}\Sigma_1^{'} Σ1′=Σ1+K′Σ1′
由
K
′
K^{'}
K′=
Σ
1
Σ
1
+
Σ
2
\frac{\Sigma_1}{\Sigma_1+\Sigma_2}
Σ1+Σ2Σ1可得
K
′
=
H
k
P
k
H
k
T
H
k
P
k
H
k
T
+
R
k
)
K^{'}=\frac {H_kP_kH_k^T}{H_kP_kH_k^T+R_k})
K′=HkPkHkT+RkHkPkHkT)
所以相乘后的均值:
- H k x k ′ = H k x ^ k + K ′ ( z k − H k x ^ k ) H_kx_k^{'}=H_k\hat x_k+K^{'}(z_k-H_k\hat x_k) Hkxk′=Hkx^k+K′(zk−Hkx^k)
相乘后的新方差:
- H k P k ′ H k T = H k P k H k T + K ′ H k P k H k T H_kP_k{'}H_k^{T}=H_kP_kH_k^T+K^{'}H_kP_kH_k^T HkPk′HkT=HkPkHkT+K′HkPkHkT
由上面两个式子可得:
- x k ′ = x ^ k + K ′ H k ( z k − H k x ^ k ) x_k^{'}=\hat x_k+\frac {K^{'}}{H_k}(z_k-H_k\hat x_k) xk′=x^k+HkK′(zk−Hkx^k)
- P k ′ = P k + K ′ P k P_k{'}=P_k+K^{'}P_k Pk′=Pk+K′Pk
我们引入一个新的概念,
卡
尔
曼
增
益
K
\color{red}{卡尔曼增益K}
卡尔曼增益K:
K
=
K
′
H
k
=
P
k
H
k
T
H
k
P
k
H
k
T
+
R
k
\color{red}{K=\frac {K^{'}}{H_k}=\frac {P_kH_k^T}{H_kP_kH_k^T+R_k}}
K=HkK′=HkPkHkT+RkPkHkT
由此得到经过卡尔曼滤波后的最优状态估计:
x
^
k
′
=
x
^
k
+
K
(
z
k
−
H
k
x
^
k
)
\color{red}\hat{x}_k^{'}=\hat{x}_k+K(z_k-H_k\hat{x}_k)
x^k′=x^k+K(zk−Hkx^k)
P
k
′
=
P
k
+
K
H
k
P
k
\color{red}P_k^{'}=P_k+KH_kP_k
Pk′=Pk+KHkPk
3 总结
卡尔曼滤波器程序步骤
- 从当前状态计算下一步状态(估算)
x ^ k = F k x ^ k − 1 + B k u k + w k \hat{x}_k= F_k\hat{x}_{k-1}+B_ku_k+w_k x^k=Fkx^k−1+Bkuk+wk
P k = F k P K − 1 F k T + Q P_k=F_kP_{K-1}F_k^T+Q Pk=FkPK−1FkT+Q
X p r e d i c t X_{predict} Xpredict~ N ( H k x ^ k , H k P k x k T ) N(H_k\hat{x}_k,H_kP_kx_k^T) N(Hkx^k,HkPkxkT) - 根据传感器计算均值和方差
Y m e a s u r e n t Y_{measurent} Ymeasurent ~ N ( z k , R k ) N(z_k,R_k) N(zk,Rk) - 计算卡尔曼滤波
K = K ′ H k = P k H k T H k P k H k T + P k K=\frac{K^{'}}{H_k}=\frac{P_kH_k^T}{H_kP_kH_k^T+P_k} K=HkK′=HkPkHkT+PkPkHkT
x ^ k ′ = x ^ k + K ( Z k − H k x ^ k ) \hat{x}_k^{'}=\hat{x}_k+K(Z_k-H_k\hat{x}_k) x^k′=x^k+K(Zk−Hkx^k)
P k ′ = P k + K H k P k P_k^{'}=P_k+KH_kP_k Pk′=Pk+KHkPk - 将计算出的 x ^ k ′ \hat{x}_k^{'} x^k′与 P k ′ P_k^{'} Pk′带入第一步迭代,计算下一步最优状态。