Matlab航迹规划仿真——A*算法

文章目录

 

基本的A*算法在这里不再讲述,想要了解的朋友可以自己在CSDN搜索,在此主要解释下代码。

1. 初始化参数

主要参数:

  • 地图大小
  • 起始点和目标点坐标
  1. clc
  2. clear all
  3. m = 30;n = 30;
  4. Spoint = [3 3];      %起始点坐标
  5. Epoint = [29 22];    %目标点坐标
     

2. 构建地图

-inf表示不可到达的障碍物点

  1. %%构建地图
  2. for i = 1:m+2
  3.     if i == 1
  4.         for j = 1:n+2
  5.             Matrix(i,j) = -inf;
  6.         end
  7.     elseif i == m+2
  8.         for j = 1:n+2
  9.             Matrix(i,j) = -inf;
  10.         end
  11.     else
  12.         for j = 1:n+2
  13.             if ((j == 1)|(j == n+2))
  14.                 Matrix(i,j) = -inf;
  15.             else
  16.                 Matrix(i,j) = inf;
  17.             end
  18.         end
  19.     end
  20. end
  21. %%障碍
  22. for j=2:10
  23.     Matrix(5,j)=-inf;
  24. for j=2:15
  25.      Matrix(24,j)=-inf;
  26. for j=9:24
  27. %for j=6:24
  28.      Matrix(10,j)=-inf;
  29. for j=20:31
  30.     Matrix(15,j)=-inf;
  31. for j=5:20
  32.     Matrix(20,j)=-inf;
  33. for j=18:27
  34.     Matrix(28,j)=-inf;
  35. for i=2:6  
  36.     Matrix(i,18)=-inf;
  37. for i=17:20
  38.       Matrix(i,5)=-inf;
  39. for i=23:25 
  40.      Matrix(i,20)=-inf;
  41. for i=13:17
  42.     Matrix(i,13)=-inf;
  43. end
  44. end
  45. end
  46. end
  47. end
  48. end
  49. end
  50. end
  51. end
  52. end
  53. %end
  54. % 显示地图
  55. %subplot(2,2,1);
  56. h1 = plot(Spoint(1),Spoint(2),'gO');
  57. hold on
  58. h2 = plot(Epoint(1),Epoint(2),'rO');
     

