目录

MATLAB实现基于LSTM-GAN-RNN 长短期记忆网络(LSTM)结合生成对抗网络(GAN)与循环神经网络(RNN)进行无人机三维路径规划的详细项目实例... 2

项目背景介绍... 2

项目目标与意义... 4

提升复杂三维环境中的安全性与鲁棒性... 4

降低能量消耗并延长续航时间... 4

兼顾实时性与全局最优性的路径规划能力... 4

推动多源数据融合与智能决策体系建设... 5

项目挑战及解决方案... 5

高维时空耦合与网络结构设计难度... 5

对抗训练不稳定与路径质量评价困难... 6

真实数据稀缺与仿真环境构建复杂... 6

项目模型架构... 7

三维环境与状态编码模块... 7

LSTM时序特征提取与记忆模块... 7

GAN生成器结构与路径样本生成机制... 8

GAN判别器结构与路径质量判别机制... 8

RNN路径输出与三维轨迹解码模块... 9

项目模型描述及代码示例... 9

三维环境与路径数据生成示例... 9

LSTM特征提取与编码网络示例... 11

GAN生成器与判别器结构示例(基于dlnetwork)... 11

RNN路径输出与解码示例... 13

综合路径规划推理示例(自动选择最优路径)... 15

简化局部避障校正与RNN微调示例... 16

MATLAB实现基于LSTM-GAN-RNN 长短期记忆网络(LSTM)结合生成对抗网络(GAN)与循环神经网络(RNN)进行无人机三维路径规划的详细项目实例

请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 

 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)

面向复杂三维环境的无人机路径规划,正在经历从传统规划算法向数据驱动智能算法的深度演进。在实际应用场景中,无人机很少在简单、规则、静态的环境中飞行,更常见的是存在建筑物、山体、树木、临时障碍物以及气象扰动等多种不确定因素相互叠加的三维空间。路径规划不仅要考虑几何层面的可达性与避障,还要综合飞行安全、能源消耗、任务时效性、隐蔽性以及通信链路稳定性等多方面因素。传统的二维路径规划方法难以胜任三维空间的复杂性,而仅基于确定性模型的三维规划方法,在处理动态障碍物、随机风场和复杂飞行约束时也显得力不从心。

近年来,深度学习在时序建模和复杂策略学习方面展现出巨大潜力,长短期记忆网络能够在较长时间尺度上捕捉状态演化的历史依赖性,循环神经网络结构则可以对连续决策过程进行建模,而生成对抗网络则在样本生成、分布拟合和多样性保持方面具有独特优势。将这三类模型有效组合,用于无人机三维路径规划,可以在保留传统规划算法可解释性的基础上,显著增强对复杂环境和不确定因素的自适应能力,从而在时间连续、空间连续且约束复杂的场景中获得更高质量的飞行轨迹。

在典型任务场景中,例如城市低空物流配送、灾害区域勘测、森林火情巡查、精细化农业喷洒、军事侦察与监视等,无人机需在三维空间中沿着一条安全、经济且符合任务需求的轨迹飞行。环境中不仅存在静态障碍物,还可能出现其他飞行器临时占用空域、突发禁飞区域的动态调整、局部地形诱导的湍流、风速风向瞬变、电磁干扰造成的通信中断等问题。传统图搜索方法(如A、D)、连续优化方法(如梯度优化、变分法路径平滑)和采样方法(如RRT、PRM)虽然在特定条件下有效,但往往需要人工设计启发式代价函数或精细调参。一旦环境统计特性发生变化,这些算法常常需要从头调整甚至推翻原有设计,工程维护成本极高。

面向这种高维时空耦合的路径规划任务,基于数据驱动的方案提供了另一条道路:通过从大量真实或高保真仿真数据中学习环境-路径之间的映射关系,使规划模型能够在不断积累经验的过程中持续提升性能。长短期记忆网络特别适合刻画无人机状态序列和环境序列之间的长程依赖,例如前期路径选择对后续能量余量、安全裕度的影响。生成对抗网络则可以用于构造复杂路径样本分布,通过判别器提升生成路径的真实性和可行性,使其更接近传统高质量规划器的输出。循环神经网络的结构特性又非常契合“逐步决策”的逻辑,在每一个离散时间步生成下一段轨迹点,形成由状态驱动动作、由历史驱动未来的决策闭环。

将长短期记忆网络、生成对抗网络与循环神经网络联合构建三维路径规划模型,一方面可以利用LSTM的记忆单元保留长时间跨度的状态和环境信息,避免仅依靠局部信息做出短视决策;另一方面利用GAN生成大量多样化的路径样本,用于数据增强与策略探索,从而弥补真实飞行数据稀缺或者获取成本高昂的不足。可在模拟环境中持续对生成器进行训练,使其掌握在不同风场、不同障碍布局、不同任务优先级下的合理路径分布;同时通过判别器引导生成器抛弃不安全、不合理或不经济的路径策略。RNN结构则贯穿整个决策过程,以自回归方式输出路径点,使整体规划模型在结构上保持连贯与统一。

在具体实现层面,基于MATLAB R2025b提供的深度学习工具箱,可以采用序列网络或自定义dlnetwork的方式搭建三维路径规划网络。R2025b版本不再依赖某些高层封装层(例如transformerEncoderLayer),更多采用attentionLayer、自注意力和位置编码这样的基础组件进行自定义设计。对于三维路径规划任务,本项目重点使用sequenceInputLayer、lstmLayer、fullyConnectedLayer、reluLayer、tanhLayer和自定义GAN训练循环,将规划问题映射为“输入环境与任务参数、输出三维轨迹序列”的监督与对抗混合学习问题。通过合理设计状态编码方式(例如将三维位置、速度、障碍物距离、风场信息等组织为多通道时序向量),可以保证网络结构与任务物理结构相匹配。

在工程应用角度,本项目所构建的基于LSTM-GAN-RNN的三维路径规划方案,不是简单替代传统算法,而是提供一个可以与经典方法互补的智能规划模块。一方面可以利用传统规划算法生成高质量标注轨迹,作为GAN训练的真实样本来源;另一方面可以使用深度模型在实时性要求较高、环境建模不完整或存在大量不确定性的场景中,直接给出合理路径建议,或者为传统规划器提供初始解与搜索空间引导,从而在保证安全性前提下提升全局最优性和计算效率。这种融合式路径规划思路,将在未来多无人机协同、城市空中交通管理等领域发挥重要作用,也为智能控制和智能决策的交叉研究提供了丰富的实验平台。

项目目标与意义

提升复杂三维环境中的安全性与鲁棒性

无人机在复杂三维环境中进行任务执行时,安全性是任何路径规划系统必须首先满足的核心目标。传统规划方法主要依靠静态地图和预定义安全间隔,在面对动态障碍物、高度不确定的风场和临时飞行限制时容易失效。本项目基于LSTM-GAN-RNN构建的三维路径规划模型,通过引入时序记忆、对抗训练以及逐步生成路径的策略,致力于显著提高规划结果在复杂场景中的安全裕度。长短期记忆网络可以识别和记忆环境中的危险区域,例如曾经产生气流扰动的空间、历史碰撞高发区域等,在后续轨迹生成中自然倾向远离此类区域。生成对抗网络在训练过程中利用判别器不断筛选路径,逐步淘汰穿越障碍物或接近危险边界的轨迹,使生成器在输出路径时倾向于满足更严格的安全约束。循环神经网络结构以序列方式生成路径点,使系统在每一步决策时都可以综合前面的历史与当前的环境输入,从而及时修正偏离安全边界的趋势。通过这样的多层安全机制,本项目设计的路径规划模型能够在风场扰动、传感器噪声甚至部分环境信息缺失的情况下保持较高的安全性和鲁棒性,有助于降低飞行事故风险,为在城市低空、灾区等敏感区域部署无人机系统奠定可靠的技术基础。

降低能量消耗并延长续航时间

