【无人机路径规划】基于强化学习与人工旅鼠算法融合的低空无人机路径规划研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、算法改进、程序设计科研仿真。

🍎完整代码获取 定制创新 论文复现私信

🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。

🔥 内容介绍

一、整体概述

本研究围绕无人机路径规划展开,通过一系列 MATLAB 文件实现基于强化学习与人工旅鼠算法融合的路径规划功能。这些文件从环境构建、路径搜索、权重优化到结果展示,形成了一套完整的体系,致力于在复杂环境中为无人机规划出最优路径。

二、核心算法相关文件

astar3dWeighted.m

  • 功能:该文件实现了核心的加权 A * 三维路径搜索算法。它依据障碍物、威胁、地形、风场等丰富的环境信息以及权重向量,精心计算出一条可行路径,并返回路径以及各项代价指标。此算法是整个路径规划的基础,通过权衡不同环境因素的权重,为无人机在三维空间中寻找安全且高效的飞行路径。

  • 应用场景:在构建好环境地图后,作为实际路径搜索的关键步骤,为后续的优化和决策提供初始路径数据。

optimizeWeightsPSO_ALA_RL.m

  • 功能:作为主优化函数,它创新性地结合了粒子群(PSO)、人工蜂群启发的 ALA 变异策略以及强化学习(RL)的自适应参数控制。通过这些方法协同工作,搜索最优权重向量,同时维护一个非支配解存档。其中,PSO 提供全局搜索能力,ALA 变异策略增加解的多样性,RL 则根据环境动态调整参数,使得权重向量不断优化,以适应复杂多变的环境。

  • 应用场景:在环境地图和初始路径确定后,对路径权重进行深度优化,以获得满足多目标需求(如最短路径、最小威胁、最低能耗等)的最优路径。

三、环境构建相关文件

buildEnvironmentMaps.m

  • 功能:根据配置中的障碍物、威胁区域、地形参数和风场设置,构建四个重要的三维栅格地图,即障碍物占据图(occupancy)、威胁强度图(threatMap)、地形高度图(terrainMap)和三维风场(windField)。这些地图全面描述了无人机飞行的环境信息,为路径规划提供了直观且详细的环境模型。

  • 应用场景:在路径规划开始前,为整个系统提供基础的环境数据,使得后续的路径搜索和优化能够充分考虑环境因素的影响。

inputObstaclesFromConsole.m

  • 功能:当系统没有图形界面时,此文件通过命令行交互的方式输入障碍物信息,用户需要依次输入每个障碍物的 x、y 坐标以及高度,以此设定无人机飞行环境中的障碍物分布。

  • 应用场景:适用于在没有图形化操作界面的情况下,快速且灵活地设定障碍物信息,满足不同场景下的需求。

inputSceneFromFigure.m

  • 功能:借助图形窗口交互,用户可以直接在二维平面上点击并输入高度等信息,方便地生成自定义场景,包括障碍物、威胁区域、起点和终点的设定。这种方式提供了一种直观且可视化的环境构建方法,降低了用户设定环境参数的难度。

  • 应用场景:对于不熟悉命令行操作或者需要快速可视化调整环境的用户,通过图形窗口交互能更高效地构建复杂场景。

四、辅助函数与工具文件

clipVec.m

  • 功能:作为辅助函数,它将向量各元素限制在指定的下界和上界之间,确保数据在合理范围内,避免因数据溢出或不合理取值导致的错误。

  • 应用场景:在涉及向量运算或数据处理的各个环节,保证数据的有效性和稳定性。

computePathMetrics.m

  • 功能:依据计算出的路径和权重,详细计算路径的总长度、威胁代价、能量消耗、平滑度、时间代价等多个指标,并将这些指标组合成一个指标向量,用于多目标评价。该函数为评估路径的优劣提供了全面且量化的依据。

  • 应用场景:在路径生成后,对路径进行多维度评估,以便在优化过程中选择更优路径。

