基于栅格地图的无人机三维路径规划算法(Matlab代码实现)

    目录

💥1 概述

📚2 运行结果

🎉3 参考文献

👨‍💻4 Matlab代码

💥1 概述

1.代码结构说明

ACO3D:包含蚁群算法的全部内容,其入口函数aco.m

Astar3D:包含A*算法的全部内容,其入口函数Astar_main.m

RRT3D:包含RRT算法的全部内容,其入口函数RRT_main.m

Evaluation:包含算法评价的全部内容,包括计算距离、路径长度、最大转弯角

Makemap3D:包含设计的不同规模的地图,此文件可有可无

3D_data.xlsx :三维地图数据,此数据可以根据自己的需求更改

bezier.m :贝塞尔曲线路径平滑算法

main.m:主函数入口,其中所有文件名中带“main”的都是可运行的函数入口,其区别在于调用的地图不同。

Makemap3D.m:制作三维地图数据,可以在此设计自己的三维地图

plot3DMap.m:根据数据绘制三维地图

Show_Comparative_result.m:将算法评价的结果以表格的形式展现出来

注:

(1)三种路径规划算法都可独立运行,可以选择删除main函数中的内容,也可以选择自己编写main函数来

调用路径规划算法的入口函数

(2)遇到不知含义的参数,可以选择更改参数大小并查看运行结果的变化来推断参数的作用​

📚2 运行结果

主函数部分代码:

clc;clear;close all
%载入函数路径
addpath(genpath('./ACO3D'))
addpath(genpath('./Astar3D'))
addpath(genpath('./RRT3D'))
addpath(genpath('./Evaluation'))
Algorithm_name={'ACO','Astar','RRT'};
%地图规模在Makemap3D函数中设置
map = Makemap3D;%地图
source=[10 10 1]; %起点
goal=[450 400 50];%终点
max_item = 1000;%最大迭代次数
comparative_data ={};%记录需要比较的内容
Global_data={};
Straight_distance = sqrt(sum((source-goal).^2, 2));%直线距离
fprintf('起点到终点的直线距离: \n%d\n\n',Straight_distance); 
Global_data(1,end+1) = {num2str(source)};
Global_data(1,end+1) = {num2str(goal)};
Global_data(1,end+1) = {Straight_distance};
t1=clock;
%% ********蚁群算法********************************
figure(1)
plot3DMap(map);
text(source(1),source(2),source(3),'起点','color','r');
text(goal(1),goal(2),goal(3),'终点','color','r');
scatter3(source(1),source(2),source(3),"filled","g");
scatter3(goal(1),goal(2),goal(3),"filled","b");
title('ACO');
popNum = 10; %蚁群数量
tic
[aco_path,aco_cost,aco_Number_of_searches,aco_Number_of_successful_searches,aco_Number_of_failed_searches] = aco(source,goal,map,popNum);%蚁群主函数
aco_time = toc;
fprintf('ACO 历时:%0.3f 秒\n',aco_time); 
hold on
plot3(aco_path(:,1),aco_path(:,2),aco_path(:,3),'LineWidth',2,'color','r');
view(-30,30);
fprintf('ACO 路径长度:%d \n\n',aco_cost); 
[aco_max_turning_angle,aco_turning_num,aco_index] = Max_turning_angle(aco_path,1);
comparative_data(1,end+1) = {aco_time};
comparative_data(2,end) = {aco_cost};
comparative_data(3,end) = {size(aco_path,1)};
comparative_data(4,end) = {aco_Number_of_searches};
comparative_data(5,end) = {aco_Number_of_successful_searches};
comparative_data(6,end) = {aco_Number_of_successful_searches/aco_Number_of_searches};
comparative_data(7,end) = {aco_max_turning_angle};
comparative_data(8,end) = {aco_turning_num};
%% ************Astar********************************
figure(2)
plot3DMap(map);
text(source(1),source(2),source(3),'起点','color','r');
text(goal(1),goal(2),goal(3),'终点','color','r');
scatter3(source(1),source(2),source(3),"filled","g");
scatter3(goal(1),goal(2),goal(3),"filled","b");
title('Astar');
tic%计算运行时间
[astar_path,astar_cost,astar_Number_of_searches,astar_Number_of_successful_searches,astar_Number_of_failed_searches] = Astar_main(source,goal,map,max_item);%A*主函数
astar_time = toc;
fprintf('Astar 历时:%0.3f 秒\n',astar_time); 
plot3(astar_path(:,1),astar_path(:,2),astar_path(:,3),'LineWidth',2,'color','r');
view(-30,30);
fprintf('Astar 路径长度:%d\n\n',astar_cost); 
[astar_max_turning_angle,astar_turning_num,astar_index] = Max_turning_angle(astar_path,1);
%记录展示数据
comparative_data(1,end+1) = {astar_time};
comparative_data(2,end) = {astar_cost};
comparative_data(3,end) = {size(astar_path,1)};
comparative_data(4,end) = {astar_Number_of_searches};
comparative_data(5,end) = {astar_Number_of_successful_searches};
comparative_data(6,end) = {astar_Number_of_successful_searches/astar_Number_of_searches};
comparative_data(7,end) = {astar_max_turning_angle};
comparative_data(8,end) = {astar_turning_num};
​
%% ****************RRT********************************
% subplot(1,3,3); 
figure(3)
plot3DMap(map);
text(source(1),source(2),source(3),'起点','color','r');
text(goal(1),goal(2),goal(3),'终点','color','r');
scatter3(source(1),source(2),source(3),"filled","g");
scatter3(goal(1),goal(2),goal(3),"filled","b");
title('RRT');
step = 10;%设置步长
tic
[rrt_path,rrt_cost,rrt_Number_of_searches,rrt_Number_of_successful_searches,rrt_Number_of_failed_searches] = RRT_main(source,goal,map,step);%RRT主函数
rrt_time = toc;
fprintf('RRT 历时:%0.3f 秒\n',rrt_time); 
plot3(rrt_path(:,1),rrt_path(:,2),rrt_path(:,3),'LineWidth',2,'color','r');
view(-30,30);
fprintf('RRT 路径长度:%d \n\n',rrt_cost); 
[rrt_max_turning_angle,rrt_turning_num,rrt_index] = Max_turning_angle(rrt_path,1);
%记录搜索覆盖范围
comparative_data(1,end+1) = {toc};
comparative_data(2,end) = {rrt_cost};
comparative_data(3,end) = {size(rrt_path,1)};
comparative_data(4,end) = {rrt_Number_of_searches};
comparative_data(5,end) = {rrt_Number_of_successful_searches};
comparative_data(6,end) = {rrt_Number_of_successful_searches/rrt_Number_of_searches};
comparative_data(7,end) = {rrt_max_turning_angle};
comparative_data(8,end) = {rrt_turning_num};
%% 打印运行时间
t2=clock;
fprintf('程序总运行时间:%0.3f 秒\n\n', etime(t2,t1));
%计算最优项 ,其中展示表格顺序为aco、astar、rrt
comparative_data(1,end+1) = {Algorithm_name{Min_value(comparative_data{1,1},comparative_data{1,2},comparative_data{1,3})}};
for i = 2:size(comparative_data,1)
    %求每行的最小值
    comparative_data(i,end) = {Algorithm_name{Min_value(comparative_data{i,1},comparative_data{i,2},comparative_data{i,3})}};
