【集群仿真】基于matlab匈牙利算法无人机队形重构集群仿真【含Matlab源码 1498期】
一、无人机集群仿真简介(附课程报告)
1 研究背景
四旋翼无人机具有成本较低、设备简单、飞行时间灵活等特点,近些年被广泛应用于军事和民用领域,如目标侦察、应急救援、农业植保、无人机灯光表演。随着任务复杂度的增加,单架无人机往往难以满足任务需求,因此无人机集群控制及其应用由此成为目前的研究热点,多无人机集群能够提高执行任务效率和灵活度。无人机队形变换控制方法是实现多无人机编队飞行的前提,集群无人机队形重构问题是我们要考虑的一个重要问题,让每架无人机都能从初始位置无碰撞的到达最终位置,进而保证队形重构过程中代价最小或能耗最优。其中目标分配问题最多利用匈牙利算法进行解决,但是在多无人机轨迹规划时普遍存在计算难度大、规划时间增长、规划效率难以满足实际需求的问题。因此,探索计算简便、效率高的多无人机路径规划算法是目前迫切需要的。
2 任务要求
(1)实验描述
十九架无人机组成的编队如图2.1所示,由F队形切换至Z队形,如果忽略本身以及外在约束条件的情况下,将会有多种不同的移动方案。但实际情形下无人机飞行距离越长,耗能也就越多,部分无人机到达目标的距离过长,消耗电力过多,从而提前降落。
图2.1: 编队实景图
使用传统匈牙利算法来解决队形变换的目标分配问题,其编队切换仿真图如下图,其中绿色方块表示无人机在F队形中的位置,红色圆点表示Z队形中无人机集群所要到达的各目标航点,黑色直线表示经分配后无人机由初始位置到达目标位置的直线路径。
图2.2: 匈牙利算法路径图
由上图可以看出,部分无人机到达目的地的直线路径过长,而大部分无人机初始位置与目标位置重合耗能少。移动路径长短不一,造成无人机耗能相差较大。所以我们需要寻求一种移动方式,使各个无人机移动路径长度趋于一致。
(2)实验要求
1、改进分配方案,使无人机在编队切换过程中飞行路径相近,飞行至目标航点时间一致,避免无人机耗能相差较大的问题。
2、集群无人机空中个别无人机能量不足或故障情况需退出,编队无人机数目发生变化,为维持编队队形需重新规划各无人机所在位置。
二、部分源代码
% 该程序用到
% main.m :
% 主函数 % calc.m :
% 位置计算函数,实际上是将矩阵的点绘制到固定坐标位置
% 例如矩阵 array_f 中第一行第二列中的1 表示一架无人机。在模型场景中
% 他的位置实际上是(90, 30),这个计算过程就是通过这个函数计算得到,知道他的功能就行。
%
% move.m :
% 位置移动函数,该函数主要功能是做点的位置移动,不需要理会。
%
% my_function.m:
% 算法函数,需要完成的算法函数,具体要完成什么在函数中有说明% clc
clear allsymbol = 'bo'; % 打点颜色符号(b. 蓝点; bo蓝圈)
symbol1 = 'wo'; % 打点颜色符号(w. 白点; wo白圈)dt = 1; % 采样步距
v = 1; % 速度% 设置两点之间距离
width = 10;% 做 8*8 矩阵 19 个点 字符:F 初始矩阵
array_f = [0 1 1 1 1 1 1 0;0 0 1 0 0 0 0 0;0 0 1 0 0 1 0 0;0 0 1 1 1 1 0 0;0 0 0 0 0 1 0 0;0 0 1 0 0 0 0 0;0 0 1 0 0 0 0 0;0 1 1 1 0 0 0 0];% 做 8*8 矩阵 19 个点 字符:Z 目标矩阵
array_z = [0 1 1 1 1 1 1 0;0 1 0 0 0 1 0 0;0 0 0 0 1 0 0 0;0 0 0 1 0 0 0 0;0 0 0 1 0 0 0 0;0 0 1 0 0 0 0 0;0 0 0 0 0 1 0 0;1 1 1 1 1 1 0 0];%场景的范围
xmin = 0;xmax = width * 8 + 20;ymin = 0;ymax = width * 8 + 20; % 创建一个空的坐标图
axis([xmin xmax ymin ymax]); %设定坐标范围
figure(1);
hold on ; %保留绘图内容% 初始化矩阵 % 该矩阵用于保存开始坐标位置 实际上是一个二维矩阵,矩阵的索引号就是 ID 号 第一位元素为 x 轴坐标,第二位元素为 y 轴坐标% 例如: id_sta_addr(7, 1) 表示 ID7 的无人机 X 轴坐标位置; 同理 id_sta_addr(7, 2)表示 ID7 的无人机 Y 轴坐标位置
id_sta_addr = zeros(19,2); % 该矩阵用于保存结束坐标位置
id_sto_addr = zeros(19,2);% 该矩阵用于无人机在飞行过程中的临时坐标信息
id_cur_addr = zeros(19,2);% 该矩阵用于保存所有无人机的最终要飞行的时间 是一个一维数组, 同上索引和就是ID号
% 例如 id_tm(1) 表示 ID1的无人机 飞行的时间
id_tm = zeros(19, 1); % 临时变量
index = 1;% 给飞机实时编号,行扫描 安置无人机初始位置 实际上就是按比例显示F 这个函数不需要关心
% 他的工作就是 扫描 8*8 的矩阵,然后将矩阵中为 1 元素的位置按比例在图纸上用圆圈描绘出来
% 其中 两无人机的 位置宽带设置由 width 决定,如果 width = 10 ,则表示两无人机位置宽度为10个单位宽度
% 在该循环中 calc(i, j, width) 函数 是将 'F' 按比例放大并安置无人机到模型当中
% 其中 ID 的扫描顺序为: 第一行从左边第一列开始,到最后一列依次定义。
% 例如:array_f 中第一行第二列的 定义为 ID1; array_f 中第一行第七列的 定义为 ID6; 以此类推
for i = 1: 8for j = 1: 8 % start 坐标if array_f(i, j) == 1% 做矩阵点位置应该实际场景[id_sta_addr(index, 1), id_sta_addr(index, 2)] = calc(i, j, width);% 安置飞机plot(id_sta_addr(index, 1), id_sta_addr(index, 2), 'bo');index = index + 1; endend
end% 算法部分 完成 my_function 函数即可
% temp_info 保存着各个ID的变化信息
temp_info = my_function(array_f, array_z);pause(2);% % 测试部分%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% id_sto_addr = id_sta_addr;
%
% % calc(2, 2, width); 中(2,2)表示无人机终止位置坐标,width表示位宽
% %id_sto_addr(7, 1); 中(8,1)表示8 表示 ID, 1 表示 X坐标, 2 表示Y坐标
% % 表示 ID 7的点 移动到(2,2) 的位置
% [id_sto_addr(7, 1) , id_sto_addr( 7, 2)] = calc(2, 2, width);
% [id_sto_addr(8, 1) , id_sto_addr( 8, 2)] = calc(3, 5, width);
% [id_sto_addr(9, 1) , id_sto_addr( 9, 2)] = calc(2, 6, width);
% [id_sto_addr(10, 1), id_sto_addr(10, 2)] = calc(4, 4, width);
% [id_sto_addr(11, 1), id_sto_addr(11, 2)] = calc(5, 4, width);
% [id_sto_addr(12, 1), id_sto_addr(12, 2)] = calc(8, 5, width);
% [id_sto_addr(13, 1), id_sto_addr(13, 2)] = calc(7, 6, width);
% [id_sto_addr(14, 1), id_sto_addr(14, 2)] = calc(8, 6, width);
% [id_sto_addr(16, 1), id_sto_addr(16, 2)] = calc(8, 1, width);
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算 各个无人机运行时间
% 假设无人机 开始位置设置为(x1, y1),终止位置设置为(x2,y2) 则他们运行时间为:
% t = sqrt((x1 - x2)^2 + (y1 - y2)^2) / v (时间 = 路程 / 速度)
% 其中 sqrt 表示开根号
% 这里 使用一个循环则表示计算各个无人机 改变位置需要消耗的时间% 前面使用的 for 循环已经 计算出所有飞机飞行或改变位置的消耗时间% 由于无人机的时间有长有短,所以要得到最后变化的队形,肯定是按照最长时间计算变化时间%这里就是获取最大的变化时间
max_tm = max(id_tm);% 该部分有两重循环, 第一重循环是表示 时间 扫描表示的是时间更新 其中 dt 表示无人机飞行过程中的更新时间 默认dt = 1
% 如果 dt = 1则表示 1s 更新一次飞行状态
% 可以不用理会 这个 写算法用不到for t=0:dt:max_tm% 扫描19个点for index = 1:19% 单点移动[id_cur_addr(index, 1), id_cur_addr(index, 2)] = move(index, ...id_sta_addr, ...id_sto_addr, ...id_cur_addr, ...t, ...id_tm, ...v);endfprintf('在任意两无人机距离为 %d 个单位时, 最大运行时间为 %f \n', width, ...function [M,Perf_select,cost,Mean_square_erro] = zq_ave(Perf)
%Perf = [ 1.0000 1.4142 4.1231 2.2361 2.8284 3.6056 4.4721 5.0000 4.1231 5.0990;
% 3.0000 3.1623 1.0000 3.6056 2.8284 2.2361 2.0000 3.0000 5.0000 5.8310;
% 2.2361 2.0000 1.0000 2.2361 1.4142 1.0000 1.4142 2.2361 3.6056 4.4721;
% 2.2361 1.4142 2.2361 1.0000 0 1.0000 2.0000 2.2361 2.2361 3.1623;
% 3.1623 2.2361 2.8284 1.4142 1.0000 1.4142 2.2361 2.0000 1.4142 2.2361;
% 4.0000 3.0000 4.2426 2.0000 2.2361 2.8284 3.6056 3.1623 0 1.0000;% 5.8310 5.0000 4.0000 4.2426 3.6056 3.1623 3.0000 2.0000 3.1623 3.0000;
% 6.3246 5.3852 7.0711 4.4721 5.0000 5.6569 6.4031 5.8310 2.8284 2.2361;
% 6.3246 5.3852 5.0990 4.4721 4.1231 4.0000 4.1231 3.1623 2.8284 2.2361;
% 6.7082 5.8310 5.0000 5.0000 4.4721 4.1231 4.0000 3.0000 3.6056 3.1623;% ];size_P = size(Perf);%返回一个行向量,第一个元素是矩阵行,第二个是列,M = zeros(1,size_P(1));%返回一个1*10的零矩阵Perf_num = zeros(size(Perf));%返回一个10*10的零矩阵t = size_P(1);%t为10
min_mean = zeros(t);%10*10的矩阵
ave = 0;
for i=1:t min_r = min(Perf(:,t));%A(x,y)表示二维矩阵第x行第y列位置的元素,x为:则表示所有的行。因此,A(:,1)就表示A的第1列的所有元素 1ave_vl = mean(mean(Perf(:,t)));%mean是求均值 % min_mean(i) = (min_r+ave)/2;min_mean(i) = 0.2*min_r+0.8*ave_vl; % 调节最小、平均之间的比例ave = ave + ave_vl;
endave = ave/t;% 求与平均值的差值 的矩阵
for j=1:tfor i=1:t Perf_num(i,j) = abs(Perf(i,j) - min_mean(j));%10*10的矩阵=end
end% 将列最小值变为0
% function [Perf_num] = zero_mark(Perf_num)for j=1:tmin_num = min(Perf_num(:,j));%找出第j列最小的元素for i=1:tif Perf_num(i,j) == min_numPerf_num(i,j) = 0;break;endend end
%end
%zero_mark(Perf_num);%重新标0
zeros_mark_num = zeros(1,10);
n = 1;
for i=1:tfor j=1:tif Perf_num(i,j) == 0if find(zeros_mark_num == i)Perf_num = zero_mark(Perf_num,Perf,ave);elsezeros_mark_num(n) = i;n = n+1;endendend
end for i=1:tfor j=1:tif Perf_num(i,j) == 0if find(zeros_mark_num == i)Perf_num = zero_mark(Perf_num,Perf,ave);elsezeros_mark_num(n) = i;n = n+1;endendend
end cost = 0;
Mean_square_erro = 0;
Perf_select = zeros(1,t);for i=1:tfor j=1:tif Perf_num(i,j)==0M(i) = j;Perf_select(i) = Perf(j,i);%做了修改cost = cost + Perf(j,i);endend
endmean_Perf_select = mean(Perf_select)
for i = 1:tMean_square_erro = Mean_square_erro + (Perf_select(i)-mean_Perf_select)^2;
end
Mean_square_erro = Mean_square_erro/t;end
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]巫茜,罗金彪,顾晓群,曾青.基于改进PSO的无人机三维航迹规划优化算法[J].兵器装备工程学报. 2021,42(08)
【集群仿真】基于matlab匈牙利算法无人机队形重构集群仿真【含Matlab源码 1498期】相关推荐
- 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】
一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...
- 【Matlab人脸识别】KL变换人脸识别【含GUI源码 859期】
一.代码运行视频(哔哩哔哩) [Matlab人脸识别]KL变换人脸识别[含GUI源码 859期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...
- 【Matlab语音隐写】DWT音频数字水印【含GUI源码 712期】
一.代码运行视频(哔哩哔哩) [Matlab语音隐写]DWT音频数字水印[含GUI源码 712期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊, ...
- 【Matlab心音信号】EMD心音信号特征提取【含GUI源码 1735期】
一.代码运行视频(哔哩哔哩) [Matlab心音信号]EMD心音信号特征提取[含GUI源码 1735期] 二.matlab版本及参考文献 1 matlab版本 2014a *2 参考文献 [1] 沈再 ...
- 【A_star三维路径规划】基于matlab A_star算法无人机山地三维路径规划【含Matlab源码 266期】
⛄一.A_star算法简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机, ...
- 【优化布局】基于matlab免疫算法求解充电站最优布局【含Matlab源码 2539期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[生产调度]基于matlab免疫算法求解生产调度零等待问题[含Matlab源码 1178期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...
- 【雷达通信】基于matlab NCP算法SAR回波生成和成像【含Matlab源码 1185期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[雷达通信]基于matlab NCP算法SAR回波生成和成像[含Matlab源码 1185期] 点击上面蓝色字体,直接付费下载,即可. 获 ...
- 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】
一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...
- 【Matlab电力负荷预测】粒子群优化支持向量机短期电力负荷预测【含GUI源码 751期】
一.代码运行视频(哔哩哔哩) [Matlab电力负荷预测]粒子群优化支持向量机短期电力负荷预测[含GUI源码 751期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...
- 【Matlab通信】DTMF双音多频电话拨号仿真【含GUI源码 805期】
一.代码运行视频(哔哩哔哩) [Matlab通信]DTMF双音多频电话拨号仿真[含GUI源码 805期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...
最新文章
- R可视化绘制t分布(t Distribution)
- App 运营的指标具体都有哪些?(二)
- concurrent.futures dataset
- iinflux数据库使用
- 深度学习主机环境配置: Win10+Nvidia GTX 1080i+CUDA8.0+CUDDN6
- 照片识别出错_2.GQI2021强电专业点式专业图元识别连载
- 【Nutch2.2.1源代码分析之5】索引的基本流程
- sklearn自学指南(part29)--高斯混合模型
- php标签嵌入规范,HTML标签嵌套的详细规则
- extjs 实用开发指南_如何提出有效问题:针对开发人员的实用指南
- Django的视图层
- caffe学习笔记(2)
- SocketFactory、DefaultSocketFactory、ServerSocketFactory、DefaultServerSocketFactory
- 总结关于 Vue 框架面试题
- 49.邮件模板的传值与调用
- linux输入子系统概述,4. Linux - 输入子系统框架详解
- 搭建邮件服务器 linux,Linux局域网邮件服务器搭建
- oracle vm 文件复制,Oracle VM VirtualBox虚拟机怎么实现与主机之间的文件拖动
- CSS揭秘:5.条纹背景(上)
- Lm317电压源芯片制作电流源
热门文章
- Java - Java Mail邮件开发(2)springboot +Java Mail + Html
- linux 用户操作相关命令
- 一个解决OnNcLButtonUp不能响应消息问题的更好办法
- 分布式系统常用思想和技术
- WinForm系统 -- 系统架构
- android SDK 常见安装方法
- 七月算法机器学习 7 工作流程与模型调优 Kaggle案例泰坦尼克号问题
- 281210每日一句
- wampserver的下载与安装配置
- Atitit 知识搜索 信息检索的方法总结 目录 1. 目录搜索	1 1.1. 向下同级搜索	1 1.2. 向上目录抽象搜索	1 2. hash搜索模式	1 2.1. 关键词搜索 主题搜索	1 2