computeRouteStats.m

  • 功能:对一条路径进行全面的统计分析,包括节点数、直线距离、绕行系数、平均高度、爬升 / 下降距离、最大转弯角度和大于 45° 的转弯次数等。这些统计信息有助于深入了解路径的特性和质量,为路径优化提供详细的数据支持。

  • 应用场景:在路径评估和比较过程中,为用户提供丰富的路径特征信息,辅助决策。

crowdingPrune.m

  • 功能:基于拥挤距离对多目标前沿解集进行修剪,保留指定数量的最具多样性代表解。在多目标优化过程中,解集中可能存在大量相似解,通过该函数的修剪,可以使解集更加精简且多样化,提高优化效率。

  • 应用场景:在维护非支配解存档或生成 Pareto 前沿路径集时,确保解集的质量和多样性。

dominates.m

  • 功能:判断向量 a 是否 Pareto 支配向量 b,即 a 所有分量小于等于 b 且至少一个分量严格小于 b。这是多目标优化中判断解的优劣关系的重要依据,有助于筛选出更优的非支配解。

  • 应用场景:在优化过程中,用于比较不同解之间的关系,决定是否更新非支配解存档。

defaultConfig.m

  • 功能:返回默认的系统配置结构体,其中包含地图尺寸、起止点、飞行高度范围、权重上下限、种子权重、障碍物、威胁区、地形、风场以及 PSO - ALA - RL 算法参数等丰富信息。该文件为系统提供了一套默认的参数设置,方便用户快速启动和测试系统。

  • 应用场景:在系统初始化阶段,为整个路径规划系统提供基础的参数配置。

updateArchive.m

  • 功能:负责更新非支配解存档。具体来说,判断新解是否被存档解支配,若不被支配则加入存档,同时剔除被其支配的存档解,并在存档超过最大容量时用拥挤距离剪枝,确保存档始终保持最优且多样化的解。

  • 应用场景:在优化过程中,随着新解的不断生成,持续维护一个高质量的非支配解存档。

五、结果展示与分析文件

buildParetoSet.m

  • 功能:利用优化过程中存档的非支配解和当前最优权重,生成并修剪 Pareto 前沿路径集。通过合理的修剪,既确保路径集的多样性,又能控制路径集的数量,便于后续的分析和展示。

  • 应用场景:在优化完成后,为用户提供一组代表不同权衡关系的最优路径集合,方便用户根据实际需求选择合适路径。

plotCostFigures.m

  • 功能:绘制 Pareto 路径集中各路径在长度、风险、能耗、平滑、时间及总成本上的柱状图,并标记出每个指标的最优值。通过直观的图形展示,用户可以清晰地比较不同路径在各个指标上的表现。

  • 应用场景:用于可视化路径集在多目标优化中的性能表现,帮助用户直观了解不同路径的特点。

plotDetailedReport.m

  • 功能:生成详细的路径分析表格,展示每条路径的各类指标,包括成本、节点数、绕行系数、转弯统计等,并自动标注每个指标的最优路径。这种详细的报告形式为用户提供了全面且深入的路径分析信息,便于决策。

  • 应用场景:当用户需要深入了解路径的各项性能指标,以便做出更精准的路径选择时使用。

plotSceneAndParetoPaths.m

  • 功能:在三维图形中显示环境,包括障碍物柱体、威胁球体以及 Pareto 前沿路径。通过用不同颜色和线宽突出最优路径,并绘制安全气泡,为用户提供了一个直观的三维可视化环境,展示无人机飞行环境与最优路径的关系。

  • 应用场景:在路径规划完成后,以直观的三维图形展示环境和路径,帮助用户更好地理解路径在实际环境中的布局和安全性。

printParetoSummary.m

  • 功能:在命令行打印 Pareto 路径集的摘要信息,包括各路径的节点数、总成本、长度、风险、能耗、平滑度、时间以及推荐路径的权重向量。这为用户在命令行界面下提供了简洁且关键的路径信息总结。

  • 应用场景:适用于用户希望快速获取路径集关键信息,而不需要详细图形或表格展示的情况。

⛳️ 运行结果

