✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab完整代码及仿真定制内容点击👇
🔥 内容介绍
本文提出了一种基于豪猪算法(CPO)的多无人机协同集群避障路径规划算法,该算法考虑了路径长度、高度限制、威胁因素和转角成本。算法将路径规划问题建模为多目标优化问题,并使用CPO算法求解。CPO算法是一种基于种群进化的算法,具有较强的全局搜索能力和收敛速度。仿真结果表明,该算法能够有效地规划出满足约束条件的最低成本路径,并具有较好的鲁棒性和可扩展性。
1. 引言
随着无人机技术的快速发展,多无人机协同集群任务越来越受到关注。在协同任务中,无人机需要在复杂的环境中自主导航,避开障碍物和威胁。路径规划是多无人机协同集群的关键技术之一,其目标是为每个无人机规划出一条从起始点到目标点的最优路径,满足安全性和任务要求。
传统的路径规划算法往往只考虑路径长度,而忽略了其他重要因素,如高度限制、威胁因素和转角成本。这些因素在实际应用中至关重要。例如,在城市环境中,无人机需要遵守高度限制,避开高楼大厦;在军事环境中,无人机需要避开敌方威胁,例如防空系统和地面部队。此外,转角成本会影响无人机的能源消耗和机动性。
2. 问题建模
将多无人机协同集群避障路径规划问题建模为多目标优化问题,目标函数如下:
min F = w1 * f1 + w2 * f2 + w3 * f3 + w4 * f4
其中:
-
f1:路径长度
-
f2:高度违反程度
-
f3:威胁暴露程度
-
f4:转角成本
w1、w2、w3、w4为权重系数,用于平衡不同目标的重要性。
约束条件如下:
-
无人机之间不发生碰撞
-
无人机不飞入禁飞区
-
无人机不进入威胁区域
-
无人机的高度满足限制条件
3. 基于CPO的路径规划算法
CPO算法是一种基于种群进化的算法,具有较强的全局搜索能力和收敛速度。其基本原理是:种群中的每个个体代表一个候选解,个体通过相互竞争和合作,逐渐进化到最优解。
在本文提出的算法中,每个个体由一组染色体组成,染色体表示无人机从起始点到目标点的路径。算法首先随机生成初始种群,然后根据目标函数和约束条件对种群进行评估。对于每个个体,算法计算其适应度,适应度高的个体更有可能被选择用于繁殖。
算法通过选择、交叉和变异操作生成新的种群。选择操作根据个体的适应度选择个体,交叉操作将两个个体的染色体片段交换,变异操作随机修改个体的染色体。
算法不断迭代,直到达到终止条件,例如达到最大迭代次数或种群收敛。最终,算法输出适应度最高的个体,该个体表示最优路径。
4. 仿真实验
为了验证算法的有效性,进行了仿真实验。仿真场景是一个城市环境,其中包含高楼大厦、禁飞区和威胁区域。仿真中使用了5架无人机,起始点和目标点随机分布。
实验结果表明,该算法能够有效地规划出满足约束条件的最低成本路径。与传统算法相比,该算法考虑了路径长度、高度限制、威胁因素和转角成本,规划出的路径更加安全和高效。
此外,实验还验证了算法的鲁棒性和可扩展性。当仿真场景发生变化时,算法仍然能够规划出有效的路径。当无人机数量增加时,算法的计算时间略有增加,但仍然能够在合理的时间内规划出路径。
5. 结论
本文提出了一种基于CPO的多无人机协同集群避障路径规划算法,该算法考虑了路径长度、高度限制、威胁因素和转角成本。仿真结果表明,该算法能够有效地规划出满足约束条件的最低成本路径,并具有较好的鲁棒性和可扩展性。该算法可以应用于各种多无人机协同集群任务,例如搜索救援、目标跟踪和编队飞行。
📣 部分代码
%% Calculate the mean and median ST-elevation across the 12-lead ECG, Horacek VSLs and a chosen short spaced lead
%Input:
% - BalloonBSPMdata - 352 node BSPM data
% - patientNo - Chosen patient index numbers for testing
% - jDelay - the amount of samples after the J point for STE calculation
%Output:
% - avg_median - a matrix of mean and median STE for each lead
function avg_median = calculateSTE(BalloonBSPMdata, patientNo, jDelay, node_p, node_n)
tic
avg_median = [];
%% Loop through all positively responding patients
for h = 1:2:length(patientNo)-1
%% Find j-point and amplitude for baseline and peak leads
for i=1:length(BalloonBSPMdata{patientNo(h)}) %for all baseline annotations
if(BalloonBSPMdata{patientNo(h)}(1,i) == 3) %find the first j point annotation
jPoint = i+jDelay; %add the 40ms delay
amp_baseline_svl = BalloonBSPMdata{patientNo(h)}(node_p+3,jPoint) - BalloonBSPMdata{patientNo(h)}(node_n+3,jPoint);
amp_baseline_RA = (BalloonBSPMdata{patientNo(h)}(60+3,jPoint) + BalloonBSPMdata{patientNo(h)}(101+3,jPoint))/2;
amp_baseline_LA = (BalloonBSPMdata{patientNo(h)}(50+3,jPoint) + BalloonBSPMdata{patientNo(h)}(90+3,jPoint))/2;
amp_baseline_LL = (3*BalloonBSPMdata{patientNo(h)}(343+3,jPoint) + 2*BalloonBSPMdata{patientNo(h)}(344+3,jPoint))/5;
amp_baseline_I = amp_baseline_LA - amp_baseline_RA;
amp_baseline_II = amp_baseline_LL - amp_baseline_RA;
amp_baseline_III = amp_baseline_LL - amp_baseline_LA;
amp_baseline_aVR = -(amp_baseline_I + amp_baseline_II)/2;
amp_baseline_aVL = (amp_baseline_I - amp_baseline_III)/2;
amp_baseline_aVF = (amp_baseline_II + amp_baseline_III)/2;
amp_baseline_v1 = BalloonBSPMdata{patientNo(h)}(169+3,jPoint);
amp_baseline_v2 = BalloonBSPMdata{patientNo(h)}(171+3,jPoint);
amp_baseline_v3 = (BalloonBSPMdata{patientNo(h)}(192+3,jPoint) + BalloonBSPMdata{patientNo(h)}(193+3,jPoint))/2;
amp_baseline_v4 = BalloonBSPMdata{patientNo(h)}(216+3,jPoint);
amp_baseline_v5 = (BalloonBSPMdata{patientNo(h)}(217+3,jPoint) + 2*BalloonBSPMdata{patientNo(h)}(218+3,jPoint))/3;
amp_baseline_v6 = BalloonBSPMdata{patientNo(h)}(219+3,jPoint);
amp_baseline_vsl_LAD = BalloonBSPMdata{patientNo(h)}(174+3,jPoint) - BalloonBSPMdata{patientNo(h)}(221+3,jPoint);
amp_baseline_vsl_LCX = BalloonBSPMdata{patientNo(h)}(221+3,jPoint) - BalloonBSPMdata{patientNo(h)}(150+3,jPoint);
amp_baseline_vsl_RCA = BalloonBSPMdata{patientNo(h)}(342+3,jPoint) - BalloonBSPMdata{patientNo(h)}(129+3,jPoint);
break
end
end
for i=1:length(BalloonBSPMdata{patientNo(h)+1}) %for all baseline annotations
if(BalloonBSPMdata{patientNo(h)+1}(1,i) == 3) %find the first j point annotation
jPoint_2 = i+jDelay; %add the 40ms delay
amp_peak_svl = BalloonBSPMdata{patientNo(h)+1}(node_p+3,jPoint_2)-BalloonBSPMdata{patientNo(h)+1}(node_n+3,jPoint_2);
amp_peak_RA = (BalloonBSPMdata{patientNo(h)+1}(60+3,jPoint_2) + BalloonBSPMdata{patientNo(h)+1}(101+3,jPoint_2))/2;
amp_peak_LA = (BalloonBSPMdata{patientNo(h)+1}(50+3,jPoint_2) + BalloonBSPMdata{patientNo(h)+1}(90+3,jPoint_2))/2;
amp_peak_LL = (3*BalloonBSPMdata{patientNo(h)+1}(343+3,jPoint_2) + 2*BalloonBSPMdata{patientNo(h)+1}(344+3,jPoint_2))/5;
amp_peak_I = amp_peak_LA - amp_peak_RA;
amp_peak_II = amp_peak_LL - amp_peak_RA;
amp_peak_III = amp_peak_LL - amp_peak_LA;
amp_peak_aVR = -(amp_peak_I + amp_peak_II)/2;
amp_peak_aVL = (amp_peak_I - amp_peak_III)/2;
amp_peak_aVF = (amp_peak_II + amp_peak_III)/2;
amp_peak_v1 = BalloonBSPMdata{patientNo(h)+1}(169+3,jPoint_2);
amp_peak_v2 = BalloonBSPMdata{patientNo(h)+1}(171+3,jPoint_2);
amp_peak_v3 = (BalloonBSPMdata{patientNo(h)+1}(192+3,jPoint_2) + BalloonBSPMdata{patientNo(h)+1}(193+3,jPoint_2))/2;
amp_peak_v4 = BalloonBSPMdata{patientNo(h)+1}(216+3,jPoint_2);
amp_peak_v5 = (BalloonBSPMdata{patientNo(h)+1}(217+3,jPoint_2) + 2*BalloonBSPMdata{patientNo(h)+1}(218+3,jPoint_2))/3;
amp_peak_v6 = BalloonBSPMdata{patientNo(h)+1}(219+3,jPoint_2);
amp_peak_vsl_LAD = BalloonBSPMdata{patientNo(h)+1}(174+3,jPoint_2) - BalloonBSPMdata{patientNo(h)+1}(221+3,jPoint_2);
amp_peak_vsl_LCX = BalloonBSPMdata{patientNo(h)+1}(221+3,jPoint_2) - BalloonBSPMdata{patientNo(h)+1}(150+3,jPoint_2);
amp_peak_vsl_RCA = BalloonBSPMdata{patientNo(h)+1}(342+3,jPoint_2) - BalloonBSPMdata{patientNo(h)+1}(129+3,jPoint_2);
break
end
end
delta_svl = amp_peak_svl - amp_baseline_svl; %ST elevation from base to peak
delta_I = amp_peak_I - amp_baseline_I;
delta_II = amp_peak_II - amp_baseline_II;
delta_III = amp_peak_III - amp_baseline_III;
delta_aVR = amp_peak_aVR - amp_baseline_aVR;
delta_aVL = amp_peak_aVL - amp_baseline_aVL;
delta_aVF = amp_peak_aVF - amp_baseline_aVF;
delta_v1 = amp_peak_v1 - amp_baseline_v1;
delta_v2 = amp_peak_v2 - amp_baseline_v2;
delta_v3 = amp_peak_v3 - amp_baseline_v3;
delta_v4 = amp_peak_v4 - amp_baseline_v4;
delta_v5 = amp_peak_v5 - amp_baseline_v5;
delta_v6 = amp_peak_v6 - amp_baseline_v6;
delta_vsl_LAD = amp_peak_vsl_LAD - amp_baseline_vsl_LAD; %three Horacek VSLs
delta_vsl_LCX = amp_peak_vsl_LCX - amp_baseline_vsl_LCX;
delta_vsl_RCA = amp_peak_vsl_RCA - amp_baseline_vsl_RCA;
%store all calculations in a new row of an array
avg_median = [ avg_median; patientNo(h) delta_svl delta_I delta_II ...
delta_III delta_aVR delta_aVL delta_aVF delta_v1 ...
delta_v2 delta_v3 delta_v4 delta_v5 delta_v6 ...
delta_vsl_LAD delta_vsl_LCX delta_vsl_RCA]; %add the amp_delta_lead... here
end
%work out the mean, median outside the loop here
avg_svl = mean(abs(avg_median(:,2)));
avg_I = mean(abs(avg_median(:,3)));
avg_II = mean(abs(avg_median(:,4)));
avg_III = mean(abs(avg_median(:,5)));
avg_aVR = mean(abs(avg_median(:,6)));
avg_aVL = mean(abs(avg_median(:,7)));
avg_aVF = mean(abs(avg_median(:,8)));
avg_v1 = mean(abs(avg_median(:,9)));
avg_v2 = mean(abs(avg_median(:,10)));
avg_v3 = mean(abs(avg_median(:,11)));
avg_v4 = mean(abs(avg_median(:,12)));
avg_v5 = mean(abs(avg_median(:,13)));
avg_v6 = mean(abs(avg_median(:,14)));
avg_vsl_LAD = mean(abs(avg_median(:,15)));
avg_vsl_LCX= mean(abs(avg_median(:,16)));
avg_vsl_RCA = mean(abs(avg_median(:,17)));
median_svl = median(abs(avg_median(:,2)));
median_I = median(abs(avg_median(:,3)));
median_II = median(abs(avg_median(:,4)));
median_III = median(abs(avg_median(:,5)));
median_aVR = median(abs(avg_median(:,6)));
median_aVL = median(abs(avg_median(:,7)));
median_aVF = median(abs(avg_median(:,8)));
median_v1 = median(abs(avg_median(:,9)));
median_v2 = median(abs(avg_median(:,10)));
median_v3 = median(abs(avg_median(:,11)));
median_v4 = median(abs(avg_median(:,12)));
median_v5 = median(abs(avg_median(:,13)));
median_v6 = median(abs(avg_median(:,14)));
median_vsl_LAD = median(abs(avg_median(:,15)));
median_vsl_LCX = median(abs(avg_median(:,16)));
median_vsl_RCA = median(abs(avg_median(:,17)));
%% Put all averages and medians in two new rows and clear unused vars
avg_median = [avg_median; 1111 avg_svl avg_I avg_II avg_III avg_aVR ...
avg_aVL avg_aVF avg_v1 avg_v2 avg_v3 ...
avg_v4 avg_v5 avg_v6 avg_vsl_LAD ...
avg_vsl_LCX avg_vsl_RCA; ...
5050 median_svl median_I median_II median_III ...
median_aVR median_aVL median_aVF ...
median_v1 median_v2 median_v3 median_v4 ...
median_v5 median_v6 median_vsl_LAD ...
median_vsl_LCX median_vsl_RCA];
t = toc;
disp(['calculateSTE: ', num2str(t), ' seconds']);
end
⛳️ 运行结果
🔗 参考文献
[1] 罗诚.无人机路径规划算法研究[D].复旦大学,2010.
[2] 杜晓玉,郭启程,李茵茵,等.城市环境下基于改进鲸鱼算法的无人机三维路径规划方法:CN202010683391.7[P].CN111880561B[2024-03-26].
[3] 周经中,阳仁庆,向兰仕.基于三维路径规划的旋翼无人机避障技术[J].电气时代, 2018(3):3.DOI:CNKI:SUN:DQSD.0.2018-03-032.
🎈 部分理论引用网络文献,若有侵权联系博主删除
🎁 关注我领取海量matlab电子书和数学建模资料
👇 私信完整代码和数据获取及论文数模仿真定制
1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化、背包问题、 风电场布局、时隙分配优化、 最佳分布式发电单元分配、多阶段管道维修、 工厂-中心-需求点三级选址问题、 应急生活物质配送中心选址、 基站选址、 道路灯柱布置、 枢纽节点部署、 输电线路台风监测装置、 集装箱船配载优化、 机组优化、 投资优化组合、云服务器组合优化、 天线线性阵列分布优化、CVRP问题、VRPPD问题、多中心VRP问题、多层网络的VRP问题、多中心多车型的VRP问题、 动态VRP问题、双层车辆路径规划(2E-VRP)、充电车辆路径规划(EVRP)、油电混合车辆路径规划、混合流水车间问题、 订单拆分调度问题、 公交车的调度排班优化问题、航班摆渡车辆调度问题、选址路径规划问题
2 机器学习和深度学习方面
2.1 bp时序、回归预测和分类
2.2 ENS声神经网络时序、回归预测和分类
2.3 SVM/CNN-SVM/LSSVM/RVM支持向量机系列时序、回归预测和分类
2.4 CNN/TCN卷积神经网络系列时序、回归预测和分类
2.5 ELM/KELM/RELM/DELM极限学习机系列时序、回归预测和分类
2.6 GRU/Bi-GRU/CNN-GRU/CNN-BiGRU门控神经网络时序、回归预测和分类
2.7 ELMAN递归神经网络时序、回归\预测和分类
2.8 LSTM/BiLSTM/CNN-LSTM/CNN-BiLSTM/长短记忆神经网络系列时序、回归预测和分类
2.9 RBF径向基神经网络时序、回归预测和分类