一、A_star算法简介

1 A Star算法及其应用现状
进行搜索任务时提取的有助于简化搜索过程的信息被称为启发信息.启发信息经过文字提炼和公式化后转变为启发函数.启发函数可以表示自起始顶点至目标顶点间的估算距离, 也可以表示自起始顶点至目标顶点间的估算时间等.描述不同的情境、解决不同的问题所采用的启发函数各不相同.我们默认将启发函数命名为H (n) .以启发函数为策略支持的搜索方式我们称之为启发型搜索算法.在救援机器人的路径规划中, A Star算法能结合搜索任务中的环境情况, 缩小搜索范围, 提高搜索效率, 使搜索过程更具方向性、智能性, 所以A Star算法能较好地应用于机器人路径规划相关领域.

2 A Star算法流程
承接2.1节, A Star算法的启发函数是用来估算起始点到目标点的距离, 从而缩小搜索范围, 提高搜索效率.A Star算法的数学公式为:F (n) =G (n) +H (n) , 其中F (n) 是从起始点经由节点n到目标点的估计函数, G (n) 表示从起点移动到方格n的实际移动代价, H (n) 表示从方格n移动到目标点的估算移动代价.

如图2所示, 将要搜寻的区域划分成了正方形的格子, 每个格子的状态分为可通过(walkable) 和不可通过 (unwalkable) .取每个可通过方块的代价值为1, 且可以沿对角移动 (估值不考虑对角移动) .其搜索路径流程如下:

图2 A Star算法路径规划
Step1:定义名为open和closed的两个列表;open列表用于存放所有被考虑来寻找路径的方块, closed列表用于存放不会再考虑的方块;
Step2:A为起点, B为目标点, 从起点A开始, 并将起点A放入open列表中, closed列表初始化为空;
Step3:查看与A相邻的方格n (n称为A的子点, A称为n的父点) , 可通过的方格加入到open列表中, 计算它们的F, G和H值.将A从open移除加入到closed列表中;
Step4:判断open列表是否为空, 如果是, 表示搜索失败, 如果不是, 执行下一步骤;
Step5:将n从open列表移除加入到closed列表中, 判断n是否为目标顶点B, 如果是, 表示搜索成功, 算法运行结束;
Step6:如果不是, 则扩展搜索n的子顶点:
a.如果子顶点是不可通过或在close列表中, 忽略它.
b.子顶点如果不在open列表中, 则加入open列表, 并且把当前方格设置为它的父亲, 记录该方格的F, G和H值.
Step7:跳转到步骤Step4;
Step8:循环结束, 保存路径.从终点开始, 每个方格沿着父节点移动直至起点, 即是最优路径.A Star算法流程图如图3所示.

图3 A Star算法流程

二、部分源代码

