先引入状态估计的概率解释
SLAM过程可以由运动方程和观测方程来描述。假设在 t = 0 t = 0 t=0到 t = N t = N t=N的时间内,有位姿 x 0 , x 1 , . . . , x N {x_0},{x_1},...,{x_N} x0,x1,...,xN,并且有路标 y 1 , y 2 , . . . , y M {y_1},{y_2},...,{y_M} y1,y2,...,yM。运动和观测方程为:
{
x
k
=
f
(
x
k
−
1
,
u
k
)
+
w
k
k
=
1
,
…
,
N
z
k
,
j
=
h
(
y
j
,
x
k
)
+
v
k
,
j
j
=
1
,
…
,
M
\begin{cases}x_k=f\left(x_{k-1}, u_k\right)+w_k & k=1, \ldots, N \\ z_{k, j}=h\left(y_j, x_k\right)+v_{k, j} & j=1, \ldots, M\end{cases}
{xk=f(xk−1,uk)+wkzk,j=h(yj,xk)+vk,jk=1,…,Nj=1,…,M
注意:
- 观测方程中,只有当 x k x_k xk看到了 y j y_j yj时才会产生观测数据,否则没有。通常一个位置通常只能看到一小部分路标,且由于视觉SLAM特征点数量众多,所以实际中的观测方程数量会远大于运动方程。
- 在没有运动方程的情况下,整个优化问题就只由许多观测方程组成,相当于通过一组图像来恢复运动和结构。
每个方程都受噪声影响,所以要把这里的位姿 x x x和路标 y y y看成服从某种概率分布的随机变量,而不是一个数。由此问题变为:当拥有某些运动数据 u u u和观测数据 z z z时,如何确定状态变量 x , y x,y x,y的分布。进而如果得到了新时刻的数据,其分布又将怎样变化。
常见且合理情况下,假设状态量和噪声服从高斯分布,即程序中只需要储存它们的均值和协方差矩阵。问题就转变为:当存在一些运动数据和观测数据时,如何估计状态量的高斯分布。
由于位姿和路标点都是待估计的变量,改变记法,令
x
k
x_k
xk为k时刻的所有未知量,包括当前时刻的相机位姿和m个路标点。写为:
x
k
=
d
e
f
{
x
k
,
y
1
,
.
.
.
,
y
m
}
{x_k}\mathop = \limits^{def} \{ {x_k},{y_1},...,{y_m}\}
xk=def{xk,y1,...,ym}
同时把k时刻的所有观测记作
z
k
z_k
zk。于是运动方程和观测方程更简洁,不会出现
y
y
y(包含在
x
x
x中):
{
x
k
=
f
(
x
k
−
1
,
u
k
)
+
w
k
z
k
=
h
(
x
k
)
+
v
k
k
=
1
,
…
,
N
\left\{\begin{array}{l} x_k=f\left(x_{k-1}, u_k\right)+w_k \\ z_k=h\left(x_k\right)+v_k \end{array} \quad k=1, \ldots, N\right.
{xk=f(xk−1,uk)+wkzk=h(xk)+vkk=1,…,N
现在考虑k时刻情况,希望用过去0到k中的数据来估计现在的状态分布:
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
1
:
k
)
P({x_k}|{x_0},{u_{1:k}},{z_{1:k}})
P(xk∣x0,u1:k,z1:k)
下标0:k表示0时刻到k时刻的所有数据。
z
k
z_k
zk表示所有在k时刻的观测数据,可能不止一个。同时
x
k
x_k
xk实际上和
x
k
−
1
,
x
k
−
2
x_{k-1},x_{k-2}
xk−1,xk−2这些量都有关,只是没有显示地写出来。
按照贝叶斯法则,把
z
k
z_k
zk和
x
k
x_k
xk交换位置,有:
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
1
:
k
)
⏟
后验
=
P
(
x
k
,
x
0
,
u
1
:
k
,
z
1
:
k
)
P
(
x
0
,
u
1
:
k
,
z
1
:
k
)
=
P
(
z
k
∣
x
k
)
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
1
:
k
−
1
)
P
(
x
0
,
u
1
:
k
,
z
1
:
k
)
∝
P
(
z
k
∣
x
k
)
⏟
似然
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
1
:
k
−
1
)
⏟
先验
\begin{aligned} \underbrace{P\left(x_k \mid x_0, u_{1: k}, z_{1: k}\right)}_{\text {后验 }} & =\frac{P\left(x_k, x_0, u_{1: k}, z_{1: k}\right)}{P\left(x_0, u_{1: k}, z_{1: k}\right)}=\frac{P\left(z_k \mid x_k\right) P\left(x_k \mid x_0, u_{1: k}, z_{1: k-1}\right)}{P\left(x_0, u_{1: k}, z_{1: k}\right)} \\ & \propto \underbrace{P\left(z_k \mid x_k\right)}_{\text {似然 }} \underbrace{P\left(x_k \mid x_0, u_{1: k}, z_{1: k-1}\right)}_{\text {先验}} \end{aligned}
后验
P(xk∣x0,u1:k,z1:k)=P(x0,u1:k,z1:k)P(xk,x0,u1:k,z1:k)=P(x0,u1:k,z1:k)P(zk∣xk)P(xk∣x0,u1:k,z1:k−1)∝似然
P(zk∣xk)先验
P(xk∣x0,u1:k,z1:k−1)
似然由观测方程给定。至于先验部分,当前状态
x
k
x_k
xk是基于过去所有的状态估计得来的。至少是会受
x
k
−
1
x_{k-1}
xk−1的影响,以
x
k
−
1
x_{k-1}
xk−1时刻为条件概率展开:
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
1
:
k
−
1
)
=
∫
P
(
x
k
∣
x
k
−
1
,
x
0
,
u
1
:
k
,
z
1
:
k
−
1
)
P
(
x
k
−
1
∣
x
0
,
u
1
:
k
,
z
1
:
k
−
1
)
d
x
k
−
1
P({x_k}|{x_0},{u_{1:k}},{z_{1:k{\rm{ - 1}}}}){\rm{ = }}\int {P({x_k}|{x_{k - 1}},{x_0},{u_{1:k}},{z_{1:k{\rm{ - 1}}}})P({x_{k - 1}}|{x_0},{u_{1:k}},{z_{1:k{\rm{ - 1}}}})d{x_{k - 1}}}
P(xk∣x0,u1:k,z1:k−1)=∫P(xk∣xk−1,x0,u1:k,z1:k−1)P(xk−1∣x0,u1:k,z1:k−1)dxk−1
考虑更久的状态可以继续对此式展开,现在只关心k时刻可k-1时刻的情况。至此,已经给出了贝叶斯估计,因为上式没有具体的概率分布形式,无法实际操作它。
对这一步的后续处理,方法上有一些分歧。大体上存在若干种选择:
- 一种是假设马尔可夫性,简单的一阶马氏性认为,k时刻状态只与k-1时刻状态有关,与之前的无关,这样就得到以扩展卡尔曼滤波(EKF)为代表的滤波器方法。在滤波方法中,会从某时刻的状态估计推导到下一个时刻。
- 另一种方法是考虑k时刻状态与之前所有状态的关系,得到非线性优化为主体的优化框架,目前视觉SLAM的主流为非线性优化方法。
线性系统和卡尔曼滤波(KF)
假设马尔可夫性,当前时刻状态只和上一个时刻有关,即:
P
(
x
k
∣
x
k
−
1
,
x
0
,
u
1
:
k
,
z
1
:
k
−
1
)
→
P
(
x
k
∣
x
k
−
1
,
u
k
)
P
(
x
k
−
1
∣
x
0
,
u
1
⋅
k
,
z
1
⋅
k
−
1
)
→
P
(
x
k
−
1
∣
x
0
,
u
1
⋅
k
−
1
,
z
1
⋅
k
−
1
)
\begin{aligned} & P\left(x_k \mid x_{k-1}, x_0, u_{1: k}, z_{1: k-1}\right) \quad \rightarrow \quad P\left(x_k \mid x_{k-1}, u_k\right) \\ & P\left(x_{k-1} \mid x_0, u_{1 \cdot k}, z_{1 \cdot k-1}\right) \rightarrow P\left(x_{k-1} \mid x_0, u_{1 \cdot k-1}, z_{1 \cdot k-1}\right) \\ & \end{aligned}
P(xk∣xk−1,x0,u1:k,z1:k−1)→P(xk∣xk−1,uk)P(xk−1∣x0,u1⋅k,z1⋅k−1)→P(xk−1∣x0,u1⋅k−1,z1⋅k−1)
- 第一部分:由于k时刻状态与k-1之前的无关,所以简化成只与 x k − 1 x_{k-1} xk−1和 u k u_k uk有关的形式。
- 第二部分:考虑到k时刻的输入量 u k u_k uk与k-1时刻的状态无关,所以把 u k u_k uk拿掉。可以看到,这一项实际上就是k-1时刻的状态分布。
这一系列方程说明实际在做的事是“如何把k-1时刻的状态分布推导至k时刻”。即在程序运行期间只要维护一个状态量,对它不断地进行迭代和更新即可。如假设状态量服从高斯分布,那么只需要考虑维护状态量的均值和协方差即可。
从最简单的线性高斯系统开始,最后得到卡尔曼滤波器。明确了起点和终点之后再来考虑中间路线。线性高斯系统是指运动方程和观测方程可以由线性方程来描述:
{
x
k
=
A
k
x
k
−
1
+
u
k
+
w
k
z
k
=
C
k
x
k
+
v
k
k
=
1
,
…
,
N
\left\{\begin{array}{l} x_k=A_k x_{k-1}+u_k+w_k \\ z_k=C_k x_k+v_k \end{array} \quad k=1, \ldots, N\right.
{xk=Akxk−1+uk+wkzk=Ckxk+vkk=1,…,N
并假设所有的状态和噪声均满足高斯分布:
w
k
∼
N
(
0
,
R
k
)
v
k
∼
N
(
0
,
Q
k
)
w_k \sim N\left(0, R_k\right) \quad v_k \sim N\left(0, Q_k\right)
wk∼N(0,Rk)vk∼N(0,Qk)
现在利用马尔可夫性,假设知道了k-1时刻的后验状态估计
x
^
k
−
1
\hat{x}_{k-1}
x^k−1及协方差
P
^
k
−
1
\hat{P}_{k-1}
P^k−1,现在要根据k时刻的输入和观测数据,确定
x
k
x_k
xk的后验分布。未区分推导中的先验和后验,假设
x
^
k
\hat{x}_k
x^k表示后验,
x
ˇ
k
\v{x}_k
xˇk表示先验分布。
卡尔曼滤波第一步,通过运动方程确定
x
k
x_k
xk的先验分布。运动方程是线性的,而高斯分布线性变换后仍是高斯分布。所以有:
P
(
x
k
−
1
∣
x
0
,
u
1
:
k
,
z
1
:
k
−
1
)
∼
N
(
A
k
x
^
k
−
1
+
u
k
,
A
k
P
^
k
−
1
A
k
T
+
R
k
)
P\left(x_{k-1} \mid x_0, u_{1: k}, z_{1: k-1}\right) \sim N\left(A_k \hat{x}_{k-1}+u_k, A_k \hat{P}_{k-1} A_k^T+R_k\right)
P(xk−1∣x0,u1:k,z1:k−1)∼N(Akx^k−1+uk,AkP^k−1AkT+Rk)
这一步称为预测,显示了如何从上一个时刻的状态,根据输入信息(但是有噪声)推断当前时刻的状态分布。这个分布就是先验。记:
x
ˇ
k
=
A
k
x
^
k
−
1
+
u
k
P
ˇ
k
=
A
k
P
^
k
−
1
A
k
T
+
R
{\v {x }_k} = {A_k}{\hat{x}_{k - 1}} + {u_k} \quad {\v P _k} = {A_k}{\hat{P} _{k - 1}}A_k^T + R
xˇk=Akx^k−1+ukPˇk=AkP^k−1AkT+R
一方面,显然这一步状态的不确定性要变大,因为系统添加了噪声。另一方面,可以计算在某个状态下应该产生怎样的观测数据:
P
(
z
k
∣
x
k
)
∼
N
(
C
k
x
k
,
Q
k
)
P({z_k}|{x_k}) \sim N({C_k}{x_k},{Q_k})
P(zk∣xk)∼N(Ckxk,Qk)
为了得到后验概率,想要计算它们的乘积,即公式:
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
1
:
k
)
⏟
后验
∝
P
(
z
k
∣
x
k
)
⏟
似然
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
1
:
k
−
1
)
⏟
先验
\underbrace{P\left(x_k \mid x_0, u_{1: k}, z_{1: k}\right)}_{\text {后验 }} \propto \underbrace{P\left(z_k \mid x_k\right)}_{\text {似然 }} \underbrace{P\left(x_k \mid x_0, u_{1: k}, z_{1: k-1}\right)}_{\text {先验}}
后验
P(xk∣x0,u1:k,z1:k)∝似然
P(zk∣xk)先验
P(xk∣x0,u1:k,z1:k−1)
虽然最后会得到一个关于
x
k
x_k
xk的高斯分布,但是计算有一点麻烦,先把结果设为
x
k
∼
N
(
x
ˇ
k
,
P
ˇ
k
)
{x_k} \sim N({\v {x} _k},\v {P}_k)
xk∼N(xˇk,Pˇk),那么:
N
(
x
^
k
,
P
^
k
)
=
η
⋅
N
(
C
k
x
k
,
Q
)
⋅
N
(
x
ˇ
k
,
P
^
k
)
N(\hat{x}_k,\hat{P}_k) = \eta \cdot N({C_k}{x_k},Q) \cdot N(\v {x} _k,\hat {P} _k)
N(x^k,P^k)=η⋅N(Ckxk,Q)⋅N(xˇk,P^k)
用稍微讨巧的方法。已经知道等式两侧都是高斯分布,就只需比较指数部分,无需理会高斯分布前面的因子部分。指数部分很像一个二次型的配方,推导一下,先把指数部分展开:
(
x
k
−
x
^
k
)
T
P
^
k
−
1
(
x
k
−
x
^
k
)
=
(
z
k
−
C
k
x
k
)
T
Q
k
−
1
(
z
k
−
C
k
x
k
)
+
(
x
k
−
x
ˇ
k
)
T
P
ˇ
k
−
1
(
x
k
−
x
ˇ
k
)
\left(x_k-\hat{x}_k\right)^T \hat{P}_k^{-1}\left(x_k-\hat{x}_k\right)=\left(z_k-C_k x_k\right)^T Q_k^{-1}\left(z_k-C_k x_k\right)+\left(x_k-\v {x} _k\right)^T \v {P} _k^{-1}\left(x_k-\v {x} _k\right)
(xk−x^k)TP^k−1(xk−x^k)=(zk−Ckxk)TQk−1(zk−Ckxk)+(xk−xˇk)TPˇk−1(xk−xˇk)
这里的等号并不严格,实际允许相差与
x
k
x_k
xk无关的常数。为了求得左侧的
x
^
k
,
P
^
k
\hat{x}_k,\hat{P}_k
x^k,P^k,将两边展开。比较
x
k
x_k
xk的二次和一次系数。
对于二次项系数,有:
P
^
k
−
1
=
C
k
T
Q
k
−
1
C
k
+
P
ˇ
k
−
1
\hat{P}_k^{-1}=C_k^T Q_k^{-1} C_k+ \v{P} _k^{-1}
P^k−1=CkTQk−1Ck+Pˇk−1
该式给出了协方差矩阵的计算过程。为了便于后面的式子,定义中间变量:
K
=
P
^
k
C
k
T
Q
k
−
1
K=\hat{P}_k C_k^T Q_k^{-1}
K=P^kCkTQk−1
将
P
^
k
−
1
=
C
k
T
Q
k
−
1
C
k
+
P
ˇ
k
−
1
\hat{P}_k^{-1}=C_k^T Q_k^{-1} C_k+ \v{P} _k^{-1}
P^k−1=CkTQk−1Ck+Pˇk−1两边左乘
P
^
k
\hat{P}_k
P^k,有
I
=
P
^
k
C
k
T
Q
k
−
1
C
k
+
P
^
k
P
ˇ
k
−
1
=
K
C
k
+
P
^
k
P
ˇ
k
−
1
I = \hat{P}_kC_k^T Q_k^{-1} C_k + \hat{P}_k \v{P} _k^{-1} = K C_k + \hat{P}_k \v{P} _k^{-1}
I=P^kCkTQk−1Ck+P^kPˇk−1=KCk+P^kPˇk−1
于是有:
P
^
k
=
(
I
−
K
C
k
)
P
ˇ
k
\hat{P}_k = (I - K C_k )\v{P} _k
P^k=(I−KCk)Pˇk
这里有点循环定义的意思,由
P
^
k
\hat{P}_k
P^k定义了
K
K
K,又把
P
^
k
\hat{P}_k
P^k写成了
K
K
K的表达式。而实际中
K
K
K可以不依靠
P
^
k
\hat{P}_k
P^k算得(需要用到SMW公式):
K
=
P
ˇ
k
C
k
T
(
C
k
P
ˇ
k
C
k
T
+
Q
k
)
−
1
K=\v {P} _k C_k^T ( C_k \v{P} _k C_k^T + Q_k)^{-1}
K=PˇkCkT(CkPˇkCkT+Qk)−1
再比较一次项系数,有:
−
2
x
^
k
T
P
^
k
−
1
x
k
=
−
2
z
k
T
Q
k
−
1
C
k
x
k
−
2
x
ˇ
k
T
P
ˇ
k
−
1
x
k
-2\hat{x}_k^T \hat{P}_k^{-1}x_k=-2 z_k^T Q_k^{-1}C_k x_k -2 \v{x} _k^T \v{P} _k^{-1}x_k
−2x^kTP^k−1xk=−2zkTQk−1Ckxk−2xˇkTPˇk−1xk
取系数并转置得:
P
^
k
−
1
x
^
k
=
C
k
T
Q
k
−
1
z
k
+
P
ˇ
k
−
1
x
ˇ
k
\hat{P}_k^{-1}\hat{x}_k= C_k^T Q_k^{-1} z_k+ \v{P} _k^{-1} \v{x} _k
P^k−1x^k=CkTQk−1zk+Pˇk−1xˇk
两侧左乘
P
^
k
\hat{P}_k
P^k,得:
x
^
k
=
P
^
k
C
k
T
Q
k
−
1
z
k
+
P
^
k
P
ˇ
k
−
1
x
ˇ
k
\hat{x}_k = \hat{P}_kC_k^T Q_k^{-1} z_k+ \hat{P}_k\v{P} _k^{-1} \v{x} _k
x^k=P^kCkTQk−1zk+P^kPˇk−1xˇk
x
^
k
=
P
^
k
C
k
T
Q
k
−
1
z
k
+
P
^
k
P
ˇ
k
−
1
x
ˇ
k
=
K
z
k
+
(
I
−
K
C
k
)
x
ˇ
k
=
x
ˇ
k
+
K
(
z
k
−
C
k
x
ˇ
k
)
\begin{aligned} \hat{x}_k &= \hat{P}_kC_k^T Q_k^{-1} z_k+ \hat{P}_k\v{P} _k^{-1} \v{x} _k \\ &= K z_k+ (I - K C_k ) \v{x} _k \\ &= \v{x} _k + K (z_k - C_k \v{x} _k ) \end{aligned}
x^k=P^kCkTQk−1zk+P^kPˇk−1xˇk=Kzk+(I−KCk)xˇk=xˇk+K(zk−Ckxˇk)
由此得到了后验均值得表示,上面两个步骤可以归纳为“预测”和“更新”。流程如下所示:
预测:
x ˇ k = A k x ^ k − 1 + u k P ˇ k = A k P ^ k − 1 A k T + R {\v{x }_k} = {A_k}{\hat{x}_{k - 1}} + {u_k} \quad {\v{P} _k} = {A_k}{\hat{P} _{k - 1}}A_k^T + R xˇk=Akx^k−1+ukPˇk=AkP^k−1AkT+R
更新:先计算K,它又称卡尔曼增益:
K = P ˇ k C k T ( C k P ˇ k C k T + Q k ) − 1 K=\v{P} _k C_k^T ( C_k \v{P} _k C_k^T + Q_k)^{-1} K=PˇkCkT(CkPˇkCkT+Qk)−1
然后计算后验概率分布:
x ^ k = x ˇ k + K ( z k − C k x ˇ k ) P ^ k = ( I − K C k ) P ˇ k \begin{aligned} \hat{x}_k &= \v{x} _k + K (z_k - C_k \v{x} _k ) \\ \hat{P}_k &= (I - K C_k )\v{P} _k \end{aligned} x^kP^k=xˇk+K(zk−Ckxˇk)=(I−KCk)Pˇk
至此从概率角度出发的最大后验概率估计方式推导了经典的卡尔曼滤波器的整个过程。在线性高斯系统中,卡尔曼滤波构成了该系统中的最大后验概率估计。由于高斯分布经过线性变换仍服从高斯分布,整个过程没有任何近似,可以说卡尔曼滤波器构成线性系统的最优无偏估计。
非线性系统和扩展卡尔曼滤波(EKF)
SLAM中的运动方程和观测方程通常是非线性函数,尤其是视觉SLAM中的相机模型。一个高斯分布,经过非线性变换后,往往不再是高斯分布,所以在非线性系统中,必须取一定的近似,将一个非高斯分布近似成高斯分布。
把卡尔曼滤波器的结果扩展到非线性系统中,称为扩展卡尔曼滤波器。通常的做法是在某个点附近考虑运动方程和观测方程一阶泰勒展开,只保留一阶项(线性部分),然后按照线性系统进行推导。
令
k
−
1
k-1
k−1时刻的的均值和协方差矩阵为
x
^
k
−
1
\hat{x} _{k-1}
x^k−1和
P
^
k
−
1
\hat{P} _{k-1}
P^k−1,在k时刻,把运动方程和观测方程在
x
^
k
−
1
\hat{x} _{k-1}
x^k−1和
P
^
k
−
1
\hat{P} _{k-1}
P^k−1处线性化(一阶泰勒展开),有:
x
k
≈
f
(
x
^
k
−
1
,
u
k
)
+
∂
f
∂
x
k
−
1
∣
x
^
k
−
1
(
x
k
−
1
−
x
^
k
−
1
)
+
w
k
x_k \approx f(\hat{x} _{k-1}, u_k)+\frac{\partial f}{\partial x_{k-1}}|_{\hat{x} _{k-1}}(x_{k-1}-\hat{x}_{k-1})+w_k
xk≈f(x^k−1,uk)+∂xk−1∂f∣x^k−1(xk−1−x^k−1)+wk
记这里的偏导数为:
F
=
∂
f
∂
x
k
−
1
∣
x
^
k
−
1
F = \frac{\partial f}{\partial x_{k-1}}|_{\hat{x} _{k-1}}
F=∂xk−1∂f∣x^k−1
同样,对于观测方程,有:
z
k
≈
h
(
x
ˇ
k
)
+
∂
h
∂
x
k
∣
x
ˇ
k
(
x
k
−
x
ˇ
k
)
+
n
k
z_k \approx h(\v{x} _k)+\frac{\partial h}{\partial x_k}|_{\v{x} _k}(x_k-\v{x}_k)+n_k
zk≈h(xˇk)+∂xk∂h∣xˇk(xk−xˇk)+nk
记这里的偏导数为:
H
=
∂
h
∂
x
k
∣
x
ˇ
k
H = \frac{\partial h}{\partial x_k}|_{\v{x} _k}
H=∂xk∂h∣xˇk
那么,在预测步骤中,根据运动方程有:
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
0
:
k
−
1
)
∼
N
(
f
(
x
^
k
−
1
,
u
k
)
,
F
P
^
k
−
1
F
T
+
R
k
)
P\left(x_k \mid x_0, u_{1: k}, z_{0: k-1}\right) \sim N\left( f(\hat{x} _{k-1}, u_k), F\hat{P} _{k-1}F^T+R_k\right)
P(xk∣x0,u1:k,z0:k−1)∼N(f(x^k−1,uk),FP^k−1FT+Rk)
这些推导与卡尔曼滤波十分相似。为方便表述,记这里的先验和协方差的均值为:
x
ˇ
k
=
f
(
x
^
k
−
1
,
u
k
)
P
ˇ
k
=
F
P
^
k
−
1
F
T
+
R
k
{\v{x }_k} = f(\hat{x} _{k-1}, u_k) \quad {\v{P} _k} = F\hat{P} _{k-1}F^T+R_k
xˇk=f(x^k−1,uk)Pˇk=FP^k−1FT+Rk
即观测为:
P
(
x
k
∣
x
0
,
u
1
:
k
,
z
0
:
k
−
1
)
∼
N
(
x
ˇ
k
,
P
ˇ
k
)
P\left(x_k \mid x_0, u_{1: k}, z_{0: k-1}\right) \sim N(\v{x }_k, {\v{P} _k} )
P(xk∣x0,u1:k,z0:k−1)∼N(xˇk,Pˇk)
然后,考虑在观测中有:
P
(
z
k
∣
x
k
)
∼
N
(
h
(
x
ˇ
k
)
+
H
(
x
k
−
x
ˇ
k
)
,
Q
k
)
P({z_k}|{x_k}) \sim N(h(\v{x} _k)+H(x_k-\v{x}_k),{Q_k})
P(zk∣xk)∼N(h(xˇk)+H(xk−xˇk),Qk)
最后,根据最开始的贝叶斯公式,可以推导 的后验概率形式。这里只介绍结果,简而言之,会先定义一个卡尔曼增益
K
k
K_k
Kk:
K
k
=
P
ˇ
k
H
T
(
H
P
ˇ
k
H
T
+
Q
k
)
−
1
K_k=\v{P} _k H^T ( H \v{P} _k H^T + Q_k)^{-1}
Kk=PˇkHT(HPˇkHT+Qk)−1
在卡尔曼增益的基础上,后验概率的形式为:
x
^
k
=
x
ˇ
k
+
K
k
(
z
k
−
h
(
x
ˇ
k
)
P
^
k
=
(
I
−
K
k
H
)
P
ˇ
k
\hat{x}_k = {\v{x} _k + K_k (z_k - h(\v{x} _k )} \quad {\hat{P}_k = (I - K_k H )\v{P} _k}
x^k=xˇk+Kk(zk−h(xˇk)P^k=(I−KkH)Pˇk
卡尔曼滤波器给出了在线性化之后状态变量分布的变化过程。在线性系统和高斯噪声下,卡尔曼给出了无偏最优估计。而在SLAM这种非线性情况下,它给出了单次线性近似下的最大后验估计。
EKF证明过程
把结果设为 x k ∼ N ( x ^ k , P ^ k ) {x_k} \sim N({\hat{x} _k},\hat{P}_k) xk∼N(x^k,P^k),那么:
N ( x ^ k , P ^ k ) = η ⋅ N ( h ( x ˇ k ) + H ( x k − x ˇ k ) , Q k ) ⋅ N ( x ˇ k , P ˇ k ) N(\hat{x}_k,\hat{P}_k) = \eta \cdot N(h(\v{x} _k)+H(x_k-\v{x}_k),{Q_k})\cdot N(\v{x} _k,\v{P} _k) N(x^k,P^k)=η⋅N(h(xˇk)+H(xk−xˇk),Qk)⋅N(xˇk,Pˇk)
即:
( x k − x ^ k ) T P ^ k − 1 ( x k − x ^ k ) = ( z k − [ h ( x ˇ k ) + H ( x k − x ˇ k ) ] k ) T Q k − 1 ( z k − [ h ( x ˇ k ) + H ( x k − x ˇ k ) ] k ) + ( x k − x ˇ k ) T P ˇ k − 1 ( x k − x ˇ k ) \left(x_k-\hat{x}_k\right)^T \hat{P}_k^{-1}\left(x_k-\hat{x}_k\right)=\left(z_k-[h(\v{x} _k)+H(x_k-\v{x}_k)]k\right)^T Q_k^{-1}\left(z_k-[h(\v{x} _k)+H(x_k-\v{x}_k)]k\right)+\left(x_k-\v{x} _k\right)^T \v{P} _k^{-1}\left(x_k-\v{x} _k\right) (xk−x^k)TP^k−1(xk−x^k)=(zk−[h(xˇk)+H(xk−xˇk)]k)TQk−1(zk−[h(xˇk)+H(xk−xˇk)]k)+(xk−xˇk)TPˇk−1(xk−xˇk)
定义:
K k = P ^ k H T Q k − 1 K_k=\hat{P}_k H^T Q_k^{-1} Kk=P^kHTQk−1
对于二次项系数:
P ^ k − 1 = H T Q k − 1 H + P ˇ k − 1 \hat{P}_k^{-1}=H^T Q_k^{-1} H+ \v{P} _k^{-1} P^k−1=HTQk−1H+Pˇk−1
两边同时左乘 P ^ k \hat{P}_k P^k,得:
I = K k H + P ^ k P ˇ k − 1 ↓ P ^ k = ( I − K k H ) P k ˇ \begin{gathered} I=K_k H+\hat{P}_k \v P_k^{-1} \\ \downarrow \\ \hat{P}_k=\left(I-K_k H\right) \v{P_k} \end{gathered} I=KkH+P^kPˇk−1↓P^k=(I−KkH)Pkˇ
对于一次项系数:
− 2 x ^ k T P ^ k − 1 x k = − 2 [ z k − h ( x ˇ k ) + H x ˇ k ] T Q k − 1 H x k − 2 x ˇ k T P ˇ k − 1 x k -2\hat{x}_k^T \hat{P}_k^{-1}x_k=-2[z_k-h(\v{x} _k)+H\v{x}_k]^T Q_k^{-1}Hx_k -2 \v{x} _k^T \v{P} _k^{-1}x_k −2x^kTP^k−1xk=−2[zk−h(xˇk)+Hxˇk]TQk−1Hxk−2xˇkTPˇk−1xk
取系数并转置:
P ^ k − 1 x ^ k = H T Q k − 1 [ z k − h ( x ˇ k ) + H x ˇ k ] + P ˇ k − 1 x ˇ k \hat{P}_k^{-1}\hat{x}_k =H^TQ_k^{-1}[z_k-h(\v{x} _k)+H\v{x}_k] + \v{P} _k^{-1}\v{x} _k P^k−1x^k=HTQk−1[zk−h(xˇk)+Hxˇk]+Pˇk−1xˇk
两侧左乘 P ^ k \hat{P}_k P^k,得:
x ^ k = P ^ k H T Q k − 1 [ z k − h ( x ˇ k ) + H x ˇ k ] + P ^ k P ˇ k − 1 x ˇ k = K k [ z k − h ( x ˇ k ) + H x ˇ k ] + ( I − K k H ) x ˇ k = x ˇ k + K K ( z k − h ( x ˇ k ) ) \begin{aligned} \hat{x}_k &= \hat{P}_kH^T Q_k^{-1}[z_k-h(\v{x} _k)+H\v{x}_k]+ \hat{P}_k\v{P} _k^{-1} \v{x} _k \\ &= K_k [z_k-h(\v{x} _k)+H\v{x}_k]+ (I - K_k H ) \v{x} _k \\ &= \v{x} _k + K_K (z_k-h(\v{x} _k)) \end{aligned} x^k=P^kHTQk−1[zk−h(xˇk)+Hxˇk]+P^kPˇk−1xˇk=Kk[zk−h(xˇk)+Hxˇk]+(I−KkH)xˇk=xˇk+KK(zk−h(xˇk))
总结
-
预测,根据运动方程估计先验概率分布 x ˇ k {\v{x }_k} xˇk和 P ˇ k {\v{P} _k} Pˇk。
-
更新,根据观测方程计算 K K K并更新后验概率分布 x ^ k \hat{x}_k x^k和 P ^ k \hat{P}_k P^k。