【路径规划】基于NSGA2实现无人机三维路径规划matlab源码

266 阅读5分钟

1 模型

1.1 NSGA2原理

2 部分代码

clear all;
clc;
close all;
set(0,'defaultfigurecolor','w')
global DEM safth hmax scfitness;
a=load('XYZmesh.mat');%读取数字高程信息DEM
DEM=a;
DEM.Z=DEM.Z-200;
safth=60;
figure(6);
mesh(DEM.X,DEM.Y,DEM.Z+50);
% view(250 ,60);
% axis([0 100 0 100])
axis([0 100 0 100 0 500])
colormap summer;
figure(7)
R=5;%半径
a=50;%原点x坐标
b=50;%原点y坐标
h=400;%圆柱高度
m=100;%分割线的条数
[x,y,z]=cylinder(R,m);%创建以(0,0)为圆心,高度为[0,1],半径为R的圆柱
x=x+a;%平移x轴
y=y+b;%平移y轴,改为(a,b)为底圆的圆心
z=h*z;%高度放大h倍
mesh(x,y,z,'FaceColor',[0 0 0])%重新绘图
hold on
view(250 ,60);
axis([0 100 0 100])
theta = linspace(0,2*pi,1000);       %将一个圆周分为40份
X=a+R*cos(theta);                    %将cos值赋予x
Y=b+R*sin(theta);                     %将sin赋予Y
Z=ones(size(X))+h;                 %设置Z与X长度想等
fill3(X,Y,Z,[0,0,0]);                  %使用Fill3功能函数,填充XYZ所围成的区域,这个是顶盖
fill3(X,Y,Z-2,[0,0,0]);              %底盖
hmax=max(max(DEM.Z));
hmin=min(min(DEM.Z));
JULI=zeros(1,5);
for num=1:5
figure(num);
mesh(DEM.X,DEM.Y,DEM.Z+50);
% axis([0 100 0 100 hmin hmax*2]);
colormap summer;
grid off;
xlabel('x/km');
ylabel('y/km');
zlabel('z/m');
hold on;
R=5;%半径
a=50;%原点x坐标
b=50;%原点y坐标
h=400;%圆柱高度
m=100;%分割线的条数
[x,y,z]=cylinder(R,m);%创建以(0,0)为圆心,高度为[0,1],半径为R的圆柱
x=x+a;%平移x轴
y=y+b;%平移y轴,改为(a,b)为底圆的圆心
z=h*z;%高度放大h倍
mesh(x,y,z,'FaceColor',[0 0 0])%重新绘图
view(250 ,60);
axis([0 100 0 100])
theta = linspace(0,2*pi,1000);       %将一个圆周分为40份
X=a+R*cos(theta);                    %将cos值赋予x
Y=b+R*sin(theta);                     %将sin赋予Y
Z=ones(size(X))+h;                 %设置Z与X长度想等
fill3(X,Y,Z,[0,0,0]);                  %使用Fill3功能函数,填充XYZ所围成的区域,这个是顶盖
fill3(X,Y,Z-2,[0,0,0]);              %底盖
demx=DEM.X;
demy=DEM.Y;
demz=DEM.Z+50;
%% 圆柱2
R=5;%半径
a=40;%原点x坐标
b=80;%原点y坐标
h=400;%圆柱高度
m=100;%分割线的条数
[x,y,z]=cylinder(R,m);%创建以(0,0)为圆心,高度为[0,1],半径为R的圆柱
x=x+a;%平移x轴
y=y+b;%平移y轴,改为(a,b)为底圆的圆心
z=h*z;%高度放大h倍
mesh(x,y,z,'FaceColor',[0 0 0])%重新绘图
theta = linspace(0,2*pi,1000);       %将一个圆周分为40份
X=a+R*cos(theta);                    %将cos值赋予x
Y=b+R*sin(theta);                     %将sin赋予Y
Z=ones(size(X))+h;                 %设置Z与X长度想等
fill3(X,Y,Z,[0,0,0]);                  %使用Fill3功能函数,填充XYZ所围成的区域,这个是顶盖
fill3(X,Y,Z-2,[0,0,0]);              %底盖
%% 圆柱3
R=5;%半径
a=80;%原点x坐标
b=40;%原点y坐标
h=400;%圆柱高度
m=100;%分割线的条数
[x,y,z]=cylinder(R,m);%创建以(0,0)为圆心,高度为[0,1],半径为R的圆柱
x=x+a;%平移x轴
y=y+b;%平移y轴,改为(a,b)为底圆的圆心
z=h*z;%高度放大h倍
mesh(x,y,z,'FaceColor',[0 0 0])%重新绘图
theta = linspace(0,2*pi,1000);       %将一个圆周分为40份
X=a+R*cos(theta);                    %将cos值赋予x
Y=b+R*sin(theta);                     %将sin赋予Y
Z=ones(size(X))+h;                 %设置Z与X长度想等
fill3(X,Y,Z,[0,0,0]);                  %使用Fill3功能函数,填充XYZ所围成的区域,这个是顶盖
fill3(X,Y,Z-2,[0,0,0]);              %底盖

