一、A_star算法简介

0 引言
随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化、完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水下救援的白鲨MIX水下无人机等,决定飞行器性能主要是内部的飞控系统和外部的路径规划问题。就路径问题而言,在具体实施任务时仅靠操作员手中的遥控器控制无人飞行器执行相应的工作,可能会对操作员心理以及技术提出极高的要求,为了避免个人操作失误,进而造成飞行器损坏的危险,一种解决问题的方法就是对飞行器进行航迹规划。
飞行器的测量精度,航迹路径的合理规划,飞行器工作时的稳定性、安全性等这些变化对飞行器的综合控制系统要求越来越高。无人机航路规划是为了保证无人机完成特定的飞行任务,并且能够在完成任务的过程中躲避各种障碍、威胁区域而设计出最优航迹路线的问题。常见的航迹规划算法如图1所示。

图1 常见路径规划算法
文中主要对无人机巡航阶段的航迹规划进行研究,假设无人机在飞行中维持高度与速度不变,那么航迹规划成为一个二维平面的规划问题。在航迹规划算法中,A算法计算简单,容易实现。在改进A算法基础上,提出一种新的、易于理解的改进A算法的无人机航迹规划方法。传统A算法将规划区域栅格化,节点扩展只限于栅格线的交叉点,在栅格线的交叉点与交叉点之间往往存在一定角度的两个运动方向。将存在角度的两段路径无限放大、细化,然后分别用两段上的相应路径规划点作为切点,找到相对应的组成内切圆的圆心,然后作弧,并求出相对应的两切点之间的弧所对应的圆心角,根据下式计算出弧线的长度

式中:R———内切圆的半径;
α———切点之间弧线对应的圆心角。

1 A*算法概述
A算法是在Dijstar算法的基础上引入的启发式函数,通过定义的代价函数来评估代价大小,从而确定最优路径。A算法的代价函数

式中:f(x,y)———初始状态X0(x0,y0)到达目标状态X1(x1,y1)的代价估计;
g(x,y)———状态空间中从初始状态X0(x0,y0)到状态N(x1,y1)的实际代价;
h(x,y)———从状态N(x1,y1)到目标状态X1(x1,y1)最佳路径的估计代价。
要找到最短路径的实质是找到f(x,y)的最小值,其中在式(2)中寻找最短路径的关键在于求估计代价h (x,y)值。设系数λ表示状态N(x1,y1)到X1(x1,y1)最优距离,如果λ<h(x,y),搜索范围小,不能保证得到最优解;λ>h(x,y),搜索范围大,费时,但能找到最优解;λ=h(x,y),搜索到最短路径。其中h(x,y)一般用欧几里德距离(式(3))或者绝对值距离(式(4))计算。

A算法是以起始点为中心,周围8个栅格的中心为下一步预选,并不断地计算预选位置的f(x,y)值,其中f(x,y)值最小的作为当前位置,依次逐层比较,直到当前位置的临近点出现目标点为止,其最小单元如图2所示。

图2 最小单元
A
算法的流程如下:
1)创建开始节点START,目标节点TARGET、OPEN列表、CLOSE列表、CLOSE列表初始为空;
2)将START加入到OPEN列表;
3)检查OPEN列表中的节点,若列表为空,则无可行路径;若不为空,选择使f(x,y)值最小的节点k;
4)将节点k从OPEN中去除,并将其添加到CLOSE中,判断节点k是否目标节点TARGET,若是,则说明找到路径;若不是,则继续扩展节点k,生成k节点的子节点集,设q为k的子节点集,对所有节点q计算相应的f(x,y)值,并选择f(x,y)值最小的节点,将该节点放入CLOSE列表中;
5)跳到3),直到算法获得可行路径或无解退出。

二、部分源代码

