目标跟踪基础——3.卡尔曼滤波
卡尔曼滤波中重要的值有两个, 一个是上一个时刻的估计值(它是由上一时刻进行估计计算得出), 另外一个就是当前时刻的测量值或者叫做观测值(它可以是通过传感器获取得到)。
在卡尔曼滤波算法的过程中, 首先我们需要设定预测和估计的初始值, 以及其中的一些参数:
A/F: 状态转移矩阵
B : 控制系统参数,控制系统矩阵
u : 系统的输入或者是控制量
P : 状态估计协方差矩阵
K : 卡尔曼增益,用于估计值更新时的后验估计
H : 测量系统的参数, 状态观测矩阵
I: 通过先验P矩阵更新后验P矩阵的参数,一般为单位矩阵
Q:P矩阵计算中的超参数
R : 卡尔曼增益K计算时的超参数
预测 更新 x ^ t − = F x ^ t − 1 + B u t − 1 K t = P t − H T ( H P t − H T + R ) − 1 P t − = F P t − 1 F T + Q x ^ t = x ^ t − + K t ( z t − H x ^ t − ) P t = ( I − K t H ) P t − \begin{array}{c|c} \text{预测} & \text{更新}\\ \hline \hat{x}_{t}^{-}=F \hat{x}_{t-1}+B u_{t-1} & K_{t}=P_{t}^{-} H^{T}\left(H P_{t}^{-} H^{T}+R\right)^{-1} \\ P_{t}^{-}=F P_{t-1} F^{T}+Q & \hat{x}_{t}=\hat{x}_{t}^{-}+K_{t}\left(z_{t}-H \hat{x}_{t}^{-}\right)\\ & P_{t}=\left(I-K_{t} H\right) P_{t}^{-} \end{array} 预测x^t−=Fx^t−1+But−1Pt−=FPt−1FT+Q更新Kt=Pt−HT(HPt−HT+R)−1x^t=x^t−+Kt(zt−Hx^t−)Pt=(I−KtH)Pt−
对状态转移的理解:
假设一辆小车在路上行驶, 那么我们要求当前行驶的路程
x
k
x_k
xk 的话, 就可以用上一时刻小车行驶的路程
x
k
−
1
x_{k-1}
xk−1 来计算:
x
k
=
x
k
−
1
+
v
∗
d
t
x_k=x_{k-1}+v * d t
xk=xk−1+v∗dt
其中, v 代表小车行驶的速度,dt 代表一个时刻的单位时间, 这时候小车行驶路程的状态就从上一时刻转移到了当前时刻, 这个例子中的状态转移矩阵F 就是 1 , 而v 则是状态控制量 u,dt 则是控制系统矩阵B, 如果我们将小车行驶中的风阻等因素考虑进去的话, 此时这个系统中小车行驶路程的计算方程就是:
x
k
=
x
k
−
1
+
v
∗
d
t
+
w
k
x_k=x_{k-1}+v * d t+w_k
xk=xk−1+v∗dt+wk
w
k
w_k
wk就是 k 时刻下的风阻等因素, 也可以叫做这个系统中的噪声。
在目标跟踪中,我们可以将初始状态X设定为
[
x
,
y
,
w
,
h
,
d
x
,
d
y
]
T
[x,y,w,h,dx,dy]^T
[x,y,w,h,dx,dy]T ,其中x,y,w,h分别代表检测框的中心点坐标和宽高,dx和dy分别为x和y的运动估计量,这时候我们的状态转移矩阵就可以设为:
[
1
0
0
0
1
0
0
1
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
]
\left[\begin{array}{cc} 1&0&0&0&1&0 \\ 0&1&0&0&0&1 \\ 0&0&1&0&0&0 \\ 0&0&0&1&0&0 \\ 0&0&0&0&1&0 \\ 0&0&0&0&0&1 \end{array}\right]
100000010000001000000100100010010001
由于目标跟踪模型中是不存在输入的,所以我们只需要将它与(k-1)时刻的状态进行矩阵运算就能够得到当前时刻的先验估计值:
x
k
=
x
k
−
1
∗
F
=
[
1
0
0
0
1
0
0
1
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
]
∗
[
x
,
y
,
w
,
h
,
d
x
,
d
y
]
T
=
[
x
+
d
x
,
y
+
d
y
,
w
,
h
,
d
x
,
d
y
]
T
x_k = x_{k-1} * F = \left[\begin{array}{cc} 1&0&0&0&1&0 \\ 0&1&0&0&0&1 \\ 0&0&1&0&0&0 \\ 0&0&0&1&0&0 \\ 0&0&0&0&1&0 \\ 0&0&0&0&0&1 \end{array}\right] * [x,y,w,h,dx,dy]^T = [x+dx,y+dy,w,h,dx,dy]^T
xk=xk−1∗F=
100000010000001000000100100010010001
∗[x,y,w,h,dx,dy]T=[x+dx,y+dy,w,h,dx,dy]T
显然,(k-1)时刻的状态
x
k
−
1
x_{k−1}
xk−1通过与状态转移矩阵运算就将中心点坐标加上了对应的运动估计量,这时候我们就用卡尔曼滤波中的状态转移矩阵通过上一时刻的估计值计算出了当前的估计值。
卡尔曼滤波流程:
1.先验估计:通过先验估计方程将当前时刻的估计值计算出来
x
^
t
−
=
F
x
^
t
−
1
+
B
u
t
−
1
{\hat{x}_t}^- = F\hat{x}_{t-1} + Bu_{t-1}
x^t−=Fx^t−1+But−1
2.先验估计协方差:更新先验估计协方差矩阵
P
t
−
=
F
P
t
−
1
F
T
+
Q
P_t^- = FP_{t-1}F^T + Q
Pt−=FPt−1FT+Q
3.测量方程:通过测量方程更新测量值
z
t
=
H
x
t
+
v
z_t = Hx_t + v
zt=Hxt+v
4.更新卡尔曼增益:更新当前时刻的卡尔曼增益值
K
t
=
P
t
−
H
T
H
P
t
−
H
T
+
R
K_t = \frac{P_t^-H^T}{HP_t^-H^T + R}
Kt=HPt−HT+RPt−HT
5.修正估计:根据测量方程和当前时刻的卡尔曼增益
K
t
K_t
Kt修正当前估计值,得到当前时刻的最优估计值
x
^
t
=
x
^
t
−
+
K
t
(
z
t
−
H
x
^
t
−
)
\hat{x}_t = \hat{x}_t^- + K_t(z_t - H\hat{x}_t^-)
x^t=x^t−+Kt(zt−Hx^t−)
6.更新后验估计协方差:最后更新后验估计协方差矩阵
P
t
=
(
I
−
K
t
H
)
P
t
−
P_t = (I - K_tH)P_t^-
Pt=(I−KtH)Pt−
估计方式:在卡尔曼滤波过程中,如果测量值未丢失就使用修正后的测量值作为最终的结果,但如果测量值丢失,将会使用上一时刻运动状态估计出当前的估计值作为最终的结果,也就是说如果测量值丢失时仅仅有先验估计一步操作,此时卡尔曼增益和先验后验协方差矩阵都不会更新。
{
测量值未丢失:
完整流程,卡尔曼增益和先验后验协方差矩阵都正常更新
测量值丢失:
仅进行第一步流程更新当前估计值,卡尔曼增益和先验后验协方差矩阵都不会更新
}
\begin{Bmatrix} 测量值未丢失:& 完整流程,卡尔曼增益和先验后验协方差矩阵都正常更新 \\ 测量值丢失: & 仅进行第一步流程更新当前估计值,卡尔曼增益和先验后验协方差矩阵都不会更新 \end{Bmatrix}
{测量值未丢失:测量值丢失:完整流程,卡尔曼增益和先验后验协方差矩阵都正常更新仅进行第一步流程更新当前估计值,卡尔曼增益和先验后验协方差矩阵都不会更新}