0 前言
为了克服UKF在高维情况下出现滤波精度低的问题,Arasaratnam 和Haykin基于Caubature求积分变换,提出了容积卡尔曼滤波CKF方法。后来众多学者又基于CKF,提出了很多改进版本,如平方根CKF。
对于高斯分布下的非线性滤波问题,实际上就求后验期望的积分。由于被积分函数表现为非线性后验分布与高斯概率密度的乘积,因此一般很难得到解析解。这也是线性系统下该积分可以得到解析解,即著名的卡尔曼滤波算法。
E
[
x
∣
z
]
=
∫
R
f
(
x
)
exp
(
−
x
T
x
)
d
x
E[x|z]=\int_Rf(x)\exp(-x^\text{T}x)dx
E[x∣z]=∫Rf(x)exp(−xTx)dx
因此针对该非线性函数的积分问题,产生了众多基于数值积分的滤波算法。如UKF通过确定性采样来传播分布的一二阶矩(均值和方差)。而CKF作为看另一种求积分近似方法,利用球面径向规则。
CKF和UKF比较:
当取 κ = 0 \kappa=0 κ=0时, CKF 和 UKF 的估计精度相同,但鉴于 CKF 采样点少,实时性比 UKF 好,故应选用 CKF 滤波算法;
当 n ≤ 2 n\leq2 n≤2时,即低维非线性系统, UKF 的估计精度高于 CKF,应选用 UKF 滤波算法;
当 n = 2 n=2 n=2时的非线性系统, UKF 及 CKF 的估计精度相同,但 CKF 的实时性更好,应选用 CKF 滤波算法;
当 n ≥ 3 n\geq3 n≥3时,即高维非线性系统, CKF 的估计精度高于 UKF,应选用 CKF 滤波算法。
1 问题描述(离散时间非线性系统描述)
考虑带加性噪声的一般非线性系统模型,
x
k
=
f
(
x
k
−
1
)
+
w
k
−
1
z
k
=
h
(
x
k
)
+
v
k
x_k=f(x_{k-1}) +w_{k-1} \\ z_k=h(x_k)+v_k
xk=f(xk−1)+wk−1zk=h(xk)+vk
其中
x
k
x_k
xk为
k
k
k时刻的目标状态向量。
z
k
z_k
zk为
k
k
k时刻观测向量(传感器数据)。这里不考虑控制器
u
k
u_k
uk。
w
k
w_k
wk和
v
k
v_k
vk分别是过程噪声序列和量测噪声序列,并假设
w
k
w_k
wk和
v
k
v_k
vk为零均值高斯白噪声,其方差分别为
Q
k
Q_k
Qk和
R
k
R_k
Rk的高斯白噪声,即
w
k
∼
N
(
0
,
Q
k
)
w_k\sim N(0,Q_k)
wk∼N(0,Qk),
v
k
∼
N
(
0
,
R
k
)
v_k\sim N(0,R_k)
vk∼N(0,Rk),且满足如下关系(线性高斯假设)为:
E
[
w
i
v
j
T
]
=
0
E
[
w
i
w
j
T
]
=
0
i
≠
j
E
[
v
i
v
j
T
]
=
0
i
≠
j
\begin{aligned} E[w_iv_j^\text{T}] &=0\\ E[w_iw_j^\text{T}] &=0\quad i\neq j \\ E[v_iv_j^\text{T}] &=0\quad i\neq j \end{aligned}
E[wivjT]E[wiwjT]E[vivjT]=0=0i=j=0i=j
2 带加性噪声的容积卡尔曼滤波算法CKF
(1) 初始化
步骤一:给定
k
−
1
k−1
k−1时刻的状态估计和协方差矩阵
x
^
k
−
1
∣
k
−
1
,
P
k
−
1
∣
k
−
1
,
Q
k
−
1
,
R
k
−
1
\hat{x}_{k-1|k-1},P_{k-1|k-1},Q_{k-1},R_{k-1}
x^k−1∣k−1,Pk−1∣k−1,Qk−1,Rk−1
当为
k
=
0
k=0
k=0时刻时,假设
x
0
∼
N
(
x
ˉ
0
,
P
0
)
,
Q
0
,
R
0
x_0\sim N(\bar{x}_0, P_0),Q_{0},R_{0}
x0∼N(xˉ0,P0),Q0,R0,则滤波器最优初始化为
x
^
0
∣
0
=
E
(
x
0
)
=
x
ˉ
0
P
0
∣
0
=
E
(
x
0
−
x
^
0
∣
0
)
(
x
0
−
x
^
0
∣
0
)
T
=
P
0
\hat{x}_{0|0}=E(x_0)=\bar{x}_0\\P_{0|0}=E(x_0-\hat{x}_{0|0})(x_0-\hat{x}_{0|0})^\text{T} =P_0
x^0∣0=E(x0)=xˉ0P0∣0=E(x0−x^0∣0)(x0−x^0∣0)T=P0
(2) 状态预测
步骤二:根据
k
−
1
k−1
k−1时刻的估计
x
^
k
−
1
∣
k
−
1
\hat{x}_{k-1|k-1}
x^k−1∣k−1和方差
P
k
−
1
∣
k
−
1
P_{k-1|k-1}
Pk−1∣k−1,产生容积点
P
k
−
1
∣
k
−
1
=
S
k
−
1
∣
k
−
1
S
k
−
∣
k
−
1
T
P_{k-1|k-1}=S_{k-1|k-1}S_{k-|k-1}^\text{T}
Pk−1∣k−1=Sk−1∣k−1Sk−∣k−1T
ξ i = m 2 [ 1 ] i , i = 1 , 2 , ⋯ , m = 2 n \xi_i=\sqrt{\frac{m}{2}}[\mathbf{1}]_i, i=1,2,\cdots,m=2n ξi=2m[1]i,i=1,2,⋯,m=2n
[
1
]
[\mathbf{1}]
[1]表示
n
n
n(
n
n
n维状态) 维空间的点集,即
[
1
]
=
[
I
n
×
n
−
I
n
×
n
]
[\mathbf{1}]=[I_{n\times n} \ \ \ \ -I_{n\times n}]
[1]=[In×n −In×n].
S
k
−
1
∣
k
−
1
=
P
k
−
1
∣
k
−
1
X
k
−
1
∣
k
−
1
i
=
x
^
k
−
1
∣
k
−
1
+
S
k
−
1
∣
k
−
1
ξ
i
\begin{aligned} &S_{k-1|k-1}=\sqrt{P_{k-1|k-1}}\\ &\mathcal{X}^i_{k-1|k-1}=\hat{x}_{k-1|k-1}+S_{k-1|k-1}\xi_i \end{aligned}
Sk−1∣k−1=Pk−1∣k−1Xk−1∣k−1i=x^k−1∣k−1+Sk−1∣k−1ξi
步骤三: 根据非线性模型进行容积点的非线性传播
X
k
∣
k
−
1
i
=
f
(
X
k
−
1
∣
k
−
1
i
)
,
i
=
1
,
2
,
⋯
,
m
\mathcal{X}^i_{k|k-1}=f(\mathcal{X}^i_{k-1|k-1}),i=1,2,\cdots,m
Xk∣k−1i=f(Xk−1∣k−1i),i=1,2,⋯,m
步骤四: 状态一步预测和预测方差
x
^
k
∣
k
−
1
=
1
m
∑
i
=
1
m
X
k
∣
k
−
1
i
P
k
∣
k
−
1
=
1
m
∑
i
=
0
m
(
X
k
∣
k
−
1
i
−
x
^
k
∣
k
−
1
)
(
X
k
∣
k
−
1
i
−
x
^
k
∣
k
−
1
)
T
+
Q
k
\begin{aligned} &\hat{x}_{k|k-1}=\frac{1}{m}\sum_{i=1}^{m}\mathcal{X}^i_{k|k-1}\\ &P_{k|k-1}=\frac{1}{m}\sum_{i=0}^{m}(\mathcal{X}^i_{k|k-1}-\hat{x}_{k|k-1})(\mathcal{X}^i_{k|k-1}-\hat{x}_{k|k-1})^\text{T}+Q_k \end{aligned}
x^k∣k−1=m1i=1∑mXk∣k−1iPk∣k−1=m1i=0∑m(Xk∣k−1i−x^k∣k−1)(Xk∣k−1i−x^k∣k−1)T+Qk
(3) 测量更新
步骤五: 根据
k
k
k时刻的估计
x
^
k
∣
k
−
1
\hat{x}_{k|k-1}
x^k∣k−1和方差
P
k
∣
k
−
1
P_{k|k-1}
Pk∣k−1,计算容积点
S
k
∣
k
−
1
=
P
k
∣
k
−
1
ζ
k
∣
k
−
1
i
=
x
^
k
∣
k
−
1
+
S
k
∣
k
−
1
ξ
i
\begin{aligned} &S_{k|k-1}=\sqrt{P_{k|k-1}}\\ &\zeta^i_{k|k-1}=\hat{x}_{k|k-1}+S_{k|k-1}\xi_i \end{aligned}
Sk∣k−1=Pk∣k−1ζk∣k−1i=x^k∣k−1+Sk∣k−1ξi
步骤六: 将
ζ
k
∣
k
−
1
i
\zeta^i_{k|k-1}
ζk∣k−1i点通过量测方程传播,
Z
k
∣
k
−
1
i
=
h
(
ζ
k
∣
k
−
1
i
)
,
i
=
1
,
2
,
⋯
,
m
\mathcal{Z}^i_{k|k-1}=h(\zeta^i_{k|k-1}),i=1,2,\cdots,m
Zk∣k−1i=h(ζk∣k−1i),i=1,2,⋯,m
步骤七: 观测的预测,观测的预测误差方差(新息方差),状态与量测互协方差,增益
z
^
k
∣
k
−
1
=
1
m
∑
i
=
1
m
Z
k
∣
k
−
1
i
S
k
=
1
m
∑
i
=
1
m
(
Z
k
∣
k
−
1
i
−
z
^
k
∣
k
−
1
)
(
Z
k
∣
k
−
1
i
−
z
^
k
∣
k
−
1
)
T
+
R
k
C
k
=
1
m
∑
i
=
1
m
(
X
k
∣
k
−
1
i
−
x
^
k
∣
k
−
1
)
(
Z
k
∣
k
−
1
i
−
z
^
k
∣
k
−
1
)
T
K
k
=
C
k
S
k
−
1
\begin{aligned} &\hat{z}_{k|k-1}=\frac{1}{m}\sum_{i=1}^{m}\mathcal{Z}^i_{k|k-1}\\ &\mathcal{S}_{k}=\frac{1}{m}\sum_{i=1}^{m}(\mathcal{Z}^i_{k|k-1}-\hat{z}_{k|k-1})(\mathcal{Z}^i_{k|k-1}-\hat{z}_{k|k-1})^\text{T} +R_k\\ &C_{k}=\frac{1}{m}\sum_{i=1}^{m}(\mathcal{X}^i_{k|k-1}-\hat{x}_{k|k-1})(\mathcal{Z}^i_{k|k-1}-\hat{z}_{k|k-1})^\text{T} \\ &K_k=C_{k}\mathcal{S}_{k}^{-1} \end{aligned}
z^k∣k−1=m1i=1∑mZk∣k−1iSk=m1i=1∑m(Zk∣k−1i−z^k∣k−1)(Zk∣k−1i−z^k∣k−1)T+RkCk=m1i=1∑m(Xk∣k−1i−x^k∣k−1)(Zk∣k−1i−z^k∣k−1)TKk=CkSk−1
步骤八:
x
^
k
∣
k
=
E
[
x
k
∣
Z
k
]
=
x
^
k
∣
k
−
1
+
K
z
(
z
k
−
z
^
k
∣
k
−
1
)
P
k
∣
k
=
cov
(
x
~
k
∣
k
)
=
P
k
∣
k
−
1
−
K
k
S
k
K
k
T
\begin{aligned} \hat{x}_{k|k}&=E\left[ x_k\mid Z^{k}\right ]=\hat{x}_{k|k-1}+K_z\left(z_k-\hat{z}_{k|k-1}\right)\\ P_{k\mid k}&=\text{cov}\left(\widetilde{x}_{k\mid k}\right)=P_{k\mid k-1}-K_k\mathcal{S}_kK_k^\text{T} \end{aligned}
x^k∣kPk∣k=E[xk∣Zk]=x^k∣k−1+Kz(zk−z^k∣k−1)=cov(x
k∣k)=Pk∣k−1−KkSkKkT
这里
x
~
k
∣
k
=
x
k
−
x
^
k
∣
k
\widetilde{x}_{k\mid k}=x_k-\hat{x}_{k|k}
x
k∣k=xk−x^k∣k为估计误差,
Z
k
Z^{k}
Zk表示前
k
k
k时刻的所有观测,即
{
z
k
,
z
k
−
1
,
⋯
,
z
1
}
\{z_k,z_{k-1},\cdots,z_1 \}
{zk,zk−1,⋯,z1}
参考:从贝叶斯滤波理论到容积卡尔曼滤波算法(CKF)详细推导及编程实现常转弯率模型估计
下面这个更清楚