容积卡尔曼滤波(CKF)仿真抛物线运动

容积卡尔曼滤波(CKF)仿真抛物线运动

容积卡尔曼滤波(Cubature Kalman Filter, CKF)的MATLAB实现。CKF是一种用于非线性系统状态估计的算法,它通过在状态空间中采样点(容积点)来近似非线性函数的高斯分布。

代码解析

参数设置

clc; clear all; close all;%% 参数设置
n = 51;                % 状态序列长度
tf = 50;               % 仿真总时刻数
dt = 0.1;              % 时间步长
g = 9.81;              % 重力加速度

首先,我们清除MATLAB环境,设置仿真参数,包括状态序列长度、仿真总时刻数、时间步长和重力加速度。

状态变量和观测初始化

%% 状态变量和观测初始化
x = zeros(4, n);                % 系统状态
z = zeros(4, n);                % 观测值
x(:, 1) = [0; 0; 10; 0];        % 初始状态 [水平位置; 垂直位置; 水平速度; 垂直速度]
x_ckf = zeros(4, n);            % CKF滤波后的状态估计
x_ckf(:, 1) = [0; 0; 1; 0];     % CKF初始估计
xhat = x_ckf(:, 1);

这里初始化系统状态x和观测值z,以及CKF滤波后的状态估计x_ckf。初始状态设置为水平位置0,垂直位置0,水平速度10,垂直速度0。

噪声和协方差设置

%% 噪声和协方差设置
Q = diag([0.1, 0.1, 0.1, 0.1]); % 过程噪声协方差
R = diag([0.5, 0.5, 0.5, 0.5]); % 测量噪声协方差
P = eye(4) * 0.1;               % 初始状态协方差
Pplus = P;

设置过程噪声协方差Q、测量噪声协方差R和初始状态协方差P

容积点权重与分布

%% 容积点权重与分布
w = 0.25; % 每个采样点的权重
kesi = sqrt(2) * [1, 0, -1, 0; 0, 1, 0, -1; 1, -1, -1, 1; 0, -1, 0, 1];

定义容积点的权重w和分布kesi,这里使用的是2阶容积点。

状态方程与测量方程

%% 状态方程与测量方程
f = @(x) [x(1) + x(3) * dt;           % 水平位置更新(抛物线运动)x(2) + x(4) * dt;           % 垂直位置更新x(3);                       % 水平速度保持不变x(4) - g * dt];             % 垂直速度更新(加上重力影响)
h = @(x) [x(1); x(2); x(3); x(4)];    % 完整状态作为测量值

定义状态方程f和测量方程h,状态方程描述了抛物线运动的动力学模型,测量方程将完整状态作为测量值。

仿真系统

%% 仿真系统
for k = 1:tf% 真实状态更新x(:, k+1) = f(x(:, k)) + sqrt(Q) * randn(4, 1);% 观测值生成z(:, k+1) = h(x(:, k+1)) + sqrt(R) * randn(4, 1);
end

在仿真循环中,我们更新真实状态并生成观测值,同时添加过程噪声和测量噪声。

容积卡尔曼滤波

%% 容积卡尔曼滤波
for k = 1:tf%% Step 1: 生成容积采样点% Cholesky 分解tryS = chol(Pplus, 'lower');catchPplus = diag(max(diag(Pplus), epsilon)); % 使用对角替代S = chol(Pplus, 'lower');endrjpoint = S * kesi + repmat(xhat, 1, 4);     % 当前状态的容积点%% Step 2: 容积点的状态传播Xminus = zeros(4, 4);for i = 1:4Xminus(:, i) = f(rjpoint(:, i));endxminus = w * sum(Xminus, 2);                 % 预测状态均值Pminus = w * ( ...(Xminus(:, 1) - xminus) * (Xminus(:, 1) - xminus)' + ...(Xminus(:, 2) - xminus) * (Xminus(:, 2) - xminus)' + ...(Xminus(:, 3) - xminus) * (Xminus(:, 3) - xminus)' + ...(Xminus(:, 4) - xminus) * (Xminus(:, 4) - xminus)' ...) + Q;%% Step 3: 测量预测Sminus = chol(Pminus, 'lower');                  % 预测协方差的 Cholesky 分解rjpoint1 = Sminus * kesi + repmat(xminus, 1, 4); % 传播后的容积点Z = zeros(4, 4);for i = 1:4Z(:, i) = h(rjpoint1(:, i));endzhat = w * sum(Z, 2); % 预测测量均值Pzminus = w * ( ...(Z(:, 1) - zhat) * (Z(:, 1) - zhat)' + ...(Z(:, 2) - zhat) * (Z(:, 2) - zhat)' + ...(Z(:, 3) - zhat) * (Z(:, 3) - zhat)' + ...(Z(:, 4) - zhat) * (Z(:, 4) - zhat)' ...) + R; % 预测测量协方差% 交叉协方差Pxzminus = w * ( ...(rjpoint1(:, 1) - xminus) * (Z(:, 1) - zhat)' + ...(rjpoint1(:, 2) - xminus) * (Z(:, 2) - zhat)' + ...(rjpoint1(:, 3) - xminus) * (Z(:, 3) - zhat)' + ...(rjpoint1(:, 4) - xminus) * (Z(:, 4) - zhat)');%% Step 4: 更新K = Pxzminus / Pzminus;                 % 卡尔曼增益xhat = xminus + K * (z(:, k+1) - zhat); % 更新状态Pplus = Pminus - K * Pzminus * K';      % 更新协方差% 修复对称性Pplus = (Pplus + Pplus') / 2; % 特征值修复,确保正定性[V, D] = eig(Pplus);D(D < 1e-6) = 1e-6; % 调整所有特征值为小正值Pplus = V * D * V';% 强化数值稳定性epsilon = 1e-6; Pplus = Pplus + epsilon * eye(size(Pplus)); % 保存滤波后的状态x_ckf(:, k+1) = xhat;
end