3. A*算法搜索路径

  1. %%寻路
  2. Matrix(Spoint(1),Spoint(2))=0;
  3. Matrix(Epoint(1),Epoint(2))=inf;
  4. G=Matrix;
  5. F=Matrix;
  6. openlist=Matrix;
  7. closelist=Matrix;
  8. parentx=Matrix;
  9. parenty=Matrix;
  10. openlist(Spoint(1),Spoint(2)) =0;
  11. %closelist(Epoint(1),Epoint(2))=inf;
  12. for i = 1:n+2
  13.     for j = 1:m+2
  14.         k = Matrix(i,j);
  15.         if(k == -inf)
  16.             %subplot(2,2,1);
  17.             h3 = plot(i,j,'k.');
  18. %         elseif(k == inf)  % show green feasible point
  19. %             %subplot(2,2,1);
  20. %             plot(i,j,'gh');
  21. %         else
  22. %             %subplot(2,2,1);
  23. %             plot(i,j,'gh');
  24.         end
  25.         hold on
  26.     end
  27. end
  28. axis([0 m+3 0 n+3]);
  29. %subplot(2,2,1);
  30. plot(Epoint(1),Epoint(2),'b+');
  31. %subplot(2,2,1);
  32. plot(Spoint(1),Spoint(2),'b+');
  33. while(1)
  34.     num=inf;
  35.     for p=1:m+2
  36.         for q=1:n+2
  37.             if(openlist(p,q)==0&&closelist(p,q)~=1)
  38.                 Outpoint=[p,q];
  39.                 if(F(p,q)>=0&&num>F(p,q))
  40.                     num=F(p,q);
  41.                     Nextpoint=[p,q];
  42.                 end
  43.             end
  44.         end
  45.     end
  46.     closelist(Nextpoint(1),Nextpoint(2))=1;
  47.     for i = 1:3
  48.         for j = 1:3
  49.             k = G(Nextpoint(1)-2+i,Nextpoint(2)-2+j);
  50.             if(i==2&&j==2|closelist(Nextpoint(1)-2+i,Nextpoint(2)-2+j)==1)
  51.                 continue;
  52.             elseif (k == -inf)
  53.                 G(Nextpoint(1)-2+i,Nextpoint(2)-2+j) = G(Nextpoint(1)-2+i,Nextpoint(2)-2+j);
  54.                 closelist(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=1;
  55.             elseif (k == inf)
  56.                 distance=((i-2)^2+(j-2)^2)^0.5;
  57.                 G(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=G(Nextpoint(1),Nextpoint(2))+distance;
  58.                 openlist(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=0;
  59.                % H=((Nextpoint(1)-2+i-Epoint(1))^2+(Nextpoint(2)-2+j-Epoint(2))^2)^0.5;%欧几里德距离启发函数
  60.                 H_diagonal=min(abs(Nextpoint(1)-2+i-Epoint(1)),abs(Nextpoint(2)-2+j-Epoint(2)));%比较复杂的对角线启发函数
  61.                 H_straight=abs(Nextpoint(1)-2+i-Epoint(1))+abs(Nextpoint(2)-2+j-Epoint(2));
  62.                 H=sqrt(2)*H_diagonal+(H_straight-2*H_diagonal);
  63.  
  64.                 % H=max(abs(Nextpoint(1)-2+i-Epoint(1)),abs(Nextpoint(2)-2+j-Epoint(2)));%比较简单的对角线函数
  65.                 
  66.                 F(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=G(Nextpoint(1)-2+i,Nextpoint(2)-2+j)+H;
  67.                 parentx(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=Nextpoint(1);
  68.                 parenty(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=Nextpoint(2);
  69.             else distance=((i-2)^2+(j-2)^2)^0.5;
  70.                 if(k>(distance+G(Nextpoint(1),Nextpoint(2))))
  71.                 k=distance+G(Nextpoint(1),Nextpoint(2));
  72.                % H=((Nextpoint(1)-2+i-Epoint(1))^2+(Nextpoint(2)-2+j-Epoint(2))^2)^0.5;  %欧几里德距离启发函数
  73.                 H_diagonal=min(abs(Nextpoint(1)-2+i-Epoint(1)),abs(Nextpoint(2)-2+j-Epoint(2)));%比较复杂的对角线启发函数
  74.                 H_straight=abs(Nextpoint(1)-2+i-Epoint(1))+abs(Nextpoint(2)-2+j-Epoint(2));
  75.                 H=sqrt(2)*10*H_diagonal+10*(H_straight-2*H_diagonal);
  76.  
  77.                  % H=max(abs(Nextpoint(1)-2+i-Epoint(1)),abs(Nextpoint(2)-2+j-Epoint(2)));%比较简单的对角线函数
  78.                 
  79.                 F(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=k+H;
  80.                 parentx(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=Nextpoint(1);
  81.                 parenty(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=Nextpoint(2);
  82.                 end
  83.             end
  84.             if(((Nextpoint(1)-2+i)==Epoint(1)&&(Nextpoint(2)-2+j)==Epoint(2))|num==inf)
  85.                  parentx(Epoint(1),Epoint(2))=Nextpoint(1);
  86.                 parenty(Epoint(1),Epoint(2))=Nextpoint(2);
  87.                 break;
  88.             end
  89.         end
  90.         if(((Nextpoint(1)-2+i)==Epoint(1)&&(Nextpoint(2)-2+j)==Epoint(2))|num==inf)
  91.              parentx(Epoint(1),Epoint(2))=Nextpoint(1);
  92.                 parenty(Epoint(1),Epoint(2))=Nextpoint(2);
  93.             break;
  94.         end
  95.     end
  96.     if(((Nextpoint(1)-2+i)==Epoint(1)&&(Nextpoint(2)-2+j)==Epoint(2))|num==inf)
  97.          parentx(Epoint(1),Epoint(2))=Nextpoint(1);
  98.                 parenty(Epoint(1),Epoint(2))=Nextpoint(2);
  99.         break;
  100.     end
  101. end
  102.     P=[];
  103.     s=1;
  104. while(1)
  105.     if(num==inf)
  106.         break;
  107.     end
  108.     %subplot(2,2,1);
  109.     h4 = plot(Epoint(1),Epoint(2),'b+');
  110.     P(s,:)=Epoint;
  111.     s=s+1;
  112. %      pause(1);
  113.     xx=Epoint(1);
  114.     Epoint(1)=parentx(Epoint(1),Epoint(2));
  115.     Epoint(2)=parenty(xx,Epoint(2));
  116.     if(parentx(Epoint(1),Epoint(2))==Spoint(1)&&parenty(Epoint(1),Epoint(2))==Spoint(2))
  117.         %subplot(2,2,1);
  118.         plot(Epoint(1),Epoint(2),'b+');
  119.         P(s,:)=Epoint;
  120.         break;
  121.     end
  122. end
  123. P(s+1,:)=Spoint;
  124. legend([h1,h2,h3,h4],'起始点','目标点','障碍物','航迹点');
  125. count=0;
  126. for i=2:12
  127.     for j=2:12
  128.         if(G(i,j)~=inf&&G(i,j)~=-inf)
  129.             count=count+1;
  130.         end
  131.     end
  132. end
  133. count
     

4. 路径优化

  1. %将得到的折现曲线拟合成光滑的曲线
  2. P=P';
  3. a=[];
  4. b=[];
  5. a=P(1,:);
  6. b=P(2,:);
  7. figure
  8. %subplot(2,2,3);
  9. plot(a,b);
  10. axis([0,n+3,0,n+3]);
  11. values = spcrv([[a(1) a a(end)];[b(1) b b(end)]],3);
  12. figure
  13. %subplot(2,2,4);
  14. plot(values(1,:),values(2,:),'r');
  15. axis([0,m+3,0,m+3]);
     

5. 效果图

A*路径

优化后路径

 

6. 下载链接

直接复制到matlab即可使用,或者也可以点击下载

https://blog.csdn.net/qq_16775293/article/details/87654586

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MATLAB无人机空中航迹规划算法研究主要关注于无人机在空中飞行时如何规划最优航迹,以实现特定任务目标。这项研究旨在提高无人机飞行的效率和安全性,为无人机系统设计和控制提供技术支持。 无人机空中航迹规划算法研究中,常使用MATLAB进行算法验证和仿真实验。MATLAB提供了丰富的数学和控制工具箱,能够方便地实现航迹规划算法的开发和测试。 研究人员首先需要对无人机的飞行动力学模型和环境信息进行建模。然后,根据特定任务需求,设计合适的航迹规划算法,包括路径规划和轨迹生成。路径规划算法主要关注如何在给定的起点和终点之间选择最优飞行路径,以减少飞行时间和能源消耗,并避开障碍物。轨迹生成算法则考虑无人机动力学约束,将路径转化为可行的具体飞行轨迹。 在MATLAB中,可以使用优化工具箱中的优化算法来解决路径规划问题,如基于遗传算法、粒子群优化算法等。同时,控制工具箱提供了丰富的控制器设计方法,可以用于生成合理的飞行轨迹。 通过利用MATLAB进行无人机空中航迹规划算法研究,研究人员可以灵活地进行算法快速原型设计和实验验证。同时,MATLAB提供了直观的可视化工具,可以帮助研究人员分析和评估不同算法的性能。对于无人机系统设计和控制的研究人员来说,MATLAB是一个强大的工具,可以提高研究效率,推动无人机空中航迹规划算法的不断发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值