【无人机路径规划】无人机三维路径规划中蚁群算法、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* 算法:能够在复杂的三维环境中快速找到一条可行路径,并且随着采样点数的增加,路径质量会逐渐提高,趋近于全局最优解。但在采样点数有限的情况下,路径可能存在一定的冗余。

一、无人机三维路径规划的核心挑战

三维路径规划需同时满足多目标优化与物理约束:

  1. 多目标冲突:路径长度、避障安全性、能耗(如电池续航)、飞行时间需协同优化 。
  2. 动态障碍物:城市环境中需实时避让建筑物、其他无人机等移动障碍 。
  3. 三维物理约束
    • 最大转向角(通常≤30°)与爬升角(±25°) 
    • 最小转弯半径(如2m)和最短直线修正段 
    • 航迹总长度限制(L≤Lmax⁡L≤Lmax​) 
  4. 计算效率:三维空间搜索复杂度指数级增长,传统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)上最优,因精确栅格碰撞检测 。


四、环境适应性分析

  1. 静态复杂环境
    • A*:规则障碍物场景下路径最短,但计算耗时随复杂度飙升 。
    • 蚁群算法:栅格建模灵活,适合非结构化地形,但收敛速度慢 。
    • RRT*:正态采样改进后,节点数减少85%,适合大型三维地图 。
  2. 动态障碍环境
    • 蚁群算法:引入动态惩罚机制(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代码实现

图片

Read more

Spring Boot携手Leaflet,点亮省级旅游口号WebGIS可视化之路

Spring Boot携手Leaflet,点亮省级旅游口号WebGIS可视化之路

目录 前言 一、旅游口号信息管理 1、写在前面的 2、空间属性关联 二、SpringBoot后台实现 1、系统调用时序图 2、Mapper数据查询实现 3、控制层接口实现 三、Leaflet集成实现WebGIS 1、省级数据展示及可视化 2、东北三省旅游口号 3、长三角城市群口号 4、珠三角旅游口号 5、西北地区旅游口号 四、总结 前言         在当今数字化浪潮汹涌澎湃的时代,地理信息系统(GIS)技术正以前所未有的速度改变着我们对世界的认知与探索方式。它不仅为科学研究提供了强大的工具,更在旅游、城市规划、环境保护等诸多领域展现出巨大的应用潜力。而当我们将目光聚焦于旅游行业,一个充满活力与创新的领域,GIS技术的应用更是如鱼得水,为旅游体验的提升和旅        游管理的优化带来了全新的机遇。         省级旅游口号作为各地旅游宣传的重要名片,承载着地域文化的精髓与旅游资源的亮点,是吸引游客、塑造旅游品牌形象的关键要素。然而,传统的旅游口号宣传方式往往局限于文字、

DAMOYOLO-S代码实例:Python调用其Web API实现自动化目标检测流水线

DAMOYOLO-S代码实例:Python调用其Web API实现自动化目标检测流水线 你是不是也遇到过这样的场景?每天有成百上千张图片需要分析,手动上传、等待、下载结果,不仅效率低下,还容易出错。作为一名开发者,我经常需要处理大量的图像数据,寻找其中的特定目标——可能是监控视频中的异常行为,也可能是电商图片中的商品识别。 传统的目标检测方案要么需要复杂的本地部署,要么就是手动操作效率太低。直到我发现了DAMOYOLO-S这个高性能通用检测模型,特别是它提供的Web API服务,让我眼前一亮。今天,我就来分享如何用Python代码调用这个API,打造一个全自动的目标检测流水线。 1. DAMOYOLO-S:开箱即用的目标检测利器 1.1 什么是DAMOYOLO-S? DAMOYOLO-S是一个基于TinyNAS架构的高性能通用目标检测模型。简单来说,它就像一个“火眼金睛”,能够在一张图片中快速准确地找出各种物体,并告诉你它们是什么、在哪里。 这个模型有几个让我特别喜欢的特点: * 开箱即用:不需要自己训练模型,内置了COCO数据集的80个常见类别识别能力 * 部署简

旧安卓手机别扔!用KSWEB搭个人博客,搭配外网访问超香

旧安卓手机别扔!用KSWEB搭个人博客,搭配外网访问超香

KSWEB 作为安卓端轻量级 Web 服务器,核心功能是提供 PHP、MySQL 运行环境,能轻松部署 Typecho、WordPress 等博客系统,Termux 则可辅助管理内网穿透服务;这类工具特别适合预算有限的学生、个人博主,或是想折腾闲置设备的数码爱好者,优点也很突出 —— 对硬件要求极低,1GB 内存就能运行,旧款红米、华为畅享等机型都能适配,而且内置的运行环境无需手动配置,新手也能快速上手。 使用这套工具时也有不少需要注意的地方,比如手机要长期插电并连接稳定 Wi-Fi,否则服务容易中断;还要给 KSWEB 和 Termux 关闭电池优化、放开存储权限,我用小米手机测试时就因为没关后台限制,导致 Apache 服务频繁被系统杀掉,折腾了好一会儿才排查出问题;另外非 Root 机型也能使用,但部分文件权限操作会稍显繁琐。 不过仅靠 KSWEB 部署完博客后,只能在局域网内访问,这会带来很多不便:比如在家用电脑能连手机看博客,

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:教室信息管理系统(前后端源码 + 数据库 sql 脚本)

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:教室信息管理系统(前后端源码 + 数据库 sql 脚本)

🔥博客主页: 【小扳_-ZEEKLOG博客】 ❤感谢大家点赞👍收藏⭐评论✍         1.0 项目介绍         开发工具:IDEA、VScode         服务器:Tomcat, JDK 17         项目构建:maven         数据库:mysql 8.0 系统用户前台和管理后台两部分,项目采用前后端分离         前端技术:vue3 + elementUI         服务端技术:springboot + mybatis + redis + mysql         1.1 项目功能 后台功能:         1)登录、退出系统、首页         2)教室管理                 (1) 教室管理:添加、修改、删除、查询等功能。         3)教师管理