一、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),直到算法获得可行路径或无解退出。

二、部分源代码

clc;
clear all;[datax,datay,dataz]=loadmap('map.xyz');
startpoint=[datax(1,30),datay(30,1),dataz(30,30)+0.1];%起点
endpoint=[datax(1,390),datay(390,1),dataz(390,390)+0.1];%终点
q=endpoint-startpoint;
q=q/norm(q);
direction=q;
position=startpoint;
limit=[pi/6,pi/6];
​
dataz=dataz.*2.5;
% r_posi=[300,320];
% R=3;
% dataz=radar_pos(r_posi,R,datax,datay,dataz);
​
%  r_posi1=[100,120];R1=3;
r_posi2=[200,150];R2=4;
r_posi3=[300,320];R3=5;
r_posi4=[150,320];R4=3.5;
r_posi5=[200,80];R5=4.2;
​
%  dataz=radar_pos(r_posi1,R1,datax,datay,dataz);
dataz=radar_pos(r_posi2,R2,datax,datay,dataz);
dataz=radar_pos(r_posi3,R3,datax,datay,dataz);
dataz=radar_pos(r_posi4,R5,datax,datay,dataz);
dataz=radar_pos(r_posi5,R5,datax,datay,dataz);
​
lest=sqrt(sum((position-endpoint).^2));
h=0.5;
k=0;
​
while lest>h    k=k+1    route(k,:)=position;    [open_list,dir_list]=openlist(position,direction,h,limit);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%fate=zeros(25,3);    for i=1:25        xipt=open_list(i,1);yipt=open_list(i,2);[zopt,xind,yind]= mappoint(xipt,yipt,datax,datay,dataz);if(zopt>open_list(i,3))fate(i,:)=[1,1,1];open_list(i,:)=[0,0,0];end        end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%G=k*h;  H=H_func(open_list,endpoint);    [mini,ind]=min(H);    lest=sqrt(sum((position-endpoint).^2));   F=G+mini;position=open_list(ind,:);direction=dir_list(ind,:);
​
end
​
x=route(:,1);
y=route(:,2);
z=route(:,3)+21;
figure(1)
mesh(datax,datay,dataz+20);
hold on;
% view(0,10)
plot3(x,y,z,'r--*');
axis equal;
% REP.m         Replicate a matrix
%
% This function replicates a matrix in both dimensions.
%
% Syntax:       MatOut = rep(MatIn,REPN);
%
% Input parameters:
%   MatIn    - Input Matrix (before replicating)
%
%   REPN     - Vector of 2 numbers, how many replications in each dimension
%              REPN(1): replicate vertically
%              REPN(2): replicate horizontally
%
%              Example:
%
%              MatIn = [1 2 3]
%              REPN = [1 2]: MatOut = [1 2 3 1 2 3]
%              REPN = [2 1]: MatOut = [1 2 3;
%                                      1 2 3]
%              REPN = [3 2]: MatOut = [1 2 3 1 2 3;
%                                      1 2 3 1 2 3;
%                                      1 2 3 1 2 3]
%
% Output parameter:
%   MatOut   - Output Matrix (after replicating)
%% Author:   Carlos Fonseca & Hartmut Pohlheim
% History:  14.02.94        file createdfunction MatOut = rep(MatIn,REPN)% Get size of input matrix[N_D,N_L] = size(MatIn);% CalculateInd_D = rem(0:REPN(1)*N_D-1,N_D) + 1;Ind_L = rem(0:REPN(2)*N_L-1,N_L) + 1;% Create output matrixMatOut = MatIn(Ind_D,Ind_L);% End of functionfunction [zopt,xind,yind]= mappoint(xipt,yipt,datax,datay,dataz)
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
i=1;
while(xipt>datax(1,i))
i=i+1;
end
j=1;
while(yipt<datay(j,1))
j=j+1;
endtemp1=dataz(j-1,i-1)+(xipt-datax(1,i-1))*(dataz(j-1,i)-dataz(j-1,i-1))/(datax(1,i)-datax(1,i-1));
temp2=dataz(j-1,i)+(xipt-datax(1,i-1))*(dataz(j,i)-dataz(j-1,i))/(datax(1,i)-datax(1,i-1));zopt=temp1+(yipt-datay(j-1,1))*(temp2-temp1)/(datay(j,1)-datay(j-1,1));xind=i;
yind=j;
end
function [open_list,dir_list]=openlist(position,direction,h,limit)syms x y z;%%水平方向
e1=direction(1)*x+direction(2)*y+direction(3)*z-cos(limit(1));
e2=x^2+y^2+z^2-1;
e3=z-direction(3);
[x0,y0,z0] = solve(e1,e2,e3,x,y,z);
temp1=double([x0,y0,z0]);syms x1 y1 z1;%%垂直方向
e1=direction(1)*x1+direction(2)*y1+direction(3)*z1-cos(limit(2));
e2=x1^2+y1^2+z1^2-1;
e3=direction(1)*y1-direction(2)*x1;
[x2,y2,z2] = solve(e1,e2,e3,x1,y1,z1);
temp2=double([x2,y2,z2]);aa=(temp1(1,:)-temp1(2,:))/4;
bb=(temp2(1,:)-temp2(2,:))/4;
cc=temp1(2,:)-2*bb;dir_lis=zeros(25,3);for i=1:5for j=1:5dir_lis((i-1)*5+j,:)=cc+(i-1)*aa+(j-1)*bb;end
endfor i=1:25dir_lis(i,:)=dir_lis(i,:)/norm(dir_lis(i,:));%
endopen_list=dir_lis*h+rep(position,[25,1]);dir_list=dir_lis;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)

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

  1. 【Matlab图像加密】正交拉丁方置乱算法图像加解密【含GUI源码 182期】

    一.代码运行视频(哔哩哔哩) [Matlab图像加密]正交拉丁方置乱算法图像加解密[含GUI源码 182期] 二.matlab版本及参考文献 一.代码运行视频(哔哩哔哩) [Matlab图像处理]自动 ...

  2. 【Matlab图像检索】综合特征图像检索【含GUI源码 395期】

    一.代码运行视频(哔哩哔哩) [Matlab图像检索]综合特征图像检索[含GUI源码 395期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  3. 【Matlab肌电信号】肌电信号处理【含GUI源码 966期】

    一.代码运行视频(哔哩哔哩) [Matlab肌电信号]肌电信号处理[含GUI源码 966期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继周,杨 ...

  4. 【Matlab语音处理】声音信号频谱分析仪【含GUI源码 325期】

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

  5. 【Matlab条形码识别】二维条形码识别【含GUI源码 607期】

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

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

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

  7. 【RRT三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 155期】

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

  8. 【RRT三维路径规划】基于matlab RRT算法无人机三维路径规划【含Matlab源码 1363期】

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

  9. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  10. 【故障检测问题】基于matlab免疫算法求解故障检测问题【含Matlab源码 196期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[故障检测问题]基于matlab免疫算法求解故障检测问题[含Matlab源码 196期] 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭 ...

最新文章

  1. 使用svnsync备份详解[转载+修改]
  2. arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别
  3. Google和Baidu常用的搜索技巧--转
  4. 【小白学PyTorch】12.SENet详解及PyTorch实现
  5. IDEA:vue中缺少vue-quill-editor富文本插件
  6. LinkedHashMap随笔
  7. hp服务器修改风扇转速,如何改变惠普笔记本风扇转速
  8. Mac Book Pro中idea常用快捷键
  9. 自我保护第一课加密与防破解
  10. 多Excel合并成一个Excel的多sheet
  11. c# 游戏设计:人物走动动画
  12. RedHat认证介绍
  13. excel同一行中如何添加换行
  14. DNS原理与搭建(一)
  15. 你的小米手机升级MIUI11后,电池掉电很快?那是这些设置没关掉吧
  16. 通信网基础作业答案整理
  17. 项目经理如何才能控制项目进度
  18. 微信小程序申请+开发+发布流程
  19. Java抽象类与接口的运用
  20. python识别图片中数字_Python图像处理之图片验证码识别

热门文章

  1. 马航发布会确认MH370失事:这是史无前例的悲剧
  2. 【JD算法题】定义一个数组的权值为,该数组最大值的出现次数。求长度为n且每个元素范围都在[1,n]的所有数组的权值之和。
  3. 数据库垂直拆分 水平拆分
  4. Word转PDF软件哪个好?这款软件一定要试试
  5. pythonsvd内存不足_[已解决]VBS能否读写大于系统内存大小的二进制文件?
  6. c#,catch(Exception ex)的ex是什么意思
  7. 3D空间中射线与轴向包围盒AABB的交叉检测算法
  8. vue-cli3 一直运行 /sockjs-node/info?t= 解决方案
  9. python 2维列表定义踩坑ans=[[0] * n] * m
  10. java 雪花算法生成ID