当前位置: 首页 > news >正文

平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题

在这里插入图片描述

本MATLAB 代码实现了平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题

文章目录

  • 运行结果
  • 代码概述
  • 代码

运行结果

三轴状态曲线对比:
在这里插入图片描述

三轴误差曲线对比:
在这里插入图片描述
误差统计特性输出(命令行截图):

在这里插入图片描述

代码概述

  1. 初始化

    • 清空工作区和命令窗口,关闭所有图形窗口。
    • 定义时间序列 t 和设置过程噪声、观测噪声的协方差矩阵 (QR)。
    • 初始化状态估计协方差矩阵 P0 和状态向量 X,同时定义观测值 Z
  2. 运动模型

    • 使用循环生成真实状态 X 和未滤波状态 X_,根据给定的运动模型更新状态。
    • 生成观测值 Z,包含加入的观测噪声。
  3. 平方根UKF实现

    • 初始化滤波器的状态和协方差矩阵。
    • 在每个时间步 k 中:
      • 生成 sigma 点并计算它们的权重。
      • 对 sigma 点进行预测,计算新的状态和观测值。
      • 更新状态估计和协方差矩阵,使用卡尔曼增益结合观测更新状态。

在这里插入图片描述

  1. 结果绘图

    • 绘制真实值、未滤波值和滤波值的对比图。
    • 计算并绘制滤波前后的误差。
  2. 误差输出

    • 输出滤波前和 SR-UKF 后的三轴误差平均值。

代码

部分代码:

% 平方根无迹卡尔曼滤波(SR-UKF),三维非线性
% 2024-12-13/Ver1clear;clc;close all; %清空工作区、命令行,关闭小窗口
% rng(0); %固定随机种子
%% 滤波模型初始化
t = 1:1:100;% 定义时间序列
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));% 初始化状态向量
Z=zeros(3,length(t)); %定义观测值形式
Z(:,1)=[X(1,1)^2/20;X(2,1);X(3,1)]+v(:,1); %观测量
residue_tag = 0; %自适应标签
%% 运动模型
% 初始化未滤波的状态向量
X_ = zeros(3,length(t)); %给未滤波的值分配空间
X_(:,1) = X(:,1); %给未滤波的值赋初值
for i1 = 2:length(t)X(:,i1) = [X(1,i1-1) + (2.5 * X(1,i1-1) / (1 + X(1,i1-1).^2)) + 8 * cos(1.2*(i1-1));X(2,i1-1)+1;X(3,i1-1)]; %真实值X_(:,i1) = [X_(1,i1-1) + (2.5 * X_(1,i1-1) / (1 + X_(1,i1-1).^2)) + 8 * cos(1.2*(i1-1));X_(2,i1-1)+1;X_(3,i1-1)] + w(:,i1-1);%未滤波的值Z(:,i1) = [X(1,i1).^2 / 20;X(2,i1);X(3,i1)] + v(i1); %观测值
end%% 平方根UKF
P = P0;
X_ukf=zeros(3,length(t));
X_ukf(:,1)=X(:,1);
alpha = 0.95;            % 自适应增益因子,用于更新观测噪声协方差for k = 2 : length(t)Xpre = X_ukf(:,k-1);% 预测下一状态

代码定制、讲解等需求,可交流

http://www.lryc.cn/news/510586.html

相关文章:

  • 【论文笔记】Visual Alignment Pre-training for Sign Language Translation
  • NLP基础知识 - 向量化
  • JAVA学习笔记_MySQL进阶
  • ffmpeg: stream_loop报错 Error while filtering: Operation not permitted
  • Vue.use()和Vue.component()
  • javaweb 04 springmvc
  • [Visual studio] 性能探测器
  • 【漫话机器学习系列】017.大O算法(Big-O Notation)
  • IntelliJ IDEA中设置激活的profile
  • Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(上)
  • uniapp中实现APP调用本地通知栏通知、震动、本地提示音或者mp3提醒
  • ADB 上传文件并使用脚本监控上传百分比
  • 【数据库】PostgreSQL(持续更新)
  • overleaf中出现TeX capacity exceeded PDF object stream buffer=5000000的原因和解决方案
  • pyqt5冻结+分页表
  • 一起学Git【第四节:添加和提交文件】
  • 【鸿蒙实战开发】HarmonyOS集成高德地图定位实现
  • ECharts散点图-气泡图,附视频讲解与代码下载
  • python操作Elasticsearch执行增删改查
  • 学习C++:关键字
  • FFmpeg在python里推流被处理过的视频流
  • 为什么推荐使用构造函数注入而非@Autowired注解进行字段注入
  • 如何卸载和升级 Angular-CLI ?
  • 在线excel编辑(luckysheet)
  • 【ES6复习笔记】Symbol 类型及其应用(9)
  • [原创](Modern C++)现代C++的第三方库的导入方式: 例如Visual Studio 2022导入GSL 4.1.0
  • 【ES6复习笔记】Class类(15)
  • 【Golang 面试题】每日 3 题(六)
  • openEuler安装OpenGauss5.0
  • 20241230 机器学习ML -(1)线性回归(scikitlearn)