%% 该函数用于演示基于A_Star算法的三维路径规划算法
%% 清空环境
clc
clear%% 数据初始化
%下载数据
starttime=cputime;
load  HeightData z zx tabu dimao%起点终点网格点
startx=8;starty=27;
endx=35;endy=17;%OPEN LIST STRUCTURE
%IS ON LIST 1/0 |X val |Y val |Parent X val |Parent Y val |g(n) |h(n)|f(n)|
OPEN=[];%开始列表
%CLOSED LIST STRUCTURE
%X val | Y val |
CLOSED=[];%结束列表%Put all obstacles on the Closed list
k=1;
for i=1:40for j=1:40if(tabu(j,i) == 0)  %不可经过点CLOSED(k,1)=i;CLOSED(k,2)=j;k=k+1;endend
end
CLOSED_COUNT=size(CLOSED,1);%提前将不可通行点加入到CLOSED表%% set the starting node as the first node
xNode=startx;
yNode=starty;
OPEN_COUNT=1;
path_cost=0;
goal_distance=sqrt(25*(xNode-endx)^2 + 25*(yNode-endy)^2+(zx(yNode,xNode)-zx(endy,endx))^2)/(5*dimao(yNode,xNode));%所在位置距目标点欧几里得距离
OPEN(OPEN_COUNT,:)=[1,xNode,yNode,xNode,yNode,path_cost,goal_distance,goal_distance];%向new_row中插入开始列表
OPEN(OPEN_COUNT,1)=0;%表示第1个节点已经从开始列表出来
CLOSED_COUNT=CLOSED_COUNT+1;%表示第1个位置节点已经进入结束列表
CLOSED(CLOSED_COUNT,1)=xNode;
CLOSED(CLOSED_COUNT,2)=yNode;
NoPath=1;%路径记录号%% START ALGORITHM
while((xNode ~= endx || yNode ~= endy) && NoPath == 1)%只适用刚出发时候%返回exp_array=多行[s_x,s_y,gn, hn, fn]%此时OPEN=多行[1,xNode,yNode,xNode,yNode,hn,gn,fn]exp_array=expand_array(xNode,yNode,endx,endy,path_cost,zx,CLOSED,dimao,40,40); %计算当前点(xNode,yNode)所有可行的下一点,向前向后x+1、x-1、斜对角x+1,y+1、向左向右y+1、y-1exp_count=size(exp_array,1);%求得exp_array行向量的维数,可到达的下一栅格for i=1:exp_count%可到达的栅格flag=0;for j=1:OPEN_COUNT %最初OPEN_COUNT只有1行if(exp_array(i,1) == OPEN(j,2) && exp_array(i,2) == OPEN(j,3) )%exp_array的节点是OPEN里的节点OPEN(j,8)=min(OPEN(j,8),exp_array(i,5));%f(n) 更新最小值if OPEN(j,8)== exp_array(i,5)%说明原来的OPEN(j,8)>exp_array(i,5),%f(n)=g(n)+h(n)>g(n-1)+D(n-1,n)+h(n),即g(n)>g(n-1)+D(n-1,n)OPEN(j,4)=xNode;%Parent X val OPEN(j,5)=yNode;%Parent Y val 当前位置OPEN(j,6)=exp_array(i,3);%g(n) path_costOPEN(j,7)=exp_array(i,4);%h(n) goal_distancesend;%End of minimum fn checkflag=1;end;%End of node checkend;%End of j forif flag == 0%说明此时的节点还未添加进open列表,需要将其加入到open表OPEN_COUNT = OPEN_COUNT+1;OPEN(OPEN_COUNT,:)=[1,exp_array(i,1),exp_array(i,2),xNode,yNode,exp_array(i,3),exp_array(i,4),exp_array(i,5)];end;%End of insert new element into the OPEN listend;%End of i for%Find out the node with the smallest fn index_min_node = min_fn(OPEN,OPEN_COUNT,endx,endy);  %最小f(n)的行数if (index_min_node ~= -1)    %Set xNode and yNode to the node with minimum fnxNode=OPEN(index_min_node,2);yNode=OPEN(index_min_node,3);path_cost=OPEN(index_min_node,6);%Update the cost of reaching the parent node 更新位置点和路径消耗%Move the Node to list CLOSEDCLOSED_COUNT=CLOSED_COUNT+1;CLOSED(CLOSED_COUNT,1)=xNode;CLOSED(CLOSED_COUNT,2)=yNode;OPEN(index_min_node,1)=0;else%No path exists to the Target!!NoPath=0;%Exits the loop!end;%End of index_min_node check
end;%End of While Loop%% Once algorithm has run The optimal path is generated by starting of at the
%last node(if it is the target node) and then identifying its parent node
%until it reaches the start node.This is the optimal path
i=size(CLOSED,1);
Optimal_path=[];
xval=CLOSED(i,1);  %终点
yval=CLOSED(i,2);
% xval=endx;
% yval=endy;
j=1;
Optimal_path(j,1)=xval;
Optimal_path(j,2)=yval;
j=j+1;%Traverse OPEN and determine the parent nodes%返回(xval,yval)在OPEN中的序号jj=1;while(OPEN(jj,2) ~= xval || OPEN(jj,3) ~= yval )jj=jj+1;end;  %寻找对应的上一坐标点parent_x=OPEN(jj,4);%node_index returns the index of the nodeparent_y=OPEN(jj,5);while( parent_x ~= startx || parent_y ~= starty)Optimal_path(j,1) = parent_x;Optimal_path(j,2) = parent_y;%返回节点在open表中的序号k=1;while(OPEN(k,2) ~= parent_x || OPEN(k,3) ~= parent_y )k=k+1;end;parent_x=OPEN(k,4);%node_index returns the index of the nodeparent_y=OPEN(k,5);j=j+1;end;

