(一)项目实践-利用Appdesigner制作目标跟踪仿真软件

目录

前言

一、软件页面设计

二、仿真部分

(一)参数输入

(二)绘图部分

(三)目标追踪程序

总结


前言

本博客有一个专栏用来介绍有关MATLAB中的Appdesigner的操作以及使用,本文是为了深化读者对于基础知识运用而写作的。博主结合雷达目标kalman滤波跟踪过程,将参数交互、仿真结果展示等知识点结合软件制作过程进行了讲解和分析,设计了一个目标跟踪仿真软件。目的是便于读者理解,同时读者可以根据上传的源代码资源进行拓展开发,对应程序可在资源界面下载。


一、软件页面设计

软件界面由三大部分组成,第一部分是参数输入部分,第二部分是仿真按钮,第三部分是图形展示部分,具体的软件界面设计如图所示。

参数输入部分的主要作用是实现数据的交互,获取软件界面输入的参数信息,主要分为仿真参数、目标参数雷达参数三个部分,如图所示。

仿真按钮部分是程序触发部分,包含了目标跟踪的程序主体。通过点击仿真按钮,程序开始运行,仿真结束之后将仿真结果输出到图形展示框。

图形展示部分是最终的结果展示部分,主要包括目标及雷达位置示意图和跟踪误差示意图。通过函数将图形绘制到软件界面,实现结果的传递。具体的细节可以参照另外一篇文章:

(五)Appdesigner-参数输入及绘图操作https://blog.csdn.net/h320130/article/details/139999767?spm=1001.2014.3001.5502

二、仿真部分

(一)参数输入

仿真代码如下:

Matlab 复制代码
%参数设定

nf = app.target5.Value;%噪声强度
N_sim = app.sim.Value;
Ts = app.sim1.Value;
N_step = N_sim/Ts; %仿真时长

radar_location=[app.rad1.Value app.rad2.Value];

H = [1 0 0 0
    0 0 1 0];

ini_state(:,1) = [app.target1.Value, app.target2.Value, app.target3.Value, app.target4.Value]';

R_base = [app.rad3.Value 0;
                0  app.rad4.Value]; 

P_0 = 4500*eye(4);

(二)绘图部分

仿真代码如下:

Matlab 复制代码
%%
cla(app.UIAxes);
cla(app.UIAxes_2);
%绘图部分           
plot(app.UIAxes,X_real{1}(1,:),X_real{1}(3,:),"LineWidth",1.2);
app.UIAxes.NextPlot = 'add';
scatter(app.UIAxes,radar_location(1,1),radar_location(1,2),80,'v','filled');
legend(app.UIAxes,'\fontname{宋体}目标','\fontname{宋体}雷达');
xlabel(app.UIAxes,'x(m)','FontSize',14,'Fontname', 'Times New Roman'),ylabel(app.UIAxes,'y(m)','FontSize',14,'Fontname', 'Times New Roman')
set(app.UIAxes,'FontSize',14,'Fontname', 'Times New Roman');
ymax = max([X_real{1}(3,:),radar_location(2)])+3000;
ymin = min([X_real{1}(3,:),radar_location(2)])-3000;
xmax = max([X_real{1}(1,:),radar_location(1)])+3000;
xmin = min([X_real{1}(1,:),radar_location(1)])-3000;
xlim(app.UIAxes,[xmin, xmax]);
ylim(app.UIAxes,[ymin, ymax]);