在CKF循环中,我们执行以下步骤:

  1. 生成容积采样点。
  2. 容积点的状态传播。
  3. 测量预测。
  4. 更新状态和协方差。

完整代码

clc; clear all; close all;%% 参数设置
n = 51;                % 状态序列长度
tf = 50;               % 仿真总时刻数
dt = 0.1;              % 时间步长
g = 9.81;              % 重力加速度%% 状态变量和观测初始化
x = zeros(4, n);                % 系统状态
z = zeros(4, n);                % 观测值
x(:, 1) = [0; 0; 10; 0];        % 初始状态 [水平位置; 垂直位置; 水平速度; 垂直速度]
x_ckf = zeros(4, n);            % CKF滤波后的状态估计
x_ckf(:, 1) = [0; 0; 1; 0];     % CKF初始估计
xhat = x_ckf(:, 1);%% 噪声和协方差设置
Q = diag([0.1, 0.1, 0.1, 0.1]); % 过程噪声协方差
R = diag([0.5, 0.5, 0.5, 0.5]); % 测量噪声协方差
P = eye(4) * 0.1;               % 初始状态协方差
Pplus = P;%% 容积点权重与分布
w = 0.25; % 每个采样点的权重
kesi = sqrt(2) * [1, 0, -1, 0; 0, 1, 0, -1; 1, -1, -1, 1; 0, -1, 0, 1];%% 状态方程与测量方程
f = @(x) [x(1) + x(3) * dt;           % 水平位置更新(抛物线运动)x(2) + x(4) * dt;           % 垂直位置更新x(3);                       % 水平速度保持不变x(4) - g * dt];             % 垂直速度更新(加上重力影响)
h = @(x) [x(1); x(2); x(3); x(4)];    % 完整状态作为测量值%% 仿真系统
for k = 1:tf% 真实状态更新x(:, k+1) = f(x(:, k)) + sqrt(Q) * randn(4, 1);% 观测值生成z(:, k+1) = h(x(:, k+1)) + sqrt(R) * randn(4, 1);
end%% 容积卡尔曼滤波
for k = 1:tf%% Step 1: 生成容积采样点% Cholesky 分解tryS = chol(Pplus, 'lower');catchPplus = diag(max(diag(Pplus), epsilon)); % 使用对角替代S = chol(Pplus, 'lower');endrjpoint = S * kesi + repmat(xhat, 1, 4);     % 当前状态的容积点%% Step 2: 容积点的状态传播Xminus = zeros(4, 4);for i = 1:4Xminus(:, i) = f(rjpoint(:, i));endxminus = w * sum(Xminus, 2);                 % 预测状态均值Pminus = w * ( ...(Xminus(:, 1) - xminus) * (Xminus(:, 1) - xminus)' + ...(Xminus(:, 2) - xminus) * (Xminus(:, 2) - xminus)' + ...(Xminus(:, 3) - xminus) * (Xminus(:, 3) - xminus)' + ...(Xminus(:, 4) - xminus) * (Xminus(:, 4) - xminus)' ...) + Q;%% Step 3: 测量预测Sminus = chol(Pminus, 'lower');                  % 预测协方差的 Cholesky 分解rjpoint1 = Sminus * kesi + repmat(xminus, 1, 4); % 传播后的容积点Z = zeros(4, 4);for i = 1:4Z(:, i) = h(rjpoint1(:, i));endzhat = w * sum(Z, 2); % 预测测量均值Pzminus = w * ( ...(Z(:, 1) - zhat) * (Z(:, 1) - zhat)' + ...(Z(:, 2) - zhat) * (Z(:, 2) - zhat)' + ...(Z(:, 3) - zhat) * (Z(:, 3) - zhat)' + ...(Z(:, 4) - zhat) * (Z(:, 4) - zhat)' ...) + R; % 预测测量协方差% 交叉协方差Pxzminus = w * ( ...(rjpoint1(:, 1) - xminus) * (Z(:, 1) - zhat)' + ...(rjpoint1(:, 2) - xminus) * (Z(:, 2) - zhat)' + ...(rjpoint1(:, 3) - xminus) * (Z(:, 3) - zhat)' + ...(rjpoint1(:, 4) - xminus) * (Z(:, 4) - zhat)');%% Step 4: 更新K = Pxzminus / Pzminus;                 % 卡尔曼增益xhat = xminus + K * (z(:, k+1) - zhat); % 更新状态Pplus = Pminus - K * Pzminus * K';      % 更新协方差% 修复对称性Pplus = (Pplus + Pplus') / 2; % 特征值修复,确保正定性[V, D] = eig(Pplus);D(D < 1e-6) = 1e-6; % 调整所有特征值为小正值Pplus = V * D * V';% 强化数值稳定性epsilon = 1e-6; Pplus = Pplus + epsilon * eye(size(Pplus)); % 保存滤波后的状态x_ckf(:, k+1) = xhat;
end%% 绘图
state_labels = {'位置 x', '位置 y', '速度 v_x', '速度 v_y'};
for k = 1:4figure();plot(x(k, :), 'g-', 'LineWidth', 1);       % 真实状态hold on;plot(x_ckf(k, :), 'b-', 'LineWidth', 1.5); % EKF 最优估计hold on;plot(z(k, :), 'k+', 'LineWidth', 1);       % 状态测量值legend('真实状态', 'EKF 最优估计值', '状态测量值');xlabel('时间步');ylabel(state_labels{k});title(['状态 ', state_labels{k}]);set(gca, 'FontSize', 14);hold off;
end%% 全轨迹绘制
figure;
hold on;
plot(x(1, :), x(2, :), 'g-', 'LineWidth', 1.5);          % 真实轨迹
plot(z(1, :), z(2, :), 'k+', 'MarkerSize', 6);           % 测量轨迹
plot(x_ckf(1, :), x_ckf(2, :), 'b-', 'LineWidth', 1.5);  % 估计轨迹
legend('真实轨迹', '测量轨迹', '估计轨迹');
xlabel('水平位置 x');
ylabel('垂直位置 y');
title('二维抛物线运动轨迹');
grid on;
axis equal;
hold off;

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/485628.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:1995. 统计特殊四元组(python3解法)