📣 部分代码

function plotSceneAndParetoPaths(cfg, pareto)fig = figure('Color', 'w', 'Position', [90, 85, 920, 730], 'Name', '3D Path Planning Visualization');ax1 = axes(fig);hold(ax1, 'on'); grid(ax1, 'on'); view(ax1, 38, 28);axis(ax1, [1 cfg.mapSize(1) 1 cfg.mapSize(2) 1 cfg.mapSize(3)]);xlabel(ax1, 'X轴'); ylabel(ax1, 'Y轴'); zlabel(ax1, 'Z轴');title(ax1, '三维障碍物 / 威胁区 / 候选路径');for i = 1:size(cfg.obstacles, 1)x = cfg.obstacles(i, 1);y = cfg.obstacles(i, 2);h = cfg.obstacles(i, 3);if h > 0drawColumn(x, y, h);endendfor i = 1:size(cfg.threatRegions, 1)drawThreatSphere(cfg.threatRegions(i, :));endC = lines(max(3, numel(pareto)));for i = 1:numel(pareto)p = pareto(i).path;lw = 1.3;if i == 1lw = 2.8;endplot3(ax1, p(:, 1), p(:, 2), p(:, 3), '-', 'Color', C(i, :), 'LineWidth', lw);if i <= 3idm = max(2, floor(size(p, 1) * (0.35 + 0.1 * i)));text(ax1, p(idm, 1), p(idm, 2), p(idm, 3) + 0.6, sprintf('路径%d', i), ...'Color', C(i, :), 'FontWeight', 'bold');endendplot3(ax1, cfg.start(1), cfg.start(2), cfg.start(3), 'o', ...'MarkerSize', 9, 'LineWidth', 2.0, 'MarkerEdgeColor', [0.0, 0.45, 0.0], 'MarkerFaceColor', [0.35, 0.95, 0.35]);plot3(ax1, cfg.goal(1), cfg.goal(2), cfg.goal(3), 'p', ...'MarkerSize', 12, 'LineWidth', 2.0, 'MarkerEdgeColor', [0.7, 0.0, 0.0], 'MarkerFaceColor', [1.0, 0.3, 0.3]);text(ax1, cfg.start(1), cfg.start(2), cfg.start(3) + 0.9, '起始点', 'FontWeight', 'bold');text(ax1, cfg.goal(1), cfg.goal(2), cfg.goal(3) + 0.9, '目标点', 'FontWeight', 'bold');bestPath = pareto(1).path;bubbleStep = max(1, floor(size(bestPath, 1) / 7));bubbleRadius = max(1.0, pareto(1).weights(5) * 0.55);for k = 1:bubbleStep:size(bestPath, 1)drawSafetyBubble(bestPath(k, :), bubbleRadius);endset(ax1, 'FontSize', 11);endfunction drawColumn(x, y, h)[Xc, Yc, Zc] = cylinder(0.42, 12);Zc = Zc * h;surf(Xc + x, Yc + y, Zc + 1, 'FaceColor', [1.0, 0.95, 0.1], 'FaceAlpha', 0.55, ...'EdgeColor', [0.35, 0.35, 0.35], 'EdgeAlpha', 0.4);endfunction drawThreatSphere(region)cx = region(1); cy = region(2); cz = region(3); r = region(4); lv = region(5);[sx, sy, sz] = sphere(16);rr = max(1.2, 0.55 * r);surf(cx + rr * sx, cy + rr * sy, cz + rr * sz, ...'FaceColor', [1.0, 0.2, 0.2], 'FaceAlpha', min(0.08 + 0.12 * lv, 0.28), ...'EdgeColor', 'none');endfunction drawSafetyBubble(pt, r)[sx, sy, sz] = sphere(10);surf(pt(1) + r * sx, pt(2) + r * sy, pt(3) + r * sz, ...'FaceColor', [0.2, 0.35, 1.0], 'FaceAlpha', 0.08, 'EdgeColor', 'none');end

🔗 参考文献

🍅更多免费数学建模和仿真教程关注领取