%Mainclc
clear%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Grid and path parameters%Grid size [y,x,z] and resolution
sizeE=[80 80 20];
d_grid=1;%Starting point
x0=5;
y0=7;
z0=12;%Arrival point
xend=68;
yend=66;
zend=6;%Number of points with low elevation around start and end point area
n_low=3;%A* or Theta* cost weights
kg=1;
kh=1.25;
ke=sqrt((xend-x0)^2+(yend-y0)^2+(zend-z0)^2);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Map definition%Average flight altitude
h=max(z0,zend);%Points coordinates in [y,x,z] format
P0=[y0 x0 z0];
Pend=[yend xend zend];%Generate map
[E,E_safe,E3d,E3d_safe]=grid_3D_safe_zone(sizeE,d_grid,h,P0,Pend,n_low);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Path generation%Store gains in vector
K=[kg kh ke];%Measure path computation time
tic%Generate path (chose one)
% [path,n_points]=a_star_3D(K,E3d_safe,x0,y0,z0,xend,yend,zend,sizeE);
% [path,n_points]=theta_star_3D(K,E3d_safe,x0,y0,z0,xend,yend,zend,sizeE);
[path,n_points]=lazy_theta_star_3D(K,E3d_safe,x0,y0,z0,xend,yend,zend,sizeE);T_path=toc;%Path waypoints partial distance%Initialize
path_distance=zeros(n_points,1);for i=2:n_points path_distance(i)=path_distance(i-1)+sqrt((path(i,2)-path(i-1,2))^2+(path(i,1)-path(i-1,1))^2+(path(i,3)-path(i-1,3))^2);
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Plot%Map grid
x_grid=1:d_grid:sizeE(2);
y_grid=1:d_grid:sizeE(1);%Path on safe map
figure(1)
surf(x_grid(2:end-1),y_grid(2:end-1),E_safe(2:end-1,2:end-1))
hold on
plot3(x0,y0,z0,'gs')
plot3(xend,yend,zend,'rd')
plot3(path(:,2),path(:,1),path(:,3),'yx')
plot3(path(:,2),path(:,1),path(:,3),'w')
axis tight
axis equal
view(0,90);
colorbar%Path on standard map
figure(2)
surf(x_grid(2:end-1),y_grid(2:end-1),E(2:end-1,2:end-1))
hold on
plot3(x0,y0,z0,'gs')
plot3(xend,yend,zend,'rd')
plot3(path(:,2),path(:,1),path(:,3),'yx')
plot3(path(:,2),path(:,1),path(:,3),'w')
axis tight
axis equal
view(0,90);
colorbar%Path height profile
figure(3)
plot(path_distance,path(:,3))
grid on
xlabel('Path distance')
ylabel('Path height')
%A star algorithmfunction [path,n_points]=a_star_3D(K,E3d_safe,x0_old,y0_old,z0_old,xend_old,yend_old,zend_old,sizeE)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Cost weightskg=K(1);
kh=K(2);
ke=K(3);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Algorithm%If start and end points are not integer, they are rounded for the path genertion. Use of floor and ceil so they are different even if very close
x0=floor(x0_old);
y0=floor(y0_old);
z0=floor(z0_old);
xend=ceil(xend_old);
yend=ceil(yend_old);
zend=ceil(zend_old);%Initialize%Size of environment matrix
y_size=sizeE(1);
x_size=sizeE(2);
z_size=sizeE(3);%Node from which the good neighbour is reached
came_fromx=zeros(sizeE);
came_fromy=zeros(sizeE);
came_fromz=zeros(sizeE);
came_fromx(y0,x0,z0)=x0;
came_fromy(y0,x0,z0)=y0;
came_fromz(y0,x0,z0)=z0;%Nodes already evaluated
closed=[];%Nodes to be evaluated
open=[y0,x0,z0];%Cost of moving from start point to the node
G=Inf*ones(sizeE);
G(y0,x0,z0)=0;%Initial total cost
F=Inf*ones(sizeE);
F(y0,x0,z0)=sqrt((xend-x0)^2+(yend-y0)^2+(zend-z0)^2);%Initialize
exit_path=0;%While open is not empy
while isempty(open)==0 && exit_path==0%Find node with minimum f in open%Initializef_open=zeros(size(open,1),1);%Evaluate f for the nodes in openfor i=1:size(open,1)f_open(i,:)=F(open(i,1),open(i,2),open(i,3));end%Find the index location in open for the node with minimum f[~,i_f_open_min]=min(f_open);%Location of node with minimum f in openycurrent=open(i_f_open_min,1);xcurrent=open(i_f_open_min,2);zcurrent=open(i_f_open_min,3);point_current=[ycurrent, xcurrent, zcurrent];%Check if the arrival node is reachedif xcurrent==xend && ycurrent==yend && zcurrent==zend%Arrival node reached, exit and generate pathexit_path=1;else%Add the node to closedclosed(size(closed,1)+1,:)=point_current;%Remove the node from openi_open_keep=horzcat(1:i_f_open_min-1,i_f_open_min+1:size(open,1));open=open(i_open_keep,:);%Check neighbour nodesfor i=-1:1for j=-1:1for k=-1:1                    %If the neighbour node is within gridif xcurrent+i>0 && ycurrent+j>0 && zcurrent+k>0 && xcurrent+i<=x_size && ycurrent+j<=y_size && zcurrent+k<=z_size%If the neighbour node does not belong to open and to closedcheck_open=max(sum([ycurrent+j==open(:,1) xcurrent+i==open(:,2) zcurrent+k==open(:,3)],2));check_closed=max(sum([ycurrent+j==closed(:,1) xcurrent+i==closed(:,2) zcurrent+k==closed(:,3)],2));if isempty(check_open)==1check_open=0;endif isempty(check_closed)==1check_closed=0;endif check_open<3 && check_closed<3                            %Add the neighbour node to openopen(size(open,1)+1,:)=[ycurrent+j, xcurrent+i, zcurrent+k];%Evaluate the distance from start to the current node + from the current node to the neighbour nodeg_try=G(ycurrent,xcurrent,zcurrent)+sqrt(i^2+j^2+k^2);%If this distance is smaller than the neighbour distanceif g_try<G(ycurrent+j,xcurrent+i,zcurrent+k)%We are on the good path, save information%Record from which node the good neighbour is reachedcame_fromy(ycurrent+j,xcurrent+i,zcurrent+k)=ycurrent;came_fromx(ycurrent+j,xcurrent+i,zcurrent+k)=xcurrent;came_fromz(ycurrent+j,xcurrent+i,zcurrent+k)=zcurrent;

三、运行结果



四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]巫茜,罗金彪,顾晓群,曾青.基于改进PSO的无人机三维航迹规划优化算法[J].兵器装备工程学报. 2021,42(08)
[4]邓叶,姜香菊.基于改进人工势场法的四旋翼无人机航迹规划算法[J].传感器与微系统. 2021,40(07)
[5]马云红,张恒,齐乐融,贺建良.基于改进A*算法的三维无人机路径规划[J].电光与控制. 2019,26(10)
[6]焦阳.基于改进蚁群算法的无人机三维路径规划研究[J].舰船电子工程. 2019,39(03)