对于多数小型和中型无人机平台来说,能源受限是制约任务能力的根本因素。如何在保证安全和任务完成度的前提下,最大限度延长飞行时间、提升能源利用效率,是路径规划算法的重要评价维度。本项目的LSTM-GAN-RNN三维路径规划模型,通过引入能量消耗估计和代价函数设计,将能量维度融入到路径生成过程中。长短期记忆网络能够在时序上掌握速度、加速度、爬升率与能源消耗之间的关系,例如频繁爬升、高频机动、长时间逆风飞行都会迅速消耗电量。在训练阶段,可通过标注每条样本轨迹的能量消耗成本,使模型学习如何在安全可行的路径集合中,优先选择能耗较低的轨迹模式。生成对抗网络则可以通过构造“低能耗轨迹”与“高能耗轨迹”的对比样本,强化生成器对节能路径的偏好。在路径输出时,循环结构连续生成的每个路径点不仅要满足空间避障要求,还要在高度变化、方向变化、速度变化等维度上尽量平滑,从而减少频繁的姿态调整和推进系统负荷。通过这种方式,规划系统不仅能够为单个任务生成更加经济的路径,在长期使用中也能帮助运营方降低能源成本,提高电池寿命和任务覆盖范围,使无人机在现有硬件条件下发挥更大效益。

兼顾实时性与全局最优性的路径规划能力

在实际应用中,路径规划系统需要在有限时间内输出高质量的三维轨迹,既不能只追求精确而忽视计算时延,也不能为了实时响应而牺牲全局质量。本项目构建的LSTM-GAN-RNN规划模型,旨在实现实时性与全局最优性之间的平衡。通过在离线阶段利用GAN建立高质量路径分布,生成器在推理阶段可以在很短的时间内产生接近全局最优的候选路径,而不再依赖大规模在线搜索或复杂的连续优化过程。长短期记忆网络的利用,使模型在面对较长规划时间窗时仍能有效捕获全局结构,避免只关注局部短路径而导致整体绕行或过度保守。循环神经网络结构则通过自回归方式一步步生成轨迹点,每一步的计算复杂度相对较低,具备良好的并行化和工程部署能力。在MATLAB R2025b环境中,可利用GPU和mini-batch推理等机制,进一步提升在线规划速度。通过对网络结构的轻量化设计和参数裁剪技术,可以在保证精度的前提下减少模型规模,使其适配嵌入式计算平台或边缘计算设备。最终目标是构建一个既能在复杂任务场景中提供接近全局最优解,又能满足实际系统实时性需求的综合性路径规划方案。

推动多源数据融合与智能决策体系建设

现代无人机系统的感知与通信能力不断增强,机载传感器与地面系统可以获取丰富的多源数据,例如三维地形图、建筑物模型、气象数据、飞行历史轨迹、空域管制信息等。如何将这些多源异构数据融合进路径规划模型,使其在决策时充分利用来自不同渠道的知识,是智能化发展的关键方向。本项目通过LSTM-GAN-RNN结构,为多源数据融合提供一个统一的时序建模框架。环境信息可以在时间维度上构造为多通道输入序列,例如将风速风向、高度约束、障碍物密度等编码为时变特征,让网络在每一规划步都能接收最新的环境状态。GAN中使用的真实样本可以来自不同数据源的综合结果,例如传统规划算法在高精度三维地图上的最优轨迹、经验飞行员手动规划的路径以及历史任务数据中表现良好的轨迹。这种多源融合的数据驱动训练,可以让规划模型吸收不同来源、不同风格的路径策略,形成更具泛化能力和适应性的决策规则。在更宏观的层面,基于LSTM-GAN-RNN的路径规划模型还可以作为整个无人机智能决策系统的一部分,与任务分配、通信调度、协同控制等模块联合工作,推动从单机智能向集群智能、系统智能的演进,为未来空中交通管理和复杂环境下的大规模无人机协同作业打下基础。

项目挑战及解决方案

高维时空耦合与网络结构设计难度

无人机三维路径规划本质上是一个高维时空耦合的决策问题。状态空间包括位置、姿态、速度、加速度、剩余电量、传感器状态等多种变量,环境空间则涉及三维障碍物分布、风场、气象条件、禁飞区约束以及其他飞行器状态等。而路径规划需要在时间维度上输出连续的轨迹序列,每个时间步的决策都受到历史状态与未来预期的影响。这样的高维耦合和长时间依赖特性,使得简单的前馈网络难以捕捉完整的决策结构。在这种背景下,如何设计合适的LSTM-GAN-RNN组合结构成为重要挑战。一方面,LSTM层数量过多、隐藏单元规模过大,会导致训练难度剧增、梯度消失或爆炸以及计算资源消耗过高;另一方面,生成对抗网络本身易出现训练不稳定、模式崩塌等问题,与时序结构结合后,这种不稳定性有可能进一步放大。为解决这一挑战,本项目在结构设计上采用分层与模块化思路,将路径规划网络划分为环境编码子网络、时序策略生成子网络和对抗评估子网络三大部分。环境编码部分采用适度深度的全连接层和LSTM层,将高维环境信息压缩到中等维度的时序特征表示;时序策略生成部分使用一到两层LSTM加上循环输出结构,在保证表达能力的前提下控制参数规模;对抗评估部分则采用相对浅层的判别器网络,重点关注路径整体的几何合理性和安全性。通过合理设置隐藏层尺寸、激活函数类型以及正则化方式,可以在不依赖Transformer等更复杂结构的前提下,实现对时空耦合特性的有效建模。同时利用MATLAB R2025b中dlnetwork的灵活构建能力,以模块化方式组织生成器和判别器,方便调试和逐步扩展。

对抗训练不稳定与路径质量评价困难

生成对抗网络在图像生成等领域取得巨大成功的同时,也暴露出训练不稳定、难以收敛、模式崩塌等问题。在路径规划场景中,对抗训练还面临一个额外难题:路径质量的评价不仅涉及几何形状,还涉及安全性、能耗、时间和约束满足程度等多维指标。判别器如果设计不当,可能只关注某个维度特征,导致生成器为迎合判别器而输出在其他关键指标上表现较差的路径。为了提升训练稳定性和综合评价能力,本项目采用多策略联合的解决方案。首先在损失函数设计中,将判别器的对抗损失与路径物理代价函数相结合,构造加权的综合损失,使生成器在提升“逼真度”的同时兼顾安全性和能耗等指标。为避免单一尺度的判别,判别器输入不仅包括路径点序列本身,还包括由路径序列计算得到的辅助特征,例如总路径长度、最大爬升率、最小安全距离等。这些辅助特征通过简单的全连接层参与判别,提高网络对全局质量的敏感度。其次,在训练过程控制上,引入学习率衰减、判别器与生成器更新步数比例调整和梯度裁剪等措施,缓解训练振荡和梯度爆炸问题。必要时可以采用WGAN或带梯度惩罚的变体,从理论层面改进训练稳定性。此外,项目中设计了一套基于MATLAB仿真环境的路径质量评估工具,通过可视化轨迹、统计关键指标和分析失败案例,辅助调整判别器结构和损失权重。这样一来,对抗训练不再完全依赖“黑盒式”的收敛判断,而是通过定量和可视分析的方式进行过程监管,从而稳步提升路径质量。

真实数据稀缺与仿真环境构建复杂

高质量数据是训练任何深度模型的基础,而无人机三维路径规划的数据获取存在明显困难。一方面,真实飞行试验成本高昂,受天气、空域管制、平台可靠性等多因素制约,每次试验能采集的数据量有限;另一方面,对于包含极端天气、故障场景或复杂障碍布局的情况,在真实环境中进行试验存在安全风险,难以采集足够样本。仅依赖公开数据集往往难以覆盖实际工程中的具体需求。为解决这一挑战,本项目采取“仿真驱动 + 真实校准”的数据策略。首先在MATLAB环境中构建高保真三维仿真场景,通过参数化方式生成多种地形、障碍物布局和风场条件。利用传统规划算法(例如三维A、RRT、基于优化的轨迹生成器)在这些仿真环境中计算高质量路径,作为GAN训练的“真实样本”。通过调整仿真参数,可以系统性地覆盖不同高度层、障碍密度和风场强度,从而得到丰富的环境-路径对。此外,针对关键任务场景,可结合小规模真实飞行数据进行模型微调,使规划系统在仿真与现实之间建立更精确的映射。在仿真环境构建过程中,还特别注意物理合理性和参数可调性,例如风速分布采用合理的随机场模型,障碍物形状与尺寸与真实建筑物和地形保持一致。通过这种方式,即使在真实数据稀缺的条件下,仍然可以为LSTM-GAN-RNN模型提供足够的训练样本,同时保留对典型实际场景的针对性,降低从仿真到现实的迁移误差。

