(一)项目实践-利用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);

总结

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

相关推荐
Evand J10 小时前
集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码
matlab·平面·目标跟踪
我是博博啦15 小时前
matlab例题
人工智能·算法·matlab
2402_8713219516 小时前
MATLAB方程组
gpt·学习·线性代数·算法·matlab
Matlab程序猿小助手1 天前
【MATLAB源码-第218期】基于matlab的北方苍鹰优化算法(NGO)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·嵌入式硬件·算法·matlab·机器人·无人机
Matlab精灵2 天前
使用MATLAB进行字符串处理
开发语言·matlab
机器学习之心2 天前
POD-Transformer多变量回归预测(Matlab)
matlab·回归·transformer·pod-transformer
WangYan20222 天前
高光谱遥感是什么?高光谱遥感数据如何处理?(基于Matlab和Python多案例解析)从小白到精通
matlab·高光谱遥感数据处理·混合像元分解
Matlab精灵3 天前
利用Matlab函数实现深度学习算法
深度学习·算法·matlab
十七算法实验室3 天前
Matlab实现北方苍鹰优化算法优化随机森林算法模型 (NGO-RF)(附源码)
开发语言·深度学习·算法·决策树·随机森林·机器学习·matlab
mailangduoduo3 天前
基于matlab的语音信号去噪的App Designer 设计
matlab·gui设计·语音去噪·app设计