【A_star三维路径规划】基于matlab A_star算法机器人栅格地图三维路径规划【含Matlab源码 190期】相关推荐

  1. 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】

    一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  2. 【Matlab人脸识别】KL变换人脸识别【含GUI源码 859期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]KL变换人脸识别[含GUI源码 859期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  3. 【Matlab语音隐写】DWT音频数字水印【含GUI源码 712期】

    一.代码运行视频(哔哩哔哩) [Matlab语音隐写]DWT音频数字水印[含GUI源码 712期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊, ...

  4. 【Matlab通信】DTMF双音多频电话拨号仿真【含GUI源码 805期】

    一.代码运行视频(哔哩哔哩) [Matlab通信]DTMF双音多频电话拨号仿真[含GUI源码 805期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅 ...

  5. 【Matlab心音信号】EMD心音信号特征提取【含GUI源码 1735期】

    一.代码运行视频(哔哩哔哩) [Matlab心音信号]EMD心音信号特征提取[含GUI源码 1735期] 二.matlab版本及参考文献 1 matlab版本 2014a *2 参考文献 [1] 沈再 ...

  6. 【路径规划】基于matlab灰狼算法机器人栅格地图最短路径规划【含Matlab源码 2334期】

    ⛄一.灰狼算法的厂房巡检机器人路径规划简介 0 引言 近年来,我国各行各业的不断发展使相关工作流程得到了完善,其中巡检岗位是一个不可或缺的职位,尤其是在电厂.燃气厂房和煤矿等危险领域中的工作,更不能缺 ...

  7. 【路径规划】基于matlab灰狼算法机器人栅格地图最短路径规划【含Matlab源码 1761期】

    ⛄一.灰狼算法的厂房巡检机器人路径规划简介 0 引言 近年来,我国各行各业的不断发展使相关工作流程得到了完善,其中巡检岗位是一个不可或缺的职位,尤其是在电厂.燃气厂房和煤矿等危险领域中的工作,更不能缺 ...

  8. 【路径规划】基于matlab Theta_star算法机器人栅格地图最短路径规划【含Matlab源码 2618期】

    ⛄一. Theta_star算法简介 ​Lazy_Theta_star是在 Theta_star上的进一步改进,Theta_star是当节点加入open表时和当前点的父节点进行比较g值是否更小,对一些 ...

  9. 【Matlab路径规划】A_star算法机器人栅格地图路径规划【含源码 116期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]A_star算法机器人栅格地图路径规划[含源码 116期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

最新文章

  1. 人工智能芯片支持超低功耗器件的推理
  2. 【转】微信公共号开发,提示“该公众号暂时无法提供服务,请稍后再试”,如何解决?...
  3. python找列表list中某个数对应的索引值
  4. 中国航发9名劳模工匠变身“高级制造工程师”
  5. elasticSearch6源码分析(8)RepositoriesModule模块
  6. 平面坐标(方里网)转换为经纬度坐标
  7. (转)C# 把我所积累的类库全部分享给博友(附件已经上传)
  8. Docker学习总结(51)——为什么不建议把数据库部署在 Docker 容器内的7大原因?
  9. Android坡度计
  10. 【摄影与图像】444,422,420,10bit,8bit,RGB,YCrCb,场序,h264编码,封装,码率,PR常用配置
  11. 国际清算银行要求更多的加密货币监管
  12. 【Android】图像滤镜框架GPUImage从配置到应用
  13. iText7高级教程之html2pdf——6.在pdfHTML中使用字体
  14. 蓝牙模块的配置(HC05):修改密码、修改模块名字、修改波特率。
  15. 计算机系统基础崔丽群答案,2017届部分优秀教师风采展示——崔丽群
  16. HTTP协议和XMPP协议
  17. DSP2837d双核调试
  18. 【FPGA】分频电路设计(Verilog HDL设计)(良心博文)
  19. 王婆只在茶局里张时 卡巴斯基杀毒软件
  20. 交通物流模型 | Python实现基于张量分解的交通流量时空模式挖掘(出租车车载GPS数据、公交卡刷卡数据、POI的分布数据)

热门文章

  1. 爱快路由:一家深谙“粉丝文化”的技术公司
  2. html table设置行高_html5行高怎么设置 Excel做的表格怎么打印
  3. 基于springboot的仿天猫商城
  4. 招沿实业零开始学投资理财
  5. java计算机毕业设计临时停车收费系统源码+系统+数据库+lw文档+mybatis+运行部署
  6. 1024程序员节 图灵图书每满100减50
  7. 微信小程序服药提醒_您将不会再忘记服药:每日电话提醒
  8. CentOS向日葵远程登入黑屏
  9. python对接微软文字转语音
  10. “快来”带您了解低轨卫星通讯加速推进自动驾驶发展