项目模型架构

三维环境与状态编码模块

三维路径规划模型的输入,需要以合理的方式编码无人机当前状态、历史轨迹和环境信息,使其适配LSTM和RNN的时序处理特性。本项目采用“时间步 × 特征维度”的编码方式,将三维位置、速度、剩余电量以及局部环境信息融合到统一的特征向量中。每个时间步的特征向量可以包含当前三维坐标、速度分量、航向角、与最近障碍物之间的三维距离、当前高度层允许的最大飞行高度、局部风速风向以及与目标点的相对位置信息等。这样,LSTM与RNN在每一时间步接收到的输入,不再只是单一的几何位置,而是包含与决策相关的关键物理信息。环境信息本身具有空间分布特性,在编码时可采用局部栅格或局部点云的摘要特征,例如使用多个方向上的最小障碍距离、局部平均风速、局部地形高度差等作为环境向量的一部分。对于更复杂的环境表示,例如三维栅格地图,可在在线规划时使用滑动窗口方式截取与当前路径相关的局部区域,避免输入维度过高。状态编码模块通过全连接层和非线性激活函数,将原始特征映射到适合后续LSTM处理的隐藏空间,消除不同量纲之间的尺度差异,增强网络对关键特征的敏感度。在MATLAB R2025b中,可以使用sequenceInputLayer定义时序输入,再通过fullyConnectedLayer实现特征转换。整个编码模块的设计目标,是在保证信息完备性的前提下控制特征维数,使得LSTM-GAN-RNN结构能够在合理的参数规模下高效学习。

LSTM时序特征提取与记忆模块

长短期记忆网络是本项目的核心组件之一,负责在较长时间范围内提取状态与环境序列中的关键模式,并保持对重要历史信息的记忆。无人机三维路径规划的决策过程往往需要回顾较长的历史轨迹,例如前期绕过某个障碍物后,后续路径需要在该障碍物一侧保持安全距离;某一时刻发生的强风扰动,可能对后续速度和姿态调整产生持续影响。常规RNN在面对长期依赖时容易出现梯度衰减,导致早期信息难以传递到后期决策。LSTM通过引入输入门、遗忘门和输出门等机制,对信息流进行细粒度控制,允许网络选择性地保留、更新或忽略特定时间步的状态信息。项目中采用一到两层堆叠的LSTM结构,第一层负责对原始特征进行低层次时序建模,第二层则对第一层输出进行更高层次的抽象,捕捉路径策略中的全局结构和长期依赖。每层LSTM的隐藏单元数量根据输入特征维数和任务复杂度设置,比如在几十到一两百的范围内取值,以平衡表达能力与训练难度。通过在LSTM后接Dropout层与归一化层,可以减轻过拟合并加快收敛。最终的LSTM输出为每个时间步一个隐藏状态向量,这些向量既包含当前环境与状态信息,也凝聚了历史轨迹和决策过程中的重要线索,为后续GAN生成器和RNN输出层提供高质量的时序特征基础。

GAN生成器结构与路径样本生成机制

生成对抗网络中的生成器,在本项目中承担“路径方案构造者”的角色。生成器输入包括随机噪声向量以及由LSTM编码的环境-状态特征,输出则为一段候选三维路径序列。与图像生成任务不同,路径生成需要遵循物理可行性和飞行约束,因此生成器结构设计以时序建模为主。实现上,生成器包含一个初始全连接层,将随机噪声与环境特征拼接后映射到一个高维隐向量空间;然后通过一到两层LSTM或双向LSTM对这个隐向量进行时序展开,即将整体隐向量解码为多个时间步的隐藏状态,每个时间步再通过全连接层输出对应的三维位置增量或绝对坐标。增量方式的优势在于能够自然形成平滑轨迹,并方便通过累加约束控制路径长度和速度变化。生成器尾部采用tanh或线性激活函数,使输出位置落在预定空间范围内。训练过程中,生成器不断在判别器反馈的指导下调整参数,使得产生的路径在几何形态、安全距离、能量消耗等方面逐步逼近真实样本。借助LSTM提取的环境特征,生成器可以根据具体环境结构自适应调整路径规划策略,例如在障碍密集区域自动倾向绕行,在风向有利的区域延长顺风飞行段。通过将噪声向量引入生成过程,还可以在保持整体路径质量的前提下获得一定多样性,便于在同一任务下探索多条可行路径。

GAN判别器结构与路径质量判别机制

判别器在整个LSTM-GAN-RNN模型中扮演“路径质量审查者”的角色,其目标是区分真实路径与生成路径,并通过对抗训练间接提升生成器输出的质量。判别器输入为一条完整或部分路径序列,包含三维坐标、速度以及派生特征(例如局部曲率、爬升率、与障碍物的最小距离等)。结构上,判别器可以采用一到两层LSTM或GRU对时序路径进行编码,并在末端通过全连接层输出一个标量概率,表示输入路径来自真实数据的可信度。为了增强判别器对全局特征的敏感度,除了直接使用轨迹点序列外,还可以将一些统计特征拼接到序列末端或单独输入。例如总路径长度、总飞行时间、平均速度、最大加速度和最小安全距离等。这些特征帮助判别器识别那些几何上看似平滑但物理指标不合理的路径。判别器的损失函数采用交叉熵或相应对抗变体,通过最大化真实路径被判为真、生成路径被判为假的概率来训练。训练策略上,通常在每轮迭代中先更新判别器若干步,使其保持较强的辨别能力,然后再更新生成器,使其针对当前判别器的反馈进行优化。MATLAB R2025b中的dlnetwork和自定义训练循环,支持在同一训练过程中灵活更新多个网络参数。通过合理设计判别器结构与训练策略,可以减少模式崩塌现象,鼓励生成器探索更多高质量路径模式,同时在多项约束指标上保持均衡表现。

RNN路径输出与三维轨迹解码模块

在LSTM和GAN生成器提供的时序特征基础上,RNN路径输出模块负责将高维隐藏状态解码为具体的三维轨迹点。该模块以序列方式运行:每一时间步接收上一时间步的隐藏状态、上一个输出路径点以及当前环境特征,输出当前时刻的路径点位置或位移。采用RNN结构的优势在于它与路径规划的逐步决策模式高度一致,便于引入反馈机制和在线修正策略。结构上,RNN输出层可以由一层轻量级的lstmLayer或simpler rnnLayer组成,后接fullyConnectedLayer将隐藏状态映射到三维坐标输出。通过将上一时刻的输出作为当前输入的一部分,路径输出模块可以形成自回归结构,实现对轨迹连续性和平滑性的自然约束。此外,在每个时间步可以计算局部约束指标(例如与障碍物的最小距离是否大于阈值),并在训练时将这一信息反向影响损失函数,对违反约束的路径段施加惩罚。这样,RNN输出模块不仅仅是简单的解码器,还承担了局部约束检查和细节调整的作用。在部署阶段,该模块可以与上位任务规划器和底层控制器结合:当环境信息发生突变或任务目标调整时,RNN可以在保持前段路径不变的情况下快速重新生成后续轨迹,实现柔性 replanning。本项目在MATLAB R2025b中采用序列网络结构构建该模块,在训练阶段与LSTM-GAN的生成部分通过dlnetwork组合,确保梯度可以在完整时序链路上传递,形成端到端的路径学习与输出体系。

项目模型描述及代码示例

