【无人机路径规划】无人机三维路径规划中蚁群算法、A* 与 RRT* 算法对比(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
💥1 概述
随着无人机技术的快速发展,其在军事侦察、物流配送、环境监测等众多领域的应用日益广泛。在实际应用场景中,无人机需要在复杂的三维空间内规划出一条安全、高效的飞行路径,以避开障碍物并满足任务需求。蚁群算法、A* 算法和 RRT* 算法是目前无人机三维路径规划中常用的算法,它们各自具有独特的原理和特点,对其进行详细对比有助于根据具体应用场景选择最合适的算法。
蚁群算法 蚁群算法是一种模拟蚂蚁觅食行为的启发式优化算法。蚂蚁在寻找食物的过程中,会在走过的路径上释放信息素,信息素浓度越高的路径对其他蚂蚁的吸引力越大。在无人机路径规划中,将三维空间划分为多个节点,每只“虚拟蚂蚁”从起点开始,根据信息素浓度和启发式信息选择下一个节点,不断迭代更新信息素浓度,最终找到一条从起点到终点的最优路径。
A* 算法 A* 算法是一种基于图搜索的路径规划算法,它结合了 Dijkstra 算法的广度优先搜索和贪心最佳优先搜索的特点。A* 算法通过定义一个评估函数f(n)=g(n)+h(n),其中 (g(n)) 是从起点到节点 (n) 的实际代价,(h(n)) 是从节点 (n) 到终点的启发式估计代价。算法从起点开始,不断扩展具有最小 (f(n)) 值的节点,直到找到终点或遍历完所有可达节点。
RRT* 算法 RRT* 算法是快速随机树算法(RRT)的改进版本,它通过在三维空间中随机采样来构建一棵搜索树。从起点开始,每次随机选择一个采样点,然后在搜索树中找到距离该采样点最近的节点,将其连接到采样点并扩展树。RRT* 算法在 RRT 的基础上,增加了路径优化机制,通过重新连接节点和修剪树枝,不断优化树的结构,最终得到一条接近最优的路径。
路径质量 -蚁群算法:通过信息素的更新和积累,能够在多次迭代后找到全局较优的路径。但由于信息素的更新过程相对缓慢,在复杂环境下可能陷入局部最优解,导致路径质量下降。A* 算法:在有明确启发式函数的情况下,能够保证找到最优路径。但启发式函数的选择对算法性能影响较大,如果选择不当,可能会增加搜索时间。RRT* 算法:能够在复杂的三维环境中快速找到一条可行路径,并且随着采样点数的增加,路径质量会逐渐提高,趋近于全局最优解。但在采样点数有限的情况下,路径可能存在一定的冗余。
一、无人机三维路径规划的核心挑战
三维路径规划需同时满足多目标优化与物理约束:
- 多目标冲突:路径长度、避障安全性、能耗(如电池续航)、飞行时间需协同优化 。
- 动态障碍物:城市环境中需实时避让建筑物、其他无人机等移动障碍 。
- 三维物理约束:
- 最大转向角(通常≤30°)与爬升角(±25°)
- 最小转弯半径(如2m)和最短直线修正段
- 航迹总长度限制(L≤LmaxL≤Lmax)
- 计算效率:三维空间搜索复杂度指数级增长,传统A*算法实时性不足 。
二、算法原理与特性对比
1. 蚁群算法(ACO)
- 三维实现:
- 环境建模:采用三维栅格法,沿高度分层划分空间 。
- 信息素更新:路径选择概率公式引入启发式因子(如距离、障碍物密度) 。
- 优势:
- 全局优化能力强,避免局部最优 。
- 并行计算效率高,适合复杂障碍物环境 。
- 局限:
- 收敛速度慢,前期随机搜索效率低 。
- 动态环境中信息素更新滞后,响应速度不足 。
原理:模拟蚂蚁觅食行为,通过信息素正反馈机制(分布式计算、自组织、正反馈)引导路径优化

2. A*算法
- 原理:启发式搜索(f(n)=g(n)+h(n),结合实际代价g(n)(起点到当前点)与预估代价h(n)(当前点到终点) 。
- 三维实现:
- 栅格化环境,扩展26邻域节点(允许三维斜向移动) 。
- 改进策略:融合贝塞尔曲线平滑路径,解决节点处姿态突变问题 。
- 优势:
- 完备性且最优性(启发函数可采纳时) 。
- 局限:
- 计算复杂度高:三维网格节点数激增,192³网格即可致内存溢出 。
- 仅适用于静态环境,动态障碍需完全重新规划 。
路径长度最短(实验均值33.7m,优于RRT*的35.1m) 。

3. RRT*算法
- 原理:基于随机采样与渐进优化,通过重选父节点和剪枝缩短路径 。
- 改进机制:
- 正态分布采样:替代均匀随机采样,加速收敛 。
- 三角不等式剪枝:删除冗余节点,路径长度缩减50% 。
- 优势:
- 实时性最佳:改进版计算耗时仅为传统RRT*的20% 。
- 动态环境适应性:实时更新搜索树,避让移动障碍 。
- 局限:
- 初始路径曲折,需后处理平滑 。
路径长度稳定性差,方差高于A* 。

三、性能指标定量对比
表1:算法核心指标对比
| 指标 | 蚁群算法 | A*算法 | RRT*算法 |
|---|---|---|---|
| 路径长度(km) | 2.75–3.20 | 2.83(最短) | 2.90–3.50 |
| 计算时间(s) | 3.29–5.60 | 0.50(静态最优) | 0.05(改进版) |
| 动态障碍响应 | 滞后(信息素更新慢) | 需完全重规划 | 实时更新树结构 |
| 路径平滑性 | 中(依赖参数调优) | 低(需后处理) | 高(渐进优化) |
| 内存消耗 | 中(分布式计算) | 高(存储所有节点) | 低(树结构) |

关键数据解读:
- 能耗对比:改进蚁群算法能耗(64.08 J)低于A*(72.93 J),因路径平滑减少姿态调整 。
安全性:A*在风险路径长度(0.15m)与危险路径长度(0.05m)上最优,因精确栅格碰撞检测 。

四、环境适应性分析
- 静态复杂环境:
- A*:规则障碍物场景下路径最短,但计算耗时随复杂度飙升 。
- 蚁群算法:栅格建模灵活,适合非结构化地形,但收敛速度慢 。
- RRT*:正态采样改进后,节点数减少85%,适合大型三维地图 。
- 动态障碍环境:
- 蚁群算法:引入动态惩罚机制(AS-N),避障路径长度缩短15% 。
- A*:需融合动态窗口法(DWA)提升实时性 。
RRT*:实时采样避障成功率100% 。

五、应用场景推荐
| 场景 | 推荐算法 | 依据 |
|---|---|---|
| 电力巡检(静态精细规划) | A* | 路径最短、能耗最低 |
| 城市物流(动态障碍密集) | RRT* | 实时性高,动态避障能力强 |
| 农业植保(大范围非结构) | 改进蚁群 | 能耗低、适应复杂地形 |
| 实时搜救(未知环境) | RRT + 蚁群* | RRT*快速生成初始路径,蚁群优化全局安全 |
六、总结与展望
- 算法融合趋势:
- A* + 贝塞尔曲线:解决路径平滑问题 。
- RRT* + 梯度优化:提升初始路径质量 。
- 蚁群 + 动态惩罚机制:增强动态响应 。
- 未来方向:轻量化神经网络加速在线规划,强化学习优化多目标权重 。
本报告依据实验数据与学术文献对比分析,可为无人机三维路径规划算法选型提供理论支撑与工程参考。具体应用需结合场景约束(如实时性要求、硬件算力)综合权衡。
📚2 运行结果

主函数代码:
%Wishing you to encourage yourself! 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") 🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
[1]陆璐,孙昱浩,孙启光.基于改进蚁群算法的无人机三维路径规划研究[J].广东交通职业技术学院学报,2025,24(01):46-51+114.
[2]温佳霖,梁丰,许雯.基于改进蚁群算法的无人机三维路径规划研究[J].现代信息科技,2023,7(20):84-87+91.DOI:10.19850/j.cnki.2096-4706.2023.20.018.
🌈4 Matlab代码实现