难度&#xff1a;简单 给你一个 下标从 0 开始 的整数数组 nums &#xff0c;返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 &#xff1a; nums[a] nums[b] nums[c] nums[d] &#xff0c;且a < b < c < d 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3…

几个Linux系统安装体验: 开源欧拉系统

本文介绍开源欧拉系统&#xff08;openEuler&#xff09;的安装。 下载 下载地址&#xff1a; https://www.openeuler.org/zh/download/archive/detail/?versionopenEuler%2022.03%20LTS 本文下载的文件名称为openEuler-22.03-LTS-x86_64-dvd.iso。 帮助文档地址如下&…

Data Uncertainty Learning in Face Recognition 论文阅读

Data Uncertainty Learning in Face Recognition 论文阅读 Abstract1. Introduction2. Related Work3. Methodology3.1. Preliminaries3.2. Classification-based DUL for FR3.3. Regression-based DUL for FR3.4. Discussion of Related Works 4. Experiments4.1. Datasets an…

用友BIP与旺店通数据集成方案解析

用友BIP与旺店通企业奇门的供应商集成同步方案 在现代企业的数据管理中&#xff0c;跨平台的数据集成是实现高效业务运作的关键环节。本文将分享一个实际案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将用友BIP系统中的供应商数据无缝对接到旺店通企业奇门&#xf…

代码随想录Day34 本周小结动态规划,62.不同路径,63. 不同路径 II,343. 整数拆分,96.不同的二叉搜索树。

1.本周小结动态规划 周一 在关于动态规划&#xff0c;你该了解这些&#xff01; (opens new window)中我们讲解了动态规划的基础知识。 首先讲一下动规和贪心的区别&#xff0c;其实大家不用太强调理论上的区别&#xff0c;做做题&#xff0c;就感受出来了。 然后我们讲了动…

vue中使用socket.io统计在线用户