plot(app.UIAxes_2,RMSE_each_node_sum',"LineWidth",1);
xlabel(app.UIAxes_2,'Frame','FontSize',14,'Fontname', 'Times New Roman'),ylabel(app.UIAxes_2,'RMSE(m)','FontSize',14,'Fontname', 'Times New Roman')
set(app.UIAxes_2,'FontSize',14,'Fontname', 'Times New Roman');

(三)目标追踪程序

仿真代码如下:

Matlab 复制代码
for k = 1:N_step
                % 目标运动设定
                X_real= cell(N_R,1);
                X_real(:) = {zeros(nx,N_step+1)};
                for i = 1:N_Q
                    X_real{i} = track(app,ini_state(:,i),nx,N_step,F,Q);
                end
                % 目标的估计值为一个确定的数,真实值满足其均值的高斯分布
                %%
                %量测信息更新
                Z_real = cell(N_R,N_Q);
                for i = 1:N_R
                    for j = 1:N_Q
                        Z_real{i,j}= H*X_real{j};%其中h为量测更新函数,为N_R*N_Q的元组
                    end
                end
                z_real_every = cell(N_R,N_step);
                z_real_every(:) = {zeros(nz,1)};

                R = cell(N_R,N_step);
                R(:) = {zeros(nz,nz)};

                %% 最优滤波过程(有反馈)
                X_each_node = cell(N_R,N_step);
                X_each_node(:) = {zeros(nx,1)};

                P_each_node = cell(N_R,N_step);
                P_each_node(:) = {zeros(nx,nx)};

                for i1 = 1:N_R
                    X_each_node{i1,N_initial} = ini_state(:,1) + sqrt(P_0)*randn(nx,1);
                    P_each_node{i1,N_initial} = P_0; 
                    RMSE_each_node(i1,N_initial) = (X_each_node{i1,N_initial}(1,1)-X_real{1}(1,N_initial))^2 + (X_each_node{i1,N_initial}(3,1)-X_real{1}(3,N_initial))^2;
                end

                for i = N_initial+1: N_step
                    for i1 = 1:N_R

                        R_mid = R_cal(app,R_base,X_real{1}(:,i),radar_location(i1,:)');


                        R{i1,i} = R_mid;

                        z_real_every{i1,i} = Z_real{i1,1}(:,i) + R_mid*randn(nz,1);


                        [X_each_node{i1,i},P_each_node{i1,i}] = KF(app,X_each_node{i1,i-1},z_real_every{i1,i},P_each_node{i1,i-1},R_mid,F,Q,H);

                        RMSE_each_node(i1,i) = (X_each_node{i1,i}(1,1)-X_real{1}(1,i))^2 + (X_each_node{i1,i}(3,1)-X_real{1}(3,i))^2;

                    end
                end
                RMSE_each_node_sum = RMSE_each_node + RMSE_each_node_sum;
end

            RMSE_each_node_sum = sqrt(RMSE_each_node_sum/N_step);

总结

以上就是今天要讲的内容,本文简单介绍了一种目标追踪仿真软件的设计方法,涉及软件界面设计、图形展示、参数输入等知识,读者可以在博主设计的软件基础上进行修改,实现自己所需的功能。

相关推荐
机器学习之心27 分钟前
MATLAB基于改进云物元的模拟机协同训练质量评价
matlab·改进云物元
ytttr87331 分钟前
MATLAB实现经验模态分解(EMD)与希尔伯特变换获取能量谱
人工智能·python·matlab
t198751282 小时前
基于多假设跟踪(MHT)算法的MATLAB实现
开发语言·matlab
机器学习之心5 小时前
MATLAB多子种群混沌自适应哈里斯鹰算法优化BP神经网络回归预测
神经网络·算法·matlab
π同学10 小时前
基于Matlab的递推最小二乘法参数估计
matlab·最小二乘法
小喵要摸鱼16 小时前
【MATLBA】使用教程
matlab
listhi5201 天前
基于空时阵列最佳旋转角度的卫星导航抗干扰信号处理的完整MATLAB仿真
开发语言·matlab·信号处理
88号技师1 天前
2025年7月一区SCI优化算法-Logistic-Gauss Circle optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
yugi9878381 天前
基于MATLAB的心电信号去噪
开发语言·matlab
gihigo19982 天前
MATLAB使用遗传算法解决车间资源分配动态调度问题
算法·matlab