实现多无人机航迹规划附Matlab代码)
✅作者简介热爱科研的Matlab仿真开发者擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 往期回顾关注个人主页Matlab科研工作室 关注我领取海量matlab电子书和数学建模资料个人信条格物致知,完整Matlab代码获取及仿真咨询内容私信。 内容介绍随着多无人机集群在灾害应急测绘、山区输电线路巡检、农林大范围植保等场景的大规模落地应用三维空间下的多无人机协同航迹规划已经成为集群任务执行的核心技术支撑。传统人工规划二维航迹的方法无法适配福建漳州山地、近海等复杂三维地形环境很容易出现无人机撞山、集群碰撞、航迹重叠冲突等安全问题严重制约多无人机集群的任务执行效率。灰狼优化算法Grey Wolf Optimizer, GWO作为2014年提出的新型元启发式智能优化算法凭借参数少、收敛稳定性强、全局搜索能力均衡的核心优势完美适配多无人机三维航迹规划这类高维多约束优化场景能够在复杂障碍环境下快速生成满足协同约束的全局最优多机航迹大幅提升多无人机集群的任务安全性与执行效率。一、 多无人机三维航迹规划的场景需求与技术痛点多无人机三维航迹规划的核心目标是在给定的三维任务空间内为每一架无人机生成一条从起点到目标点的可飞行航迹同时满足地形障碍规避、无人机之间最小安全距离约束、最大航迹长度限制、最大转弯角与爬升角约束等多重约束条件最终实现多机集群的综合任务收益最大化。在福建漳州的沿海山地巡检场景中任务区域内同时存在海拔超过1000米的山地障碍物、高压输电塔等人工障碍物、民航禁飞区等空域约束传统的A*算法、人工势场法等传统路径规划方法在三维多机场景下很容易出现搜索维数爆炸、陷入局部最优陷阱的问题无法同时兼顾多机的航迹最优性与协同安全性。传统的多无人机航迹规划方案大多采用“先单机规划、后协同校验”的两步策略先为每一架无人机单独规划最优航迹再通过后续调整消除航迹之间的冲突这种方法生成的航迹全局最优性差调整过程中往往会导致单架无人机的航迹长度大幅增加甚至出现无法规避障碍的无效航迹。而基于GWO算法的多无人机三维协同航迹规划框架将所有无人机的航迹作为整体进行统一编码优化在迭代寻优的过程中同步完成障碍规避与多机协同约束校验直接输出全局最优的多机协同航迹从根源上解决了传统两步规划方法的性能缺陷。灰狼优化算法的仿生逻辑来源于灰狼种群的分层狩猎行为将灰狼种群严格划分为α、β、δ、ω四个社会等级α狼是种群的最高领导者对应优化问题的全局最优解β狼是次级领导者对应次优解δ狼服从α与β的指挥对应第三级优质解剩余的普通ω狼围绕前三类优质狼的位置进行更新模拟灰狼种群的围捕狩猎过程。这种基于三层精英狼引导的更新机制相比传统粒子群算法的单精英引导机制拥有更强的全局勘探能力迭代过程中种群多样性衰减速度更慢非常适配多无人机三维航迹规划这类高维多约束的复杂优化场景。⛳️ 运行结果 部分代码function IMG_Plot(solution, UAV)%IMG_PLOT 绘图函数(需手动添加无人机close all;% 解Tracks solution.Tracks; % 航迹们Data solution.Alpha_Data; % 最优航迹信息Fitness_list solution.Fitness_list; % 适应度曲线Alpha_no solution.Alpha_no; % α解序号Beta_no solution.Beta_no; % β解序号Delta_no solution.Delta_no; % γ解序号agent_no Alpha_no; % 要绘制的解的序号% 航迹图if UAV.PointDim3%%%%%%%%% ———— 2D仿真 ———— %%%%%%%%%x1 [UAV.S(1,1),Tracks{agent_no, 1}.P{1, 1}(1,:),UAV.G(1,1)];y1 [UAV.S(1,2),Tracks{agent_no, 1}.P{1, 1}(2,:),UAV.G(1,2)];x2 [UAV.S(2,1),Tracks{agent_no, 1}.P{2, 1}(1,:),UAV.G(2,1)];y2 [UAV.S(2,2),Tracks{agent_no, 1}.P{2, 1}(2,:),UAV.G(2,2)];x3 [UAV.S(3,1),Tracks{agent_no, 1}.P{3, 1}(1,:),UAV.G(3,1)];y3 [UAV.S(3,2),Tracks{agent_no, 1}.P{3, 1}(2,:),UAV.G(3,2)];% add morefigure(1)plot(x1,y1,k,x2,y2,k-.,x3,y3,k--,LineWidth1) % 修改这里hold onfor i 1:UAV.numplot(UAV.S(i,1),UAV.S(i,2),ko,LineWidth1,MarkerSize9)hold onplot(UAV.G(i,1),UAV.G(i,2),p,colork,LineWidth1,MarkerSize10)hold onendfor i 1:size(UAV.Menace.radar,1)rectangle(Position,[UAV.Menace.radar(i,1)-UAV.Menace.radar(i,3),UAV.Menace.radar(i,2)-UAV.Menace.radar(i,3),2*UAV.Menace.radar(i,3),2*UAV.Menace.radar(i,3)],Curvature,[1,1],EdgeColor,k,FaceColor,g)hold onendfor i 1:size(UAV.Menace.other,1)rectangle(Position,[UAV.Menace.other(i,1)-UAV.Menace.other(i,3),UAV.Menace.other(i,2)-UAV.Menace.other(i,3),2*UAV.Menace.other(i,3),2*UAV.Menace.other(i,3)],Curvature,[1,1],EdgeColor,k,FaceColor,c)hold onendfor i 1:UAV.numleg_str{i} [Track,num2str(i)];endleg_str{UAV.num1} Start;leg_str{UAV.num2} End;legend(leg_str)grid onaxis equalxlim([-25,900]) % 修改这里ylim([-25,900]) % 修改这里xlabel(x(km))ylabel(y(km))title(路径规划图)else%%%%%%%%% ———— 3D仿真 ———— %%%%%%%%%x1 [UAV.S(1,1),Tracks{agent_no, 1}.P{1, 1}(1,:),UAV.G(1,1)];y1 [UAV.S(1,2),Tracks{agent_no, 1}.P{1, 1}(2,:),UAV.G(1,2)];z1 [UAV.S(1,3),Tracks{agent_no, 1}.P{1, 1}(3,:),UAV.G(1,3)];x2 [UAV.S(2,1),Tracks{agent_no, 1}.P{2, 1}(1,:),UAV.G(2,1)];y2 [UAV.S(2,2),Tracks{agent_no, 1}.P{2, 1}(2,:),UAV.G(2,2)];z2 [UAV.S(2,3),Tracks{agent_no, 1}.P{2, 1}(3,:),UAV.G(2,3)];x3 [UAV.S(3,1),Tracks{agent_no, 1}.P{3, 1}(1,:),UAV.G(3,1)];y3 [UAV.S(3,2),Tracks{agent_no, 1}.P{3, 1}(2,:),UAV.G(3,2)];z3 [UAV.S(3,3),Tracks{agent_no, 1}.P{3, 1}(3,:),UAV.G(3,3)];% add morefigure(1)plot3(x1,y1,z1,g,LineWidth2) % 修改这里hold onplot3(x2,y2,z2,r-.,LineWidth2)hold onplot3(x3,y3,z3,b:,LineWidth2)hold on% add morefor i 1:UAV.numplot3(UAV.S(i,1),UAV.S(i,2),UAV.S(i,3),ko,LineWidth1.3,MarkerSize12)hold onplot3(UAV.G(i,1),UAV.G(i,2),UAV.G(i,3),p,colork,LineWidth1.3,MarkerSize13)hold onendfor i 1:size(UAV.Menace.radar,1)drawsphere(UAV.Menace.radar(i,1),UAV.Menace.radar(i,2),UAV.Menace.radar(i,3),UAV.Menace.radar(i,4),true)hold onendfor i 1:size(UAV.Menace.other,1)drawsphere(UAV.Menace.other(i,1),UAV.Menace.other(i,2),UAV.Menace.other(i,3),UAV.Menace.other(i,4))hold onendfor i 1:UAV.numleg_str{i} [Track,num2str(i)];endleg_str{UAV.num1} Start;leg_str{UAV.num2} End;legend(leg_str)grid onaxis square%axis equalxlim([-25,900]) % 修改这里ylim([-25,900]) % 修改这里zlim([0,25]) % 修改这里xlabel(x(km))ylabel(y(km))zlabel(z(km))title(路径规划图)end% 适应度figure(2)plot(Fitness_list,k,LineWidth1)grid onxlabel(iter)ylabel(fitness)title(适应度曲线)% 屏幕输出信息fprintf(\n无人机数量%d, UAV.num)fprintf(\n无人机导航点个数)fprintf(%d, , UAV.PointNum)fprintf(\n无人机飞行距离)fprintf(%.2fkm, , Data.L)fprintf(\n无人机飞行时间)fprintf(%.2fs, , Data.t)fprintf(\n无人机飞行速度)fprintf(%.2fm/s, , Data.L./Data.t*1e3)fprintf(\n无人机总碰撞次数%d, Data.c)fprintf(\n目标函数收敛值%.2f, Fitness_list(end))% fprintf(\nα、β、δ 解编号%d, %d, %d, Alpha_no, Beta_no, Delta_no)fprintf(\n\n)end%% 绘制球面function drawsphere(a,b,c,R,useSurf)% 以(a,b,c)为球心R为半径if (nargin5)useSurf false;end% 生成数据[x,y,z] sphere(20);% 调整半径x R*x;y R*y;z R*z;% 调整球心x xa;y yb;z zc;if useSurf% 使用surf绘制axis equal;surf(x,y,z);hold onelse% 使用mesh绘制axis equal;mesh(x,y,z);hold onendend 参考文献往期回顾扫扫下方二维码