本文主要是介绍容积KF(CKF),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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)详细推导及编程实现常转弯率模型估计
下面这个更清楚
这篇关于容积KF(CKF)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!