概率机器人总结——卡尔曼滤波先实践再推导
概率机器人总结——(扩展)卡尔曼滤波先实践再推导
为什么要把扩展两个字加个括号呢,因为本文的实践过程是以扩展卡尔曼为例,但是推导过程主要是参考博客卡尔曼滤波 – 从推导到应用(一),相较于《概率机器人》上的推导过程更容易理解,而《概率机器人》上对于扩展卡尔曼滤波的推到也是基于卡尔曼滤波进行了一个拓展,因此本文以卡尔曼滤波推导为学习样例,然后加入个人的一些理解分析
(1)卡尔曼、扩展卡尔曼、粒子滤波到底什么关系?
徐亦达老师的卡尔曼滤波的推导视频里强调了这几个滤波的关系,如下:
模型类型 | p ( x k ∣ x k − 1 ) p\left(x_{k} \mid x_{k-1}\right) p(xk∣xk−1) | p ( y t ∣ x t ) p(y_t \mid x_t) p(yt∣xt) | p ( x 1 ) p(x_1) p(x1) | 说明 |
---|---|---|---|---|
离散状态动态模型 | A x t + B u t Ax_t+Bu_t Axt+But | H x t Hx_t Hxt | π \pi π | 隐马尔科夫模型,无滤波 |
线性高斯动态模型 | N ( A x t + B u t + δ , Q ) N(Ax_t+Bu_t+\delta, Q) N(Axt+But+δ,Q) | N ( H x t + c , R ) N(Hx_t+c, R) N(Hxt+c,R) | N ( μ , σ ) N(\mu,\sigma) N(μ,σ) | 卡尔曼滤波 |
非线性非高斯动态模型 | f ( x t − 1 ) f(x_{t-1}) f(xt−1) | g ( x t − 1 ) g(x_{t-1}) g(xt−1) | f ( x 0 ) f(x_0) f(x0) | 粒子滤波 |
首先什么是动态模型呢? | ||||
这个就是状态模型,在离散状态下就是大名鼎鼎的隐马尔科夫模型,在机器学习范畴内非常有效的一种模型,而当我们的状态转移方程和观测方程都变成线性高斯模型之后,这时候处理最有效的方式之一就是卡尔曼滤波,而扩展卡尔曼呢?当动态模型都为非线性高斯模型是就是用扩展卡尔曼滤波(其基本思路就是将非线性模型线性化),而最后最复杂的是非线性非高斯模型,怎么办呢?粒子滤波咯,粒子滤波我写了一个同款博客,欢迎参考概率机器人总结——粒子滤波先实践再推导,这就是他们之间的关系。 |
(2)实践——扩展卡尔曼滤波
首先给出线性高斯动态模型的状态转移方程和观测方程,如下:
x
t
=
A
t
x
t
−
1
+
B
t
u
t
+
ε
t
x_{t}=A_{t} x_{t-1}+B_{t} u_{t}+\varepsilon_{t}
xt=Atxt−1+Btut+εt
z
t
=
C
t
x
t
+
δ
t
z_{t}=C_{t} x_{t}+\delta_{t}
zt=Ctxt+δt
其中
ε
t
\varepsilon_{t}
εt和
δ
t
\delta_{t}
δt分别为满足零均值高斯分布的噪声。
然后,我们从卡尔曼滤波的公式开始,如下:
μ
‾
t
=
A
t
μ
t
−
1
+
B
t
u
t
Σ
‾
t
=
A
t
Σ
t
−
1
A
t
T
+
R
t
K
t
=
Σ
‾
t
C
t
T
(
C
t
Σ
‾
t
C
t
T
+
Q
t
)
−
1
μ
t
=
μ
‾
t
+
K
t
(
z
t
−
C
t
μ
‾
t
)
Σ
t
=
(
I
−
K
t
C
t
)
Σ
‾
t
\begin{aligned} \overline{\mu}_{t} &=A_{t} \mu_{t-1}+B_{t} u_{t} \\ \overline{\Sigma}_{t} &=A_{t} \Sigma_{t-1} A_{t}^{T}+R_{t} \\ K_{t} &=\overline{\Sigma}_{t} C_{t}^{T}\left(C_{t} \overline{\Sigma}_{t} C_{t}^{T}+Q_{t}\right)^{-1} \\ \mu_{t} &=\overline{\mu}_{t}+K_{t}\left(z_{t}-C_{t} \overline{\mu}_{t}\right) \\ \Sigma_{t} &=\left(I-K_{t} C_{t}\right) \overline{\Sigma}_{t} \end{aligned}
μtΣtKtμtΣt=Atμt−1+Btut=AtΣt−1AtT+Rt=ΣtCtT(CtΣtCtT+Qt)−1=μt+Kt(zt−Ctμt)=(I−KtCt)Σt
如果没有接触过卡尔曼滤波,第一次看到这些公式会觉得怎么这么复杂,学明白之后发现其实还是蛮简单的,这里先简单说下对这个公式的理解
第一个公式和均值(期望)有关,指的是通过上一个状态的均值
μ
t
−
1
\mu_{t-1}
μt−1和控制量以及状态转移方程预测出下一个状态的均值
μ
‾
t
\overline{\mu}_{t}
μt
第二个公式和方差有关,指的是根据上一个状态的方差
Σ
t
−
1
\Sigma_{t-1}
Σt−1和噪声的方差
R
t
R_{t}
Rt预测出下一个状态的方差
Σ
‾
t
\overline{\Sigma}_{t}
Σt
注意高斯分布的状态的变量其实就均值和方差两个东西,通过第一步和第二步我们就完成了【预测过程】
第三个公式和卡尔曼增益有关,指的是通过观测方程及其噪声的方差计算卡尔曼增益
第四个公式和均值有关,指的是通过卡尔曼增益对预测出来的均值进行更新
第五个公式和方差有关,和第四步一样,指的是通过卡尔曼增益对预测出来方差进行更新
我们先计算了卡尔曼增益然后分别跟新了均值和方差两个东西,通过后面三步我们就完成了【更新过程】
好了,卡尔曼滤波搞清楚了,我们再来看下扩展卡尔曼滤波,首先给出非线性高斯动态模型的方程,如下:
x
t
=
g
(
u
t
,
x
t
−
1
)
+
ε
t
x_{t}=g\left(u_{t}, x_{t-1}\right)+\varepsilon_{t}
xt=g(ut,xt−1)+εt
z
t
=
h
(
x
t
)
+
δ
t
z_{t}=h\left(x_{t}\right)+\delta_{t}
zt=h(xt)+δt
同理,其中
ε
t
\varepsilon_{t}
εt和
δ
t
\delta_{t}
δt分别为满足零均值高斯分布的噪声。
μ
‾
t
=
g
(
u
t
,
μ
t
−
1
)
Σ
‾
t
=
G
t
Σ
t
−
1
G
t
T
+
R
t
K
t
=
Σ
‾
t
H
t
T
(
H
t
Σ
‾
t
H
t
T
+
Q
t
)
−
1
μ
t
=
μ
‾
t
+
K
t
(
z
t
−
h
(
μ
‾
t
)
)
Σ
t
=
(
I
−
K
t
H
t
)
Σ
‾
t
\begin{aligned} \overline{\mu}_{t} &=g\left(u_{t}, \mu_{t-1}\right) \\ \overline{\Sigma}_{t} &=G_{t} \Sigma_{t-1} G_{t}^{T}+R_{t} \\ K_{t} &=\overline{\Sigma}_{t} H_{t}^{T}\left(H_{t} \overline{\Sigma}_{t} H_{t}^{T}+Q_{t}\right)^{-1} \\ \mu_{t} &=\overline{\mu}_{t}+K_{t}\left(z_{t}-h\left(\overline{\mu}_{t}\right)\right) \\ \Sigma_{t} &=\left(I-K_{t} H_{t}\right) \overline{\Sigma}_{t} \end{aligned}
μtΣtKtμtΣt=g(ut,μt−1)=GtΣt−1GtT+Rt=ΣtHtT(HtΣtHtT+Qt)−1=μt+Kt(zt−h(μt))=(I−KtHt)Σt
和卡尔曼滤波一对比,发现简直一模一样,主要不同的是将状态转移方程中系数矩阵
A
t
,
C
t
A_t,C_t
At,Ct换成了非线性方程的雅克比矩阵
G
t
,
H
t
G_t,H_t
Gt,Ht,为什么是雅克比矩阵,这当然是和推导有关,我们可以先直观感受下,在《概率机器人》的推导过程中,在对状态转移的分布进行积分获状态的置信度时需要提取出来一个关键公式:
L
t
=
1
2
(
x
t
−
A
t
x
t
−
1
−
B
t
u
t
)
T
R
t
−
1
(
x
t
−
A
t
x
t
−
1
−
B
t
u
t
)
+
1
2
(
x
t
−
1
−
μ
t
−
1
)
T
Σ
t
−
1
−
1
(
x
t
−
1
−
μ
t
−
1
)
\begin{aligned} L_{t}=& \frac{1}{2}\left(x_{t}-A_{t} x_{t-1}-B_{t} u_{t}\right)^{\mathrm{T}} R_{t}^{-1}\left(x_{t}-A_{t} x_{t-1}-B_{t} u_{t}\right)+\\ & \frac{1}{2}\left(x_{t-1}-\mu_{t-1}\right)^{\mathrm{T}} \Sigma_{t-1}^{-1}\left(x_{t-1}-\mu_{t-1}\right) \end{aligned}
Lt=21(xt−Atxt−1−Btut)TRt−1(xt−Atxt−1−Btut)+21(xt−1−μt−1)TΣt−1−1(xt−1−μt−1)
而扩展卡尔曼滤波的这个对应的公式是
L
t
=
1
2
[
x
t
−
g
(
u
t
,
μ
t
−
1
)
−
G
t
(
x
t
−
1
−
μ
t
−
1
)
]
T
R
t
−
1
[
x
t
−
g
(
u
t
,
μ
t
−
1
)
−
G
t
(
x
t
−
1
−
μ
t
−
1
)
]
+
1
2
(
x
t
−
1
−
μ
t
−
1
)
T
Σ
t
−
1
−
1
(
x
t
−
1
−
μ
t
−
1
)
\begin{aligned} L_{t}=& \frac{1}{2}\left[x_{t}-g\left(\boldsymbol{u}_{t}, \boldsymbol{\mu}_{t-1}\right)-G_{t}\left(\boldsymbol{x}_{t-1}-\boldsymbol{\mu}_{t-1}\right)\right]^{\mathrm{T}} \boldsymbol{R}_{t}^{-1}\left[\boldsymbol{x}_{t}-g\left(\boldsymbol{u}_{t}, \boldsymbol{\mu}_{t-1}\right)-G_{t}\left(\boldsymbol{x}_{t-1}-\boldsymbol{\mu}_{t-1}\right)\right] \\ &+\frac{1}{2}\left(\boldsymbol{x}_{t-1}-\boldsymbol{\mu}_{t-1}\right)^{\mathrm{T}} \boldsymbol{\Sigma}_{t-1}^{-1}\left(\boldsymbol{x}_{\boldsymbol{t}-1}-\boldsymbol{\mu}_{t-1}\right) \end{aligned}
Lt=21[xt−g(ut,μt−1)−Gt(xt−1−μt−1)]TRt−1[xt−g(ut,μt−1)−Gt(xt−1−μt−1)]+21(xt−1−μt−1)TΣt−1−1(xt−1−μt−1)
我们发现状态
x
t
−
1
x_t-1
xt−1前的系数矩阵就是由
A
t
A_t
At变为了
G
t
G_t
Gt,但是这样理解可能还不够直观。
下面我们可以看下PythonRobotics中提供的拓展卡尔曼滤波的python代码是怎么写的
def ekf_estimation(xEst, PEst, z, u):
# Predict
xPred = motion_model(xEst, u)
jF = jacobF(xPred, u)
PPred = jF.dot(PEst).dot(jF.T) + R
# Update
jH = jacobH(xPred)
zPred = observation_model(xPred)
y = z.T - zPred
S = jH.dot(PPred).dot(jH.T) + Q
K = PPred.dot(jH.T).dot(np.linalg.inv(S))
xEst = xPred + K.dot(y)
PEst = (np.eye(len(xEst)) - K.dot(jH)).dot(PPred)
return xEst, PEst
我这里都不要太多解释,对应着公式看就能都对应上,这里比较有意思的一个点是代码为了追求简单采样了线性高斯动态模型来代替的非线性高斯动态模型,就是用扩展卡尔曼滤波来解了一个线性高斯动态模型,我们可以看下这个雅克比矩阵是怎么处理的,以状态转移方程为例:
def jacobF(x, u):
yaw = x[2, 0]
v = u[0, 0]
jF = np.array([
[1.0, 0.0, -DT * v * math.sin(yaw), DT * math.cos(yaw)],
[0.0, 1.0, DT * v * math.cos(yaw), DT * math.sin(yaw)],
[0.0, 0.0, 1.0, 0.0],
[0.0, 0.0, 0.0, 1.0]])
return jF
代码中这个矩阵是怎么来的呢?
首先状态转移方程的模型是这样的:
x
t
+
1
=
F
x
t
+
B
u
t
\mathbf{x}_{t+1}=F \mathbf{x}_{t}+B \mathbf{u}_{t}
xt+1=Fxt+But
其中
F
=
[
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
]
F=\left[ \begin{array}{llll}{1} & {0} & {0} & {0} \\ {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {0}\end{array}\right]
F=
1000010000100000
以及
B
=
[
cos
(
ϕ
)
d
t
0
sin
(
ϕ
)
d
t
0
0
d
t
1
0
]
B=\left[ \begin{array}{cc}{\cos (\phi) d t} & {0} \\ {\sin (\phi) d t} & {0} \\ {0} & {d t} \\ {1} & {0}\end{array}\right]
B=
cos(ϕ)dtsin(ϕ)dt0100dt0
然后雅克比矩阵的计算公式是
J
F
=
[
d
x
d
x
d
x
d
y
d
x
d
ϕ
d
x
d
v
d
y
d
x
d
y
d
y
d
y
d
ϕ
d
y
d
v
d
ϕ
d
x
d
ϕ
d
y
d
ϕ
d
ϕ
d
ϕ
d
v
d
v
d
x
d
v
d
y
d
v
d
ϕ
d
v
d
v
]
J_{F}=\left[ \begin{array}{cccc}{\frac{d x}{d x}} & {\frac{d x}{d y}} & {\frac{d x}{d \phi}} & {\frac{d x}{d v}} \\ {\frac{d y}{d x}} & {\frac{d y}{d y}} & {\frac{d y}{d \phi}} & {\frac{d y}{d v}} \\ {\frac{d \phi}{d x}} & {\frac{d \phi}{d y}} & {\frac{d \phi}{d \phi}} & {\frac{d \phi}{d v}} \\ {\frac{d v}{d x}} & {\frac{d v}{d y}} & {\frac{d v}{d \phi}} & {\frac{d v}{d v}}\end{array}\right]
JF=
dxdxdxdydxdϕdxdvdydxdydydydϕdydvdϕdxdϕdydϕdϕdϕdvdvdxdvdydvdϕdvdv
把所有变量都带进去就可以得到
J
F
=
[
1
0
−
v
sin
(
ϕ
)
d
t
cos
(
ϕ
)
d
t
0
1
v
cos
(
ϕ
)
d
t
sin
(
ϕ
)
d
t
0
0
1
0
0
0
0
1
]
J_{F}=\left[ \begin{array}{cccc}{1} & {0} & {-v \sin (\phi) d t} & {\cos (\phi) d t} \\ {0} & {1} & {v \cos (\phi) d t} & {\sin (\phi) d t} \\ {0} & {0} & {1} & {0} \\ {0} & {0} & {0} & {1}\end{array}\right]
JF=
10000100−vsin(ϕ)dtvcos(ϕ)dt10cos(ϕ)dtsin(ϕ)dt01
通过这个例子可以加深我们对扩展卡尔曼滤波的实际操作的理解。
然后代码运行的结果如下(建议读下源码,对理解很有帮助):
(3)推导——卡尔曼滤波
卡尔曼滤波的推导各有千秋,《概率机器人》上是直接对高斯分布的形式进行积分,然后通过求积分结果(正态分布)的极小值和方差获得预测或者下一状态的均值和方差,而徐亦达老师的视频课程是通过高斯形式的联合分布来给出结论的,但是给我印象最深的还是白巧克力亦唯心博主(贺博,大佬大佬…)给出来的推导过程,下面我基于鉴于博客的推导过程给出自己的理解。
首先给出运动方程和观测方程,这应该没什么问题:
x
k
=
A
x
k
−
1
+
B
u
k
−
1
+
w
k
−
1
(
1
)
x_{k}=A x_{k-1}+B u_{k-1}+w_{k-1}(1)
xk=Axk−1+Buk−1+wk−1(1)
z
k
=
H
x
k
+
v
k
(
2
)
z_{k}=H x_{k}+v_{k}(2)
zk=Hxk+vk(2)其中,
p
(
w
)
∼
N
(
0
,
Q
)
p(w) \sim N(0, Q)
p(w)∼N(0,Q),
p
(
v
)
∼
N
(
0
,
R
)
p(v) \sim N(0, R)
p(v)∼N(0,R)
我们首先明确,这两个方程我们都是已知的,我们能够通过运动方程得到理论预测(先验),然后我们又有观测数据,通过观测数据我们可以对理论预测进行修正,从而得到后验。
这里我们给出这样一个修正公式 x ^ k = x ^ k ′ + K k ( z k − z ^ k ) = x ^ k ′ + K k ( z k − H x ^ k ′ ) ( 3 ) \hat{x}_{k}=\hat{x}_{k}^{\prime}+K_{k}\left(z_{k}-\hat{z}_{k}\right)=\hat{x}_{k}^{\prime}+K_{k}\left(z_{k}-H \hat{x}_{k}^{\prime}\right)(3) x^k=x^k′+Kk(zk−z^k)=x^k′+Kk(zk−Hx^k′)(3)其中, x ^ k ′ \hat{x}_{k}^{\prime} x^k′是我们理论预测值(先验), x ^ k \hat{x}_{k} x^k是我们修正后的估计值(后验), z ^ k \hat{z}_{k} z^k是测量值的预测值(就是将我们的状态预测值, x ^ k ′ \hat{x}_{k}^{\prime} x^k′带入观测方程得到的结果), z k z_{k} zk就是我们实际的测量值, ( z k − H x ^ k ′ ) \left(z_{k}-H \hat{x}_{k}^{\prime}\right) (zk−Hx^k′)就是残差。
这里通过协方差矩阵往下推,首先给出估计值和真实值之前的协方差矩阵: P k = E [ e k e k T ] = E [ ( x k − x ^ k ) ( x k − x ^ k ) T ] ( 4 ) P_{k}=E\left[e_{k} e_{k}^{T}\right]=E\left[\left(x_{k}-\hat{x}_{k}\right)\left(x_{k}-\hat{x}_{k}\right)^{T}\right](4) Pk=E[ekekT]=E[(xk−x^k)(xk−x^k)T](4)将上文的(3)式和(2)式代入得 P k = E [ [ ( I − K k H ) ( x k − x ^ k ′ ) − K k v k ] [ ( I − K k H ) ( x k − x ^ k ′ ) − K k v k ] T ] ( 5 ) P_{k}=E\left[\left[\left(I-K_{k} H\right)\left(x_{k}-\hat{x}_{k}^{\prime}\right)-K_{k} v_{k}\right]\right.\left[\left(I-K_{k} H\right)\left(x_{k}-\hat{x}_{k}^{\prime}\right)-K_{k} v_{k}\right]^{T} ](5) Pk=E[[(I−KkH)(xk−x^k′)−Kkvk][(I−KkH)(xk−x^k′)−Kkvk]T](5)然后我们给出理论预测值和真实值之间的协方差矩阵 P k ′ = E [ e k ′ e k ′ T ] = E [ ( x k − x ^ k ′ ) ( x k − x ^ k ′ ) T ] P_{k}^{\prime}=E\left[e_{k}^{\prime} e_{k}^{\prime T}\right]=E\left[\left(x_{k}-\hat{x}_{k}^{\prime}\right)\left(x_{k}-\hat{x}_{k}^{\prime}\right)^{T}\right] Pk′=E[ek′ek′T]=E[(xk−x^k′)(xk−x^k′)T]展开(5)式得 P k = ( I − K k H ) E [ ( x k − x ^ k ′ ) ( x k − x ^ k ′ ) T ] ( I − K k H ) + K k E [ v k v k T ] K k T P_{k}=\left(I-K_{k} H\right) E\left[\left(x_{k}-\hat{x}_{k}^{\prime}\right)\left(x_{k}-\hat{x}_{k}^{\prime}\right)^{T}\right]\left(I-K_{k} H\right)+\quad K_{k} E\left[v_{k} v_{k}^{T}\right] K_{k}^{T} Pk=(I−KkH)E[(xk−x^k′)(xk−x^k′)T](I−KkH)+KkE[vkvkT]KkT得 P k = ( I − K k H ) P k ′ ( I − K k H ) T + K k R K k T P_{k}=\left(I-K_{k} H\right) P_{k}^{\prime}\left(I-K_{k} H\right)^{T}+K_{k} R K_{k}^{T} Pk=(I−KkH)Pk′(I−KkH)T+KkRKkT得 P k = P k ′ − K k H P k ′ − P k ′ H T K k T + K k ( H P k ′ H T + R ) K k T P_{k}=P_{k}^{\prime}-K_{k} H P_{k}^{\prime}-P_{k}^{\prime} H^{T} K_{k}^{T}+K_{k}\left(H P_{k}^{\prime} H^{T}+R\right) K_{k}^{T} Pk=Pk′−KkHPk′−Pk′HTKkT+Kk(HPk′HT+R)KkT协方差的矩阵的对角线元素就是方差,我们对上式所有对角线元素求和,求和结果满足下式 T [ P k ] = T [ P k ′ ] − 2 T [ K k H P k ′ ] + T [ K k ( H P k ′ H T + R ) K k T ] T\left[P_{k}\right]=T\left[P_{k}^{\prime}\right]-2 T\left[K_{k} H P_{k}^{\prime}\right]+T\left[K_{k}\left(H P_{k}^{\prime} H^{T}+R\right) K_{k}^{T}\right] T[Pk]=T[Pk′]−2T[KkHPk′]+T[Kk(HPk′HT+R)KkT]我们求一个K使得最小均方误差最小,于是对上式求导有 d T [ P k ] d K k = − 2 ( H P k ′ ) T + 2 K k ( H P k ′ H T + R ) \frac{d T\left[P_{k}\right]}{d K_{k}}=-2\left(H P_{k}^{\prime}\right)^{T}+2 K_{k}\left(H P_{k}^{\prime} H^{T}+R\right) dKkdT[Pk]=−2(HPk′)T+2Kk(HPk′HT+R) K k = P k ′ H T ( H P k ′ H T + R ) − 1 K_{k}=P_{k}^{\prime} H^{T}\left(H P_{k}^{\prime} H^{T}+R\right)^{-1} Kk=Pk′HT(HPk′HT+R)−1当当当!这就是卡尔曼增益啦,卡尔曼增益里面包含了一个我们前文提到过的 P k ′ P_{k}^{\prime} Pk′(预测值与真实值之间的协方差矩阵),它是怎么求的呢?通过我们预测过程求解出来的: P k + 1 ′ = E [ e k + 1 T e k + 1 T ′ ] = E [ ( x k + 1 − x ^ k + 1 ′ ) ( x k + 1 − x ^ k + 1 ′ ) r ] = E [ ( A ( x k − x ^ k ) + ω k ) ( A ( x k − x ^ k ) + ω k t ) r ] = E [ ( A e k ) ( A e k ) r ] + E [ ω k ω k T ] = A P k A T + Q \begin{aligned} P_{k+1}^{\prime} &=E\left[e_{k+1}^{T} e_{k+1}^{T \prime}\right] \\ &=E\left[\left(x_{k+1}-\hat{x}_{k+1}^{\prime}\right)\left(x_{k+1}-\hat{x}_{k+1}^{\prime}\right)^{r}\right] \\ &=E\left[\left(A\left(x_{k}-\hat{x}_{k}\right)+\omega_{k}\right)\left(A\left(x_{k}-\hat{x}_{k}\right)+\omega_{k t}\right)^{r}\right] \\ &=E\left[\left(A e_{k}\right)\left(A e_{k}\right)^{r}\right]+E\left[\omega_{k} \omega_{k}^{T}\right] \\ &=A P_{k} A^{T}+Q \end{aligned} Pk+1′=E[ek+1Tek+1T′]=E[(xk+1−x^k+1′)(xk+1−x^k+1′)r]=E[(A(xk−x^k)+ωk)(A(xk−x^k)+ωkt)r]=E[(Aek)(Aek)r]+E[ωkωkT]=APkAT+Q倒数第三步到倒数第二步的原因是状态变量与噪声独立,到这里卡尔曼滤波中的所有公式都可解释了,是不是很爽快!
(4)顺便问一句,如何通过卡尔曼滤波进行多传感器融合?
扩展卡尔曼滤波EKF与多传感器融合这个博客简单地讲清楚了这个问题,如下两张PPT所示:
如果卡尔曼滤波搞得差不多清楚了的话这两张图就很好理解了,Predicition预测的方式是相同的,Update更新是他们的测量方程不同,例如这篇博客中举的例子,对于激光而言,观测矩阵如下:
z
=
H
x
+
R
=
[
1
0
0
0
0
1
0
0
]
[
p
x
p
y
v
x
v
y
]
+
[
0.0225
0
0
0.0225
]
z =H x+R=\left[ \begin{array}{cccc}{1} & {0} & {0} & {0} \\ {0} & {1} & {0} & {0}\end{array}\right] \left[ \begin{array}{c}{p_{x}} \\ {p_{y}} \\ {v_{x}} \\ {v_{y}}\end{array}\right]+\left[ \begin{array}{cc}{0.0225} & {0} \\ {0} & {0.0225}\end{array}\right]
z=Hx+R=[10010000]
pxpyvxvy
+[0.0225000.0225]对于雷达而言
z
=
f
(
x
)
+
R
=
[
ρ
ϕ
ρ
˙
]
=
[
p
x
2
+
p
y
2
arctan
p
y
p
x
p
x
v
x
+
p
y
v
y
p
x
2
+
p
y
2
]
+
[
0.09
0
0
0
0.0009
0
0
0
0.09
]
z=f(x)+R=\left[ \begin{array}{c}{\rho} \\ {\phi} \\ {\dot{\rho}}\end{array}\right]=\left[ \begin{array}{c}{\sqrt{p_{x}^{2}+p_{y}^{2}}} \\ {\arctan \frac{p_{y}}{p_{x}}} \\ {\frac{p_{x} v_{x}+p_{y} v_{y}}{\sqrt{p_{x}^{2}+p_{y}^{2}}}}\end{array}\right]+\left[ \begin{array}{ccc}{0.09} & {0} & {0} \\ {0} & {0.0009} & {0} \\ {0} & {0} & {0.09}\end{array}\right]
z=f(x)+R=
ρϕρ˙
=
px2+py2arctanpxpypx2+py2pxvx+pyvy
+
0.090000.00090000.09
因此在扩展卡尔曼滤波的更新过程中就会不一样,在工程实践方面肯定还存在这许多实践细节要注意,这里就不在细究,之后遇到实际项目时再进一步考虑。
就到这里啦,有问题欢迎交流~
此外,对SLAM算法感兴趣的同学可以看考我的博客SLAM算法总结——经典SLAM算法框架总结