目录 一、引入相关模块 二、store/modules 中封装socketio 三、后端代码(nodejs) 一、引入相关模块 main.js 中参考以下代码 ,另外socketio的使用在查阅其它相关文章时有出入,还是尽量以官方文档为准 import VueSocketIO from vue-socket.io import SocketIO from socket.io-…

Agent Network Protocol技术白皮书:一个对标Anthropic MCP的协议

Agent Network Protocol技术白皮书&#xff1a;一个对标Anthropic MCP的协议 Anthropic MCP让人们看到智能体通过API或协议与外部数据对接的巨大潜力。我们在几个月之前就发布了Agent Network Protocol技术白皮书&#xff0c;一个和MCP类似的协议&#xff0c;致力于解决智能体…

dbeaver安装

数据库常用的管理工具就是navicat&#xff0c;页面简洁大方&#xff0c;且易上手&#xff0c;唯一不好的就是要收费&#xff0c;个人使用的话可以用dbeaver&#xff0c;一款开源的数据库管理工具。 下载地址&#xff1a;https://dbeaver.io/download/ 直接下载这个windows(inst…

每日计划-1206

1. 完成 300. 最长上升子序列 有两种办法&#xff0c;一是使用状态规划&#xff0c;二是用二分法&#xff0c;递推。利用桶排序思想&#xff0c;出自最长递增子序列&#xff08;nlogn 二分法、DAG 模型 和 延伸问题&#xff09; | 春水煎茶 代码实现&#xff1a; class Soluti…

PHP 表单处理

在php接口中创建一个html&#xff0c;并添加一个提交按钮&#xff0c;当填写完文本框里面的内容后&#xff0c;点击提交会自动使用post方法传过去我们写的shop.php接口中。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

Altium Designer学习笔记 29 PCB布线_信号线

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…

华为网络设备配置文件备份与恢复(上传、下载、导出,导入)

在日常运维工作中&#xff0c;会经常存在网络割接的情况&#xff0c;为了保证网络割接失败时能重新回退至原有配置&#xff0c;从而不影响原有的办公环境&#xff0c;在网络割接前的备份工作就非常有必要了。 备份方式&#xff1a;FTP 备份技术&#xff1a;PC客户端<---&g…

STM32编码器接口及编码器测速模板代码

编码器是什么&#xff1f; 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器&#xff0c;我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分&#xff0c;可以分为增量式编码器和绝对式编码器。 从编码器检测原理上来分&#xff0…

Flume——进阶(agent特性+三种结构:串联,多路复用,聚合)

目录 agent特性ChannelSelector描述&#xff1a; SinkProcessor描述&#xff1a; 串联架构结构图解定义与描述配置示例Flume1&#xff08;监测端node1&#xff09;Flume3&#xff08;接收端node3&#xff09;启动方式 复制和多路复用结构图解定义描述配置示例node1node2node3启…

【python自动化一】pytest的基础使用

1.pytest简述 pytest‌ 是一个功能强大且灵活的Python测试框架&#xff0c;其主要是用于流程控制&#xff0c;具体用于UI还是接口自动化根据个人需要而定。且其具有丰富插件&#xff0c;使用时较为方便。咱们具体看下方的内容&#xff0c;本文按照使用场景展开&#xff0c;不完…

️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南20241206

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型的完整指南 &#x1f4dd; 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能的飞速发展&#xff0c;越来越多的开发者尝试在本地环境中部署大模型进行实验。然而&#xff0c;由于资源需求高、网络限制多…

buuctf:rar

根据题目所示&#xff0c;直接进行爆破 爆破后密码是8795,解压后得到flag flag{1773c5da790bd3caff38e3decd180eb7}

李飞飞空间智能来了:AI生成可探索交互的3D世界,颠覆游戏电影VR行业

目录 前言图生世界摄影效果景深效果滑动变焦 3D效果交互效果动画效果 走进大师的艺术工作流总结 前言 12月3日&#xff0c;有AI“教母”之称的李飞飞发布了空间智能的一个项目&#xff0c;一经发布就立刻引爆了外网。这个项目是仅仅通过一张图片&#xff0c;AI就可以快速的构建…

dockerfile部署前后端(vue+springboot)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言0.环境说明和准备1.前端多环境打包1.1前端多环境设置1.2打包 2.后端项目多环境配置以及打包2.1后端多环境配置2.2项目打包 3.文件上传4.后端镜像制作4.1dockerf…

Numpy基础练习

import numpy as np 1.创建一个长度为10的一维全为0的ndarray对象,然后让第5个元素等于1 n np.zeros(10,dtypenp.int32) n[4] 12.创建一个元素从10到49的ndarray对象 n np.arrange(10,50)3.将第2题的所有元素位置反转 n[::-1]使用np.random.random创建一个10*10的ndarray对象…