【MATLAB代码】三个CT模型的IMM例程,各CT旋转速率不同,适用于定位、导航、目标跟踪

news2024/12/23 14:38:38

在这里插入图片描述

三个CT模型,各CT模型下的运动旋转速率不同,适用于定位、导航、目标跟踪

文章目录

  • 代码构成
  • 运行结果
  • 源代码
  • 代码讲解
    • 概述
    • 代码结构
      • 1. 初始化
      • 2. 仿真参数设置
      • 3. 生成量测数据
      • 4. IMM迭代
      • 5. 绘图
    • 主要功能
    • 函数部分
      • 1. 卡尔曼滤波函数
      • 2. 模型综合函数
      • 3. 模型概率更新函数
    • 总结

代码构成

  • 代码结构如下:
    在这里插入图片描述

运行结果

  • 目标的运动轨迹:
    在这里插入图片描述
    放大后可以看到各个模型的估计效果:
    在这里插入图片描述
    位置跟踪误差和速度跟踪误差曲线如下:
    在这里插入图片描述
    三个模型交互时的概率曲线如下:
    在这里插入图片描述
    输出各模型对X轴速度跟踪误差的最大值:
    在这里插入图片描述

源代码

% 基于IMM算法的目标跟踪,三模型IMM(3种CT的模型)
% 2024-11-01/Ver1
clc; clear; close all;  % 清除命令窗口、工作空间和关闭所有图形窗口
rng('default'); rng(0); % 设置随机数生成器的默认状态,以确保可重复性

%% 仿真参数设置
time = 100;            % 仿真迭代次数
T = 1;                  % 采样间隔(时间步长)
w1 = 1 * 2 * pi / 360; % 模型2的转弯率(1度)
w2 = 3 * 2 * pi / 360; % 模型2的转弯率(3度)
w3 = -3 * 2 * pi / 360; % 模型3的转弯率(-3度)
H = [1, 0, 0, 0;       % 模型量测矩阵
     0, 0, 1, 0];     
G = [T^2 / 2, 0;      % 模型过程噪声加权矩阵
     T, 0;
     0, T^2 / 2;
     0, T];  
R = 10 * diag([1, 1]); % 模型量测噪声协方差矩阵
Q = 0.1 * diag([1, 1]); % 模型过程噪声协方差矩阵
F1 = [];  
F2 = [];             % 模型2状态转移矩阵(左转弯)
F3 = [];             % 模型3状态转移矩阵(右转弯)

x0 = [1000, 200, 100, 20]'; % 初始状态(位置X,速度X,位置Y,速度Y)

% 完整代码下载链接:https://gf.bilibili.com/item/detail/1106576012

代码讲解

概述

本代码实现了基于交互多模型(IMM)算法的目标跟踪,使用三种恒速(CT)模型来对动态目标进行状态估计。通过对目标运动状态的建模和滤波,该算法能够在不同运动模式下有效跟踪目标。

代码结构

1. 初始化

clc; clear; close all;
rng('default'); rng(0);
  • 清除命令窗口、工作空间和关闭所有图形窗口。
  • 设置随机数生成器以确保可重复性。

2. 仿真参数设置

time = 100;            % 仿真迭代次数
T = 1;                  % 采样间隔
w1 = 1 * 2 * pi / 360; % 模型1的转弯率
w2 = 3 * 2 * pi / 360; % 模型2的转弯率
w3 = -3 * 2 * pi / 360; % 模型3的转弯率
% 状态转移矩阵和噪声协方差矩阵的定义
  • 设置仿真参数,包括时间步长、转弯率及模型的量测和过程噪声协方差矩阵。
  • 定义三种模型的状态转移矩阵 F1, F2, F3

3. 生成量测数据

x0 = [1000, 200, 100, 20]'; % 初始状态
% 生成状态数据和含噪声的量测数据
  • 初始化目标的初始状态。
  • 生成真实状态及其对应的有噪声的观测数据。

4. IMM迭代

% 初始化
X_IMM = zeros(4, time); % 状态估计值
P_IMM = zeros(4, 4, time); % 状态协方差矩阵
% 迭代
for t = 1:time - 1
    % 交互步骤
    % 卡尔曼滤波步骤
    % 模型概率更新
    % 状态综合
