
本文介绍一种基于Versoria函数改进的扩展卡尔曼滤波(MVC-EKF)算法,与传统EKF进行对比,重点解决传统EKF在非高斯噪声条件下的鲁棒性问题。
程序介绍
算法核心创新
本代码实现了一种基于Versoria函数改进的扩展卡尔曼滤波(MVC-EKF)算法,重点解决传统EKF在非高斯噪声条件下的鲁棒性问题。主要创新体现在:
-
Versoria权重函数:通过指数型权重函数动态调整卡尔曼增益
-
协方差迭代机制:采用Joseph形式协方差更新公式
系统模型与公式推导
状态空间模型
-
状态方程(线性运动模型):
x k + 1 = [ 1 0 0 1 ] x k + [ 1 2 ] + w k x_{k+1} = \begin{bmatrix}1 & 0\\0 & 1\end{bmatrix}x_k + \begin{bmatrix}1\\2\end{bmatrix} + w_k xk+1=[1001]xk+[12]+wk
过程噪声 w k ∼ N ( 0 , Q ) w_k \sim \mathcal{N}(0,Q) wk∼N(0,Q), Q = 0.01 I 2 Q=0.01I_2 Q=0.01I2 -
观测方程(非线性测量模型):
z k = [ x 1 , k x 2 , k ] + v k z_k = \begin{bmatrix}\sqrt{x_{1,k}} \\ \sqrt{x_{2,k}}\end{bmatrix} + v_k zk=[x1,kx2,k]+vk
观测噪声 v k ∼ N ( 0 , R ) + δ 10 < k < 30 ⋅ 10 v_k \sim \mathcal{N}(0,R) + \delta_{10<k<30}\cdot10 vk∼N(0,R)+δ10<k<30⋅10, R = I 2 R=I_2 R=I2
雅可比矩阵计算
-
状态转移雅可比矩阵:
F k = ∂ f ∂ x = I 2 F_k = \frac{\partial f}{\partial x} = I_2 Fk=∂x∂f=I2 -
观测雅可比矩阵(关键非线性处理):
H k = [ x 1 x 1 2 + x 2 2 x 2 x 1 2 + x 2 2 1 2 x 1 1 2 x 2 ] H_k = \begin{bmatrix} \frac{x_1}{\sqrt{x_1^2+x_2^2}} & \frac{x_2}{\sqrt{x_1^2+x_2^2}} \\ \frac{1}{2\sqrt{x_1}} & \frac{1}{2\sqrt{x_2}} \end{bmatrix} Hk=[x12+x22x12x11x12+x22x22x21]
该矩阵在预测状态 x ^ k − \hat{x}_k^- x^k−处线性化,实现泰勒一阶近似
法实现流程
预测步骤(EKF与MVC-EKF共享)
x_pred = f(x_est(:,k-1))
P_pred = F_k * P_est * F_k' + Q
更新步骤差异
| 步骤 | EKF | MVC-EKF改进 |
|---|---|---|
| 卡尔曼增益 | K k = P p r e d H k T S k − 1 K_k = P_pred H_k^T S_k^{-1} Kk=PpredHkTSk−1 | K k M V C = w M V C ⋅ K k K_k^{MVC} = w_{MVC} \cdot K_k KkMVC=wMVC⋅Kk |
| 状态更新 | x ^ k = x p r e d + K k ϵ k \hat{x}_k = x_pred + K_k \epsilon_k x^k=xpred+Kkϵk | x ^ k M V C = x p r e d + K k M V C ϵ k \hat{x}_k^{MVC} = x_pred + K_k^{MVC} \epsilon_k x^kMVC=xpred+KkMVCϵk |
| 协方差更新 | P k = ( I − K k H k ) P p r e d P_k = (I - K_k H_k)P_pred Pk=(I−KkHk)Ppred | P k M V C = ( I − K k M V C H k ) P p r e d P_k^{MVC} = (I - K_k^{MVC} H_k)P_pred PkMVC=(I−KkMVCHk)Ppred |
性能评估方法
代码实现多维度误差分析,包含:
-
均方根误差(RMSE):
RMSE = 1 N ∑ k = 1 N ( x ^ k − x k t r u e ) 2 \text{RMSE} = \sqrt{\frac{1}{N}\sum_{k=1}^N (\hat{x}_k - x_k^{true})^2} RMSE=N1k=1∑N(x^k−xktrue)2
该指标综合反映估计精度 -
极大值误差:
MAX_ERR = max ( ∣ x ^ k − x k t r u e ∣ ) \text{MAX\_ERR} = \max(|\hat{x}_k - x_k^{true}|) MAX_ERR=max(∣x^k−xktrue∣)
反映算法在异常值冲击下的鲁棒性 -
标准差:
STD = 1 N − 1 ∑ k = 1 N ( e k − e ˉ ) 2 \text{STD} = \sqrt{\frac{1}{N-1}\sum_{k=1}^N (e_k - \bar{e})^2} STD=N−11k=1∑N(ek−eˉ)2
表征误差分布的离散程度
运行结果
状态曲线:

状态误差曲线:

命令行的结果输出:

matlab代码
部分代码:
% 基于MVC的EKF,含有与EKF的对比二维平面的运动估计
% 核心:目标跟踪或状态估计,通过Versoria函数优化协方差更新
% 2025-06-21/Ver1
clear; clc; close all;
% rng(0);
%% 系统模型定义
% 定义状态空间模型
% x(k+1) = f(x(k)) + w(k)
% y(k) = h(x(k)) + v(k)
% 非线性状态转移函数
f = @(x) [x(1) + 1; x(2) + 2];
% 非线性观测函数(距离与角度)
h = @(x) [x(1)^0.5; x(2)^0.5];
% f 和 h 的雅可比矩阵
F = @(x) [1, 0; 0, 1]; % f 的雅可比矩阵
% H = @(x) [2 * x(1), 1]; % h 的雅可比矩阵
H = @(x) [x(1)*(x(1)^2+x(2)^2)^(-0.5),x(2)*(x(1)^2+x(2)^2)^(-0.5);
0.5*x(1)^(-0.5),0.5*x(2)^(-0.5)]; % h 的雅可比矩阵
完整代码下载链接:https://download.youkuaiyun.com/download/callmeup/91092933
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者
140

被折叠的 条评论
为什么被折叠?



