【逐行注释】MATLAB的EKF和UKF例程与详细注释|附下载链接

在这里插入图片描述

例程简述

这是一个状态量为三维的MATLAB下的滤波程序,分成EKF(扩展卡尔曼滤波)和UKF(无迹卡尔曼滤波)两种,分别滤波后,显示滤波值的曲线、滤波误差的对比曲线、滤波误差的最大值、平均值、标准差的输出。

  • 模型是非线性的(状态方程和观测方程都是非线性的)
  • 我有意将模型设计得尽可能复杂一些,拿到手以后可以从难往简单的方向改,更容易上手。

部分代码与注释如下,供参考

% EKF+UKF效果对比
% author:Evand©2023-2024
% 作者联系方式:微信matlabfilter(除前期达成一致外,咨询需付费,但购买例程会更便宜)
% date: 2023-11-07/Ver2
% 2024-6-7/Ver3:增加、优化误差输出语句
% 2024-8-25/Ver4:添加逐行注释、XYZ改为"第 维度"
clear; %清空工作区变量
clc; %清空命令行内容
close all; %关闭所有窗口(主窗口除外)
rng(0); % 设置固定的随机数种子
%% 滤波模型初始化
% 定义时间序列
t = 1:1:1000;
% 过程噪声协方差矩阵和过程噪声
Q = 1*diag([1,1,1]); %协方差矩阵
w = sqrt(Q)*randn(size(Q,1),length(t)); %过程噪声
% 观测噪声协方差矩阵和观测噪声
R = 1*diag([1,1,1]); %观测噪声协方差矩阵
v = sqrt(R)*randn(size(R,1),length(t)); %观测噪声
% 初始状态估计协方差矩阵
P0 = 1*eye(3);
% 初始化状态向量
X = zeros(3,length(t));
% 初始化扩展卡尔曼滤波状态向量
X_ekf = zeros(3,length(t));
X_ekf(1,1) = X(1,1); %给ekf滤波值赋初值
% 初始化观测值矩阵

下载链接

如需完整代码与注释,点击下面的链接下载(下载需付费,建议先看完文章,确定需要再下载):
https://download.csdn.net/download/callmeup/89677179

代码运行情况

运行后,得到的绘图和数据输出如下:
第一幅图是三个维度的状态真实值、EKF滤波值、UKF滤波值对比:
在这里插入图片描述
第二幅图是两种滤波方法的误差曲线,对比:
在这里插入图片描述

第三幅图比较难理解,是误差大小的CDF(累积概率密度函数)图像:
在这里插入图片描述
CDF这个图像反映了误差的总体趋势,CDF相关的知识可见本人的另一篇文章,有详细叙述:https://blog.csdn.net/callmeup/article/details/137754111
误差的统计特性输出为误差最大值误差平均值误差标准差,如下:
在这里插入图片描述

各模块作用

程序分成滤波模型初始化、运动模型、EKF、UKF、绘图、输出这些部分。
滤波模型初始化,定义了PQR等滤波需要使用的参数,同时给状态量X和观测量Z这些量定义空间:
在这里插入图片描述
运动模型部分通过迭代生成真实值、未滤波的值、观测值。误差也是在这里添加的:
在这里插入图片描述
EKF和UKF部分为重点,不再这里展示(源码上面有相关的标注)
绘图部分,每一行也都有注释,初学者也能看懂:
在这里插入图片描述
输出部分使用的是fprintf函数:
在这里插入图片描述
如有需要,可私信或通过下方的微信联系我。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值