【无人机路径规划】无人机三维路径规划中蚁群算法、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

疫苗发布和接种预约系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

疫苗发布和接种预约系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着全球公共卫生事件的频发,疫苗接种成为防控传染病的重要手段。高效的疫苗发布和接种预约系统对于提升疫苗接种覆盖率、优化资源配置具有关键作用。传统疫苗接种管理方式存在信息不透明、预约流程繁琐、数据统计滞后等问题,难以满足大规模接种需求。因此,开发一套基于现代化信息技术的疫苗发布和接种预约系统,实现疫苗信息的实时更新、预约流程的便捷化以及数据管理的智能化,具有重要的现实意义。该系统能够帮助卫生部门高效管理疫苗库存、分配接种资源,同时为公众提供透明的疫苗信息和便捷的预约渠道,从而提升疫苗接种效率和服务质量。关键词:疫苗发布、接种预约、信息管理、公共卫生、资源配置。 本系统采用前后端分离架构,后端基于SpringBoot框架实现,提供RESTful API接口,支持高并发访问和数据安全传输。前端使用Vue.js框架构建,具备响应式布局和良好的用户体验。数据库采用MySQL,存储疫苗信息、用户数据和预约记录等核心数据。系统功能模块包括疫苗信息发布、预约管理、用户权限控制、数据统计分析等。管理员可通过后台管理疫苗库存、审核预约请求,普通用户可通过前端页面查询疫苗信息并完成在线预约。系统支

SpringWeb

SpringWeb

之前javaEE开发中,web层使用的原生的Servlet, 弊端: 类中只提供doGet/doPost方法, 接收参数很麻烦 ,响应数据也很麻烦(java对象转为json格式) spring中的web模块就可以解决以上存在的问题 SpringWEB 组件 前端控制器:DispatcherServlet(不需要程序员开发),由框架提供,在web.xml 中配置。作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求.处理器映射器:HandlerMapping(不需要程序员开发),由框架提供。作用:根据请求的 url 查找 Handler(处理器/Controller)处理器适配器:HandlerAdapter(不需要程序员开发),由框架提供。作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。处理器:Handler(也称之为 Controller,需要工程师开发)。注意:编写

Qwen3-VL-WEBUI部署避坑:常见启动失败原因及解决方法

Qwen3-VL-WEBUI部署避坑:常见启动失败原因及解决方法 1. 背景与技术定位 1.1 Qwen3-VL-WEBUI 简介 Qwen3-VL-WEBUI 是阿里云为 Qwen3-VL-4B-Instruct 模型量身打造的可视化交互界面工具,旨在降低多模态大模型的使用门槛。该 WebUI 提供了图形化操作入口,支持图像上传、视频分析、GUI代理任务执行、OCR识别、代码生成等高级功能,适用于开发者、研究人员和企业用户快速验证视觉语言模型能力。 作为 Qwen-VL 系列的最新迭代,Qwen3-VL 在架构设计、推理能力和应用场景上实现了全面跃迁。其内置的 Qwen3-VL-4B-Instruct 模型不仅具备强大的图文理解与生成能力,还集成了多项前沿技术模块,如 DeepStack 特征融合、交错 MRoPE 位置编码、文本-时间戳对齐机制等,显著提升了在长上下文、复杂空间关系和动态视频理解中的表现。 2. 部署环境准备与常见问题 2.1 推荐部署方式:镜像一键部署 目前最推荐的方式是通过 ZEEKLOG

Python+IDM双剑合璧:轻松搞定网页反爬的WebP图片批量下载(附完整代码)

Python与IDM协同作战:攻克WebP图片批量下载的反爬壁垒 最近在采集一批设计素材时,我遇到了一个颇为棘手的状况。目标网站上的图片资源全部采用了WebP格式,这本身没什么问题,但当我尝试用常规的Python爬虫脚本直接下载时,却频频遭遇403 Forbidden错误。浏览器里直接打开图片链接,同样显示拒绝访问——典型的反爬机制在起作用。手动一张张保存?面对几百张图片,这显然不现实。就在几乎要放弃的时候,我偶然尝试用IDM(Internet Download Manager)去抓取单个链接,居然成功了。这个发现让我意识到,或许可以走一条“曲线救国”的路:用Python来组织和调度任务,而把实际的下载重担交给IDM这个专业的下载器。这种组合,不仅绕开了网站对Python直接请求的封锁,还充分发挥了IDM在下载稳定性、多线程和断点续传方面的优势。本文将详细拆解这套方案,从原理分析、环境搭建到代码实战,为你提供一个即拿即用的反爬场景下载工具箱。 1. 理解反爬机制与工具选型逻辑 为什么Python的requests库会失败,而IDM却能成功?这背后通常涉及几种常见的反爬策略。许多