三维环境与路径数据生成示例
clear; clc; rng(1); % 清空工作区和命令窗口并固定随机种子,保证实验可复现
numSamplesPerScene = 40; % 每个场景生成若干条路径样本,用作训练数据
maxSteps = 60; % 每条路径的最大时间步数,统一序列长度
gridSize = [100 100 50]; % 三维空间尺寸,单位可视为米,对应X,Y,Z范围
obstacleDensity = 0.02; % 障碍物密度系数,控制环境复杂程度
allPaths = cell(numScenes*numSamplesPerScene,1); % 预分配路径序列存储单元,提升效率
allEnvFeat = cell(numScenes*numSamplesPerScene,1); % 存放与路径对应的环境特征序列
sampleIdx = 1; % 初始化全局样本索引,用于逐条填充数据单元
for s = 1:numScenes % 外层循环遍历每个场景,构建多场景数据集
    numObstacles = round(prod(gridSize)*obstacleDensity/500); % 根据空间体积与密度估算障碍物数量
    obsCenters = rand(numObstacles,3).*gridSize; % 随机生成障碍物中心坐标,覆盖整个空间
    obsRadius = 5 + 10*rand(numObstacles,1); % 为每个障碍物设置半径,模拟不同大小的建筑或障碍
    windField = [3*randn 3*randn 0.5*randn]; % 为场景设置一个简化常值风场向量,便于路径代价计算
    for n = 1:numSamplesPerScene % 内层循环在同一场景下生成多条路径
        startPos = [5 5 5]; % 固定起点在空间一角,便于可视对比
        goalPos = gridSize - 5; % 固定终点在空间对角,形成穿越场景的飞行任务
        path = zeros(maxSteps,3); % 预分配路径点矩阵,每行对应一个时间步的三维位置
        envFeat = zeros(maxSteps,6); % 预分配环境特征,每行包含风场和相对目标等信息
        pos = startPos; % 初始化当前位置为起点,为后续路径迭代提供初始状态
            dirToGoal = goalPos - pos; % 计算从当前位置指向目标点的方向向量
            dirToGoal = dirToGoal ./ (norm(dirToGoal) + 1e-6); % 对方向向量进行归一化,避免数值问题
            windBias = 0.2*windField; % 将风场对路径方向的影响建模为一个偏置向量
            stepVec = dirToGoal + windBias; % 合成指向目标与风偏的方向,形成实际运动方向
            stepLen = 2 + 1.0*rand; % 在一定范围内随机步长,增加路径多样性
            newPos = pos + stepLen*stepVec; % 计算候选下一位置,作为初步路径点
            newPos = max(newPos,[1 1 1]); % 限制位置不小于空间下边界,防止越界
            newPos = min(newPos,gridSize-1); % 限制位置不超过空间上边界,保证在仿真区域内
            for k = 1:numObstacles % 遍历所有障碍物,检查当前路径段是否和障碍物过近
                    newPos = pos + stepLen*avoidDir; % 将运动方向修改为避障方向,绕开障碍物
                end % 结束单个障碍物的碰撞检测与修正
            end % 完成对所有障碍物的检测,得到更新后的安全位置
            pos = newPos; % 将当前位置更新为新位置,为下一时间步规划做准备
            path(t,:) = pos; % 记录当前时间步的路径点到路径矩阵
            envFeat(t,:) = [windField relGoal(1:3)]; % 将风场与相对目标组合成环境特征向量
        end % 完成一条路径的逐步生成
        allPaths{sampleIdx} = path; % 将生成的完整路径存入数据元胞
        allEnvFeat{sampleIdx} = envFeat; % 将对应的环境特征序列存入元胞
        sampleIdx = sampleIdx + 1; % 样本索引加一,准备记录下一条路径
    end % 完成本场景下的多条路径生成
end % 完成所有场景的数据生成工作
LSTM特征提取与编码网络示例
load('uav3d_data.mat','allPaths','allEnvFeat'); % 载入之前生成的路径和环境数据,为网络训练做准备
numSamples = numel(allPaths); % 统计样本数量,便于构造输入输出单元
seqInput = cell(numSamples,1); % 预分配网络输入序列存储单元
seqTarget = cell(numSamples,1); % 预分配网络输出目标序列存储单元
    path = allPaths{i}; % 读取当前样本路径序列
    stateFeat = path; % 将三维路径点作为状态特征基础
    nextPath = [path(2:end,:); path(end,:)]; % 构造下一时刻位置作为预测目标,实现一步前向预测
    seqTarget{i} = nextPath'; % 转置目标序列,使其与输入序列的维度格式相匹配
