概述
随着无人机技术在军事侦察、物流配送及环境监测等领域的广泛应用,如何在复杂的三维空间内规划出一条安全、高效的飞行路径成为关键问题。实际场景中,无人机需避开障碍物并满足任务约束。蚁群算法(ACO)、A* 算法和 RRT* 算法是目前主流的三维路径规划方案,各有优劣。本文通过理论分析与 Matlab 仿真,对这三种算法进行详细对比,帮助开发者根据具体场景选择最优解。
核心挑战
三维路径规划需同时满足多目标优化与物理约束,主要难点包括:
- 多目标冲突:路径长度、避障安全性、能耗(如电池续航)及飞行时间需协同优化。
- 动态障碍物:城市环境中需实时避让建筑物、其他无人机等移动目标。
- 三维物理约束:包括最大转向角(通常≤30°)、爬升角(±25°)、最小转弯半径及航迹总长度限制。
- 计算效率:三维空间搜索复杂度呈指数级增长,传统 A* 算法在大规模网格下实时性不足。
算法原理与特性
1. 蚁群算法 (ACO)
模拟蚂蚁觅食行为,通过信息素正反馈机制引导路径优化。在三维空间中,将环境划分为栅格节点,虚拟蚂蚁根据信息素浓度和启发式信息选择路径,迭代更新后找到较优解。
- 优势:全局优化能力强,适合复杂障碍物环境,并行效率高。
- 局限:收敛速度较慢,前期随机搜索效率低;动态环境中信息素更新滞后。
2. A* 算法
基于图搜索的启发式算法,结合 Dijkstra 广度优先搜索与贪心最佳优先搜索特点。评估函数 f(n)=g(n)+h(n),其中 g(n) 为起点到当前点代价,h(n) 为预估终点代价。
- 优势:完备且最优(当启发函数可采纳时),静态环境下路径最短。
- 局限:三维网格节点激增易致内存溢出;仅适用于静态环境,动态障碍需重规划。
3. RRT* 算法
快速随机树算法的改进版,通过随机采样构建搜索树,并增加路径优化机制(重连接节点、剪枝)。
- 优势:实时性最佳,动态环境适应性强,随采样点数增加路径质量趋近全局最优。
- 局限:初始路径曲折,需后处理平滑;路径稳定性略逊于 A*。
性能指标对比
| 指标 | 蚁群算法 | A* 算法 | RRT* 算法 |
|---|---|---|---|
| 路径长度 | 2.75–3.20 km | 2.83 km (最短) | 2.90–3.50 km |
| 计算时间 | 3.29–5.60 s | 0.50 s (静态) | 0.05 s (改进版) |
| 动态响应 | 滞后 | 需完全重规划 | 实时更新 |
| 路径平滑性 | 中 | 低 (需后处理) | 高 |
| 内存消耗 | 中 | 高 | 低 |
数据解读:改进蚁群算法能耗较低(64.08 J vs 72.93 J),因路径平滑减少姿态调整;A* 在风险路径检测上最优,依赖精确栅格碰撞检测。
应用场景推荐
| 场景 | 推荐算法 | 依据 |
|---|---|---|
| 电力巡检 (静态精细) | A* | 路径最短、能耗最低 |
| 城市物流 (动态密集) | RRT* | 实时性高,动态避障强 |
| 农业植保 (大范围非结构) | 改进蚁群 | 能耗低,适应复杂地形 |
| 实时搜救 (未知环境) | RRT + 蚁群* | 快速生成初始路径,全局优化安全 |
Matlab 代码实现
以下为主函数逻辑,展示了如何加载模块、设置地图参数并依次运行三种算法进行对比。代码中使用了 tic/toc 记录耗时,并通过 plot3 绘制三维路径结果。
%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(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_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********************************
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_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')
总结与展望
算法融合是未来趋势,例如 A* 结合贝塞尔曲线解决平滑问题,RRT* 结合梯度优化提升初始路径质量。轻量化神经网络加速在线规划及强化学习优化多目标权重也是重要方向。具体应用需结合场景约束(如实时性要求、硬件算力)综合权衡。
参考文献
[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.