end
  • 初始化状态估计和协方差矩阵。
  • 在每个时间步内:
    • 计算混合概率。
    • 对每个模型进行卡尔曼滤波。
    • 更新模型的概率。
    • 综合各模型的状态和协方差。

5. 绘图

% 绘制目标轨迹和估计误差
  • 通过图形展示目标的真实轨迹、各模型的估计轨迹及观测值。
  • 计算并绘制位置和速度跟踪误差。
  • 绘制模型概率变化曲线。

主要功能

  • 状态预测与更新:使用卡尔曼滤波对每个模型进行状态预测与更新。
  • 模型综合:根据模型的概率对多个模型的状态进行加权综合,得到最终的状态估计。
  • 可视化分析:通过图形展示真实轨迹、估计轨迹和误差,便于对算法性能的分析。

函数部分

1. 卡尔曼滤波函数

function [X, P, e, S] = Kalman(X_Forward, P_Forward, Z, A, G, Q, H, R)
  • 实现了卡尔曼滤波的预测和更新步骤。

2. 模型综合函数

function [x_pre, P] = Model_mix(x1, x2, x3, P1, P2, P3, u)
  • 根据各模型的加权状态和协方差进行综合。

3. 模型概率更新函数

function [u]=Model_P_up(r1,r2,r3,S1,S2,S3,c_j)
  • 根据残差和协方差更新模型的概率。

总结

本代码通过结合IMM算法与卡尔曼滤波,实现了对动态目标的有效跟踪。适用于需要在复杂环境中进行实时状态估计的应用场景,如自动驾驶、无人机导航等。通过三种模型的组合,能够提高估计的准确性和鲁棒性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sklearn 实现随机森林分类器 - python 实现

python sklearn 实现随机森林分类器 from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris # 加载数据集 irisload_iris() x,yiris.data,iris.target print("x y shape:",x.shape,y.shape) # 创建并训练模型 model Random…

GetX的一些高级API

目录 前言 一、一些常用的API 二、局部状态组件 1.可选的全局设置和手动配置 2.局部状态组件 1.ValueBuilder 1.特点 2.基本用法 2.ObxValue 1.特点 2.基本用法 前言 这篇文章主要讲解GetX的一些高级API和一些有用的小组件。 一、一些常用的API GetX提供了一些高级…

WPF+MVVM案例实战(十一)- 环形进度条实现

文章目录 1、运行效果2、功能实现1、文件创建与代码实现2、角度转换器实现3、命名空间引用3、源代码下载1、运行效果 2、功能实现 1、文件创建与代码实现 打开 Wpf_Examples 项目,在Views 文件夹下创建 CircularProgressBar.xaml 窗体文件。 CircularProgressBar.xaml 代码实…

SYN590RH

一般描述 SYN590RH是SYNOXO全新开发设计的一款宽电压范围,低功耗,高性能,无需外置AGC电容,灵敏度达到典型-110 dBm,400MHz~450MHz频率范围应用的单芯片ASK或00 K射频接收器。 SYN590RH是一款典型的即插即用型单片高…

kafka里的consumer 是推还是拉?

大家好,我是锋哥。今天分享关于【kafka里的consumer 是推还是拉?】面试题?希望对大家有帮助; kafka里的consumer 是推还是拉? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中,消费者&…

C语言的数组地址 数组的遍历与练习

