容积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[xz]=Rf(x)exp(xTx)dx
因此针对该非线性函数的积分问题,产生了众多基于数值积分的滤波算法。如UKF通过确定性采样来传播分布的一二阶矩(均值和方差)。而CKF作为看另一种求积分近似方法,利用球面径向规则。

CKF和UKF比较:

当取 κ = 0 \kappa=0 κ=0时, CKF 和 UKF 的估计精度相同,但鉴于 CKF 采样点少,实时性比 UKF 好,故应选用 CKF 滤波算法;

n ≤ 2 n\leq2 n2时,即低维非线性系统, UKF 的估计精度高于 CKF,应选用 UKF 滤波算法;

n = 2 n=2 n=2时的非线性系统, UKF 及 CKF 的估计精度相同,但 CKF 的实时性更好,应选用 CKF 滤波算法;

n ≥ 3 n\geq3 n3时,即高维非线性系统, 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(xk1)+wk1zk=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) wkN(0,Qk), v k ∼ N ( 0 , R k ) v_k\sim N(0,R_k) vkN(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 k1时刻的状态估计和协方差矩阵
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^k1∣k1,Pk1∣k1,Qk1,Rk1
当为 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} x0N(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(x0x^0∣0)(x0x^0∣0)T=P0

(2) 状态预测

步骤二:根据 k − 1 k−1 k1时刻的估计 x ^ k − 1 ∣ k − 1 \hat{x}_{k-1|k-1} x^k1∣k1和方差 P k − 1 ∣ k − 1 P_{k-1|k-1} Pk1∣k1,产生容积点
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} Pk1∣k1=Sk1∣k1Skk1T

ξ 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} Sk1∣k1=Pk1∣k1 Xk1∣k1i=x^k1∣k1+Sk1∣k1ξ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 Xkk1i=f(Xk1∣k1i)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^kk1=m1i=1mXkk1iPkk1=m1i=0m(Xkk1ix^kk1)(Xkk1ix^kk1)T+Qk

(3) 测量更新

步骤五: 根据 k k k时刻的估计 x ^ k ∣ k − 1 \hat{x}_{k|k-1} x^kk1和方差 P k ∣ k − 1 P_{k|k-1} Pkk1,计算容积点
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} Skk1=Pkk1 ζkk1i=x^kk1+Skk1ξi
步骤六: ζ k ∣ k − 1 i \zeta^i_{k|k-1} ζkk1i点通过量测方程传播,
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 Zkk1i=h(ζkk1i)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^kk1=m1i=1mZkk1iSk=m1i=1m(Zkk1iz^kk1)(Zkk1iz^kk1)T+RkCk=m1i=1m(Xkk1ix^kk1)(Zkk1iz^kk1)TKk=CkSk1
步骤八:
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^kkPkk=E[xkZk]=x^kk1+Kz(zkz^kk1)=cov(x kk)=Pkk1KkSkKkT
这里 x ~ k ∣ k = x k − x ^ k ∣ k \widetilde{x}_{k\mid k}=x_k-\hat{x}_{k|k} x kk=xkx^kk为估计误差, Z k Z^{k} Zk表示前 k k k时刻的所有观测,即 { z k , z k − 1 , ⋯   , z 1 } \{z_k,z_{k-1},\cdots,z_1 \} {zk,zk1,,z1}

参考:从贝叶斯滤波理论到容积卡尔曼滤波算法(CKF)详细推导及编程实现常转弯率模型估计

下面这个更清楚

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

容积卡尔曼滤波 (Cubature Kalman Filter, CKF) 是一种非线性的滤波器,它通过在状态空间中取样来近似高维积分。下面是一个简单的CKF的Matlab代码示例: ``` matlab function [x_est, P_est] = CKF(z, x_pred, P_pred, Q, R) n = length(x_pred); % 状态向量的维度 m = length(z); % 观测向量的维度 % 参数设置 num_samples = 2*n; % 采样点数量 w_m = 1 / (2*num_samples); % 权重系数 w_c = w_m; w_c0 = w_m; % 生成采样点 points = zeros(n, num_samples); for i = 1:n points(:,i) = x_pred + sqrt(n) * chol(P_pred)'(:,i); end % 预测 x_pred_points = zeros(n, num_samples); for i = 1:num_samples x_pred_points(:,i) = f(points(:,i)); % f为状态转移函数 end x_pred_est = sum(w_m * x_pred_points, 2); P_pred_est = zeros(n, n); for i = 1:num_samples P_pred_est = P_pred_est + w_c * (x_pred_points(:,i) - x_pred_est) * (x_pred_points(:,i) - x_pred_est)'; end P_pred_est = P_pred_est + Q; % Q为过程噪声的协方差矩阵 % 更新 z_pred_points = zeros(m, num_samples); for i = 1:num_samples z_pred_points(:,i) = h(x_pred_points(:,i)); % h为观测函数 end z_pred_est = sum(w_m * z_pred_points, 2); Pzz = zeros(m, m); Pxz = zeros(n, m); for i = 1:num_samples Pzz = Pzz + w_c * (z_pred_points(:,i) - z_pred_est) * (z_pred_points(:,i) - z_pred_est)'; Pxz = Pxz + w_c * (x_pred_points(:,i) - x_pred_est) * (z_pred_points(:,i) - z_pred_est)'; end Pzz = Pzz + R; % R为测量噪声的协方差矩阵 K = Pxz * inv(Pzz); % 卡尔曼增益 x_est = x_pred_est + K * (z - z_pred_est); % 估计的状态向量 P_est = P_pred_est - K * Pzz * K'; % 估计的状态协方差矩阵 end ``` 以上是一个简单的CKF的Matlab代码示例,其中包含了预测和更新的步骤,通过在状态空间中取样来近似高维积分。需要注意的是,根据实际的问题场景和数据格式,需要对代码进行适当的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值