end % 完成所有样本的序列构造
inputDim = size(seqInput{1},1); % 获取单个时间步的输入特征维度,用于定义网络结构
outputDim = size(seqTarget{1},1); % 获取单个时间步的输出维度,这里为三维位置
layersLSTM = [ ... % 构建用于特征提取和预测的LSTM序列网络结构
    sequenceInputLayer(inputDim) % 定义时序输入层,接收特征维度为inputDim的序列数据
    reluLayer % 非线性激活提升网络表达能力,避免线性变换的局限
    dropoutLayer(0.2) % 引入随机失活减轻过拟合,增强模型泛化能力
    fullyConnectedLayer(outputDim) % 将LSTM输出映射到三维坐标空间,对应路径点预测
optsLSTM = trainingOptions('adam', ... % 选择Adam优化器进行训练,兼顾收敛速度与稳定性
    'MaxEpochs',20, ... % 设定最大训练轮数为20,作为初始训练规模
    'GradientThreshold',1, ... % 设置梯度阈值为1,防止梯度爆炸问题
    'Shuffle','every-epoch', ... % 每个训练轮对样本顺序打乱,提高训练鲁棒性
    'Plots','none', ... % 不在训练过程中展示图形,适合脚本批量运行
netLSTM = trainNetwork(seqInput,seqTarget,layersLSTM,optsLSTM); % 使用构建的网络和选项训练LSTM模型
save('uav_lstm_encoder.mat','netLSTM'); % 将训练好的LSTM网络保存到文件,用于后续GAN和RNN模块
GAN生成器与判别器结构示例(基于dlnetwork)
genInputDim = 16; % 设定生成器噪声向量维度,用于引入路径多样性
encodedDim = 32; % 设定环境与状态编码的压缩维度,使生成器输入统一为中等维度
genLayers = [ ... % 构建生成器的层结构,负责将噪声和环境特征映射为路径序列
    featureInputLayer(genInputDim + encodedDim) % 输入层接收噪声与编码特征拼接后的向量
    fullyConnectedLayer(128) % 全连接层将输入映射到128维隐藏空间,作为高层语义基础
    reluLayer % 使用ReLU激活增强非线性表达能力
    lstmLayer(128,'OutputMode','sequence') % LSTM层将隐藏向量解码为时序特征序列
genNet = dlnetwork(layerGraph(genLayers)); % 将生成器层图封装为dlnetwork,支持自定义训练循环
discInputDim = 3; % 判别器基础输入维度为三维路径坐标,可根据需要扩展
discLayers = [ ... % 构建判别器的层结构,用于区分真实路径和生成路径
    sequenceInputLayer(discInputDim) % 时序输入层接收路径序列坐标
    reluLayer % ReLU激活引入非线性,使判别更灵活
    fullyConnectedLayer(1) % 输出单一标量作为真伪评分
    sigmoidLayer]; % 使用Sigmoid将评分映射到[0,1]区间,对应真实概率
learnRateG = 1e-4; % 为生成器设置较小学习率,防止训练振荡
trailingAvgG = []; % 初始化生成器梯度指数平均,用于Adam优化器
trailingAvgSqG = []; % 初始化生成器梯度平方指数平均
trailingAvgSqD = []; % 初始化判别器梯度平方指数平均
numEpochsGAN = 10; % 设定GAN对抗训练轮数,作为初步训练规模
numIterationsPerEpoch = floor(numSamples / miniBatchSizeGAN); % 计算每轮迭代次数,覆盖全部样本
for epoch = 1:numEpochsGAN % 外层循环控制GAN训练轮数,逐步提升生成质量
    idx = randperm(numSamples); % 每轮训练前随机打乱样本顺序,增强泛化能力
    for iter = 1:numIterationsPerEpoch % 内层循环逐小批量执行对抗训练
        batchIdx = idx((iter-1)*miniBatchSizeGAN+1:iter*miniBatchSizeGAN); % 选取当前批次样本索引
        realSeq = cell(miniBatchSizeGAN,1); % 预分配真实路径批次存储单元
        for b = 1:miniBatchSizeGAN % 遍历当前批次中的每个样本
            path = allPaths{batchIdx(b)}; % 读取一条真实路径序列
            realSeq{b} = path'; % 转置路径矩阵,使其为特征×时间格式
        end % 完成当前批次真实路径整理
        dlReal = dlarray(cat(3,realSeq{:}),'CBT'); % 将多个序列拼接为三维数组并转为dlarray,维度为通道×批次×时间
        noise = randn(genInputDim,miniBatchSizeGAN); % 为每个样本生成噪声向量,提供随机性
        encFeat = randn(encodedDim,miniBatchSizeGAN); % 用随机向量暂时代替环境编码,真实应用中可接入LSTM编码输出
        dlGenInput = dlarray(genInput,'CB'); % 将生成器输入转为dlarray,维度为通道×批次
        [gradientsG,gradientsD,lossG,lossD] = dlfeval(@modelGradientsGAN,genNet,discNet,dlGenInput,dlReal); % 在自动求导环境下计算生成器和判别器梯度以及对应损失
        [genNet,trailingAvgG,trailingAvgSqG] = adamupdate(genNet,gradientsG, ... % 使用Adam优化器更新生成器参数
            trailingAvgG,trailingAvgSqG,epoch,learnRateG); % 传入指数平均和学习率,完成参数调整
        [discNet,trailingAvgD,trailingAvgSqD] = adamupdate(discNet,gradientsD, ... % 使用Adam优化器更新判别器参数
            trailingAvgD,trailingAvgSqD,epoch,learnRateD); % 使用独立的平均量与学习率更新判别器
    end % 完成一个训练轮次的全部小批量对抗更新
end % 完成GAN训练过程
save('uav_gan_gen.mat','genNet'); % 保存训练好的生成器网络,用于路径规划阶段
save('uav_gan_disc.mat','discNet'); % 保存训练好的判别器网络,便于后续评估与可视分析
function [gradG,gradD,lossG,lossD] = modelGradientsGAN(genNet,discNet,dlGenInput,dlReal) % 定义计算GAN梯度和损失的函数,供dlfeval调用
dlFake = reshape(dlFake,3,[],size(dlReal,3)); % 调整生成路径张量形状,使其与真实数据在维度上匹配
dlOutReal = forward(discNet,dlReal); % 通过判别器对真实路径进行前向传播,获得真样本评分
dlOutFake = forward(discNet,dlFake); % 通过判别器对生成路径进行前向传播,获得伪样本评分
lossReal = -mean(log(dlOutReal + 1e-8)); % 计算真实样本损失,鼓励判别器输出接近1
lossFake = -mean(log(1 - dlOutFake + 1e-8)); % 计算生成样本损失,鼓励判别器输出接近0
lossD = lossReal + lossFake; % 判别器总损失为真实损失与生成损失之和
gradD = dlgradient(lossD,discNet.Learnables); % 对判别器可学习参数求导,得到梯度
gradG = dlgradient(lossG,genNet.Learnables); % 对生成器可学习参数求导,得到梯度
end % 结束梯度计算函数定义
RNN路径输出与解码示例
rnnLayers = [ ... % 定义用于路径解码的RNN网络结构
    sequenceInputLayer(inputDim) % 输入层接收与LSTM相同格式的状态与环境特征序列
    lstmLayer(64,'OutputMode','sequence') % 使用64单元LSTM层进行轻量时序建模
rnnNet = dlnetwork(layerGraph(rnnLayers)); % 将RNN结构封装为dlnetwork,支持自定义训练和推理
miniBatchSizeRNN = 8; % 小批量大小与前期训练保持一致,便于复用数据组织方式
numIterationsRNN = floor(numSamples / miniBatchSizeRNN); % 计算每轮RNN训练的迭代次数
trAvgR = []; % 初始化RNN梯度指数平均,用于Adam优化器
trAvgSqR = []; % 初始化RNN梯度平方指数平均
for epoch = 1:numEpochsRNN % 外层循环控制RNN训练轮数
    idx = randperm(numSamples); % 每轮训练打乱样本顺序,提升泛化能力
    for iter = 1:numIterationsRNN % 内层循环逐小批量训练RNN
        batchIdx = idx((iter-1)*miniBatchSizeRNN+1:iter*miniBatchSizeRNN); % 选取当前批次样本索引
        XBatch = cell(miniBatchSizeRNN,1); % 预分配输入序列批次存储单元
        YBatch = cell(miniBatchSizeRNN,1); % 预分配目标序列批次存储单元
        for b = 1:miniBatchSizeRNN % 遍历当前批次样本并构造网络输入
            XBatch{b} = seqInput{batchIdx(b)}; % 读取一条输入特征序列
            YBatch{b} = seqTarget{batchIdx(b)}; % 读取对应的目标路径序列
        end % 完成批次数据准备
        X = dlarray(cat(3,XBatch{:}),'CBT'); % 将输入序列拼接并转为dlarray格式
        T = dlarray(cat(3,YBatch{:}),'CBT'); % 将目标序列拼接并转为dlarray格式
        [gradR,lossR] = dlfeval(@modelGradientsRNN,rnnNet,X,T); % 计算当前批次RNN参数梯度和损失
        [rnnNet,trAvgR,trAvgSqR] = adamupdate(rnnNet,gradR,trAvgR,trAvgSqR,epoch,learnRateRNN); % 使用Adam优化器更新RNN网络参数
end % 结束RNN训练过程
save('uav_rnn_decoder.mat','rnnNet'); % 保存训练完成的RNN解码网络以便后续路径生成与评估
function [gradients,loss] = modelGradientsRNN(rnnNet,X,T) % 定义RNN梯度与损失计算函数,用于dlfeval调用
Y = forward(rnnNet,X); % 利用RNN网络对输入序列进行前向传播,得到预测路径序列
loss = mse(Y,T); % 使用均方误差度量预测路径与目标路径之间的差距
gradients = dlgradient(loss,rnnNet.Learnables); % 对RNN所有可学习参数求导,得到对应梯度
end % 结束RNN梯度计算函数
综合路径规划推理示例(自动选择最优路径)
load('uav_lstm_encoder.mat','netLSTM'); % 载入预训练LSTM编码网络,用于提取环境状态特征
load('uav_gan_gen.mat','genNet'); % 载入训练好的GAN生成器网络,用于生成候选路径
goalPos = [90 90 45]; % 设定目标点坐标,落在仿真空间上界附近
windFieldTest = [2 1 0.3]; % 为测试场景定义简化风场向量
envFeatTest = zeros(maxStepsPlan,6); % 预分配测试环境特征矩阵
for t = 1:maxStepsPlan % 构造测试环境特征序列
    relGoal = goalPos - pos; % 计算当前位置相对目标的位置差
    envFeatTest(t,:) = [windFieldTest relGoal(1:3)]; % 将风场和相对目标组合成特征向量
    pos = pos + (relGoal./(norm(relGoal)+1e-6))*1.0; % 粗略向目标移动一小步,用于模拟参考轨迹
end % 完成测试环境特征序列构造
stateFeatTest = zeros(maxStepsPlan,3); % 预分配状态特征,用于形成完整输入
for t = 1:maxStepsPlan % 初始化状态特征为线性插值路径
    stateFeatTest(t,:) = startPos*(1-alpha) + goalPos*alpha; % 使用线性插值生成粗略三维路径点
encodedSeq = predict(netLSTM,{seqInputTest}); % 使用LSTM编码网络对测试序列进行特征提取
encodedMat = encodedSeq{1}; % 从元胞中取出编码矩阵,作为后续GAN输入的一部分
encodedVec = mean(encodedMat,2); % 对时间维度取平均,得到环境与状态的全局编码向量
costCandidate = zeros(numCandidates,1); % 预分配候选路径代价值数组
    noise = randn(genInputDim,1); % 生成单个候选的噪声向量
    genInputTest = [noise; encodedVec]; % 将噪声和环境编码拼接为生成器输入
    dlInputTest = dlarray(genInputTest,'CB'); % 转为dlarray格式,通道×批次
    dlFakeSeq = forward(genNet,dlInputTest); % 使用生成器生成伪路径增量序列
    fakeSeq = extractdata(dlFakeSeq); % 将dlarray转换为常规数值数组
    fakeSeq = reshape(fakeSeq,3,[]); % 调整为三维坐标×时间形式
    fakeSeq = fakeSeq'; % 转置为时间×三维坐标形式
    scaleVec = gridSize ./ 2; % 定义将tanh输出映射到空间坐标的缩放系数
    pathGen = max(pathGen,1); % 限制路径点不低于空间下界
    pathGen = min(pathGen,gridSize-1); % 限制路径点不超过空间上界
    pathsCandidate{k} = pathGen; % 存储当前候选路径序列
    dGoal = vecnorm(pathGen - goalPos,2,2); % 计算每个时间步到目标的欧氏距离
    goalPenalty = dGoal(end); % 取终点距离作为目标偏离惩罚
    costCandidate(k) = distTerm + 5*smoothTerm + 10*goalPenalty; % 综合各项代价构造总路径代价值
end % 完成所有候选路径的生成与代价评估
[~,bestIdx] = min(costCandidate); % 找到代价最小的候选路径索引,视为最优路径
bestPath = pathsCandidate{bestIdx}; % 读取最优路径序列供展示与执行
ax = axes(fig); % 在图窗中创建坐标轴对象
colormap(fig,turbo); % 为当前图窗设置turbo色图,兼容R2025b版本要求
plot3(ax,bestPath(:,1),bestPath(:,2),bestPath(:,3),'b.-','LineWidth',1.5); % 绘制最优路径的三维轨迹线
hold(ax,'on'); % 保持坐标轴内容,便于叠加起点终点标记
plot3(ax,startPos(1),startPos(2),startPos(3),'go','MarkerSize',8,'MarkerFaceColor','g'); % 使用绿色圆点标记起点位置
xlabel(ax,'X'); ylabel(ax,'Y'); zlabel(ax,'Z'); % 标注三维坐标轴名称
title(ax,'LSTM-GAN-RNN无人机三维最优路径示例'); % 为图像添加标题说明路径来源与模型结构
view(ax,3); % 设置默认三维视角,便于全局观察轨迹曲线
简化局部避障校正与RNN微调示例
function pathRefined = refinePathWithRNN(rnnNet,roughPath,envFeat,gridSize) % 定义路径细化函数,结合RNN和边界约束
dlX = dlarray(inputSeq,'CBT'); % 转换为dlarray格式,供RNN前向推理
dlY = forward(rnnNet,dlX); % 使用训练好的RNN网络预测优化后的路径序列
pathPred = extractdata(dlY)'; % 将预测结果转为时间×特征格式的数值数组
end % 结束路径细化函数定义
roughPath = bestPath; % 将GAN生成并选出的最优候选路径作为粗略路径输入
envFeatInterp = envFeatTest; % 使用预构造的测试环境特征作为RNN细化的环境输入
pathFinal = refinePathWithRNN(rnnNet,roughPath,envFeatInterp,gridSize); % 通过RNN精细调整路径细节,得到最终执行路径
fig2 = figure; % 创建新图窗用于对比粗略路径和精细路径
ax2 = axes(fig2); % 在新图窗中创建坐标轴对象
colormap(fig2,turbo); % 设置turbo色图以保持与之前图像一致
plot3(ax2,roughPath(:,1),roughPath(:,2),roughPath(:,3),'c--','LineWidth',1); % 使用虚线展示粗略路径轨迹
hold(ax2,'on'); % 保持坐标轴内容,方便叠加精细路径
plot3(ax2,pathFinal(:,1),pathFinal(:,2),pathFinal(:,3),'m.-','LineWidth',1.5); % 使用实线展示RNN细化后路径
plot3(ax2,startPos(1),startPos(2),startPos(3),'go','MarkerSize',8,'MarkerFaceColor','g'); % 继续标记起点位置
plot3(ax2,goalPos(1),goalPos(2),goalPos(3),'ro','MarkerSize',8,'MarkerFaceColor','r'); % 继续标记终点位置
grid(ax2,'on'); % 打开网格以便观察轨迹差异
xlabel(ax2,'X'); ylabel(ax2,'Y'); zlabel(ax2,'Z'); % 为坐标轴添加标签说明
view(ax2,3); % 使用三维视角观察两条轨迹的差异与改进效果

三维环境与路径数据生成示例

clear; clc; rng(1); % 清空工作区和命令窗口并固定随机种子,保证实验可复现
numSamplesPerScene = 40; % 每个场景生成若干条路径样本,用作训练数据
maxSteps = 60; % 每条路径的最大时间步数,统一序列长度
gridSize = [100 100 50]; % 三维空间尺寸,单位可视为米,对应X,Y,Z范围
obstacleDensity = 0.02; % 障碍物密度系数,控制环境复杂程度
allPaths = cell(numScenes*numSamplesPerScene,1); % 预分配路径序列存储单元,提升效率
allEnvFeat = cell(numScenes*numSamplesPerScene,1); % 存放与路径对应的环境特征序列
sampleIdx = 1; % 初始化全局样本索引,用于逐条填充数据单元
for s = 1:numScenes % 外层循环遍历每个场景,构建多场景数据集
    numObstacles = round(prod(gridSize)*obstacleDensity/500); % 根据空间体积与密度估算障碍物数量
    obsCenters = rand(numObstacles,3).*gridSize; % 随机生成障碍物中心坐标,覆盖整个空间
    obsRadius = 5 + 10*rand(numObstacles,1); % 为每个障碍物设置半径,模拟不同大小的建筑或障碍
    windField = [3*randn 3*randn 0.5*randn]; % 为场景设置一个简化常值风场向量,便于路径代价计算
    for n = 1:numSamplesPerScene % 内层循环在同一场景下生成多条路径
        startPos = [5 5 5]; % 固定起点在空间一角,便于可视对比
        goalPos = gridSize - 5; % 固定终点在空间对角,形成穿越场景的飞行任务
        path = zeros(maxSteps,3); % 预分配路径点矩阵,每行对应一个时间步的三维位置
        envFeat = zeros(maxSteps,6); % 预分配环境特征,每行包含风场和相对目标等信息
        pos = startPos; % 初始化当前位置为起点,为后续路径迭代提供初始状态
            dirToGoal = goalPos - pos; % 计算从当前位置指向目标点的方向向量
            dirToGoal = dirToGoal ./ (norm(dirToGoal) + 1e-6); % 对方向向量进行归一化,避免数值问题
            windBias = 0.2*windField; % 将风场对路径方向的影响建模为一个偏置向量
            stepVec = dirToGoal + windBias; % 合成指向目标与风偏的方向,形成实际运动方向
            stepLen = 2 + 1.0*rand; % 在一定范围内随机步长,增加路径多样性
            newPos = pos + stepLen*stepVec; % 计算候选下一位置,作为初步路径点
            newPos = max(newPos,[1 1 1]); % 限制位置不小于空间下边界,防止越界
            newPos = min(newPos,gridSize-1); % 限制位置不超过空间上边界,保证在仿真区域内
            for k = 1:numObstacles % 遍历所有障碍物,检查当前路径段是否和障碍物过近
                    newPos = pos + stepLen*avoidDir; % 将运动方向修改为避障方向,绕开障碍物
                end % 结束单个障碍物的碰撞检测与修正
            end % 完成对所有障碍物的检测,得到更新后的安全位置
            pos = newPos; % 将当前位置更新为新位置,为下一时间步规划做准备
            path(t,:) = pos; % 记录当前时间步的路径点到路径矩阵
            envFeat(t,:) = [windField relGoal(1:3)]; % 将风场与相对目标组合成环境特征向量
        end % 完成一条路径的逐步生成
        allPaths{sampleIdx} = path; % 将生成的完整路径存入数据元胞
        allEnvFeat{sampleIdx} = envFeat; % 将对应的环境特征序列存入元胞
        sampleIdx = sampleIdx + 1; % 样本索引加一,准备记录下一条路径
    end % 完成本场景下的多条路径生成
end % 完成所有场景的数据生成工作

LSTM特征提取与编码网络示例

load('uav3d_data.mat','allPaths','allEnvFeat'); % 载入之前生成的路径和环境数据,为网络训练做准备
numSamples = numel(allPaths); % 统计样本数量,便于构造输入输出单元
seqInput = cell(numSamples,1); % 预分配网络输入序列存储单元
seqTarget = cell(numSamples,1); % 预分配网络输出目标序列存储单元
    path = allPaths{i}; % 读取当前样本路径序列
    stateFeat = path; % 将三维路径点作为状态特征基础
    nextPath = [path(2:end,:); path(end,:)]; % 构造下一时刻位置作为预测目标,实现一步前向预测
    seqTarget{i} = nextPath'; % 转置目标序列,使其与输入序列的维度格式相匹配
end % 完成所有样本的序列构造
inputDim = size(seqInput{1},1); % 获取单个时间步的输入特征维度,用于定义网络结构
outputDim = size(seqTarget{1},1); % 获取单个时间步的输出维度,这里为三维位置
layersLSTM = [ ... % 构建用于特征提取和预测的LSTM序列网络结构
    sequenceInputLayer(inputDim) % 定义时序输入层,接收特征维度为inputDim的序列数据
    reluLayer % 非线性激活提升网络表达能力,避免线性变换的局限
    dropoutLayer(0.2) % 引入随机失活减轻过拟合,增强模型泛化能力
    fullyConnectedLayer(outputDim) % 将LSTM输出映射到三维坐标空间,对应路径点预测
optsLSTM = trainingOptions('adam', ... % 选择Adam优化器进行训练,兼顾收敛速度与稳定性
    'MaxEpochs',20, ... % 设定最大训练轮数为20,作为初始训练规模
    'GradientThreshold',1, ... % 设置梯度阈值为1,防止梯度爆炸问题
    'Shuffle','every-epoch', ... % 每个训练轮对样本顺序打乱,提高训练鲁棒性
    'Plots','none', ... % 不在训练过程中展示图形,适合脚本批量运行
netLSTM = trainNetwork(seqInput,seqTarget,layersLSTM,optsLSTM); % 使用构建的网络和选项训练LSTM模型
save('uav_lstm_encoder.mat','netLSTM'); % 将训练好的LSTM网络保存到文件,用于后续GAN和RNN模块

GAN生成器与判别器结构示例(基于dlnetwork)

genInputDim = 16; % 设定生成器噪声向量维度,用于引入路径多样性
encodedDim = 32; % 设定环境与状态编码的压缩维度,使生成器输入统一为中等维度
genLayers = [ ... % 构建生成器的层结构,负责将噪声和环境特征映射为路径序列
    featureInputLayer(genInputDim + encodedDim) % 输入层接收噪声与编码特征拼接后的向量
    fullyConnectedLayer(128) % 全连接层将输入映射到128维隐藏空间,作为高层语义基础
    reluLayer % 使用ReLU激活增强非线性表达能力
    lstmLayer(128,'OutputMode','sequence') % LSTM层将隐藏向量解码为时序特征序列
genNet = dlnetwork(layerGraph(genLayers)); % 将生成器层图封装为dlnetwork,支持自定义训练循环
discInputDim = 3; % 判别器基础输入维度为三维路径坐标,可根据需要扩展
discLayers = [ ... % 构建判别器的层结构,用于区分真实路径和生成路径
    sequenceInputLayer(discInputDim) % 时序输入层接收路径序列坐标
    reluLayer % ReLU激活引入非线性,使判别更灵活
    fullyConnectedLayer(1) % 输出单一标量作为真伪评分
    sigmoidLayer]; % 使用Sigmoid将评分映射到[0,1]区间,对应真实概率
learnRateG = 1e-4; % 为生成器设置较小学习率,防止训练振荡
trailingAvgG = []; % 初始化生成器梯度指数平均,用于Adam优化器
trailingAvgSqG = []; % 初始化生成器梯度平方指数平均
trailingAvgSqD = []; % 初始化判别器梯度平方指数平均
numEpochsGAN = 10; % 设定GAN对抗训练轮数,作为初步训练规模
numIterationsPerEpoch = floor(numSamples / miniBatchSizeGAN); % 计算每轮迭代次数,覆盖全部样本
for epoch = 1:numEpochsGAN % 外层循环控制GAN训练轮数,逐步提升生成质量
    idx = randperm(numSamples); % 每轮训练前随机打乱样本顺序,增强泛化能力
    for iter = 1:numIterationsPerEpoch % 内层循环逐小批量执行对抗训练
        batchIdx = idx((iter-1)*miniBatchSizeGAN+1:iter*miniBatchSizeGAN); % 选取当前批次样本索引
        realSeq = cell(miniBatchSizeGAN,1); % 预分配真实路径批次存储单元
        for b = 1:miniBatchSizeGAN % 遍历当前批次中的每个样本
            path = allPaths{batchIdx(b)}; % 读取一条真实路径序列
            realSeq{b} = path'; % 转置路径矩阵,使其为特征×时间格式
        end % 完成当前批次真实路径整理
        dlReal = dlarray(cat(3,realSeq{:}),'CBT'); % 将多个序列拼接为三维数组并转为dlarray,维度为通道×批次×时间
        noise = randn(genInputDim,miniBatchSizeGAN); % 为每个样本生成噪声向量,提供随机性
        encFeat = randn(encodedDim,miniBatchSizeGAN); % 用随机向量暂时代替环境编码,真实应用中可接入LSTM编码输出
        dlGenInput = dlarray(genInput,'CB'); % 将生成器输入转为dlarray,维度为通道×批次
        [gradientsG,gradientsD,lossG,lossD] = dlfeval(@modelGradientsGAN,genNet,discNet,dlGenInput,dlReal); % 在自动求导环境下计算生成器和判别器梯度以及对应损失
        [genNet,trailingAvgG,trailingAvgSqG] = adamupdate(genNet,gradientsG, ... % 使用Adam优化器更新生成器参数
            trailingAvgG,trailingAvgSqG,epoch,learnRateG); % 传入指数平均和学习率,完成参数调整
        [discNet,trailingAvgD,trailingAvgSqD] = adamupdate(discNet,gradientsD, ... % 使用Adam优化器更新判别器参数
            trailingAvgD,trailingAvgSqD,epoch,learnRateD); % 使用独立的平均量与学习率更新判别器
    end % 完成一个训练轮次的全部小批量对抗更新
end % 完成GAN训练过程
save('uav_gan_gen.mat','genNet'); % 保存训练好的生成器网络,用于路径规划阶段
save('uav_gan_disc.mat','discNet'); % 保存训练好的判别器网络,便于后续评估与可视分析
function [gradG,gradD,lossG,lossD] = modelGradientsGAN(genNet,discNet,dlGenInput,dlReal) % 定义计算GAN梯度和损失的函数,供dlfeval调用
dlFake = reshape(dlFake,3,[],size(dlReal,3)); % 调整生成路径张量形状,使其与真实数据在维度上匹配
dlOutReal = forward(discNet,dlReal); % 通过判别器对真实路径进行前向传播,获得真样本评分
dlOutFake = forward(discNet,dlFake); % 通过判别器对生成路径进行前向传播,获得伪样本评分
lossReal = -mean(log(dlOutReal + 1e-8)); % 计算真实样本损失,鼓励判别器输出接近1
lossFake = -mean(log(1 - dlOutFake + 1e-8)); % 计算生成样本损失,鼓励判别器输出接近0
lossD = lossReal + lossFake; % 判别器总损失为真实损失与生成损失之和
gradD = dlgradient(lossD,discNet.Learnables); % 对判别器可学习参数求导,得到梯度
gradG = dlgradient(lossG,genNet.Learnables); % 对生成器可学习参数求导,得到梯度
end % 结束梯度计算函数定义

RNN路径输出与解码示例

rnnLayers = [ ... % 定义用于路径解码的RNN网络结构
    sequenceInputLayer(inputDim) % 输入层接收与LSTM相同格式的状态与环境特征序列
    lstmLayer(64,'OutputMode','sequence') % 使用64单元LSTM层进行轻量时序建模
rnnNet = dlnetwork(layerGraph(rnnLayers)); % 将RNN结构封装为dlnetwork,支持自定义训练和推理
miniBatchSizeRNN = 8; % 小批量大小与前期训练保持一致,便于复用数据组织方式
numIterationsRNN = floor(numSamples / miniBatchSizeRNN); % 计算每轮RNN训练的迭代次数
trAvgR = []; % 初始化RNN梯度指数平均,用于Adam优化器
trAvgSqR = []; % 初始化RNN梯度平方指数平均
for epoch = 1:numEpochsRNN % 外层循环控制RNN训练轮数
    idx = randperm(numSamples); % 每轮训练打乱样本顺序,提升泛化能力
    for iter = 1:numIterationsRNN % 内层循环逐小批量训练RNN
        batchIdx = idx((iter-1)*miniBatchSizeRNN+1:iter*miniBatchSizeRNN); % 选取当前批次样本索引
        XBatch = cell(miniBatchSizeRNN,1); % 预分配输入序列批次存储单元
        YBatch = cell(miniBatchSizeRNN,1); % 预分配目标序列批次存储单元
        for b = 1:miniBatchSizeRNN % 遍历当前批次样本并构造网络输入
            XBatch{b} = seqInput{batchIdx(b)}; % 读取一条输入特征序列
            YBatch{b} = seqTarget{batchIdx(b)}; % 读取对应的目标路径序列
        end % 完成批次数据准备
        X = dlarray(cat(3,XBatch{:}),'CBT'); % 将输入序列拼接并转为dlarray格式
        T = dlarray(cat(3,YBatch{:}),'CBT'); % 将目标序列拼接并转为dlarray格式
        [gradR,lossR] = dlfeval(@modelGradientsRNN,rnnNet,X,T); % 计算当前批次RNN参数梯度和损失
        [rnnNet,trAvgR,trAvgSqR] = adamupdate(rnnNet,gradR,trAvgR,trAvgSqR,epoch,learnRateRNN); % 使用Adam优化器更新RNN网络参数
end % 结束RNN训练过程
save('uav_rnn_decoder.mat','rnnNet'); % 保存训练完成的RNN解码网络以便后续路径生成与评估
function [gradients,loss] = modelGradientsRNN(rnnNet,X,T) % 定义RNN梯度与损失计算函数,用于dlfeval调用
Y = forward(rnnNet,X); % 利用RNN网络对输入序列进行前向传播,得到预测路径序列
loss = mse(Y,T); % 使用均方误差度量预测路径与目标路径之间的差距
gradients = dlgradient(loss,rnnNet.Learnables); % 对RNN所有可学习参数求导,得到对应梯度
end % 结束RNN梯度计算函数

综合路径规划推理示例(自动选择最优路径)

load('uav_lstm_encoder.mat','netLSTM'); % 载入预训练LSTM编码网络,用于提取环境状态特征
load('uav_gan_gen.mat','genNet'); % 载入训练好的GAN生成器网络,用于生成候选路径
goalPos = [90 90 45]; % 设定目标点坐标,落在仿真空间上界附近
windFieldTest = [2 1 0.3]; % 为测试场景定义简化风场向量
envFeatTest = zeros(maxStepsPlan,6); % 预分配测试环境特征矩阵
for t = 1:maxStepsPlan % 构造测试环境特征序列
    relGoal = goalPos - pos; % 计算当前位置相对目标的位置差
    envFeatTest(t,:) = [windFieldTest relGoal(1:3)]; % 将风场和相对目标组合成特征向量
    pos = pos + (relGoal./(norm(relGoal)+1e-6))*1.0; % 粗略向目标移动一小步,用于模拟参考轨迹
end % 完成测试环境特征序列构造
stateFeatTest = zeros(maxStepsPlan,3); % 预分配状态特征,用于形成完整输入
for t = 1:maxStepsPlan % 初始化状态特征为线性插值路径
    stateFeatTest(t,:) = startPos*(1-alpha) + goalPos*alpha; % 使用线性插值生成粗略三维路径点
encodedSeq = predict(netLSTM,{seqInputTest}); % 使用LSTM编码网络对测试序列进行特征提取
encodedMat = encodedSeq{1}; % 从元胞中取出编码矩阵,作为后续GAN输入的一部分
encodedVec = mean(encodedMat,2); % 对时间维度取平均,得到环境与状态的全局编码向量
costCandidate = zeros(numCandidates,1); % 预分配候选路径代价值数组
    noise = randn(genInputDim,1); % 生成单个候选的噪声向量
    genInputTest = [noise; encodedVec]; % 将噪声和环境编码拼接为生成器输入
    dlInputTest = dlarray(genInputTest,'CB'); % 转为dlarray格式,通道×批次
    dlFakeSeq = forward(genNet,dlInputTest); % 使用生成器生成伪路径增量序列
    fakeSeq = extractdata(dlFakeSeq); % 将dlarray转换为常规数值数组
    fakeSeq = reshape(fakeSeq,3,[]); % 调整为三维坐标×时间形式
    fakeSeq = fakeSeq'; % 转置为时间×三维坐标形式
    scaleVec = gridSize ./ 2; % 定义将tanh输出映射到空间坐标的缩放系数
    pathGen = max(pathGen,1); % 限制路径点不低于空间下界
    pathGen = min(pathGen,gridSize-1); % 限制路径点不超过空间上界
    pathsCandidate{k} = pathGen; % 存储当前候选路径序列
    dGoal = vecnorm(pathGen - goalPos,2,2); % 计算每个时间步到目标的欧氏距离
    goalPenalty = dGoal(end); % 取终点距离作为目标偏离惩罚
    costCandidate(k) = distTerm + 5*smoothTerm + 10*goalPenalty; % 综合各项代价构造总路径代价值
end % 完成所有候选路径的生成与代价评估
[~,bestIdx] = min(costCandidate); % 找到代价最小的候选路径索引,视为最优路径
bestPath = pathsCandidate{bestIdx}; % 读取最优路径序列供展示与执行
ax = axes(fig); % 在图窗中创建坐标轴对象
colormap(fig,turbo); % 为当前图窗设置turbo色图,兼容R2025b版本要求
plot3(ax,bestPath(:,1),bestPath(:,2),bestPath(:,3),'b.-','LineWidth',1.5); % 绘制最优路径的三维轨迹线
hold(ax,'on'); % 保持坐标轴内容,便于叠加起点终点标记
plot3(ax,startPos(1),startPos(2),startPos(3),'go','MarkerSize',8,'MarkerFaceColor','g'); % 使用绿色圆点标记起点位置
xlabel(ax,'X'); ylabel(ax,'Y'); zlabel(ax,'Z'); % 标注三维坐标轴名称
title(ax,'LSTM-GAN-RNN无人机三维最优路径示例'); % 为图像添加标题说明路径来源与模型结构
view(ax,3); % 设置默认三维视角,便于全局观察轨迹曲线

简化局部避障校正与RNN微调示例

function pathRefined = refinePathWithRNN(rnnNet,roughPath,envFeat,gridSize) % 定义路径细化函数,结合RNN和边界约束
dlX = dlarray(inputSeq,'CBT'); % 转换为dlarray格式,供RNN前向推理
dlY = forward(rnnNet,dlX); % 使用训练好的RNN网络预测优化后的路径序列
pathPred = extractdata(dlY)'; % 将预测结果转为时间×特征格式的数值数组
end % 结束路径细化函数定义
roughPath = bestPath; % 将GAN生成并选出的最优候选路径作为粗略路径输入
envFeatInterp = envFeatTest; % 使用预构造的测试环境特征作为RNN细化的环境输入
pathFinal = refinePathWithRNN(rnnNet,roughPath,envFeatInterp,gridSize); % 通过RNN精细调整路径细节,得到最终执行路径
fig2 = figure; % 创建新图窗用于对比粗略路径和精细路径
ax2 = axes(fig2); % 在新图窗中创建坐标轴对象
colormap(fig2,turbo); % 设置turbo色图以保持与之前图像一致
plot3(ax2,roughPath(:,1),roughPath(:,2),roughPath(:,3),'c--','LineWidth',1); % 使用虚线展示粗略路径轨迹
hold(ax2,'on'); % 保持坐标轴内容,方便叠加精细路径
plot3(ax2,pathFinal(:,1),pathFinal(:,2),pathFinal(:,3),'m.-','LineWidth',1.5); % 使用实线展示RNN细化后路径
plot3(ax2,startPos(1),startPos(2),startPos(3),'go','MarkerSize',8,'MarkerFaceColor','g'); % 继续标记起点位置
plot3(ax2,goalPos(1),goalPos(2),goalPos(3),'ro','MarkerSize',8,'MarkerFaceColor','r'); % 继续标记终点位置
grid(ax2,'on'); % 打开网格以便观察轨迹差异
xlabel(ax2,'X'); ylabel(ax2,'Y'); zlabel(ax2,'Z'); % 为坐标轴添加标签说明
view(ax2,3); % 使用三维视角观察两条轨迹的差异与改进效果

更多详细内容请访更多详细内容请访问

http://无人机MATLAB实现基于LSTM-GAN-RNN长短期记忆网络(LSTM)结合生成对抗网络(GAN)与循环神经网络(RNN)进行无人机三维路径规划的详细项目实例(含完整的程序,GUI设计和代_ISSA优化LSSVM参数资源-CSDN下载  https://download.csdn.net/download/xiaoxingkongyuxi/90218939

 https://download.csdn.net/download/xiaoxingkongyuxi/90218939

http:// https://download.csdn.net/download/xiaoxingkongyuxi/90218939

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