书接上回啊,上一篇详细的介绍了下标准卡尔曼滤波,使用卡尔曼滤波进行更新和预测都是建立在线性系统的基础上,因为高斯分布 x k x_k xk预测后仍然是高斯分布,且高斯分布变换到观测空间后也仍然是符合高斯分布的。
然而,实际工程中,极少有系统是线性系统,那这种情况怎么使用卡尔曼滤波呢?
非线性处理
学过数学的都知道,线性函数可以使用下式进行表达,
f ( x ) = a x + b (1) f(x)=ax+b \tag{1} f(x)=ax+b(1)
然而其他的函数,比如, f ( x ) = a x 2 + b x + c f(x)=ax^2+bx+c f(x)=ax2+bx+c, f ( x ) = sin x f(x)=\sin{x} f(x)=sinx, f ( x ) = ln x f(x)=\ln{x} f(x)=lnx, f ( x ) = a x f(x)=a^x f(x)=ax等,这些都不是线性函数,按道理来说是都没办法使用卡尔曼滤波的,那工程中如何使用卡尔曼滤波呢?比如无人驾驶中的车辆运动学模型,如何使用卡尔曼滤波对车辆的位置进行跟踪?
大学那会都学过,任何光滑连续的曲线都是可微的,一个光滑的曲线可以用多个连续的短距离的直线来表示,如下图,
这就给我们在非线性系统上应用卡尔曼滤波提供了一种思路,可以使用泰勒级数对非线性系统进行展开,只取其一阶的泰勒级数,使用非线性系统当前位置的一阶泰勒级数进行近似和逼近。
扩展卡尔曼滤波
上面介绍了,如何将非线性系统通过泰勒展开成一阶系统,现在,来看一下EKF的整体计算流程。其实,扩展卡尔曼滤波与的整体流程与标准卡尔曼是大致相同的,如下,
第一步,确定状态预测方程,
x
^
k
=
F
k
x
^
k
−
1
+
B
k
u
⃗
k
P
k
=
F
k
P
k
−
1
F
k
T
+
Q
k
(2)
\hat{x}_{k}=F_{k} \hat{x}_{k-1} +B_{k}\vec{u}_{k} \\ \space P_{k}=F_{k}P_{k-1}F_{k}^{T} +Q_{k} \tag{2}
x^k=Fkx^k−1+Bkuk Pk=FkPk−1FkT+Qk(2)
第二步,计算卡尔曼增益,
K
′
=
P
k
H
k
T
(
H
k
P
k
H
k
T
+
R
k
)
−
1
(3)
K^{'}=P_{k}H_{k}^{T}(H_{k}P_{k}H_{k}^{T}+R_{k})^{-1} \tag{3}
K′=PkHkT(HkPkHkT+Rk)−1 (3)
第三步,更新系统状态和协方差矩阵,
x
^
k
′
=
x
^
k
+
K
′
(
z
⃗
k
−
H
k
x
^
k
)
P
k
′
=
P
k
−
K
′
H
k
P
k
(4)
\hat{x}_{k}^{'}=\hat{x}_{k}+K^{'}(\vec{z}_{k}-H_{k}\hat{x}_{k}) \\ \space \\ P_{k}^{'}=P_{k}-K^{'}H_{k}P_{k} \tag{4}
x^k′=x^k+K′(zk−Hkx^k) Pk′=Pk−K′HkPk(4)
第四步,将系统状态方程泰勒展开到一阶方程,并用此一阶方程作为下一个计算循环的系统方程,
F
k
+
1
=
δ
f
δ
x
^
′
x
^
k
+
1
=
F
k
+
1
x
^
k
+
B
k
+
1
u
⃗
k
+
1
P
k
+
1
=
F
k
+
1
P
k
F
k
+
1
T
+
Q
k
+
1
(5)
F_{k+1} = \frac{\delta f}{\delta \hat{x}^{'}} \\ \hat{x}_{k+1}=F_{k+1} \hat{x}_{k} +B_{k+1}\vec{u}_{k+1} \\ \space P_{k+1}=F_{k+1}P_{k}F_{k+1}^{T} +Q_{k+1} \tag{5}
Fk+1=δx^′δfx^k+1=Fk+1x^k+Bk+1uk+1 Pk+1=Fk+1PkFk+1T+Qk+1(5)