三、运行结果

四、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)

【三维路径规划】基于matlab A_star算法无人机山地三维路径规划【含Matlab源码 266期】相关推荐

  1. 【A_star三维路径规划】基于matlab A_star算法无人机山地三维路径规划【含Matlab源码 266期】

    ⛄一.A_star算法简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机, ...

  2. 【A_star二维路径规划】基于matlab A_star算法无人机二维路径规划(起终点障碍物可设置)【含Matlab源码 1321期】

    ⛄一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[A_star二维路径规划]基于matlab A_s ...

  3. 【Matlab身份证识别】身份证号码识别【含GUI源码 014期】

    一.代码运行视频(哔哩哔哩) [Matlab身份证识别]身份证号码识别[含GUI源码 014期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  4. 【Matlab车牌识别】停车计费系统【含GUI源码 735期】

    一.代码运行视频(哔哩哔哩) [Matlab车牌识别]停车计费系统[含GUI源码 735期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLA ...

  5. 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】

    一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...

  6. 【Matlab语音分析】语音信号分析【含GUI源码 1718期】

    一.代码运行视频(哔哩哔哩) [Matlab语音分析]语音信号分析[含GUI源码 1718期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]韩纪庆,张磊,郑铁 ...

  7. 【Matlab水果识别】自助水果超市【含GUI源码 594期】

    一.代码运行视频(哔哩哔哩) [Matlab水果识别]自助水果超市[含GUI源码 594期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]倪云峰,叶健,樊娇娇 ...

  8. 【路径规划】基于matlab A_star算法机器人动态避障【含Matlab源码 2571期】

    ⛄一.A_star算法简介 1 A Star算法及其应用现状 进行搜索任务时提取的有助于简化搜索过程的信息被称为启发信息.启发信息经过文字提炼和公式化后转变为启发函数.启发函数可以表示自起始顶点至目标 ...

  9. 【A_star三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[三维路径规划]基于matlab A_star算法无人机三维路径规划[含Matlab源码 446期] 获取代码方式2: 付费专栏Matla ...

  10. 【飞行器】基于matlab四旋翼无人机几何跟踪控制【含Matlab源码 2270期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[飞行器]基于matlab四旋翼无人机几何跟踪控制[含Matlab源码 2270期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...

最新文章

  1. 基于Python, Selenium, Phantomjs无头浏览器访问页面
  2. linux复盘:mysql基础
  3. vb.net連接ACCESS数据库
  4. ML之FE:对pandas的dataframe中的类别型字段进行数字编码化(类别型特征数值化)并导出映射表daiding
  5. spark RDD的血缘关系
  6. 管理处理器的亲和性(affinity)
  7. javascript 分时函数 分批次添加DOM节点 timeChunk
  8. springmvc与mysql实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
  9. 谈论源码_当我们谈论开放音乐时,我们指的是什么?
  10. Intel超线程技术 Hyper-Threading Technology (7) - 最早的一篇超线程论文介绍
  11. 【图论】求无向连通图的割点
  12. postgresql 修改表字段_关于一些postgresql特有的概念以及安装方法的叙述
  13. 计算机制图的简称市什么,计算机地的图制图复习题.doc
  14. java 计数程序_Java JVM——4.程序计数器
  15. 深度学习神经网络的预测间隔
  16. 服务器应用越狱修复,iOS 11.2-11.3.1越狱问题汇总 iOS 11.2-11.3.1越狱错误及修复教程...
  17. 计算机运行快捷方式,电脑怎么创建运行快捷方式到开始菜单
  18. Android硬解码H264流
  19. HTML常用标签(上)
  20. 第十三周 项目3车辆类(继承)

热门文章

  1. 令人震惊的电子邮件归档调查
  2. MySQL-第三篇SQL语句基础(2)数据库约束
  3. http客户端-性能比较系列-第二篇-多线程
  4. Linux命令行报错 bash: cannot create temp file for here-document: No space left on device
  5. Python 学习笔记---爬取海贼王动漫
  6. jenkins com.jcraft.jsch.JSchException: Auth cancel
  7. mysql 日期与索引问题
  8. JAVA字节流,字符流
  9. Mxnet入门--第3篇
  10. 每日一句20191104