1.int main(void) { int a[5] { 10,20,30,40,50 };//数组间的元素地址相连的 int* p; printf("%d\n", &a[0]); printf("%d\n", &a[1]); printf("%d\n", &a[2]); printf("%d\n", &a[3]); …

基于springboot + vue的网上订餐系统的设计与实现(附源码)

一、项目背景 随着互联网技术的飞速发展和智能手机的普及,人们的生活方式发生了翻天覆地的变化,其中之一便是网上订餐系统的兴起。这种系统通过在线平台连接消费者和餐饮服务提供商,使得用户可以随时随地浏览菜单、下单并支付,极…

Redis安装及运维

源码安装 Redis安装前建议要进行残留数据检查,排除后期存在的各种隐患 官网:https://redis.io/,Linux版本只会提供源码,不提供二进制安装包,因此需要编译源码进行安装,本次使用CentOS8 VMware虚拟机进行安…

windows10 安装 达梦数据库DM8

一. 前期工作 下载 https://www.dameng.com/list_103.html 通过百度网盘分享的文件:达梦数据库 链接:https://pan.baidu.com/s/1mJcT3UiwojeWIhXpAwh-RA 提取码:jyzi 点我: 想要 解压 双击iso文件 二. 安装步骤 1 .双击setup.ext安装 …

机器人大模型GR2——在大规模视频数据集上预训练且机器人数据上微调,随后预测动作轨迹和视频(含GR1详解)

前言 上个月的24年10.9日,我在朋友圈看到字节发了个机器人大模型GR2,立马去看了下其论文(当然了,本质是个技术报告) 这次也是我头一次看paper,不看正文,而是直奔其References,​看有没有我预想中的文献&a…

PCB电源层布线信号

在印刷电路板(PCB)的设计过程中,电源层通常被视为电源分配网络(PDN)的核心。电源层和接地层通常是通过平面铜层来实现的,旨在确保系统稳定性。然而,随着电路板复杂性的增加,尤其是在多层电路板中,设计师可能面临在电源层上布置信号线路的需求。虽然这种做法可以节省空…

【大数据学习 | kafka】producer的参数与结构

1. producer的结构 producer:生产者 它由三个部分组成 interceptor:拦截器,能拦截到数据,处理完毕以后发送给下游,它和过滤器不同并不是丢弃数据,而是将数据处理完毕再次发送出去,这个默认是不…

Java基本语法和基础数据类型——针对实习面试

目录 Java基本语法和基础数据类型标识符和关键字有什么区别?Java关键字有哪些?Java基本数据类型有哪些?什么是自动装箱和拆箱?自动装箱(Autoboxing)自动拆箱(Unboxing) 自动装箱和拆…

自动化测试工具Ranorex Studio(十九)-其他编辑选项

失败继续运行和禁用 表中列出的每个Action条目,都可以设置为禁用或 “失败继续运行”。 设置action条目为“失败继续运行”时,如果遇到错误,模块不会停在那个位置,而是继续执行。 您可以通过右键菜单或属性窗口设置这两个选项。 设…

知识见闻 - Workday公司介绍

人力资源“一哥”Workday的前世今生 01 Duffield 既然要聊Workday,我们首先要认识一个人。David Duffield,又一位企业软件服务行业的绝对大神。 大卫杜菲尔德(David Duffield)出生于1941年。 40岁,很多职场人都已经认命…

VS2022配置调试Qt源代码

需要保证源代码和项目使用的版本匹配,符号需要注意是64位还是32位,并且用msvc。 1. 设置源代码路径 2. 设置调试PDB路径 这里最好把4个地方都加进去,防止某些不常用PDB被漏掉。 D:\Qt\5.15.2\msvc2019_64\bin D:\Qt\5.15.2\msvc2019_64\lib…

利用腾讯元器构建商业化AI智能体——【快递100 AI智能体实战教学】

写在开头 随着人工智能技术的不断进步,腾讯元器作为一项强大的工具,使得构建商业化的AI智能体变得更加便捷和高效。本文将带你深入了解如何利用腾讯元器搭建快递100 AI智能体的全过程,从前期规划到最终实现,为你提供一份详尽的实…

「C/C++」C++ 设计模式 之 单例模式(Singleton)

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

【前端基础】CSS基础

目标:掌握 CSS 属性基本写法,能够使用文字相关属性美化文章页。 01-CSS初体验 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 文档的呈现(美化内容&#…

【Oracle】空格单字符通配符查询匹配失败

问题 在进行模糊查询的时候,通过全局任意字符串匹配出含有两个字刘姓的人,但是通过刘_不能匹配出结果。 解决 检查后发现,姓名中包含空格 SELECT * FROM student WHERE TRIM(sname) LIKE 刘_;第一种解决方案就是查询的时候进行去空格处理&a…