end
%求最大值
comparative_data(6,end) = {Algorithm_name{Max_value(comparative_data{6,1},comparative_data{6,2},comparative_data{6,3})}};
​
​
%展示比较结果
Show_Comparative_result(Global_data,comparative_data)
​
%三种算法展示到一张图中
figure(4)
plot3DMap(map);
text(source(1),source(2),source(3),'起点','color','r');
text(goal(1),goal(2),goal(3),'终点','color','r');
h1 = plot3(aco_path(:,1),aco_path(:,2),aco_path(:,3),'LineWidth',2,'color','r');
h2 = plot3(astar_path(:,1),astar_path(:,2),astar_path(:,3),'LineWidth',2,'color','k');
h3 = plot3(rrt_path(:,1),rrt_path(:,2),rrt_path(:,3),'LineWidth',2,'color','m');
legend([h1,h2,h3],'蚁群','A*','RRT')
%legend("boxoff")
view(-30,30);

🎉3 参考文献

[1]董德金,王常成,蔡云泽.基于改进多目标进化算法的栅格地图路径规划[J/OL].上海交通大学学报,1-18[2024-05-16].

[2]王志明.无人机路径规划算法研究[D].长春工业大学,2019.

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

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: A*算法是一种常见的路径规划算法,通过估计当前节点到目标节点的代价,并结合已经前往的路径,选择代价最小的节点作为下一个前往的节点,从而找到最优路径。在无人机三维栅格地图路径规划问题中,可以采用以下步骤实现A*算法的求解。 1. 定义无人机三维栅格地图: - 将地图划分为二维栅格,并为每个栅格定义一个状态,如空闲、障碍等。 - 在每个栅格中,引入高度信息,以表示三维地图。 - 使用矩阵表示地图,其中每个元素表示对应栅格的状态和高度信息。 2. 初始化A*算法参数: - 定义起始节点和目标节点。 - 初始化起始节点的代价为0,将其添加到开放集合中。 - 初始化估计代价函数,例如使用曼哈顿距离作为启发函数。 3. 实现A*算法主循环: - 当开放集合为空时,表示无解,算法结束。 - 从开放集合中选择代价最小的节点作为当前节点,并将其从开放集合中移除。 - 判断当前节点是否为目标节点,如果是,则找到了最优路径,算法结束。 - 如果当前节点不是目标节点,则遍历当前节点的相邻节点,更新它们的代价,并将它们添加到开放集合中。 4. 实现路径回溯: - 从目标节点开始,按照每个节点的父节点一直回溯到起始节点,得到最优路径。 5. 实现路径可视化: - 使用图形界面或绘图函数,将路径在地图上进行可视化展示。 该问题的Matlab代码实现较为复杂,主要包括地图的初始化、节点代价的更新、启发函数的定义、开放集合的管理等。限于字数,无法提供完整代码,建议参考相关路径规划算法Matlab实现,并根据无人机三维栅格地图路径规划问题的特点进行相应的修改和调试。 ### 回答2: A*算法是一种经典的启发式搜索算法,用于在图形表示的地图中寻找从起点到终点的最短路径。对于无人机三维栅格地图路径规划问题,我们可以将地图抽象成一个三维网格,其中每个网格表示一个空间位置,包括X轴、Y轴和Z轴的坐标。 以下是基于A*算法求解无人机三维栅格地图路径规划MATLAB代码示例: ```MATLAB % 定义地图,0表示可通过的空间,1表示障碍物 map = zeros(100, 100, 100); map(20:40, 30:50, 30:70) = 1; % 定义起点和终点坐标 start = [10, 10, 10]; goal = [90, 90, 90]; % 定义每个网格中的代价 cost = ones(100, 100, 100); cost(map == 1) = Inf; % 障碍物的代价设为无穷大 % 定义起点的启发式代价 h = sqrt(sum((goal - start).^2)); % 初始化起点信息 node.start = start; node.cost = 0; node.parent = 0; node.h = h; % 将起点加入开放列表 openList = [node]; while ~isempty(openList) % 从开放列表中选择启发式代价最小的节点作为当前节点 [~, index] = min([openList.cost]); current = openList(index); % 如果当前节点为目标节点,则路径规划完成 if isequal(current.start, goal) break; end % 从开放列表中移除当前节点 openList(index) = []; % 获取当前节点周围的邻居节点 neighbors = getNeighbors(current.start, map); for i = 1:numel(neighbors) neighbor = neighbors(i); % 计算邻居节点的代价 neighbor.cost = current.cost + cost(neighbor.start(1), neighbor.start(2), neighbor.start(3)); neighbor.h = sqrt(sum((goal - neighbor.start).^2)); neighbor.parent = current; % 如果邻居节点已经在开放列表中,更新其代价和父节点 [isInOpenList, index] = ismember(neighbor.start, [openList.start], 'rows'); if isInOpenList if neighbor.cost < openList(index).cost openList(index).cost = neighbor.cost; openList(index).parent = neighbor.parent; end % 如果邻居节点不在开放列表中,则将其加入开放列表 else openList = [openList, neighbor]; end end end % 从终点回溯得到最短路径 path = []; while ~isequal(current.start, start) path = [current.start; path]; current = current.parent; end path = [start; path]; % 可视化路径规划结果 figure; plot3(path(:,1), path(:,2), path(:,3), 'b', 'LineWidth', 2); hold on; plot3(start(1), start(2), start(3), 'ro', 'MarkerSize', 10); plot3(goal(1), goal(2), goal(3), 'go', 'MarkerSize', 10); xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴'); title('无人机三维栅格地图路径规划'); grid on; ``` 以上代码使用A*算法实现了从起点到终点的无人机三维栅格地图路径规划。首先定义了地图、起点和终点的坐标,并初始化起点节点的代价和启发式代价,然后通过循环从开放列表中选择代价最小的节点进行搜索,直到找到目标节点。在搜索过程中,计算邻居节点的代价和启发式代价,并更新其在开放列表中的状态。最后,从终点回溯得到最短路径,并进行可视化展示。 注意:上述代码仅供参考,实际应用中可能需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值