startx(1)=round(20*rand(1));
starty(1)=round(20*rand(1));
startz(1)=2;
xx=1;
flag=1;
k=2;
while flag
   if starty(k-1)>95||startx(k-1)>95
       flag=0;
   end
   
   startx(k)=startx(k-1)+xx;
   starty(k)=starty(k-1)+xx;
   startz(k)=startz(k-1);
   RR=sqrt((startx(k)-a)^2+(starty(k)-b)^2);
   
  while RR<=R
       starty(k)=starty(k)-1;
        RR=sqrt((startx(k)-a)^2+(starty(k)-b)^2)
   end
%     startx(k)=startx(k)-xx;
   %     demz(startx(k),starty(k))
   if demz(startx(k),starty(k))<10
       startz(k)= demz(startx(k),starty(k))+2;
   end  
  if  startz(k)<demz(startx(k),starty(k))
       startz(k)= demz(startx(k),starty(k))+50+5*rand(1);
       
   else
       startz(k)= demz(startx(k),starty(k))+50+5*rand(1);
       
   end
 
   k=k+1;
end

for i=2:length(startx)
   JULI(num)=JULI(num)+sqrt( (startx(i)- startx(i-1))^2+(starty(i)- starty(i-1))^2+(startz(i)- startz(i-1))^2);
end
switch num
   case 1
       
 plot3(starty,startx,startz,'k-','LineWidth',4);hold on
 text(starty(1),startx(1),startz(1),'起点','color','k','FontSize',13)
 text(starty(end),startx(end),startz(end),'起点','color','k','FontSize',13)
   case 2
        plot3(starty,startx,startz,'b-','LineWidth',4);hold on
         text(starty(1),startx(1),startz(1),'起点','color','k','FontSize',13)
 text(starty(end),startx(end),startz(end),'起点','color','k','FontSize',13)
   case 3
        plot3(starty,startx,startz,'r-','LineWidth',4);hold on
         text(starty(1),startx(1),startz(1),'起点','color','k','FontSize',13)
 text(starty(end),startx(end),startz(end),'起点','color','k','FontSize',13)
   case 4
        plot3(starty,startx,startz,'c-','LineWidth',4);hold on
         text(starty(1),startx(1),startz(1),'起点','color','k','FontSize',13)
 text(starty(end),startx(end),startz(end),'起点','color','k','FontSize',13)
   case 5
        plot3(starty,startx,startz,'m-','LineWidth',4);hold on
         text(starty(1),startx(1),startz(1),'起点','color','k','FontSize',13)
 text(starty(end),startx(end),startz(end),'起点','color','k','FontSize',13)
end
end​

3 仿真结果

4 参考文献

[1]谭励, 王浩宇, and 连晓峰. "一种基于改进NSGA-II的无人机路径规划方法.".

部分理论引用网络文献,若有侵权联系博主删除。

5 MATLAB代码与数据下载地址

见博客主页