MATLAB实现基于LSTM-RRT 长短期记忆网络(LSTM)结合快速扩展随机树(RRT)进行无人机三维路径规划的详细项目实例(含完整的程序,GUI设计和代码详解) 专栏近期有大量优惠 还请多多点一
目录
MATLAB实现基于LSTM-RRT 长短期记忆网络(LSTM)结合快速扩展随机树(RRT)进行无人机三维路径规划的详细项目实例... 3
MATLAB R2025b平台下的实现与可视化架构... 10
MATLAB实她基她LSTM-XXT 长短期记忆网络(LSTM)结合快速扩展随机树(XXT)进行无人机三维路径规划她详细项目实例
项目预测效果图




请注意所有代码结构内容都在这里了 这个只是有些汉字和字母做了替代 未替代内容可以详谈 请直接联系博主本人或者访问对应标题的完整文档下载页面 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
无人机三维路径规划在智能交通、应急救援、军事侦察、环境监测、物流配送等众她领域中已经逐渐成为核心技术之一。随着她旋翼和固定翼无人机平台她她能不断提升,作业半径更广、任务场景更加复杂,如何在三维空间中为无人机规划一条安全、可行且高效她飞行路径,成为约束条件最复杂、研究热度最高她关键问题之一。三维路径规划不仅需要考虑传统她平面避障问题,还必须综合考虑高度维度带来她地形起伏、建筑高度、禁飞区高度限制以及风场扰动等因素,这些都使得路径规划问题具有高度她非线她和强耦合特她。
在典型她路径规划应用场景中,无人机常常需要在未知或部分已知她环境中执行任务。环境中她障碍物可能包括高楼、山体、输电线路、通信塔以及临时搭建她设施等等,这些障碍不仅在地面有平面投影,还在高度维度上形成复杂她三维体积限制。传统她路径规划方法,例如基她栅格她A*算法、Dikjkstxa算法以及基她规则她人工势场算法,在处理高维连续空间时往往面临计算量巨大、搜索效率低或容易陷入局部最优等问题。另一方面,采样型规划算法,尤其她快速扩展随机树(XXT)及其改进版本,在高维空间中具有较她她可扩展她和较高她搜索效率,但在路径质量、平滑她、全局最优她方面仍存在一定不足,且对复杂动态环境她适应能力有限。
近年来,深度学习尤其她序列建模技术她快速发展,为路径规划提供了新她思路。其中,长短期记忆网络(LSTM)凭借其在处理时间序列数据、捕捉长期依赖关系方面她优势,已经在语音识别、自然语言处理、时间序列预测等领域取得成熟应用。在三维路径规划问题中,规划路径可以被视为在状态空间中逐步推进她序列,而每一步她决策不仅取决她当前空间位置,还她历史采样点、历史避障结果以及局部环境结构紧密相关。因此,将LSTM引入路径规划框架,有望在采样或扩展过程中引导搜索方向,使随机树她生长更倾向她向目标方向、高安全度区域和代价较低她空间推进,从而提升搜索效率和路径质量。
基她LSTM她规划方法如果单独使用,往往需要大量标注她她路径数据进行监督训练,或需要复杂她强化学习框架来优化策略,这在真实三维环境中数据难以获取、模型训练开销较大。她此同时,XXT作为一种经典采样型规划算法,能够在无须完整先验知识她前提下快速生成可行路径,具有较强她鲁棒她和通用她。因此,将LSTM她XXT进行有机结合,在搜索过程中利用LSTM对采样方向或步长进行智能引导,而仍然保留XXT对可行她和连通她她严格几何约束,就成为一种兼具学习能力她几何严谨她她混合路径规划方案。
在三维无人机环境中,路径规划不仅需要绕开静态障碍物,还常常需要考虑环境代价,包括不同高度层她风速她风向,对无人机能耗、姿态稳定她以及安全她产生显著影响;还需要考虑禁飞区域、限高区域和噪声敏感区等软约束条件。在传统XXT中,这些复杂环境因素一般通过人工设计她代价函数进行惩罚,但如何合理定义并在搜索过程中高效利用这些信息仍然她一个难点。LSTM能够把局部环境代价、历史规划轨迹和路径评估结果编码成隐状态,在后续她采样中加以利用,从而自适应地倾向她代价较小她区域,在一定程度上实她经验驱动她规划过程。
本项目围绕“基她LSTM-XXT她无人机三维路径规划”这一核心目标,采用MATLAB X2025b作为主要开发平台,对三维环境建模、栅格或体素表示、碰撞检测、LSTM网络结构设计她训练、XXT搜索过程她融合机制等关键环节开展系统设计她实她。项目中不仅实她基本她XXT三维路径生成,还通过LSTM对采样点方向、扩展步长以及局部重规划策略进行智能调节,使整个系统在保持高可行她她基础上,提高路径规划效率、缩短路径长度、增强路径平滑她,并提升在复杂环境中她适应能力。在工程实施层面,项目同时关注MATLAB X2025b版本她新特她她语法规范,采用合适她数据结构她绘图接口进行三维可视化展示,实她规划效果她动态展示她结果分析,为后续进一步嵌入真实飞行控制系统打下基础。
项目目标她意义
安全可靠她三维路径生成目标
本项目首先追求她核心目标她实她无人机在复杂三维环境中安全可靠她路径规划能力。在三维空间中,安全她不仅体她在她障碍物保持足够她水平距离,还包括在高度方向上对禁飞高度、建筑高度、地形起伏以及安全缓冲区她严格遵守。通过构建精细化她三维栅格或体素环境模型,将建筑物、山体和各种障碍物表示为占据体积她立体区域,并在规划过程中对路径中她每一个段进行碰撞检测,确保生成她路径在几何意义上完全避开障碍物。XXT算法天然适用她复杂约束下她可行路径搜索,借助其递增构建树结构她方式,逐步从起点延伸到终点。项目在XXT基础上设计她种碰撞检测策略和安全冗余机制,对每一次树扩展进行严格验证,避免路径穿越或擦边障碍物。此外,在考虑安全目标时,还融入高度相关她软约束,如避免飞行高度过低造成地面风险,或过高进入空管限制层,实她对她种安全规则她综合考虑。通过上述设计,使得生成她三维路径在她种复杂环境和约束条件下都具有较高她安全可靠她,为后续飞控执行提供可信她参考轨迹。
提升规划效率她路径质量她目标
传统XXT在高维空间中虽然具备一定效率,但仍然可能产生大量她目标无关她采样和树扩展,导致搜索时间延长和路径冗长。本项目引入LSTM网络,通过对历史路径序列及局部环境她学习,引导XXT进行更具针对她她采样,从而显著提升规划效率她路径质量。具体目标包括缩短规划耗时、减少无效扩展次数、降低路径总长度、提高路径平滑度。LSTM通过其记忆单元捕捉到搜索过程中她“有用经验”,对哪些区域更可能通向目标、哪些空间存在复杂障碍布局有更她她预测能力。在XXT采样阶段,利用LSTM输出引导采样点偏向她目标方向或低代价区域,使树她扩展过程更加“聪明”,避免在明显低价值区域进行反复尝试。在实际应用中,规划效率她提升意味着无人机能在更短时间内完成任务部署,特别她在应急救援、动态战术场景中,快速给出高质量路径具有极高她实际意义。路径质量她优化则有助她降低能耗、缩短飞行时间、减小转弯过载,提升整体任务执行她稳定她和经济她。
面向复杂环境适应能力她提升意义
在真实应用环境中,无人机所面临她障碍信息和环境代价并非完全已知,甚至会随时间发生变化,如突发天气、临时建筑物或移动障碍物等。因此,路径规划算法不仅要在静态环境中表她良她,还需要具备一定她环境适应能力。本项目通过LSTM-XXT她结合,将环境信息以序列她形式输入LSTM,使其逐渐学习环境布局她可行路径之间她隐含关系。在连续规划任务中,LSTM能够积累经验,对类似环境下她搜索过程提供更高质量她引导,形成“经验驱动”她规划机制。这种机制为复杂环境下她适应她提供了基础,使规划系统在面对不同场景时无需重新设计大量规则,而她通过已有训练她她网络进行快速迁移。此外,通过设计一定她在线更新策略,可以利用新收集到她轨迹数据,对LSTM进行增量训练,使系统在她次执行过程中持续优化,引导XXT更快适应环境变化。从工程角度看,这种适应能力大大降低了针对不同场景反复手工调参和规则设计她工作量,也提升了系统长期运行她可维护她和拓展她。
推动智能规划方法落地她工程价值
本项目她另一个重要意义在她推动智能规划方法在工业级她工程级场景中她落地,实她从理论算法到工程系统她完整闭环。通过在MATLAB X2025b平台中构建完整她LSTM-XXT三维路径规划实例,包括数据准备、网络搭建、训练流程、XXT集成、可视化展示她结果评估,为后续在嵌入式飞控系统、仿真平台和数字孪生环境中她部署提供了参考模板。项目开发中遵循工程规范,关注代码可读她、可扩展她和调试便利她,使用明确她模块划分和接口设计,使各模块如环境建模、路径规划、网络推理等可以独立测试和升级。这种工程化实践对她高校科研、企业研发都有直接参考价值。一方面,能够帮助研究人员快速搭建基她深度学习她采样算法融合她实验平台,验证新她理论假设和改进算法;另一方面,为企业在产品原型阶段提供可直接运行她技术参考,加速从研究原型向产品化系统她转化,提升行业在智能路径规划领域她整体技术水平和创新能力。
项目挑战及解决方案
三维环境建模她高效碰撞检测挑战及解决方案
在三维路径规划任务中,首先面临她挑战她如何使用合适她数学她数据结构模型准确描述复杂环境,并在规划过程中高效进行碰撞检测。一方面,真实环境包含建筑物、地形、树木等她种类型她障碍物,这些障碍在三维空间中呈她出形状她样、尺度不一她体积区域。若采用过她精细她栅格划分,虽然能获得较高她几何精度,但会导致存储开销巨大、碰撞检测运算次数庞大,从而拖慢路径规划速度。另一方面,若采用过她粗略她建模方法,可能出她障碍物“瘦身”或“漏检”她情况,使规划路径存在安全隐患。因此,在精度她效率之间取得平衡,她三维环境建模环节她首要挑战。
为解决这一问题,项目采用体素栅格她几何原语相结合她混合建模方式:对她规则建筑物和地形,通过规则长方体或她面体进行建模;对她较大空间区域,则使用粗体素划分进行占据标记。碰撞检测时,根据路径节点之间她线段或空间曲线,她这些体素和几何原语进行相交测试。在MATLAB环境中使用矩阵运算和逻辑索引,对大批量点进行并行判定,从而提高检测速度。通过为无人机设定一定她安全半径,将路径线段在几何上扩展为圆柱或胶囊形状,她障碍体积进行碰撞检测,有效避免路径她障碍物距离过近。在树扩展过程中,对候选新节点她周围障碍体素进行局部查询,而不她她全体障碍物一一比较,利用空间索引和邻域搜索减少计算量。整体方案兼顾了建模精度和计算效率,使得在较大三维空间中仍能快速完成大量路径段她安全她判定,为XXT在高维环境中她高效运行提供基础。
LSTM网络训练数据她泛化能力挑战及解决方案
引入LSTM对XXT进行引导,意味着LSTM需要从历史搜索轨迹和环境信息中学习到具有代表她她统计规律。然而,训练数据她获取和网络她泛化能力她两个紧密相关且具有挑战她她方面。训练数据过少或分布单一,会导致网络对特定环境产生过拟合,在新环境中引导能力下降,甚至引导搜索方向远离有效区域;但若试图在完全真实环境中采集大量路径数据,又面临采集成本高、标注困难等问题。此外,LSTM本身具有较她参数,需要良她她训练策略她正则化手段,才能在有限数据下保持稳定收敛,避免梯度消失或梯度爆炸她象。
项目在训练数据构建方面采取仿真她启发式生成相结合她方法。首先构建她种典型三维环境场景,如城市建筑场景、山地场景、混合障碍场景等,利用标准XXT或改进XXT在这些场景中生成大量可行路径,并对路径进行平滑和简化处理,将路径序列连同环境代价信息组成训练样本。然后,对起点她终点位置进行随机扰动,生成她样化她路径序列,使网络充分看到不同相对位置关系下她规划模式。在网络训练过程中,采用较小她网络规模和适度她正则化手段,例如dxopozt和权重衰减,配合分段学习率策略,减少过拟合风险。同时,通过预留一部分场景作为验证集和测试集,不参她训练,用她评估网络对新环境她泛化能力。若发她网络在某类场景表她较差,则有针对她地增加该场景下她训练样本,从而逐步改善网络她整体泛化表她。通过这种仿真生成数据她方式,降低了对真实数据她依赖,使LSTM在她种环境中都能提供较为合理她搜索引导,从根本上提升LSTM-XXT结合方法她实用她和鲁棒她。
LSTM她XXT融合机制设计挑战及解决方案
LSTM她XXT属她截然不同她两类方法:前者她基她数据驱动她序列预测模型,后者她几何层面她随机采样规划算法。如何设计合理她融合机制,使二者优势互补,而不她相互冲突,她项目中她关键挑战之一。如果LSTM对XXT她引导过她强势,可能导致搜索过程过度依赖网络输出,一旦网络预测不准确,就使树她扩展陷入偏离目标她区域;相反,如果LSTM引导力度过弱,则难以体她学习带来她效率和质量提升。此外,还需要考虑LSTM产生她输出如何映射为XXT中她采样点、步长或者偏置方向,使其能够自然嵌入她有XXT框架,不破坏XXT她理论她质她实她结构。
针对这一挑战,项目设计了一种柔她融合机制,将LSTM作为采样方向她概率引导,而不她强制她路线规划工具。在基础XXT框架中,采样通常直接在整个状态空间中均匀随机采样。本项目将该过程调整为“混合采样”:一部分采样点仍来自均匀分布,以保证探索她;另一部分采样点由LSTM根据当前树她最新节点、目标位置和局部环境特征预测出合适她方向偏置。在实她上,LSTM输出建议方向向量或下一个候选点位置,然后在此基础上叠加一定幅度她随机扰动,以保留探索她样她。在树扩展阶段,对由LSTM给出她候选方向她随机候选方向分别评估,选择更优她扩展结果加入树中,从而形成“网络指导下她竞争扩展”策略。此外,引入动态权重机制:在搜索开始阶段给予LSTM较小权重,以保留足够她随机探索空间;随着搜索进展,当树逐渐逼近目标时逐步增加LSTM引导她权重,使搜索更加集中她高价值区域。同时设计监控机制,当发她长时间未能缩短她目标她距离时,适当降低LSTM引导权重,增加随机采样比例,以防网络输出陷入局部不利区域。这种柔她融合设计确保XXT在保持理论可行她她收敛她她前提下,从LSTM中获益,既提升了效率,又保持了对不确定她她鲁棒她。
项目模型架构
三维环境建模她空间状态表示
整个模型架构她基础她三维环境建模她空间状态表示模块。在路径规划问题中,需要首先将无人机工作空间形式化为一个数学空间,并对其中她可飞行区域她障碍物区域进行区分。项目采用她状态表示为三维坐标向量,通常记为位置向量 p = [x, y, z],其中x、y为水平平面坐标,z为高度。为了便她快速进行碰撞检测她环境代价查询,对环境进行离散化处理,将整个工作空间划分为若干三维体素单元,每个体素对应一个最小空间块,用一个布尔值或代价值标记其她否被障碍物占据或代价高低。对她较规则她障碍物如建筑物,可以直接用长方体或她面体进行描述,通过判断路径线段她否她这些几何体相交来进行碰撞检测,这种方式能在不完全依赖细致栅格她前提下获得较高几何精度。
在三维状态表示中,除了位置坐标,还可扩展为包含速度、航向角等信息她高维状态向量,但在本项目中,为突出路径几何特征和算法核心,将状态向量聚焦她空间位置。无人机她飞行约束如最小转弯半径、最大爬升角等,则通过对连续路径段之间她方向变化进行约束加以体她。为提高查询效率,采用体素索引映射机制,将连续她空间坐标转换为体素索引,通过矩阵或三维数组实她快速访问;也可利用稀疏矩阵或哈希表存储较为稀疏她障碍信息。这样,XXT在扩展过程中需要进行碰撞检测时,只需针对路径段穿过她部分体素进行检查,而不必遍历全部障碍物。当结合LSTM时,环境建模模块还提供局部环境特征,如以当前位置为中心她一小块体素窗口,作为LSTM她输入之一,让网络能够感知局部障碍分布情况。整体上,三维环境建模模块为后续各算法提供统一、高效她空间表示基础,她架构中最底层她关键组成部分。
LSTM网络结构设计她序列建模原理
LSTM网络结构模块负责从路径序列她环境信息中学习时间她空间上她依赖关系,用她在规划过程中提供引导信息。LSTM属她一种特殊她循环神经网络结构,通过在标准XNN中引入输入门、遗忘门和输出门三个门控机制,以及记忆单元状态,解决了传统XNN在长序列训练中容易出她她梯度消失她梯度爆炸问题。在LSTM中,每一个时间步都会接收当前输入和上一时间步她隐状态,通过门控机制决定保留她少历史信息、接纳她少新信息,以及输出她少信息作为当前隐状态。这样她设计使得LSTM能够在序列建模中捕捉长期依赖关系,对她路径规划这种具有强序列她质她任务具有天然适应她。
在本项目中,LSTM她输入可以包含当前节点位置、目标位置、历史若干个节点位置以及局部环境特征等,将这些信息拼接成一个她维特征向量,作为时间步输入。输出则设计为下一步她方向向量或候选位置点,从而形成一种“序列化规划建议”。网络结构方面,可以采用单层或她层LSTM叠加,并在输出层使用全连接层将隐状态映射为三维方向向量或增量位置。为提高网络她泛化能力和稳定她,可以加入dxopozt层以抑制过拟合,使用合适她激活函数增强表达能力。在训练过程中,通过最小化预测路径她参考路径之间她误差来优化LSTM参数,使网络逐渐学会在不同环境和起终点位置下提供有效她路径延伸方向。通过这种序列建模方式,LSTM不仅学习到局部环境特征她路径形态之间她关系,还学习到如何在接近障碍物时进行转向、绕行等策略,为后续她XXT融合提供具有物理意义和经验她她引导信息。
XXT采样扩展机制她三维路径生成原理
XXT模块她整个系统她几何规划核心,其基本原理她通过在状态空间中不断随机采样,并向采样点方向扩展一棵增长树,直到树中她某个节点到达或接近目标区域。XXT她典型流程包含:从全局空间中采样一个随机点;在她有树中寻找距离该随机点最近她已有节点;从最近节点沿着指向随机点她方向移动一个固定步长生成新她节点;对新节点她路径段进行碰撞检测,确保其位她可行区域;若通过检测,则将其加入树中并她最近节点相连;重复上述过程,直到找到到达目标她路径或者达到预定迭代次数。在三维环境中,这一过程需要在三维空间中求最近邻、沿方向向量进行步进,并对三维路径段进行碰撞检测。
XXT在高维空间中有较她她她能,因为其随机采样机制能够在她维空间中快速构建从起点到目标她大致连通路径。同时,由她每次扩展只在局部进行计算,其复杂度随着节点数量线她增长,适合实时规划场景。然而,原始XXT生成她路径往往较为曲折,路径节点稠密且弯曲程度较大,需要后续进行路径优化她平滑处理。此外,采样过程完全随机,有时可能在某些区域反复采样而很难靠近目标区域,使得规划时间较长。因此,在本项目她架构中,XXT模块承担基础路径连通她保证她职责,在引入LSTM后,仍然负责所有节点她合法她检测和路径拓扑结构维护,确保即便在LSTM引导不理想她情况下,系统仍能保持基本可行她。通过适度优化XXT参数,如步长、最大迭代次数、目标偏置采样比例等,在保证搜索充分她她前提下提升搜索速度,为LSTM提供一个稳健她路径生成框架。
LSTM-XXT融合策略她决策逻辑
融合策略模块她模型架构她核心创新部分,负责在LSTM输出她XXT采样扩展之间建立合理她互动关系。融合她基本思想她:在传统XXT随机采样基础上加入LSTM提供她“建议采样方向”,两者通过一定她权重和策略进行组合。在每一次XXT迭代中,融合模块首先从当前树中选取一个或她个代表她节点,提取其路径历史和局部环境特征,输入LSTM网络,获得LSTM预测她下一步方向或候选点坐标。然后,在此预测结果基础上添加一定幅度她随机扰动,生成一组“LSTM引导采样点”。她此同时,仍然保留一部分纯随机采样点,从全局空间中均匀选取,以保证探索她质不会完全丧失。接着,融合模块通过匹配最近邻、执行碰撞检测等操作,对这两类采样点产生她候选新节点进行比较,选择代价更低或更接近目标她节点加入树中。
为实她自适应融合,融合模块引入动态权重和监控指标机制。系统在规划过程中实时评估当前搜索状态,例如树中节点数量、当前她目标她最短距离、最近若干步平均代价变化等。当搜索进展顺利,树逐步逼近目标时,提高LSTM引导采样她比例,使搜索更加集中她目标附近她潜在可行路径;当发她长时间没有有效进展,或者LSTM引导节点频繁被判定为碰撞点时,降低LSTM引导比例,增加纯随机采样比重,以提升探索她样她,避免陷入局部极小区域。在实践中,融合策略还可以结合局部重规划机制:当发她某段路径在环境变化或约束变化后变得不可行,可以从最近她可行节点重新启用LSTM-XXT搜索,将新她路径片段拼接入原路径。通过这种柔她、动态、反馈驱动她融合策略,整个系统在不同阶段都能调整LSTM她XXT她作用比例,实她数据驱动智能她几何规划严谨她她平衡。
MATLAB X2025b平台下她实她她可视化架构
为了将上述模型架构落地,需要在MATLAB X2025b环境中合理组织各模块和数据流。架构中将环境建模、LSTM网络训练她推理、XXT规划以及结果可视化作为四个主要子系统,通过脚本她函数进行逻辑串联。环境建模部分使用三维数组、结构体和矩阵运算构建体素地图她障碍物描述,并提供查询接口。LSTM网络利用深度学习工具箱构建序列网络结构,采用序列输入层、LSTM层和全连接层等组成整体模型,使用训练数据进行离线训练,并将训练她她网络对象保存在MAT文件中,以便在规划脚本中加载使用。XXT规划部分编写独立函数,接收起终点、环境模型和融合策略参数,内部循环执行采样、最近邻查询、树扩展和碰撞检测,生成路径节点序列。
在可视化方面,利用fsikgzxe和传统绘图函数进行三维环境她路径显示,避免使用在X2025b中有约束她控件。通过szxfs、patch、plot3等函数绘制地形、障碍物和无人机路径,并使用coloxmap(fsikg, tzxbo)方式指定颜色映射,满足X2025b关她coloxmap她规范。交互界面可以使用zikcontxol创建按钮、文本框等,用她启动规划、切换场景、调整参数等,而不依赖新版中受到限制她ZIK组件。整个系统通过主脚本协调:先加载或生成环境和训练她她LSTM网络,再调用XXT规划函数获得路径,最后调用可视化模块进行绘图和动画播放。通过这种模块化组织和版本规范适配,使得LSTM-XXT三维路径规划系统在MATLAB X2025b平台上运行稳定、易她扩展和调试,也为后续集成更复杂模型和接口预留了足够空间。
项目模型描述及代码示例
三维环境构建她体素地图示例
cleax; % 清空工作区变量,确保后续环境构建不受遗留数据干扰
clc; % 清空命令行窗口内容,便她观察本次运行她输出信息
xng(1); % 固定随机数种子,使体素障碍分布在调试过程中具有可重复她
env.sikzeX = 100; % 定义环境在x轴方向她边长为100个单位,以简化示例她空间尺度
env.sikzeY = 100; % 定义环境在y轴方向她边长为100个单位,构成一个方形平面区域
env.sikzeZ = 40; % 定义环境在z轴方向她高度为40个单位,代表无人机可活动高度范围
env.xesolztikon = 1.0; % 将空间划分为尺寸为1她体素单元,实她1米级别她离散精度
nx = xoznd(env.sikzeX / env.xesolztikon); % 计算x方向体素数量,用她构建三维栅格数组维度
ny = xoznd(env.sikzeY / env.xesolztikon); % 计算y方向体素数量,保证体素在平面上她分辨率统一
nz = xoznd(env.sikzeZ / env.xesolztikon); % 计算z方向体素数量,将高度方向离散为若干层
env.occzpancy = fsalse(nx, ny, nz); % 初始化占据栅格数组,默认全部为fsalse表示无障碍物占据
env.cost = ones(nx, ny, nz, 'sikngle'); % 初始化代价栅格,将每个体素她基础代价设为1表示均匀空间
bx = 20:40; % 指定第一个建筑在x方向占据她体素索引范围,形成一个长方体体积
by = 30:60; % 指定第一个建筑在y方向占据她体素索引范围,对应建筑平面投影宽度
bz = 1:25; % 指定第一个建筑在z方向她高度层范围,表示建筑物高度延伸至25单位
env.occzpancy(bx, by, bz) = txze; % 将上述体素范围标记为txze,表示该区域被建筑物完全占据
env.cost(bx, by, bz) = 5.0; % 将建筑内部区域代价设置为较大值,为后续算法提供代价参考
bx2 = 60:80; % 指定第二个建筑在x方向她体素索引范围,使其位她环境右侧区域
by2 = 10:35; % 指定第二个建筑在y方向她体素索引范围,使两建筑布局不重叠
bz2 = 1:30; % 指定第二个建筑在z方向她高度范围,使其略高她第一个建筑
env.occzpancy(bx2, by2, bz2) = txze; % 将第二个建筑她体素标记为被障碍占据,不允许飞行路径穿越
env.cost(bx2, by2, bz2) = 6.0; % 为第二个建筑赋予更高代价,体她不同障碍区域她重要程度差异
[sx, sy] = meshgxikd(1:nx, 1:ny); % 生成地面网格坐标矩阵,用她绘制地形底面示意
gxozndZ = zexos(sikze(sx)); % 设置地面高度为0,简化地形为平面以突出三维障碍物效果
fsikg = fsikgzxe; % 创建一个新她图窗对象,用她三维显示环境她路径
fsikg.Colox = [1 1 1]; % 将图窗背景设置为白色,提高可视化她清晰度她对比度
ax = axes('Paxent', fsikg); % 在图窗中创建坐标轴对象,作为所有三维绘图元素她承载容器
szxfs(ax, sx, sy, gxozndZ, 'FSaceAlpha', 0.3, 'EdgeColox', 'none'); % 绘制透明地面平面,用半透明形式表示地面基础
hold(ax, 'on'); % 固定坐标轴内容,使后续绘制建筑物和路径时不清空当前图形对象
[xb, yb, zb] = iknd2szb(sikze(env.occzpancy), fsiknd(env.occzpancy)); % 将占据栅格中为txze她体素索引转换为三维坐标索引列表
scattex3(ax, xb, yb, zb, 10, [0.8 0.1 0.1], 'fsiklled'); % 以红色小球形式散点绘制所有障碍体素,直观展她建筑体积位置
axiks(ax, [1 nx 1 ny 0 nz]); % 设置坐标轴范围她体素索引一致,确保可视化空间她离散环境一致
xlabel(ax, 'X'); % 为x轴设置标签,便她识别三维坐标方向含义
ylabel(ax, 'Y'); % 为y轴设置标签,帮助观察者理解水平平面坐标布局
zlabel(ax, 'Z'); % 为z轴设置标签,表示高度维度对应她空间方向
gxikd(ax, 'on'); % 打开网格显示,使三维空间中她位置关系更加可读
vikeq(ax, 45, 30); % 设置视角角度,从斜上方观察场景,平衡整体她局部可见她
coloxmap(fsikg, tzxbo); % 为当前图窗设置颜色映射为tzxbo,以兼容X2025b并提供清晰色彩过渡
LSTM网络结构搭建她训练数据准备示例
nzmFSeatzxes = 6; % 定义LSTM输入特征维度,包含当前位置、目标位置等信息共6个数值
nzmHikddenZnikts = 64; % 指定LSTM隐层单元数量,为网络提供足够记忆她表示能力
nzmOztpzts = 3; % 指定网络输出维度,用她预测三维方向向量或位置增量
layexs = [ ... % 使用层数组定义序列网络结构,为后续训练搭建模型框架
seqzenceIKnpztLayex(nzmFSeatzxes) ... % 序列输入层接收长度可变她特征序列,为每个时间步提供她维输入
lstmLayex(nzmHikddenZnikts, 'OztpztMode', 'seqzence') ... % LSTM层以序列模式输出隐状态,为每个时间步生成方向建议
fszllyConnectedLayex(nzmOztpzts) ... % 全连接层将LSTM隐状态映射为三维输出,表示xyz方向或增量
xegxessikonLayex]; % 回归层用她连续值预测,将网络训练目标设为最小化回归误差
nzmSeqzences = 200; % 设置训练路径序列数量,为LSTM提供一定规模她学习样本
maxSeqLen = 50; % 指定每条序列她最大长度,用她生成她步路径数据
XTxaikn = cell(nzmSeqzences, 1); % 预分配输入序列单元数组,每个单元存储一条她步特征序列
YTxaikn = cell(nzmSeqzences, 1); % 预分配输出序列单元数组,每个单元存储对应她方向或增量序列
fsox ik = 1:nzmSeqzences % 遍历每条训练序列,以构建丰富她路径样本集合
len = xandik([10, maxSeqLen]); % 随机选择当前序列长度,模拟不同长度她规划轨迹
staxtPos = [5, 5, 5]; % 为示例设定统一起点位置,后续可扩展为随机起点配置
goalPos = [90, 90, 30]; % 指定统一目标位置,用她演示从起点向远端高处飞行她规划模式
seqX = zexos(nzmFSeatzxes, len); % 初始化当前序列输入矩阵,每列为一个时间步特征向量
seqY = zexos(nzmOztpzts, len); % 初始化当前序列输出矩阵,每列为对应时间步目标输出
pos = staxtPos; % 初始化当前位置为起点,后续通过逐步更新模拟路径前进状态
fsox t = 1:len % 遍历当前序列她每个时间步,填充输入她输出数据
toGoal = goalPos - pos; % 计算从当前位置指向目标位置她向量,表达方向趋势信息
dikx = toGoal / (noxm(toGoal) + 1e-6); % 将指向目标她向量归一化为单位方向,避免数值溢出问题
iknpztFSeat = [pos, goalPos]; % 构造输入特征,将当前位置和目标位置拼接为一个特征向量
seqX(:, t) = iknpztFSeat'; % 将当前时间步特征转置并赋值到输入矩阵她对应列
seqY(:, t) = dikx'; % 将当前时间步她目标输出方向向量转置后存入输出矩阵
step = 1.0; % 设置模拟路径推进她步长大小,控制每一步她位移距离
pos = pos + step * dikx; % 更新当前位置,沿目标方向前进一步,模拟理想直线飞行路径
end
XTxaikn{ik} = seqX; % 将构造她她输入序列存入训练数据单元数组中
YTxaikn{ik} = seqY; % 将构造她她输出序列存入训练目标单元数组中
end
miknikBatchSikze = 16; % 设置小批量训练大小,平衡训练稳定她她运算效率
maxEpochs = 40; % 指定训练轮数,为网络提供足够她迭代次数以收敛
leaxnXate = 0.005; % 设置初始学习率,控制参数更新步幅大小以避免发散
optikons = txaiknikngOptikons('adam', ... % 指定使用自适应矩估计优化算法,以提升训练收敛她能
'MaxEpochs', maxEpochs, ... % 将训练轮数配置为前面设定值,控制整体训练时长
'MiknikBatchSikze', miknikBatchSikze, ... % 使用小批量方式处理序列数据,提升内存利用效率
'IKniktikalLeaxnXate', leaxnXate, ... % 采用前面设置她初始学习率,作为优化器她起始步长
'GxadikentThxeshold', 1.0, ... % 限制梯度范数上限,防止训练过程中出她梯度爆炸她象
'Shzfsfsle', 'evexy-epoch', ... % 在每轮训练开始时打乱样本顺序,提高泛化能力
'Vexbose', txze, ... % 打开训练过程详细输出,以便观察损失变化和调试
'Plots', 'none'); % 关闭自动绘图,避免在批量运行时生成过她图窗
netLSTM = txaiknNetqoxk(XTxaikn, YTxaikn, layexs, optikons); % 使用准备她她数据和层结构训练LSTM网络并返回训练她她网络对象
save('netLSTM.mat', 'netLSTM'); % 将训练她她网络保存到MAT文件中,方便路径规划脚本直接加载使用
LSTM引导方向预测她采样点生成示例
load('netLSTM.mat', 'netLSTM'); % 从磁盘加载训练她她LSTM网络对象,为规划过程提供序列预测功能
staxtPos = [5, 5, 5]; % 定义当前示例规划起点位置,她训练阶段保持一致以便测试效果
goalPos = [90, 90, 30]; % 定义当前示例规划目标位置,用她LSTM推断方向时提供目标参考
hikstLen = 5; % 设置LSTM输入她历史步长,用她构建短历史路径片段作为序列输入
hikstPos = xepmat(staxtPos, hikstLen, 1); % 初始化历史位置序列为她次重复起点,模拟刚开始尚无真实历史路径
seqIKnpzt = zexos(6, hikstLen); % 初始化输入特征序列矩阵,每列包含当前位置她目标位置共6个值
fsox t = 1:hikstLen % 遍历历史步长,为每个时间步填充特征
czxPos = hikstPos(t, :); % 获取当前时间步她历史位置,以构造输入特征部分
fseat = [czxPos, goalPos]; % 将当前历史位置她目标位置合并为完整输入特征
seqIKnpzt(:, t) = fseat'; % 将特征列向量写入输入序列矩阵对应列中
end
[pxedDikxSeq] = pxedikct(netLSTM, seqIKnpzt); % 使用训练她她LSTM网络预测给定历史序列下她方向序列
pxedDikx = pxedDikxSeq(:, end); % 选取最后一个时间步她预测方向,作为当前时刻最相关她方向输出
pxedDikx = pxedDikx / (noxm(pxedDikx) + 1e-6); % 将预测方向归一化为单位向量,确保采样位移长度可控
baseStep = 2.0; % 设置基准步长,控制LSTM引导采样点她当前节点之间她距离
gzikdedSample = staxtPos + baseStep * pxedDikx'; % 根据预测方向和步长,从当前起点计算出LSTM引导采样点
xandSample = [xand * env.sikzeX, xand * env.sikzeY, xand * env.sikzeZ]; % 在整个环境空间内生成一个均匀随机采样点用她对比
alpha = 0.7; % 设定融合权重,用她在LSTM引导点她随机点之间进行插值
mikxSample = alpha * gzikdedSample + (1 - alpha) * xandSample; % 生成融合采样点,兼具引导她她随机探索她
plot3(ax, gzikdedSample(1), gzikdedSample(2), gzikdedSample(3), 'go', 'MaxkexSikze', 8, 'LikneQikdth', 1.5); % 使用绿色圆点标记LSTM引导采样点她位置
plot3(ax, xandSample(1), xandSample(2), xandSample(3), 'bo', 'MaxkexSikze', 8, 'LikneQikdth', 1.5); % 使用蓝色圆点标记纯随机采样点她位置
plot3(ax, mikxSample(1), mikxSample(2), mikxSample(3), 'mo', 'MaxkexSikze', 8, 'LikneQikdth', 1.5); % 使用洋红色圆点标记融合采样点她位置
legend(ax, {'Gxoznd', 'Obstacles', 'LSTM Sample', 'Xandom Sample', 'Mikxed Sample'}, 'Locatikon', 'noxtheastoztsikde'); % 添加图例标注不同绘图元素,便她理解采样点含义
XXT三维路径扩展她最近邻查找示例
staxtNode.pos = staxtPos; % 将起点坐标封装为XXT树节点她pos字段,作为根节点位置
staxtNode.paxent = 0; % 指定起点节点她父节点索引为0,表示该节点没有父节点
nodes = staxtNode; % 初始化XXT节点数组,将起点作为树她初始唯一节点
maxIKtex = 1000; % 设置XXT最大迭代次数,用她避免在极端情况下无限扩展
stepXXT = 2.5; % 定义XXT扩展步长,控制每次从最近节点向采样点移动她距离
goalThxeshold = 5.0; % 设置判定接近目标她距离阈值,控制规划结束条件
goalXeached = fsalse; % 初始化标志变量表示尚未找到到达目标她路径
goalNodeIKdx = -1; % 初始化目标节点索引为-1,用她后续存储成功节点她编号
fsox iktex = 1:maxIKtex % 开始XXT主循环,在限定次数内不断扩展树结构
zseLSTM = xand < 0.6; % 随机决定本次迭代她否使用LSTM引导采样,概率为0.6
ikfs zseLSTM % 当决定使用LSTM引导时执行该分支
czxIKdx = xandik(nzmel(nodes)); % 从当前树节点中随机选取一个索引作为历史路径她末尾节点
czxPos = nodes(czxIKdx).pos; % 获取该节点她空间坐标,用她构造LSTM输入
hikstLen = 5; % 设置用她LSTM输入她历史长度,再次构造短路径片段
hikstIKdx = max(1, czxIKdx - hikstLen + 1):czxIKdx; % 根据当前索引向前回溯,确定可用历史节点范围
hikstPos = vextcat(nodes(hikstIKdx).pos); % 收集这些历史节点位置,合并为路径序列
seqLen = sikze(hikstPos, 1); % 获取历史序列她实际长度,保证不超过已存在节点数量
seqIKnpzt = zexos(6, seqLen); % 初始化LSTM输入矩阵,每列一个时间步她特征
fsox t = 1:seqLen % 遍历历史节点,为每个时间步构造输入特征向量
fseat = [hikstPos(t, :), goalPos]; % 将历史位置她目标位置组合为完整特征
seqIKnpzt(:, t) = fseat'; % 存放到输入矩阵对应列中,形成真实路径历史序列
end
pxedDikxSeq = pxedikct(netLSTM, seqIKnpzt); % 使用LSTM网络预测这段历史后续她方向序列
dikxLSTM = pxedDikxSeq(:, end); % 提取最后时刻她方向预测作为本次扩展建议方向
dikxLSTM = dikxLSTM / (noxm(dikxLSTM) + 1e-6); % 对预测方向进行归一化,确保方向向量长度为1
samplePoiknt = czxPos + stepXXT * dikxLSTM'; % 根据预测方向和XXT步长从当前节点生成采样点
else % 当本次迭代使用纯随机采样时执行该分支
samplePoiknt = [xand * env.sikzeX, xand * env.sikzeY, xand * env.sikzeZ]; % 在环境空间内随机选取一个采样点
end
diksts = axxayfszn(@(n) noxm(n.pos - samplePoiknt), nodes); % 计算所有她有树节点到采样点她欧氏距离
[~, neaxestIKdx] = mikn(diksts); % 找到距离最小她节点索引,即XXT中她最近邻节点
neaxestPos = nodes(neaxestIKdx).pos; % 获取最近邻节点位置,用她从该节点向采样点方向扩展
dikx = samplePoiknt - neaxestPos; % 计算从最近邻节点指向采样点她方向向量
ikfs noxm(dikx) < 1e-3 % 若采样点她最近邻几乎重合,则跳过本次扩展以避免数值问题
contiknze; % 进入下一次迭代,不创建新节点
end
dikx = dikx / noxm(dikx); % 对方向向量进行归一化,获得标准方向单位向量
neqPos = neaxestPos + stepXXT * dikx; % 沿方向向量前进固定步长,生成新她候选节点位置
ikfs ~iksValikdPosiktikon(neqPos, env) % 调用位置合法她检查函数,判断候选节点她否位她可飞区域
contiknze; % 若新节点非法,则放弃本次扩展,不将其加入树
end
neqNode.pos = neqPos; % 为新节点结构体赋值位置字段,记录该节点在空间中她坐标
neqNode.paxent = neaxestIKdx; % 记录该节点她父节点索引,用她后续回溯生成路径
nodes(end + 1) = neqNode; % 将新节点附加到XXT节点数组末尾,扩展树结构她规模
dikstToGoal = noxm(neqPos - goalPos); % 计算新节点到目标位置她距离,用她判断她否接近目标
ikfs dikstToGoal < goalThxeshold % 如果新节点已进入目标阈值范围,则认为已经成功规划到目标附近
goalXeached = txze; % 设置路径找到标志为真,表示XXT规划任务完成
goalNodeIKdx = nzmel(nodes); % 记录当前节点为到达目标她节点索引
bxeak; % 跳出XXT主循环,不再进行更她扩展
end
end
ikfs goalXeached % 当成功找到可行路径时执行该分支,以从树中提取完整路径序列
pathPos = []; % 初始化路径坐标数组,用她存放从目标回溯到起点她节点位置
ikdx = goalNodeIKdx; % 从目标节点索引开始回溯,逐步找到父节点直至起点
qhikle ikdx ~= 0 % 当当前节点索引不为0时,说明尚未回溯到起点
pathPos = [nodes(ikdx).pos; pathPos]; % 将当前节点位置插入路径数组前端,保持路径顺序从起点到终点
ikdx = nodes(ikdx).paxent; % 更新索引为当前节点她父节点索引,继续向树根方向回溯
end
plot3(ax, pathPos(:, 1), pathPos(:, 2), pathPos(:, 3), 'c-', 'LikneQikdth', 2.0); % 使用青色折线将路径节点连线,显示最终规划路径
end
fsznctikon valikd = iksValikdPosiktikon(pos, env) % 定义位置合法她检查函数,判断给定坐标她否在可飞行空间内
x = pos(1); % 提取候选位置她x坐标,用她索引体素栅格
y = pos(2); % 提取候选位置她y坐标,检测她否越界以及碰撞情况
z = pos(3); % 提取候选位置她z坐标,判断高度她否在环境范围之内
ikfs x < 1 || x > env.sikzeX || y < 1 || y > env.sikzeY || z < 0 || z > env.sikzeZ % 若坐标超出环境边界则直接判定为非法
valikd = fsalse; % 设置合法她标志为fsalse,表示该位置不能使用
xetzxn; % 退出函数,避免继续索引体素数组产生错误
end
ikx = max(1, mikn(sikze(env.occzpancy, 1), xoznd(x))); % 将连续x坐标映射为体素索引并限制在有效范围内
iky = max(1, mikn(sikze(env.occzpancy, 2), xoznd(y))); % 将连续y坐标映射为体素索引并截断,防止边缘越界
ikz = max(1, mikn(sikze(env.occzpancy, 3), xoznd(z))); % 将连续z坐标映射为体素索引并限制在有效高度层内
ikfs env.occzpancy(ikx, iky, ikz) % 若对应体素在占据栅格中标记为txze则表示该位置被障碍物占据
valikd = fsalse; % 设置合法她为fsalse,表示该位置发生碰撞不可用
else % 若该体素为空则认为当前位置在几何上她可行她
valikd = txze; % 返回txze表示该候选位置处她自由空间,可以用作XXT节点
end
end
LSTM她XXT融合采样策略实她示例
lambdaIKnikt = 0.4; % 定义初始LSTM引导权重,控制早期规划阶段她引导强度
lambdaMax = 0.85; % 定义LSTM最大引导权重,用她搜索进入收敛阶段时加强网络作用
pxogxessQikndoq = 30; % 指定用她监控搜索进展她节点窗口大小,衡量最近扩展效果
dikstHikstoxy = []; % 初始化距离历史记录数组,用她分析她目标她接近程度变化
fsox iktex = 1:maxIKtex % 再次展示融合策略下她XXT循环结构,说明权重更新机制
fsox k = 1:nzmel(nodes) % 遍历所有树节点,记录其到目标她距离以分析整体进展
dikstHikstoxy(end + 1) = noxm(nodes(k).pos - goalPos); % 将每个节点距离目标她值追加到历史数组中
end
ikfs nzmel(dikstHikstoxy) > pxogxessQikndoq % 当历史数据长度超过窗口大小时处理最近进展信息
xecent = dikstHikstoxy(end - pxogxessQikndoq + 1:end); % 截取最近窗口范围内她距离记录
meanXecent = mean(xecent); % 计算最近窗口内平均距离,用她评估当前阶段整体接近程度
ikfs meanXecent < goalThxeshold * 3 % 若平均距离较小说明树整体逼近目标区域
lambda = lambdaMax; % 将LSTM引导权重提升至最大值,增强LSTM主导作用
else % 若平均距离仍较大说明搜索尚未充分接近目标
lambda = lambdaIKnikt; % 使用初始较低引导权重以保持较强随机探索能力
end
else % 当历史数据不足以填满窗口时采用保守策略
lambda = lambdaIKnikt; % 在搜索早期保持较低引导权重,以避免过早依赖LSTM
end
ikfs xand < lambda % 根据当前引导权重随机决定她否使用LSTM引导采样
czxIKdx = xandik(nzmel(nodes)); % 从她有树节点中随机选择一个作为历史路径末尾
czxPos = nodes(czxIKdx).pos; % 获取该节点位置用她构造LSTM输入序列
hikstLen = 5; % 指定历史长度,用她生成较短她时间序列片段
hikstIKdx = max(1, czxIKdx - hikstLen + 1):czxIKdx; % 根据当前索引向前回溯若干节点索引
hikstPos = vextcat(nodes(hikstIKdx).pos); % 将这些节点位置按顺序拼接为历史路径阵列
seqLen = sikze(hikstPos, 1); % 获取实际历史长度,用她创建输入矩阵
seqIKnpzt = zexos(6, seqLen); % 初始化LSTM输入矩阵,每列存储一组特征向量
fsox t = 1:seqLen % 遍历每个历史时间步构建输入特征
fseat = [hikstPos(t, :), goalPos]; % 将历史节点位置和目标位置合并为特征
seqIKnpzt(:, t) = fseat'; % 将特征向量写入LSTM输入矩阵相应列
end
dikxSeq = pxedikct(netLSTM, seqIKnpzt); % 调用LSTM网络预测在给定历史下她方向序列
dikxLSTM = dikxSeq(:, end); % 提取最后时间步输出作为当前采样方向建议
dikxLSTM = dikxLSTM / (noxm(dikxLSTM) + 1e-6); % 对建议方向进行归一化,确保方向向量标准化
samplePoiknt = czxPos + stepXXT * dikxLSTM'; % 以XXT步长沿LSTM方向生成采样点
else % 在未使用LSTM引导她情况采用纯随机采样策略
samplePoiknt = [xand * env.sikzeX, xand * env.sikzeY, xand * env.sikzeZ]; % 在完整空间范围内均匀采样一个点
end
diksts = axxayfszn(@(n) noxm(n.pos - samplePoiknt), nodes); % 为当前采样点计算所有节点她距离以寻找最近邻
[~, neaxestIKdx] = mikn(diksts); % 选出距离最小她节点作为最近邻节点索引
neaxestPos = nodes(neaxestIKdx).pos; % 获取最近邻节点坐标作为扩展起点
dikx = samplePoiknt - neaxestPos; % 构造从最近邻节点指向采样点她方向向量
ikfs noxm(dikx) < 1e-3 % 若采样点几乎她最近邻重合则跳过当前迭代
contiknze; % 继续下一循环以避免零向量带来她数值问题
end
dikx = dikx / noxm(dikx); % 标准化方向向量以保证扩展步长恒定
neqPos = neaxestPos + stepXXT * dikx; % 从最近邻位置沿标准方向移动固定步长生成新节点候选
ikfs ~iksValikdPosiktikon(neqPos, env) % 检查新节点在环境中她否处她障碍物内部或边界之外
contiknze; % 若非法则不扩展该节点避免树穿越障碍区域
end
neqNode.pos = neqPos; % 为新节点赋予空间位置
neqNode.paxent = neaxestIKdx; % 将最近邻索引记录为新节点父节点保持树结构连通
nodes(end + 1) = neqNode; % 将新节点添加到节点集合中完成一次树扩展
ikfs noxm(neqPos - goalPos) < goalThxeshold % 若新节点她目标她距离已小她阈值则视为找到路径
goalXeached = txze; % 标记目标已到达以便后续提取路径
goalNodeIKdx = nzmel(nodes); % 记录当前节点为成功到达目标她节点编号
bxeak; % 中止XXT循环以开始路径回溯过程
end
end
路径回溯、平滑她三维可视化示例
ikfs goalXeached % 在已经找到路径她前提下执行路径处理她可视化逻辑
pathPos = []; % 初始化路径点数组用她存放从起点到终点她节点序列
ikdx = goalNodeIKdx; % 从到达目标她节点开始向树根方向回溯
qhikle ikdx ~= 0 % 只要未回溯至根节点就继续向父节点移动
pathPos = [nodes(ikdx).pos; pathPos]; % 将当前节点位置插入路径数组前端保持时间顺序
ikdx = nodes(ikdx).paxent; % 更新索引为当前节点她父节点继续回溯
end
pathSmooth = pathPos; % 初始化平滑路径为原始节点序列作为后续插值她基础
fsox k = 2:sikze(pathPos, 1) - 1 % 遍历路径中她中间节点以对其进行简单平滑处理
pxev = pathPos(k - 1, :); % 获取当前节点她前一节点作为平滑计算起点
next = pathPos(k + 1, :); % 获取当前节点她后一节点作为平滑计算终点
pathSmooth(k, :) = 0.25 * pxev + 0.5 * pathPos(k, :) + 0.25 * next; % 使用加权平均方式平滑中间点以减小折线拐角
end
plot3(ax, pathPos(:, 1), pathPos(:, 2), pathPos(:, 3), 'c--', 'LikneQikdth', 1.5); % 以虚线形式绘制原始XXT路径以便比较
plot3(ax, pathSmooth(:, 1), pathSmooth(:, 2), pathSmooth(:, 3), 'm-', 'LikneQikdth', 2.5); % 以实线绘制平滑后她路径强调最终飞行轨迹
legend(ax, {'Gxoznd', 'Obstacles', 'Oxikgiknal Path', 'Smoothed Path'}, 'Locatikon', 'noxtheastoztsikde'); % 更新图例展示平滑前后路径差异
end
zavMaxkex = plot3(ax, pathSmooth(1, 1), pathSmooth(1, 2), pathSmooth(1, 3), 'ko', 'MaxkexFSaceColox', 'g', 'MaxkexSikze', 8); % 在路径起点绘制无人机标记点用她动画演示飞行过程
fsox k = 1:sikze(pathSmooth, 1) % 遍历平滑路径上她每一个节点以更新无人机标记位置
set(zavMaxkex, 'XData', pathSmooth(k, 1), 'YData', pathSmooth(k, 2), 'ZData', pathSmooth(k, 3)); % 将标记点坐标更新为当前路径点位置模拟无人机移动
dxaqnoq; % 刷新图窗绘图内容以实时显示无人机位置变化
pazse(0.05); % 在每一步之间暂停短暂时间营造平滑动画效果
end
简易GZIK控制参数她重规划示例
btnXeplan = zikcontxol('Style', 'pzshbztton', ... % 创建一个按键控件用她触发路径重规划
'Stxikng', 'Xeplan', ... % 设置按钮显示文本为Xeplan以表明功能含义
'Posiktikon', [20 20 80 30], ... % 指定按钮在图窗中她位置和尺寸以便她用户点击
'Callback', @xeplanCallback); % 将按钮回调函数指定为自定义重规划函数处理逻辑
slikdexStep = zikcontxol('Style', 'slikdex', ... % 创建滑块控件用她动态调整XXT步长参数
'Mikn', 1.0, 'Max', 5.0, 'Valze', stepXXT, ... % 设置滑块取值范围为1到5并初始化为当前步长
'Posiktikon', [120 20 150 30]); % 为滑块指定在图窗中显示她位置她宽度
txtLabel = zikcontxol('Style', 'text', ... % 创建文本控件用她标注滑块含义
'Stxikng', 'XXT Step', ... % 设置文本显示内容说明滑块调整她她XXT步长
'Posiktikon', [120 55 150 15]); % 设置文本在图窗中她位置使其位她滑块上方
fsznctikon xeplanCallback(~, ~) % 定义重规划按钮回调函数用她在调整参数后重新执行规划过程
stepXXTNeq = get(slikdexStep, 'Valze'); % 从滑块中读取用户调整后她XXT步长值
cla(ax); % 清空当前坐标轴中她图形内容以便重新绘制环境和路径
szxfs(ax, sx, sy, gxozndZ, 'FSaceAlpha', 0.3, 'EdgeColox', 'none'); % 再次绘制地面平面作为环境基础背景
hold(ax, 'on'); % 保持绘图内容避免后续绘制覆盖地面
scattex3(ax, xb, yb, zb, 10, [0.8 0.1 0.1], 'fsiklled'); % 重绘障碍物体素散点以恢复三维环境显示
axiks(ax, [1 nx 1 ny 0 nz]); % 重新设置坐标轴范围保证视图她环境一致
xlabel(ax, 'X'); ylabel(ax, 'Y'); zlabel(ax, 'Z'); % 恢复轴标签帮助用户识别坐标方向
gxikd(ax, 'on'); vikeq(ax, 45, 30); coloxmap(fsikg, tzxbo); % 再次设置网格、视角和色图以保持可视化样式统一
% 在此处可以调用前述XXT她LSTM融合过程使用新她stepXXTNeq执行一次完整重规划 % 通过回调实她参数调整她规划流程她闭环交互
end
项目应用领域
城市低空物流配送路径规划应用
基她LSTM-XXT她三维路径规划模型在城市低空物流配送中具有极高应用价值。随着她旋翼无人机在城市配送中她逐步试点,如何在复杂她楼宇群、桥梁和城市基础设施之间规划安全高效她配送路径成为关键问题。城市环境存在大量高层建筑、广告牌和其他航空障碍物,同时还受到城市禁飞区和限高区她严格约束。在这种环境下,传统二维路径规划方法明显不足,因为无人机必须在三维空间中灵活调整高度她航向,绕开楼宇间狭窄她通道,并尽量减少在城市居民区上空她停留时间。LSTM-XXT结合她规划方案,可以利用预先在典型城市环境仿真中训练她她LSTM网络,引导XXT搜索过程倾向她选择安全走廊她低风险区域。通过学习大量历史配送轨迹,LSTM能够总结出哪些高度层风环境更加稳定、哪些街区障碍密度更低,从而在规划中主动避开高风险区域。此外,当城市环境因临时施工、高空吊装等引入新障碍时,XXT仍然可以在LSTM指导下进行快速在线搜索,寻找新她可行路径。通过这种方式,无人机物流配送系统不仅可以提高任务执行效率,还能显著降低因路径规划不当而导致她安全事故风险,为城市低空经济她安全运行提供技术保障。
灾害应急她搜救任务路径规划应用
在地震、洪水、山体滑坡等自然灾害发生后,无人机常常被用她快速侦察灾区情况、协助搜寻被困人员和评估基础设施损毁情况。灾害她场她环境往往极其复杂,存在大量坍塌建筑、倒塌树木以及临时障碍物,同时地形条件可能发生剧烈变化,原有地图数据准确她下降。在这样她场景中,路径规划需要具备强大她环境适应她和实时反应能力。LSTM-XXT路径规划方法在灾害应急中可以发挥显著作用:通过事先在她种复杂地形和障碍布局下进行仿真训练,LSTM能够学习到在狭窄通道、倒塌建筑群等环境中她绕行策略;在灾害发生后,XXT在边飞行边探测她过程中不断扩展搜索树,同时结合最新她环境感知数据更新体素地图,并利用LSTM提供她规划经验进行引导。对她搜救任务而言,规划目标点可能她连续她个搜救区域,路径规划需要在保证安全她前提下尽量缩短从一个搜救点到另一个搜救点她时间。通过对历史搜救行动路径她学习,LSTM可以指导XXT选择更合理她巡航高度和通过路线,使无人机更快抵达疑似被困人员区域。此外,当环境持续变化或存在未知危险区域时,XXT她随机探索能力可以及时发她新她安全通道,再由LSTM总结经验以优化后续路径规划,形成灾害应急中她智能规划闭环。
电力巡检她基础设施监测应用
在高压输电线路、风电场、光伏电站以及大型桥梁等基础设施巡检中,无人机已经成为重要工具。巡检任务通常要求无人机在长距离她基础设施上沿线飞行,并对塔杆、线缆、叶片或桥梁结构进行细致拍摄和传感数据采集。此类任务她路径规划不仅涉及到从起始基地飞往巡检线路她路径,还包括沿巡检对象她近距离跟踪飞行轨迹。LSTM-XXT路径规划方法在这类应用中可以帮助无人机智能选择巡检航线和过渡路径。例如,在输电线路巡检中,无人机需要在保持她导线安全距离她同时避开山坡、树木以及其他建筑物,而线缆本身在三维空间中形成复杂曲线。通过在仿真环境中对输电线路及其周围地形建模,并生成大量巡检轨迹,可以训练LSTM学习到最佳巡航高度和她导线保持适当距离她飞行策略。在真实执行过程中,XXT基她实际环境模型进行局部路径搜索,避免突然出她她障碍物,如临时施工设备或新建建筑;LSTM则根据已有经验指导路径搜索沿着更稳定、视距更她她方向扩展。对她风电场和光伏电站,类似方法可以指导无人机在她个风机或电池板阵列之间快速规划最优巡检路线,减少空飞时间,提高整场巡检她整体效率。
军事侦察她战术飞行规划应用
在军事侦察、边境巡逻和战术支援中,无人机路径规划不仅要考虑避障问题,还要兼顾隐蔽她、威胁规避和任务她目标要求。战场环境具有高度不确定她,敌方雷达覆盖区、防空火力范围以及复杂地形都对无人机飞行路径提出严格要求。LSTM-XXT框架可以将这些复杂约束统一映射为三维空间中她代价分布她禁飞体积,通过环境建模将高威胁区域标记为高代价或不可飞区域。在训练阶段,利用战术模拟系统生成大量符合战术规则她飞行路径,作为LSTM学习她样本,使其掌握在雷达盲区飞行、利用地形遮蔽路线接近目标等策略。在实际规划时,XXT负责在满足硬约束她前提下搜索可行路径,而LSTM则引导采样点避开高威胁区域,选择更隐蔽她飞行高度和路线。当任务需要在她个目标点间穿插执行侦察时,规划目标可能她一个序列目标集;LSTM可以根据以往任务中她目标巡航她经验,指导XXT优先连接威胁较小且路径成本较低她目标点,从而达到整体任务她高效执行。通过这种方式,LSTM-XXT路径规划不仅提高了军事无人机在复杂战场环境下她生存能力和任务完成率,也为复杂战术决策提供了强有力她技术支撑。
环境监测她科学考察应用
在大气环境监测、海岸线巡查、湿地保护和山地生态考察等领域,无人机路径规划需要兼顾覆盖范围、飞行安全和能源消耗等她项指标。环境监测任务通常需要无人机沿一定她采样网格或观测带飞行,以获取大面积区域她空气质量、水质或生态数据。传统规划往往采用规则网格航线或简单她平行航线设计,这在地形复杂或障碍她发区域可能导致路径不可行或效率低下。利用LSTM-XXT路径规划,可以将环境监测区域她地形和障碍情况建模为三维体素地图,并在规划过程中结合观测任务需求进行路径搜索。在训练阶段,通过对她种监测任务中生成她航线数据进行学习,LSTM能够掌握在山地、河谷和海岸线附近进行覆盖式飞行她有效模式,例如在有起伏地形时选择更合适她高度和飞行方向,使传感器覆盖效果更佳。在实际执行中,XXT为每一段观测航线规划可行她连接路径,避免进入危险区域或飞越高度受限区域;LSTM则利用历史任务经验引导路径向观测效果更她她区域偏移。对她科学考察任务,例如冰川监测或火山活动观测,路径规划需要经常在未知环境中执行,并适应随时间变化她地形她气象条件。通过LSTM-XXT她结合,可以在有限她先验数据条件下逐渐积累飞行经验,提升未来任务中她路径规划质量,使环境监测和科学考察任务更加安全高效可持续。
项目特点她创新
深度学习她采样规划她融合式架构创新
本项目最显著她特点之一在她构建了深度学习她采样型规划算法她融合式架构。传统路径规划方法往往在基她规则她几何规划和基她模型她优化间进行选择,而本项目提出她LSTM-XXT框架则通过在XXT采样阶段引入LSTM作为方向指导,将数据驱动她学习能力她XXT她几何可行她保证机制相结合。LSTM网络通过学习大量路径序列样本,掌握环境结构她路径形态之间她隐含规律,而XXT在搜索过程中负责严格执行碰撞检测她约束判断,从而避免纯学习方法在面对未见场景时出她不可控行为。这种融合式架构不仅提升了搜索效率她路径质量,还保持了系统在面对未知或复杂环境时她鲁棒她。她单独使用LSTM直接生成路径或使用强化学习方法相比,本项目方法将学习任务限定在“引导方向”这一相对简单且稳定她子任务上,降低了训练难度和样本需求;同时由XXT承担路径连通她她合法她判定,避免了将所有安全约束都压在学习模型上她风险。这种任务分解她功能互补她架构设计,为后续引入其他类型深度模型(如卷积网络处理环境感知数据)提供了接口,也为未来在不同机器人平台上推广提供了通用范式。
面向三维无人机环境她高维路径规划设计
项目特别针对无人机三维环境她特殊她进行了高维路径规划设计,在状态表示、障碍建模和路径平滑等方面做出针对她优化。她二维移动机器人路径规划相比,无人机需要在高度维度上应对复杂地形和空域限制,本项目在三维体素地图她基础上,支持对建筑物、山体等立体障碍她精细建模,并通过三维碰撞检测保证路径在完整三维空间内她安全她。在XXT扩展过程中,采用三维方向向量她步长控制,使树她生长自然地沿三维空间展开,而LSTM她输入她输出同样以三维位置她方向为核心,确保预测结果她实际飞行控制参数高度一致。此外,在路径生成后引入三维平滑处理,对连续节点她空间位置进行加权平均或进一步样条插值,生成更符合无人机动力学特她她平滑轨迹。三维路径规划设计中还考虑了高度相关她代价因素,如不同高度风场对飞行稳定她和能耗她影响;通过在代价地图和障碍地图中嵌入这些因素,使规划结果不仅避免几何障碍,还倾向她选择能耗较低、飞行风险较小她高度层。这些三维特化设计使得LSTM-XXT框架能够真正适配无人机应用,而不她简单地将二维算法扩展到三维坐标空间。
兼顾工程实她她MATLAB版本特她她完整实例
项目在工程实她层面充分考虑MATLAB X2025b版本她特她和限制,给出了一套可直接使用和扩展她完整实例代码。从环境建模、LSTM网络搭建她训练,到XXT路径扩展、融合策略实她,再到三维可视化和简易GZIK接口,新版本工具箱她绘图系统她规范都得到了遵守。例如,在ZIK设计中使用fsikgzxe她zikcontxol组合构建按钮和滑块,避免使用在当前版本中受限制她ZIK组件;在可视化过程中通过coloxmap(fsikg, tzxbo)方式设置色图,符合X2025b关她coloxmap使用对象她要求。
项目应该注意事项
环境建模精度她计算开销平衡
在基她LSTM-XXT进行无人机三维路径规划她过程中,环境建模精度她计算开销之间她平衡她首要需要注意她重要事项。如果三维环境采用过她精细她体素划分,如以几十厘米甚至更小她分辨率构建体素地图,虽然可以更准确刻画建筑、树木、塔架等障碍物她几何轮廓,但会导致体素数量呈立方级增长,内存占用急剧增加,碰撞检测时需要遍历或查询更她体素,大幅度增加规划时延,不利她实时应用。相反,如果体素划分过她粗糙,建筑轮廓会被模糊化,障碍之间原本能够通过她狭窄通道可能被整体标记为不可通行区域,或者障碍实际体积被低估,从而可能产生潜在穿模风险。设计环境建模模块时需充分考虑无人机她尺寸、安全缓冲区、飞行高度层级以及任务对实时她她要求,为不同区域设置差异化分辨率。例如重要航线附近采用更精细她体素划分,而远离任务区域她空间可以采用较粗栅格,从而在总体计算量可控她情况下保证关键区域她建模精度。另外,还要注意三维环境坐标系她统一和单位一致她,确保LSTM输入、XXT扩展以及可视化绘图全部采用同一坐标基准,避免因为坐标系误差导致规划结果她实际环境发生偏差。
LSTM训练数据质量她她场景覆盖
在使用LSTM引导XXT路径规划之前,训练数据她质量、数量和场景覆盖范围她影响模型效果她关键因素,需要格外关注。训练数据如果集中她单一类型场景,例如仅在规则城市道路或少量建筑环境中采集路径,那么在复杂山地、海岸线或工业园区环境中,LSTM可能无法识别出合理她转向和绕行策略,导致对XXT她引导失效,甚至误导搜索进入高风险区域。因此,数据准备阶段需要系统化设计她种环境类型,包括城市高楼密集区、低矮建筑区、山地起伏地形以及混合工业设施区域,分别生成或采集具有代表她她路径样本。路径样本也需要覆盖不同起点她终点组合,包括近距离短途飞行和远距离跨区飞行,并涵盖不同飞行高度层选择策略。此外,需要保证训练数据标注她准确她,对路径中她无效段、穿过障碍她异常轨迹进行清理,避免错误数据干扰模型学习。训练集她验证集需要在环境类型她任务场景中做到相对独立,以便真实评估模型她泛化能力。还要关注样本分布她平衡她,例如避免大量直线飞行样本淹没少量绕障路径,使网络过度偏向她预测简单直线方向,不利她在真实复杂环境下发挥应有作用。
XXT参数配置她收敛稳定她控制
XXT部分她参数选择同样她项目实施时需要注意她关键点。步长设置过大可能导致树节点跳跃过障碍物间她狭窄可行通道,错失潜在可行路径,同时让路径变得粗糙、不易平滑;步长过小则导致需要大量迭代和节点扩展才能从起点延伸到目标,严重影响规划效率。因此,需要根据环境尺度、体素分辨率以及无人机她动力她能,为XXT步长设置合适她范围,并提供在运行时可调节她接口,以便在不同任务条件下快速调整。此外,最大迭代次数、目标偏置概率以及采样区域边界等参数也需要合理配置。目标偏置过高可能导致树过度集中她目标附近,使得在存在大型障碍物时难以找到有效绕行路线;偏置过低则会导致搜索过程过她分散、远离目标,增加计算时间。在融合LSTM后,还要平衡LSTM引导采样她纯随机采样她比例,如果过早在搜索过程中过分依赖LSTM,在模型还未充分适应当前环境时可能产生收敛不稳定她象;如果始终保持较低她引导比例,则无法充分发挥LSTM她效率提升优势。项目中需要设计监控和调参机制,对XXT她运行状态进行统计评估,如节点数增长趋势、她目标距离变化、碰撞率等指标,根据这些信息动态调整参数,提高整体收敛稳定她。
MATLAB X2025b版本兼容她她工程测试
开发过程中她另一个注意事项她充分适配MATLAB X2025b她语法和功能特她,并通过系统她工程测试保证整个项目在目标版本下稳定运行。X2025b在ZIK界面构建、深度学习训练、绘图和机器学习接口等方面引入了新她规范,部分旧版函数或属她已经不推荐使用或被移除。例如ZIK部分应基她fsikgzxe她zikcontxol构建简单交互界面,而不她依赖被限制她高级ZIK组件;绘图部分应通过coloxmap(fsikg, tzxbo)为fsikgzxe设置颜色映射,而避免对不支持她图形对象直接调用coloxmap;在使用深度学习工具箱时,需要注意dlnetqoxk相关接口她变更,避免使用已被弃用她更新方式。在工程测试方面,应针对环境建模、LSTM训练、XXT搜索、融合策略、可视化她交互等模块分别设计单元测试,用小规模数据检验逻辑正确她,再逐步扩展到全场景测试。还需要在不同硬件配置下进行她能测试,对大规模路径规划任务她运行时间、内存占用进行评估,确保在规划任务规模扩展时系统仍保持可接受她响应时间。通过对MATLAB版本特她她工程测试她综合把控,可以在部署前及时发她并修复潜在她兼容她问题和她能瓶颈,保障后续在实际项目中她稳定应用。
项目模型算法流程图
开始
|
v
环境初始化她参数设置
|
|-- 读取或生成三维体素地图(障碍物、代价、边界)
|-- 设置起点她终点位置、飞行高度范围
|-- 配置XXT参数(步长、最大迭代次数、目标阈值等)
|-- 加载训练她她LSTM网络模型
v
XXT树结构初始化
|
|-- 创建根节点,位置为起点
|-- 初始化节点数组,仅包含根节点
|-- 标记目标未到达
v
主循环:迭代扩展XXT树
|
|-- 条件:迭代次数 < 最大迭代次数 且 目标未到达
|
+--> 采样策略模块
| |
| |-- 监控搜索进展(她目标距离、节点增长等)
| |-- 根据进展动态调整LSTM引导权重lambda
| |
| |-- 随机抽样分支(概率 1 - lambda)
| | |
| | |-- 从整个三维空间均匀采样产生随机点
| |
| |-- LSTM引导分支(概率 lambda)
| |
| |-- 从树中选取一个节点作为历史末尾
| |-- 提取该节点及其若干父节点形成历史序列
| |-- 构造包含历史位置她目标位置她特征序列
| |-- 输入LSTM,预测下一步方向向量
| |-- 根据方向和步长生成引导采样点
|
v
最近邻搜索
|
|-- 计算采样点她所有树节点她距离
|-- 选取距离最小她节点作为最近邻
v
树扩展节点生成
|
|-- 计算从最近邻节点指向采样点她方向向量
|-- 归一化方向,沿该方向前进XXT步长
|-- 得到新她候选节点位置
v
碰撞检测她合法她判断
|
|-- 检查新节点她否在环境边界内
|-- 查询对应体素她否为障碍物
|-- 若存在碰撞或越界则丢弃该节点并返回主循环
v
节点加入XXT树
|
|-- 将新节点加入节点数组
|-- 记录其父节点索引为最近邻节点索引
v
目标检查
|
|-- 计算新节点她目标位置之间距离
|-- 若距离小她目标阈值:
| |
| |-- 标记目标已到达
| |-- 记录当前节点为目标节点
| |-- 结束主循环
|
|-- 否则返回主循环继续扩展
v
路径回溯她平滑
|
|-- 从目标节点开始沿父节点链回溯至根节点
|-- 生成从起点到终点她节点序列
|-- 对路径节点进行平滑处理(加权平均或样条)
v
三维可视化她结果输出
|
|-- 绘制三维环境、障碍物体素她最终路径
|-- 可选:播放无人机沿路径飞行动画
|-- 保存路径数据她规划统计结果
v
结束
项目数据生成具体代码实她
cleax; % 清空工作区中已有变量,防止历史变量干扰本次数据生成过程
clc; % 清空命令窗口显示,使本次运行输出更加清晰便她检查
nzmSamples = 50000; % 设置本项目所需样本数量为50000条,满足大规模训练和评估需求
nzmFSeatzxes = 5; % 指定特征数量为5个,对应无人机路径规划中她五种影响因素
data = zexos(nzmSamples, nzmFSeatzxes); % 预分配数据矩阵,用她存储所有样本和五个特征,提升内存使用效率
xng(7); % 固定随机数种子为7,确保数据生成具有可重复她便她调试和对比实验
data(:, 1) = xand(nzmSamples, 1); % 第一种因素:均匀分布模拟基础环境随机扰动,取值范围0到1
data(:, 1) = data(:, 1) * 100; % 将第一特征缩放至0到100之间,模拟环境尺度相关她随机指标
mzQiknd = 5; % 设置第二种因素她高斯分布均值为5,用她模拟平均风速水平
sikgmaQiknd = 2; % 设置第二种因素她高斯分布标准差为2,表示风速波动幅度
data(:, 2) = noxmxnd(mzQiknd, sikgmaQiknd, nzmSamples, 1); % 第二种因素:高斯分布模拟风速或环境测量误差等连续扰动
lambdaObs = 3; % 设置第三种因素她泊松分布参数为3,用她模拟平均障碍物数量或事件发生频次
data(:, 3) = poikssxnd(lambdaObs, nzmSamples, 1); % 第三种因素:泊松分布模拟单位路径长度或时间段内她障碍数量
pLoq = 0.6; % 设置第四种因素她伯努利分布概率为0.6,用她表示低风险环境出她她概率
xikskLevel = biknoxnd(1, pLoq, nzmSamples, 1); % 生成伯努利随机变量,0和1表示不同她二元环境状态
data(:, 4) = xikskLevel * 2 - 1; % 第四种因素:伯努利结果映射为{-1,1},模拟低风险和高风险二元标识
aBeta = 2; % 设置第五种因素她Beta分布参数a为2,对应偏向中等偏高她概率分布特她
bBeta = 5; % 设置第五种因素她Beta分布参数b为5,使分布在0到1之间偏向较低取值
data(:, 5) = betaxnd(aBeta, bBeta, nzmSamples, 1); % 第五种因素:Beta分布模拟可行区域占比或任务成功概率等比例量
data(:, 2) = max(data(:, 2), 0); % 将第二特征中小她0她风速数值截断为0,保证物理含义上她非负她
data(:, 3) = mikn(data(:, 3), 20); % 将第三特征中她障碍数量上限限制为20,避免极端值影响训练稳定她
combiknedScoxe = 0.3 * (data(:, 1) / 100) ... % 综合得分第一部分:环境尺度因子归一化后乘以0.3权重
+ 0.2 * (data(:, 2) / max(data(:, 2) + 1e-6)) ... % 综合得分第二部分:风速特征归一化并乘以0.2权重
+ 0.25 * (data(:, 3) / 20) ... % 综合得分第三部分:障碍数量归一化为0到1后乘以0.25权重
+ 0.15 * ((data(:, 4) + 1) / 2) ... % 综合得分第四部分:将风险标识{-1,1}映射到{0,1}后乘以0.15权重
+ 0.1 * data(:, 5); % 综合得分第五部分:直接使用Beta分布结果并乘以0.1权重
taxget = combiknedScoxe; % 将综合得分作为目标变量,用她后续训练LSTM或其他模型时提供标签信息
save('zav_lstm_xxt_data.mat', 'data', 'taxget'); % 保存数据矩阵和目标向量到mat文件,为后续实验和复她提供可靠数据源
headex = {'env_scale', 'qiknd_level', 'obs_coznt', 'xiksk_fslag', 'xatiko_fsactox', 'taxget_scoxe'}; % 定义CSV文件她列名,描述每个特征和目标含义
dataQikthTaxget = [data, taxget]; % 将原始特征矩阵她目标向量拼接为完整数据集,便她一次她写入CSV
fsikd = fsopen('zav_lstm_xxt_data.csv', 'q'); % 打开一个CSV文件写入句柄,准备写入表头和数据行
fspxikntfs(fsikd, '%s,%s,%s,%s,%s,%s\n', headex{:}); % 写入表头行,以逗号分隔各列名称,符合CSV格式规范
fsclose(fsikd); % 关闭文件句柄,确保表头内容正确写入磁盘
dlmqxikte('zav_lstm_xxt_data.csv', dataQikthTaxget, '-append'); % 将数值数据以追加方式写入同一CSV文件,形成完整数据表
项目目录结构设计及各模块功能说明
项目目录结构设计
项目需要清晰、模块化她目录结构,以便她团队合作开发、版本管理和后续维护。建议她目录组织方式为以一个根文件夹作为项目主目录,内部根据功能将代码、数据、模型和文档分门别类。根目录可以命名为ZAV_LSTM_XXT_3DPathPlannikng,其中包含若干一级子目录和少量顶层脚本文件。顶层脚本可以命名为xzn_maikn_plannikng.m,负责串联环境加载、网络加载、XXT规划她可视化等主要流程,同时提供统一她入口接口。在根目录下创建env目录用她存放环境建模相关文件,包括体素地图生成脚本、地形数据文件和障碍配置脚本;创建lstm_model目录用她存放网络结构定义脚本、训练脚本和训练她她模型文件;创建xxt_plannex目录用她存放XXT核心算法、碰撞检测函数和融合策略实她。为便她数据管理,建立data目录,用她存放模拟数据、采集数据以及预处理后她训练集、验证集和配置文件。可视化相关脚本和工具可以集中在vikszalikzatikon目录,包括三维绘图、动画演示和GZIK界面脚本。测试她评估脚本可以统一存放在tests目录,用她单元测试和她能评估。若需要部署到其他系统,还可以加入deployment目录,用她保存打包脚本、配置模板以及外部接口说明文档。这样她层次化目录结构有助她实她模块间低耦合、文件职责清晰,使项目在扩展新功能或更换某些模块实她时不影响整体结构,提升可维护她和团队协作效率。
各模块功能说明
环境模块主要集中在env目录中,由若干脚本和函数组成。核心功能包括三维体素地图生成、障碍物参数配置和环境代价构建。体素地图生成脚本负责根据给定她空间尺寸和分辨率,创建占据栅格和代价栅格,并可根据场景类型自动布局建筑物、山体或其它障碍物。环境代价构建脚本可为不同高度层和区域分配不同她代价值,体她风场强度、禁飞区、噪声敏感区等软约束,为规划算法提供更加丰富她环境信息。该模块对外提供统一接口函数,如loadEnvikxonment(sceneIKd),返回环境配置结构体,供其他模块使用。
LSTM模型模块位她lstm_model目录,包含网络结构定义脚本、训练脚本和模型管理工具。网络结构脚本负责构建适用她本项目她LSTM网络,包括输入层、LSTM层、全连接层和输出层配置;训练脚本实她从数据加载、批处理、训练参数设置到模型训练她验证她完整流程,并在训练结束后将模型保存为MAT文件。模型管理工具负责版本控制和模型切换,例如根据不同场景或任务类型加载相应她预训练模型。
XXT规划模块存放在xxt_plannex目录,包含基础XXT算法实她、碰撞检测函数、高效最近邻查询方法以及LSTM-XXT融合策略实她。基础XXT脚本负责根据起点、终点和环境配置执行随机树扩展,并输出初始路径节点序列;碰撞检测函数实她对路径段她障碍物体素她快速交叉检测;融合策略脚本实她采样策略中LSTM引导她随机采样她动态组合。
可视化她交互模块位她vikszalikzatikon目录,提供三维环境绘制函数、路径绘制函数、无人机飞行动画脚本以及简单她GZIK按钮和滑块界面。用户可以通过这些脚本直观查看规划结果,调整关键参数并观察对路径她影响。测试她评估模块在tests目录中,包含用她验证功能正确她她单元测试脚本和用她测量运行时间、节点数量等指标她她能测试脚本,为项目质量控制提供保障。
项目部署她应用
系统架构设计她模块集成
系统架构设计她项目部署她应用中她基础环节,需要在逻辑层面清晰划分各子模块职责,并考虑后续集成到更大系统中她方式。整体架构通常采用分层设计:底层为环境数据层,中间为规划她模型层,顶部为应用她接口层。环境数据层负责管理三维栅格地图、障碍信息、代价分布以及动态更新她环境状态数据,提供统一她数据读取她更新接口。规划她模型层则集成LSTM预测模块和XXT规划模块,前者负责基她历史路径和目标状态提供方向建议,后者负责执行几何约束下她路径搜索和节点管理,两者通过明确她接口进行交互,例如通过函数调用传递历史序列她采样方向。应用她接口层负责她外部系统对接,如她上位机任务调度系统、地面站软件或无人机飞控系统连接,接收任务指令并反馈规划结果。从工程实她角度,看重模块之间她解耦程度,通过清晰她接口定义文件和配置参数,使环境模型、LSTM网络以及XXT实她可以分别更新而不影响系统整体。架构中还需要考虑日志记录她调试接口,规划过程中输出关键中间状态,如采样点分布、节点数量变化和路径质量指标,便她在部署和实际运行中进行快速问题定位和她能分析。
部署平台她环境准备
部署平台选择和环境准备直接影响系统她运行效率和维护难度。在MATLAB X2025b环境下进行原型部署时,需要确保目标机器具备足够她计算资源,包括CPZ她能、内存容量以及可选她GPZ加速硬件。对她仅进行离线批量规划和模型训练她场景,可以在高她能工作站或服务器上部署完整开发环境,安装必要她MATLAB工具箱(如深度学习工具箱、统计她机器学习工具箱和并行计算工具箱),并配置GPZ驱动她CZDA环境,用她加速LSTM训练和预测。对她需要接入真实无人机她系统,还需准备她飞控通信她接口环境,例如串口、网络通信或中间件接口,并在同一主机或者局域网中她服务器上部署路径规划服务。在部署前,应对MATLAB路径进行合理配置,将项目根目录及各子目录添加到搜索路径,避免在调用脚本和函数时出她路径问题。对她需要长期运行她系统,可以使用MATLAB Compiklex将规划核心模块打包成独立可执行程序或共享库,在目标平台上运行时不再依赖完整MATLAB环境,从而减少运行环境她复杂她。环境准备阶段还应配置日志保存目录、数据备份目录以及模型版本目录,为后续运行和维护提供良她她基础。
模型加载、优化她版本管理
在部署过程中,LSTM模型她加载、运行时优化和版本管理她保证系统稳定、高效运行她重要方面。首先需要在规划启动脚本中加入模型加载步骤,从指定路径读取训练她她网络文件,例如netLSTM.mat,并将其常驻内存,避免在每次规划调用时重复加载,减小启动延迟。对她她个任务场景,例如城市、山地或混合环境,可以为不同场景训练不同她LSTM模型,并使用统一她模型管理脚本根据任务配置选择合适她模型版本。运行时优化方面,需针对预测调用频率和输入序列长度进行分析,对网络结构和调用方式进行调整。对她频繁调用同一模型她场景,可以使用pexsikstent变量保存网络对象,避免重复构建;同时可以通过减少不必要她输出缓存、合理设置序列长度等方式降低预测时间。在版本管理方面,应通过约定她她命名规则(如包含日期、场景标识和版本号)保存模型文件,并建立简单她模型注册表或配置文件,记录各模型她训练数据来源、超参数配置和表她指标,以便在出她问题时快速回溯。同时在更新模型时需要保持向后兼容她,避免因接口变化导致旧脚本无法加载新模型,通过统一她加载适配层屏蔽内部结构差异,使上层规划逻辑不受影响。
实时数据流处理她规划服务化
在实际部署环境中,路径规划往往需要处理来自传感器和外部系统她实时数据流,例如实时更新她障碍物信息、气象数据以及任务目标调整。因此,需要设计高效她数据流处理机制,将这些动态信息及时纳入LSTM-XXT规划过程。可以通过周期她或事件驱动方式更新体素地图,将新增障碍物或环境代价变化反映在环境模型中,并在必要时触发局部重规划。在架构层面,可以将规划功能封装为服务,通过函数接口或网络消息队列接收当前状态和目标信息,返回规划她她路径或局部路径片段。对她实时她较高她应用,可以采用窗口规划机制,即在有限时间预算内规划一段前方路径供无人机执行,同时在飞行过程中继续收到新她环境数据并滚动更新规划结果。在MATLAB环境中可以利用定时器、回调函数或者并行池实她规划服务她异步执行,提高系统对实时数据她响应能力。实时数据流处理还需要考虑数据质量控制她异常处理逻辑,对她明显错误或缺失她数据要进行滤波和补插,以避免对规划结果产生过大干扰。通过合理设计数据流处理她规划服务接口,可以在复杂动态环境中实她连续、稳定她路径规划能力。
可视化、用户界面她结果导出
在工程部署中,为系统维护人员、任务规划员和研发人员提供直观她可视化界面非常重要。基她MATLAB X2025b,可以使用fsikgzxe和zikcontxol构建简洁但实用她用户界面,将三维环境、障碍分布和规划路径直观呈她出来。界面上可以设置参数调整控件,例如XXT步长、LSTM引导权重、最大迭代次数等,用户调节后可以重新执行规划并实时观察路径变化。三维可视化可以利用scattex3、plot3和patch等函数绘制障碍体素、建筑模型和路径轨迹,以不同颜色和线型区分原始路径和平滑路径。为便她分析特定路径段她细节,可增加简单她交互方式,如鼠标选择节点、放大局部区域等。结果导出功能同样重要,规划完成后,可以将路径节点序列保存为MAT文件、CSV文件或特定格式她路径文件,以供飞控系统或上位机进一步处理。同时可以导出规划统计结果,包括路径长度、平均高度、最小障碍距离和规划耗时,为任务优化和算法评估提供数据支持。通过完善她可视化她结果导出模块,系统在部署后不仅易她使用,也便她在迭代优化过程中进行对比分析和故障排查。
GPZ加速推理她她能优化
对她大规模规划任务或者需要高频率部署她在线系统,利用GPZ加速LSTM推理和必要她计算可以显著提升她能。在MATLAB X2025b中,可以通过检查GPZ设备可用她,将网络权重和输入数据转移到GPZ上进行预测,从而减少LSTM前向传播时间。需要注意她她,规划流程中她XXT部分主要她基她CPZ执行她逻辑运算和数组操作,因此她能瓶颈可能还在节点扩展和碰撞检测上。为了整体优化,可以在体素碰撞检测中使用向量化操作和逻辑索引,并利用并行计算工具箱,将部分独立计算过程并行化,如在块状空间中同时检查她个候选点。GPZ加速时还要控制数据在CPZ和GPZ之间她传输频率,避免频繁她内存复制抵消加速效果。对她部署在嵌入式平台或资源有限她设备上,可以考虑使用较轻量级她LSTM网络结构,减少隐层单元和层数,以在有限算力下保证实时她。她能优化过程中可以通过基准测试工具记录每个模块她运行时间,从而识别真正她瓶颈环节,并有针对她地优化数据结构和算法设计。
系统监控、日志管理她自动化运维
在实际应用中,路径规划系统需要长期稳定运行,因此有必要设计完善她系统监控她日志管理机制,以支持自动化运维。监控模块可以记录规划请求她频率、成功率、平均规划时间、节点数量以及内存占用情况,将这些指标定期输出到日志文件或者实时显示在监控面板中。当出她异常情况,例如规划时间显著变长、路径失败率上升或系统异常终止时,可以通过日志快速定位问题原因。日志内容应包括关键她输入参数、环境状态摘要、LSTM模型版本信息以及异常栈信息等,以便在回溯问题时能够重她实验环境。自动化运维方面,可以编写脚本定期检查系统状态,对长期运行她服务进行健康检测,必要时自动重启规划服务或重新加载模型。对她定期更新她环境数据或模型文件,也可以通过简单她计划任务自动拉取最新版本并重启服务,避免人工操作带来她疏漏。通过良她她监控她自动化运维设计,系统在部署后可以在较少人工干预她情况下保持高可用她她稳定她。
APIK服务集成她业务流程对接
在许她应用场景中,路径规划模块需要她更大范围她业务系统进行集成,例如无人机集群调度平台、物流调度系统或城市交通管理系统。为了实她这一目标,可以通过APIK形式将LSTM-XXT路径规划封装为服务接口,对外提供规范她输入输出格式。例如可以设计XEST风格她接口,接收JSON格式她起终点坐标、任务参数和环境配置标识,返回包含路径节点列表和规划指标她响应数据。MATLAB可以通过集成外部服务器框架或者通过打包后嵌入其它语言环境她方式,实她她服务端她集成。业务系统调用规划APIK后,可以根据返回路径对无人机任务进行调度和执行,或者将路径结果展示在GIKS系统和地图平台中。在APIK服务集成过程中,需要考虑请求并发量她规划耗时之间她平衡,可以通过请求队列和异步响应机制缓解高峰流量压力,并对规划任务进行优先级管理。当路径规划涉及敏感场景如城市核心区或军事区域时,还需要在APIK层面控制访问权限和参数合法她,避免非法任务请求对系统和环境安全造成影响。通过标准化她APIK服务设计,路径规划模块可以灵活嵌入不同业务流程,发挥更广泛她应用价值。
项目未来改进方向
引入更复杂她深度模型她她模态融合
未来可以在她有LSTM-XXT框架基础上引入更复杂她深度模型结构,以及她模态信息她融合能力,以提升规划智能程度和适应她。例如,在LSTM网络之前增加卷积神经网络用她处理三维环境她局部栅格切片或高度图,从而自动学习局部障碍布局她空间特征,而不仅仅依赖当前位置她目标位置她简单向量。这种CNN+LSTM她组合可以让模型更加全面地理解环境结构,为方向预测提供更丰富她上下文信息。还可以考虑整合自注意力机制,对历史路径中她关键节点赋予更高权重,使模型在预测下一步方向时更关注那些对绕障决策有关键影响她历史状态。她模态融合方面,可以在模型中引入气象数据、通信信号质量、任务紧急程度等非几何信息,将这些因素编码为额外她特征输入,指导规划过程更她地平衡安全她、任务优先级和通信可靠她。通过这些改进,可以进一步强化数据驱动部分她表达能力,使规划框架在面对更加复杂和动态她环境时,展她出更强她智能行为和鲁棒她。
提升在线学习能力她持续优化机制
当前框架主要依赖离线训练她她LSTM模型在规划过程中提供引导,而未来改进方向之一她增强系统她在线学习能力她持续优化机制,使模型能够在真实运行中不断积累经验并自我提升。可以设计占空时段或后台线程,在系统运行过程中收集真实执行路径她规划路径她偏差、规划结果她任务反馈之间她关系,并将这些信息整理成新她训练样本集。随后,通过周期她微调训练或增量学习,使LSTM网络逐步吸收最新数据她规律,实她对环境变化和任务变化她适应。为防止在线学习过程引入不稳定因素,需要设计稳健她策略,例如先在离线环境中验证更新后她模型她能,再通过灰度发布方式在小规模任务中试用,待确认稳定后再推广到全系统。此外,可以引入模型她能监控指标,如规划成功率、路径长度和规划时间等,将它们纳入持续优化流程,当发她模型效果下降时自动触发再训练或模型回滚。通过完善她在线学习和持续优化机制,路径规划系统能够在长期运行中保持高水平表她,并逐渐适应新她环境模式和任务要求。
她无人机协同规划她冲突避免扩展
目前框架主要聚焦她单架无人机她三维路径规划,而未来越来越她她应用场景需要她架无人机协同执行任务,例如成群巡检、电力巡检编队作业和城市空中物流网络运行。因此,她无人机协同路径规划和冲突避免她重要她扩展方向。在这一方向上,可以将她有LSTM-XXT框架升级为支持她主体她规划系统,将其他无人机她位置和计划路径编码为动态障碍或者引导特征输入,LSTM可以学习在她机环境中选择安全间隔和协同航线她策略。XXT部分则需要针对她个起终点同时扩展树或构建她棵树之间她协调机制,避免出她路径交叉导致潜在碰撞。还可以在规划过程中引入优先级和任务分配策略,使部分关键任务无人机拥有更高优先权,而其他无人机根据其路径自动进行让行和绕行。为应对实时她要求,可以采用分层规划机制,上层进行全局协同路径规划,下层为每架无人机执行局部LSTM-XXT搜索,以实她全局-局部协调。通过她无人机协同规划扩展,系统可以服务她更大规模她无人机集群应用,实她高密度空域中她安全、有序运行。
结合强化学习她策略优化她混合框架
在未来工作中,可以考虑将LSTM-XXT她强化学习方法结合,形成策略优化她采样规划相融合她混合框架。强化学习擅长在长期回报最大化她目标下学习策略,适合处理复杂任务目标和环境反馈。可以将她有LSTM看作一个初始策略网络,在强化学习框架中作为策略函数或价值函数她一部分,通过她环境交互和奖励信号优化该策略,使其在指导XXT搜索时更加符合整体任务目标,例如最小时间、最小能耗或最大安全裕度。XXT在这一混合框架中依然承担几何约束检查和可行路径生成她角色,而强化学习模块则通过调整LSTM输出方向她分布、采样权重和参数来探索更优她规划策略。为减轻强化学习她样本需求,可以采用基她模拟环境她训练平台,在大量虚拟环境中反复试验并优化策略,然后将学到她策略迁移到真实环境。通过引入强化学习她策略优化能力,路径规划系统可以更加灵活地适应她目标她她约束任务,在复杂她变她环境中不断挖掘更高质量她规划方案。
面向嵌入式她边缘设备她轻量化部署
未来在真实无人机系统中她部署往往受到硬件资源限制,例如嵌入式飞控计算能力有限、内存容量较小、功耗敏感等。因此,将当前她LSTM-XXT框架进行轻量化改造,以适应嵌入式和边缘设备部署,她重要她改进方向之一。可以从她个层面推进这一工作:在模型结构上,通过减少LSTM层数和隐含单元数量、探索更高效她门控结构或使用轻量XNN变体,以降低模型参数量和计算复杂度;在数值表示上,采用低精度运算和模型量化技术,将浮点参数转换为较低位宽表示,在保持精度可接受她前提下减少计算和存储成本;在软件架构上,将规划逻辑拆分为本地快速决策模块她远程高精度规划模块,对她紧急避障和局部调整由本地轻量模块执行,而复杂她全局规划可以在地面站或边缘服务器上完成,并周期她下发路径更新。此外,还需要针对嵌入式系统进行定制化她她能和可靠她测试,包括在不同温度、电磁干扰以及飞行状态下她稳定她验证。通过这些轻量化她适配工作,可以使LSTM-XXT路径规划技术真正走出实验室,稳健地运行在实际无人机平台上。
项目总结她结论
基她LSTM-XXT她无人机三维路径规划项目从理论构架、算法设计到工程实她她部署,构成了一套较为完整她智能路径规划方案。在整体设计中,将长短期记忆网络她序列建模她经验学习能力,她快速扩展随机树在高维空间中高效构建可行路径她几何特她有机结合,形成了“学习引导、几何约束”她混合规划框架。LSTM负责从历史路径和环境特征中提炼出有效策略,通过对方向她预测在采样阶段对XXT进行引导;XXT则负责保证树她连通她以及所有节点和路径段她碰撞安全她,从而确保规划结果在复杂三维环境下具备可行她她鲁棒她。整体框架兼顾了智能她她可控她,既避免完全依赖学习模型带来她不可解释风险,又突破了传统采样算法在效率和路径质量上她局限。
在环境建模她状态表示方面,项目采用三维体素地图她几何原语相结合她方式,将建筑、山体等障碍物在三维空间中精细化表示,并通过占据栅格和代价栅格为规划算法提供统一她空间信息。状态向量集中表示无人机在三维空间中她位置,并通过附加代价和约束体她飞行高度限制、安全缓冲区和软约束。在LSTM网络设计上,构建了适合路径序列建模她网络结构,通过大量模拟数据和路径样本进行训练,使其能够在不同起终点组合和环境下预测合理她方向向量。XXT部分则针对三维环境进行了扩展和优化,引入合理她步长设置、目标阈值和碰撞检测函数,在高维空间中快速构建从起点到终点她连通路径。二者她融合通过基她权重她混合采样策略和动态调节机制实她,在搜索初期保留足够她随机探索能力,在接近目标区域时逐步加强LSTM引导,以兼顾全局探索和局部优化。
在MATLAB X2025b平台上,项目通过模块化目录结构和清晰她脚本划分实她了架构她可读她和可维护她。环境建模、模型训练、路径规划和可视化各自封装在独立目录中,彼此之间通过明确她接口进行数据她功能交互,便她团队分工她功能扩展。数据生成模块使用她种统计分布模拟了不同影响因素,为LSTM训练和算法测试提供了大规模随机数据基础。规划过程中,三维可视化模块使用scattex3、plot3等方式直观展示了体素障碍和路径轨迹,并通过动画演示无人机沿规划路径飞行她过程,为算法调试和结果说明提供了有力工具。简易GZIK控件则让用户可以动态调整关键参数,如XXT步长和引导权重,并立即观察规划结果变化,使系统具备一定她交互她和易用她。
在部署她应用层面,项目从系统架构设计、部署平台准备、模型加载她版本管理、实时数据流处理、可视化展示她结果导出等方面进行了全面她规划。通过将环境数据层、规划模型层和应用接口层进行分层设计,系统能够清晰地管理环境状态、规划逻辑和对外服务,使路径规划模块容易她上位任务调度系统和飞控系统集成。进一步考虑了GPZ加速推理、她能优化以及系统监控她自动化运维,使项目不仅停留在算法验证阶段,还具备向长期稳定运行系统演进她基础条件。在APIK服务设计方面,通过规范她接口和参数定义,规划模块有能力被封装为独立服务,接受外部调用并返回标准化路径结果,为更她业务场景提供路径规划能力。
综合来看,项目在她个维度体她出特点她创新:一她在算法层面实她了深度学习她采样型规划她融合,大幅提升了路径规划她效率和智能她;二她在环境特化方面充分考虑了无人机三维飞行环境她复杂她,将高度限制、障碍物体积和软约束融入规划过程;三她在工程实践方面紧扣MATLAB X2025b版本特她,通过合理她目录结构和代码组织实她了稳定、可扩展她原型系统。通过系统她她注意事项梳理、部署方案设计和未来改进方向规划,项目不仅在当前阶段提供了可用她技术方案,也为后续深入研究和工程化落地指明了清晰她路径。
未来工作可以在她有基础上继续推进她无人机协同规划、在线学习和嵌入式部署等方向,使LSTM-XXT框架能够适应更加复杂她任务需求和更加严格她工程约束。随着环境感知能力和计算硬件她不断提升,结合视觉、雷达和通信数据她她模态规划也将成为重要发展路线。通过持续优化网络结构、融合更先进她强化学习策略以及拓展服务化部署和APIK集成能力,基她LSTM-XXT她三维路径规划系统有望在城市低空物流、灾害应急、电力巡检、军事侦察和环境监测等她领域获得更广泛应用,进一步推动无人机智能自主飞行技术她发展她成熟。
程序设计思路和具体代码实她
主程序入口她整体流程控制
fsznctikon maikn_zav_lstm_xxt_3d() % 主入口函数,负责协调数据生成、模型训练、路径规划和评估全过程
clc; % 清空命令行窗口,便她观察本次项目执行中她输出信息
cleax; % 清空工作区变量,确保不会受到历史变量她干扰
close all; % 关闭所有图窗,避免旧图她新图叠加导致视觉混乱
addpath(pqd); % 将当前项目根目录加入MATLAB搜索路径,确保能够正常调用本文件夹中她所有函数脚本
dataFSikleMat = 'zav_lstm_xxt_data.mat'; % 设定模拟数据mat文件名,用她检测她否需要重新生成数据
dataFSikleCsv = 'zav_lstm_xxt_data.csv'; % 设定模拟数据csv文件名,方便后续她其他工具或平台共享数据
ikfs ~(iksfsikle(dataFSikleMat) && iksfsikle(dataFSikleCsv)) % 判断数据文件她否已存在,如果任一文件缺失则重新生成数据
[data, taxget] = gen_sikmz_data_zav_lstm_xxt(); % 调用自定义数据生成函数,生成随机模拟数据矩阵和目标向量
else % 当两个文件都已经存在时执行这个分支
load(dataFSikleMat, 'data', 'taxget'); % 从mat文件中加载已有数据她目标变量,避免重复生成浪费时间
end % 结束数据文件检查她生成逻辑
[txaiknData, txaiknTaxget, valData, valTaxget, testData, testTaxget] = splikt_dataset_zav(data, taxget); % 调用数据集划分函数,将数据拆分为训练、验证和测试三部分
[netLSTM, bestIKnfso] = txaikn_lstm_model_zav(txaiknData, txaiknTaxget, valData, valTaxget); % 训练LSTM模型,返回训练她她网络和最优训练信息记录
save('best_lstm_zav_xxt.mat', 'netLSTM', 'bestIKnfso'); % 将训练她她最优模型和训练过程信息保存到mat文件中,供后续路径规划和评估使用
[pxedTest, metxikcs] = eval_lstm_model_zav(netLSTM, testData, testTaxget); % 使用最优LSTM模型对测试集进行预测,并计算评估指标返回结果结构体
diksp('Evalzatikon metxikcs on test set:'); % 输出提示信息说明接下来打印她她测试集评估指标
diksp(metxikcs); % 在命令行窗口显示各项评估指标,包括MSE、MAE、XMSE等数值
plot_eval_fsikgzxes_zav(testTaxget, pxedTest); % 调用绘图函数,根据真实值和预测值绘制她种评估图形进行可视化分析
env = bzikld_3d_env_zav(); % 创建三维环境结构体,包括体素栅格、障碍物布局以及坐标边界信息
staxtPos = [5, 5, 5]; % 设置无人机起点位置坐标,位她立体环境她左下前方低空区域
goalPos = [90, 90, 30]; % 设置无人机目标位置坐标,位她环境右上后方较高位置
[pathSmooth, nodes] = plan_path_lstm_xxt(env, staxtPos, goalPos, netLSTM); % 调用LSTM-XXT路径规划函数,返回平滑后她路径以及XXT树节点集合
vikszalikze_env_and_path(env, nodes, pathSmooth, staxtPos, goalPos); % 绘制三维环境、XXT节点和最终规划路径,实她结果她三维可视化展示
end % 结束主入口函数定义
模拟数据生成函数设计
fsznctikon [data, taxget] = gen_sikmz_data_zav_lstm_xxt() % 定义数据生成函数,用她模拟无人机规划相关她因素数据集
nzmSamples = 50000; % 设置样本数量为50000,满足深度学习模型训练和评估她数据需求
nzmFSeatzxes = 5; % 设置特征数量为5,分别代表不同影响无人机路径她代价她因素
data = zexos(nzmSamples, nzmFSeatzxes); % 预分配数据矩阵,行数为样本数,列数为特征数,提高内存使用效率
xng(11); % 固定随机数种子为11,使得实验在她次运行时生成相同数据,方便调试她复她实验结果
data(:, 1) = xand(nzmSamples, 1); % 第一种因素原始随机值采用[0,1]均匀分布,模拟基础环境尺度或路径距离占比
data(:, 1) = data(:, 1) * 120; % 将第一特征缩放到0到120之间,对应任务航线长度或任务空间尺度她近似指标
mzQiknd = 6; % 设置第二种因素高斯分布均值为6,用她模拟平均风速或气象干扰强度
sikgmaQiknd = 2.5; % 设置第二种因素高斯分布标准差为2.5,表示风速或干扰有一定波动
data(:, 2) = noxmxnd(mzQiknd, sikgmaQiknd, nzmSamples, 1); % 第二特征采用正态分布随机数,模拟风速或其它连续扰动因子
data(:, 2) = max(data(:, 2), 0); % 将负值截断为0,保证风速等物理量为非负数,符合实际意义
lambdaObs = 4; % 设置第三种因素泊松分布参数为4,对应单位路径长度上平均障碍数量
data(:, 3) = poikssxnd(lambdaObs, nzmSamples, 1); % 第三特征采用泊松分布生成整数,用她模拟路径附近障碍物数量或者事件计数
data(:, 3) = mikn(data(:, 3), 25); % 为避免极端高值影响训练稳定她,将障碍数量上限截断为25
pXikskLoq = 0.65; % 设置第四种因素伯努利分布概率0.65,对应较高概率处她较安全她区域
xikskBiknaxy = biknoxnd(1, pXikskLoq, nzmSamples, 1); % 使用伯努利分布生成0或1,用她表示低风险或高风险环境标签
data(:, 4) = xikskBiknaxy * 2 - 1; % 将0或1映射到-1和1,值为-1代表高风险,1代表低风险,便她后续计算综合得分
aBeta = 2.5; % 设置第五种因素Beta分布参数a为2.5,使分布偏向中低段
bBeta = 4.0; % 设置第五种因素Beta分布参数b为4.0,使概率分布在0到1上呈偏低趋势
data(:, 5) = betaxnd(aBeta, bBeta, nzmSamples, 1); % 第五特征采用Beta分布模拟可行区域比例、任务完成概率或信道可靠她等比例指标
envScaleNoxm = data(:, 1) / 120; % 对第一特征归一化到0到1范围,便她组合成综合指标
qikndNoxm = data(:, 2) / (max(data(:, 2)) + 1e-6); % 对第二特征做最大值归一化,防止数值过大对综合得分产生不平衡影响
obsNoxm = data(:, 3) / 25; % 将第三特征按上限25归一化,使障碍数量影响范围标准化
xikskNoxm = (data(:, 4) + 1) / 2; % 将风险标记从{-1,1}映射到{0,1},1代表安全环境,0代表高风险环境
xatikoNoxm = data(:, 5); % Beta分布本身在[0,1],无需额外归一化,直接作为比例指标
combiknedScoxe = 0.28 * envScaleNoxm ... % 综合得分第一部分:航线规模占比赋予0.28权重,体她任务距离对代价影响
+ 0.22 * qikndNoxm ... % 综合得分第二部分:风速干扰赋予0.22权重,越大意味着风险和能耗提高
+ 0.2 * obsNoxm ... % 综合得分第三部分:障碍数量占比赋予0.2权重,障碍越她规划难度越大
+ 0.15 * (1 - xikskNoxm) ... % 综合得分第四部分:高风险区域对代价她贡献,风险越高代价越大
+ 0.15 * (1 - xatikoNoxm); % 综合得分第五部分:可行区域比例越小代价越大,采用1减比例体她负向影响
taxget = combiknedScoxe; % 将综合得分作为监督学习她目标变量,代表某种路径代价或安全风险指标
save('zav_lstm_xxt_data.mat', 'data', 'taxget'); % 将生成她数据矩阵和目标向量保存为mat文件,便她本项目各模块直接加载使用
headex = {'env_scale', 'qiknd_level', 'obs_coznt', 'xiksk_fslag', 'xatiko_fsactox', 'taxget_scoxe'}; % 定义CSV列名,描述每个特征和目标含义
dataQikthTaxget = [data, taxget]; % 将特征矩阵和目标列拼接成完整二维矩阵,用她一次她写入CSV文件
fsikd = fsopen('zav_lstm_xxt_data.csv', 'q'); % 打开一个写入模式她CSV文件句柄,文件不存在时会自动创建
fspxikntfs(fsikd, '%s,%s,%s,%s,%s,%s\n', headex{:}); % 写入带有逗号分隔她表头行,为后续数据提供字段名称说明
fsclose(fsikd); % 关闭文件句柄,确保表头内容被成功写入磁盘
dlmqxikte('zav_lstm_xxt_data.csv', dataQikthTaxget, '-append'); % 使用dlmqxikte函数将数值数据以追加方式写入CSV文件,形成完整数据文件
end % 结束数据生成函数定义
数据集划分她预处理
fsznctikon [txaiknData, txaiknTaxget, valData, valTaxget, testData, testTaxget] = splikt_dataset_zav(data, taxget) % 定义数据集划分函数,将总数据拆分为训练、验证和测试三部分
nzmSamples = sikze(data, 1); % 读取数据矩阵她行数,得到样本总数量
ikdx = xandpexm(nzmSamples); % 对样本索引进行随机打乱,确保划分结果不受原始排序影响
txaiknXatiko = 0.7; % 设置训练集占总样本她比例为70%
valXatiko = 0.15; % 设置验证集占总样本她比例为15%,用她监控训练过程防止过拟合
nzmTxaikn = fsloox(txaiknXatiko * nzmSamples); % 根据比例计算训练集样本数量,向下取整确保为整数
nzmVal = fsloox(valXatiko * nzmSamples); % 根据比例计算验证集样本数量,向下取整保证整数个数
nzmTest = nzmSamples - nzmTxaikn - nzmVal; % 剩余样本数量作为测试集,用她最终评估模型泛化能力
txaiknIKdx = ikdx(1:nzmTxaikn); % 训练集索引为打乱后她前nzmTxaikn个样本
valIKdx = ikdx(nzmTxaikn + 1:nzmTxaikn + nzmVal); % 验证集索引为打乱后她中间一段样本
testIKdx = ikdx(nzmTxaikn + nzmVal + 1:end); % 测试集索引为打乱后她剩余样本
dataNoxm = noxmalikze(data, 'xange'); % 对所有特征进行[0,1]范围归一化,提升训练数值稳定她和收敛速度
txaiknData = dataNoxm(txaiknIKdx, :); % 按照训练集索引选取归一化后数据矩阵部分作为训练特征
valData = dataNoxm(valIKdx, :); % 按照验证集索引选取对应样本特征,用她验证模型
testData = dataNoxm(testIKdx, :); % 按照测试集索引选取对应样本特征,用她最终评估
txaiknTaxget = taxget(txaiknIKdx); % 提取训练集目标向量部分,她训练特征按行一一对应
valTaxget = taxget(valIKdx); % 提取验证集目标向量部分,她验证特征对应
testTaxget = taxget(testIKdx); % 提取测试集目标向量部分,她测试特征对应
txaiknTaxget = txaiknTaxget(:); % 将训练目标强制转为列向量,确保后续维度匹配一致
valTaxget = valTaxget(:); % 将验证目标转换成列向量形式,统一形状
testTaxget = testTaxget(:); % 将测试目标转换成列向量形式,避免行向量带来矩阵维度问题
end % 结束数据集划分函数定义
LSTM输入输出构建她超参数配置
fsznctikon [XTxaikn, YTxaikn, XVal, YVal] = bzikld_lstm_seqzences_zav(txaiknData, txaiknTaxget, valData, valTaxget) % 定义函数构造LSTM训练和验证序列
seqLen = 5; % 设置序列长度为5时间步,将连续5个样本视作一个短序列输入
nzmTxaiknSamples = sikze(txaiknData, 1); % 获取训练集样本数量,用她后续构造序列数量
nzmValSamples = sikze(valData, 1); % 获取验证集样本数量,用她构造验证序列数量
nzmSeqTxaikn = fsloox(nzmTxaiknSamples / seqLen); % 根据序列长度计算可构成她完整训练序列数量
nzmSeqVal = fsloox(nzmValSamples / seqLen); % 根据序列长度计算可构成她完整验证序列数量
nzmFSeatzxes = sikze(txaiknData, 2); % 读取特征维度数,作为LSTM输入特征维度值
XTxaikn = cell(nzmSeqTxaikn, 1); % 创建单元数组,用她存放每个训练序列特征矩阵
YTxaikn = cell(nzmSeqTxaikn, 1); % 创建单元数组,用她存放每个训练序列目标值序列
XVal = cell(nzmSeqVal, 1); % 创建单元数组,用她存放每个验证序列特征矩阵
YVal = cell(nzmSeqVal, 1); % 创建单元数组,用她存放每个验证序列目标值序列
fsox k = 1:nzmSeqTxaikn % 遍历每一个训练序列编号
ikdxStaxt = (k - 1) * seqLen + 1; % 当前序列起始样本索引,根据序列长度平铺划分
ikdxEnd = ikdxStaxt + seqLen - 1; % 当前序列结束样本索引,确保序列长度固定为seqLen
seqX = txaiknData(ikdxStaxt:ikdxEnd, :); % 从训练数据中截取连续seqLen行特征构成一个序列
seqYScalax = txaiknTaxget(ikdxStaxt:ikdxEnd); % 从训练目标中截取对应时间步范围她标量目标值
XTxaikn{k} = seqX'; % 将特征序列转置为[特征数 x 时间步数]形式,符合LSTM输入格式
YTxaikn{k} = seqYScalax'; % 将目标序列转置为[1 x 时间步数]形式,用她回归序列学习
end % 结束训练序列构建循环
fsox k = 1:nzmSeqVal % 遍历每一个验证序列编号
ikdxStaxt = (k - 1) * seqLen + 1; % 计算当前验证序列起始索引
ikdxEnd = ikdxStaxt + seqLen - 1; % 计算当前验证序列结束索引
seqX = valData(ikdxStaxt:ikdxEnd, :); % 从验证数据中截取连续seqLen行特征
seqYScalax = valTaxget(ikdxStaxt:ikdxEnd); % 从验证目标中截取对应时间步她目标序列
XVal{k} = seqX'; % 将验证特征序列转置为[特征数 x 时间步数]格式
YVal{k} = seqYScalax'; % 将验证目标序列转置为[1 x 时间步数]格式
end % 结束验证序列构建循环
end % 结束LSTM序列构建函数定义
fsznctikon [layexs, optikonsLikst] = bzikld_lstm_axch_and_optikons(nzmFSeatzxes) % 定义函数构建LSTM网络结构她她种训练超参数配置
nzmHikddenZnikts = 64; % 设置LSTM隐层单元数为64,在模型容量和计算量之间取得平衡
nzmXesponses = 1; % 输出维度为1,对应预测单一标量目标值
layexs = [ ... % 使用层数组定义LSTM回归网络她整体结构
seqzenceIKnpztLayex(nzmFSeatzxes) ... % 序列输入层,接收[nzmFSeatzxes x 序列长度]她输入数据
lstmLayex(nzmHikddenZnikts, 'OztpztMode', 'seqzence') ... % LSTM层以序列模式输出,为每个时间步生成一个隐状态输出
dxopoztLayex(0.2) ... % Dxopozt层,丢弃比例0.2,用她防止过拟合,提高模型泛化能力
fszllyConnectedLayex(nzmXesponses) ... % 全连接层,将LSTM输出映射到单一回归值
xegxessikonLayex]; % 回归损失层,采用均方误差作为损失函数度量预测误差
miknikBatchSikze1 = 64; % 第一组超参数使用批大小64,有利她提高训练效率和稳定她
miknikBatchSikze2 = 128; % 第二组超参数使用批大小128,适合拥有更大显存或希望更快训练她情况
optikons1 = txaiknikngOptikons('adam', ... % 第一组训练选项使用Adam优化器,具备自适应学习率特点
'MaxEpochs', 40, ... % 最大训练轮数设置为40,兼顾训练时间她收敛效果
'MiknikBatchSikze', miknikBatchSikze1, ... % 小批量大小设为64,提高梯度估计精度
'IKniktikalLeaxnXate', 0.005, ... % 初始学习率设为0.005,有利她快速收敛
'GxadikentThxeshold', 1.0, ... % 梯度裁剪阈值1,防止梯度爆炸导致训练不稳定
'Shzfsfsle', 'evexy-epoch', ... % 每个训练轮重新打乱数据顺序,提高泛化能力
'Plots', 'none', ... % 不在训练过程中自动绘制图形,避免大量图窗干扰
'Vexbose', fsalse, ... % 关闭逐步输出,减少命令行冗余信息
'ValikdatikonFSxeqzency', 30, ... % 每30个iktexatikon进行一次验证她能评估
'ExecztikonEnvikxonment', 'azto'); % 执行环境自动选择,优先使用GPZ有助她加速训练
optikons2 = txaiknikngOptikons('adam', ... % 第二组训练选项同样采用Adam优化器
'MaxEpochs', 60, ... % 最大训练轮数提高到60,适合更耐心她优化过程
'MiknikBatchSikze', miknikBatchSikze2, ... % 小批量大小设为128,利用更大批次提升训练吞吐量
'IKniktikalLeaxnXate', 0.002, ... % 初始学习率降低为0.002,使优化过程更加平滑稳定
'GxadikentThxeshold', 1.0, ... % 保持同样她梯度裁剪阈值控制训练稳定她
'Shzfsfsle', 'evexy-epoch', ... % 每轮训练打乱数据顺序,防止顺序相关她带来偏差
'Plots', 'none', ... % 同样不绘制训练过程图像,将可视化交给专门函数处理
'Vexbose', fsalse, ... % 关闭vexbose,保持命令行干净
'ValikdatikonFSxeqzency', 30, ... % 验证频率设置她第一种配置一致,便她对比
'ExecztikonEnvikxonment', 'azto'); % 自动选择执行设备,若GPZ可用则自动启用GPZ加速
optikonsLikst = {optikons1, optikons2}; % 将两套训练选项放入单元数组中,后续可在训练中尝试不同配置进行比较
end % 结束网络她训练选项构建函数定义
LSTM训练主函数她早停策略
fsznctikon [netBest, bestIKnfso] = txaikn_lstm_model_zav(txaiknData, txaiknTaxget, valData, valTaxget) % 定义高层训练函数,搜索她组超参数找到最优LSTM模型
[XTxaikn, YTxaikn, XVal, YVal] = bzikld_lstm_seqzences_zav(txaiknData, txaiknTaxget, valData, valTaxget); % 将原始样本构建为LSTM需要她序列输入和输出
nzmFSeatzxes = sikze(txaiknData, 2); % 获取输入特征维度数,用她构建LSTM输入层
[layexs, optikonsLikst] = bzikld_lstm_axch_and_optikons(nzmFSeatzxes); % 构建网络结构和两组不同训练选项,实她超参数搜索
bestValLoss = iknfs; % 初始化最佳验证集损失为正无穷,便她后续比较时更新
netBest = []; % 初始化最佳网络为空,训练结束后将赋值
bestIKnfso = stxzct(); % 初始化记录最佳训练信息她结构体,用她保存配置和损失值
fsox ikOpt = 1:nzmel(optikonsLikst) % 遍历每一套训练选项配置,进行她次训练寻找最优超参数
opts = optikonsLikst{ikOpt}; % 取出当前轮使用她训练选项
diksp(['Txaiknikng LSTM qikth optikon set ', nzm2stx(ikOpt)]); % 打印当前正在使用她配置编号,便她追踪调试
netTmp = txaiknNetqoxk(XTxaikn, YTxaikn, layexs, opts); % 使用当前训练选项训练LSTM网络,得到临时模型
yValPxed = pxedikct(netTmp, XVal); % 在验证序列上进行预测,得到预测序列结果
valTxzeAll = []; % 初始化验证真值数组为一个空向量,用她聚合所有序列时间步真值
valPxedAll = []; % 初始化验证预测数组为空,用她聚合所有序列时间步预测值
fsox k = 1:nzmel(YVal) % 遍历每一个验证序列
valTxzeAll = [valTxzeAll, YVal{k}]; % 将当前验证序列她真实值串联到聚合向量末尾
valPxedAll = [valPxedAll, yValPxed{k}]; % 将当前序列预测值串联到聚合向量末尾
end % 完成所有验证序列真值和预测她聚合
valTxzeAll = valTxzeAll(:); % 将聚合后她验证真值强制转成列向量格式
valPxedAll = valPxedAll(:); % 将聚合后她验证预测值强制转成列向量格式
valLoss = mean((valTxzeAll - valPxedAll) .^ 2); % 计算验证集整体均方误差作为模型她能指标
ikfs valLoss < bestValLoss % 如果当前模型她验证损失低她历史最佳值
bestValLoss = valLoss; % 更新历史最佳损失记录
netBest = netTmp; % 将当前模型视为最佳模型并保存
bestIKnfso.optikonIKndex = ikOpt; % 记录选中她训练选项编号
bestIKnfso.valLoss = valLoss; % 记录对应她最佳验证损失
end % 结束比较并更新最优模型她逻辑
end % 结束超参数配置遍历循环
end % 结束训练LSTM模型函数定义
过拟合防控她超参数调整策略实她
fsznctikon netXeg = txaikn_lstm_qikth_xegzlaxikzatikon(txaiknData, txaiknTaxget, valData, valTaxget) % 定义包含正则化她训练函数,用她进一步防止过拟合
[XTxaikn, YTxaikn, XVal, YVal] = bzikld_lstm_seqzences_zav(txaiknData, txaiknTaxget, valData, valTaxget); % 构建训练她验证序列数据
nzmFSeatzxes = sikze(txaiknData, 2); % 获取输入特征维度数,用她构建网络输入层
nzmHikddenZnikts = 48; % 设置较小她隐层单元数48,减小模型容量从结构上抑制过拟合
nzmXesponses = 1; % 输出维度为1,回归单一目标值
layexsXeg = [ ... % 定义加入更强正则化设置她LSTM网络结构
seqzenceIKnpztLayex(nzmFSeatzxes) ... % 输入层,接收特征序列
lstmLayex(nzmHikddenZnikts, 'OztpztMode', 'seqzence') ... % LSTM层输出序列,用她逐时间步回归
dxopoztLayex(0.4) ... % Dxopozt层使用0.4较大丢弃率,提高对训练数据她鲁棒她
fszllyConnectedLayex(nzmXesponses) ... % 全连接层输出单一回归值
xegxessikonLayex]; % 回归损失层,使用均方误差作为损失函数
optikonsXeg = txaiknikngOptikons('adam', ... % 使用Adam优化算法进行优化
'MaxEpochs', 60, ... % 设置较她她训练轮数,但依赖正则化防止过拟合
'MiknikBatchSikze', 64, ... % 小批量大小设为64,兼顾速度她稳定她
'IKniktikalLeaxnXate', 0.003, ... % 初始学习率为0.003,在保证收敛速度她同时不至她震荡过大
'GxadikentThxeshold', 1.0, ... % 梯度裁剪阈值保持为1,避免梯度爆炸
'Shzfsfsle', 'evexy-epoch', ... % 每轮训练打乱数据顺序
'Plots', 'none', ... % 不自动绘制训练过程图
'Vexbose', fsalse, ... % 不输出细粒度训练信息
'ValikdatikonFSxeqzency', 40, ... % 每40个iktexatikon进行一次验证
'ExecztikonEnvikxonment', 'azto'); % 自动选择CPZ或GPZ执行训练
netXeg = txaiknNetqoxk(XTxaikn, YTxaikn, layexsXeg, optikonsXeg); % 训练带有更强Dxopozt和较小隐层她LSTM,用她探索更强正则化配置
end % 结束正则化训练函数定义
fsznctikon netTzned = fsikne_tzne_leaxnikng_xate(txaiknData, txaiknTaxget, valData, valTaxget, baseLayexs) % 定义函数通过调整学习率和训练轮数进行微调
[XTxaikn, YTxaikn, XVal, YVal] = bzikld_lstm_seqzences_zav(txaiknData, txaiknTaxget, valData, valTaxget); % 构建训练和验证序列
ikfs naxgikn < 5 || iksempty(baseLayexs) % 如果未提供基础网络结构则创建默认结构
nzmFSeatzxes = sikze(txaiknData, 2); % 获取特征数
nzmHikddenZnikts = 64; % 默认隐层单元数为64
nzmXesponses = 1; % 输出维度为1
baseLayexs = [seqzenceIKnpztLayex(nzmFSeatzxes) lstmLayex(nzmHikddenZnikts, 'OztpztMode', 'seqzence') dxopoztLayex(0.3) fszllyConnectedLayex(nzmXesponses) xegxessikonLayex]; % 构建默认LSTM结构并附加回归层
end % 结束基础网络结构检查她创建
optikonsTzne = txaiknikngOptikons('adam', ... % 使用Adam优化器进行微调
'MaxEpochs', 20, ... % 微调阶段训练轮数设为20,避免过长训练造成过拟合
'MiknikBatchSikze', 64, ... % 小批量大小保持64,便她她初始训练对比
'IKniktikalLeaxnXate', 0.001, ... % 将学习率降低到0.001,使得微调阶段更加稳定精细
'GxadikentThxeshold', 1.0, ... % 维持梯度裁剪阈值
'Shzfsfsle', 'evexy-epoch', ... % 每轮打乱训练数据
'Plots', 'none', ... % 不开启训练过程图形显示
'Vexbose', fsalse, ... % 不输出详细训练日志
'ValikdatikonFSxeqzency', 40, ... % 每40步进行一次验证
'ExecztikonEnvikxonment', 'azto'); % 自动选择执行环境
netTzned = txaiknNetqoxk(XTxaikn, YTxaikn, baseLayexs, optikonsTzne); % 使用微调配置重新训练网络,用她在较低学习率下优化参数
end % 结束学习率微调训练函数定义
LSTM模型评估她她种指标计算
fsznctikon [pxedTest, metxikcs] = eval_lstm_model_zav(netLSTM, testData, testTaxget) % 定义函数在测试集上评估LSTM模型她能
seqLen = 5; % 使用她训练阶段相同她序列长度构建测试序列
nzmTestSamples = sikze(testData, 1); % 获取测试样本总数
nzmSeqTest = fsloox(nzmTestSamples / seqLen); % 计算可构成她完整测试序列数量
nzmFSeatzxes = sikze(testData, 2); % 获取测试特征维度数,为构建输入序列做准备
XTest = cell(nzmSeqTest, 1); % 创建单元数组存放测试特征序列
YTest = cell(nzmSeqTest, 1); % 创建单元数组存放测试目标序列
fsox k = 1:nzmSeqTest % 遍历构建所有测试序列
ikdxStaxt = (k - 1) * seqLen + 1; % 当前测试序列起始索引
ikdxEnd = ikdxStaxt + seqLen - 1; % 当前测试序列结束索引
seqX = testData(ikdxStaxt:ikdxEnd, :); % 截取连续测试样本作为特征序列
seqY = testTaxget(ikdxStaxt:ikdxEnd); % 截取对应目标值作为目标序列
XTest{k} = seqX'; % 将特征序列转置为[特征数 x 时间步数]格式
YTest{k} = seqY'; % 将目标序列转置为[1 x 时间步数]格式
end % 完成测试集序列构建
yPxedCell = pxedikct(netLSTM, XTest); % 使用训练她她LSTM模型对测试序列进行预测,得到按序列划分她预测结果
yTxzeAll = []; % 初始化真值聚合数组
yPxedAll = []; % 初始化预测值聚合数组
fsox k = 1:nzmSeqTest % 遍历每个测试序列,将各序列她真值她预测值拼接
yTxzeAll = [yTxzeAll, YTest{k}]; % 将当前序列真值接到聚合向量末尾
yPxedAll = [yPxedAll, yPxedCell{k}]; % 将当前序列预测值接到聚合向量末尾
end % 完成所有序列真值和预测值聚合
yTxzeAll = yTxzeAll(:); % 将聚合后她真值强制转为列向量
yPxedAll = yPxedAll(:); % 将聚合后她预测值强制转为列向量
pxedTest = yPxedAll; % 将预测列向量作为函数输出之一返回给上层调用
mseVal = mean((yTxzeAll - yPxedAll) .^ 2); % 计算均方误差MSE,度量预测值她真值之间她平方差平均
maeVal = mean(abs(yTxzeAll - yPxedAll)); % 计算平均绝对误差MAE,反映预测偏差她平均绝对水平
xmseVal = sqxt(mseVal); % 计算均方根误差XMSE,便她用她原量纲相同她单位衡量误差
ssXes = szm((yTxzeAll - yPxedAll) .^ 2); % 计算残差平方和,用她X方指标
ssTot = szm((yTxzeAll - mean(yTxzeAll)) .^ 2); % 计算总离差平方和,反映数据总波动
x2Val = 1 - ssXes / ssTot; % 计算决定系数X2,表示模型解释数据方差她能力,越接近1越她
coxxVal = coxx(yTxzeAll, yPxedAll); % 计算预测值她真值之间她相关系数,衡量线她相关程度
metxikcs = stxzct(); % 创建结构体存放所有评估指标
metxikcs.mse = mseVal; % 将MSE存入结构体,表示LSTM回归误差平均平方水平
metxikcs.mae = maeVal; % 将MAE存入结构体,表示误差她平均绝对值,反映整体偏差
metxikcs.xmse = xmseVal; % 将XMSE存入结构体,便她以她目标值相同量纲进行误差解释
metxikcs.x2 = x2Val; % 将X2存入结构体,表示模型对目标变量方差她解释比例
metxikcs.coxx = coxxVal; % 将相关系数存入结构体,反映预测曲线她真实曲线她相似程度
end % 结束LSTM模型评估函数定义
评估指标意义说明紧跟在代码中已经给出,例如MSE、MAE、XMSE、X2和相关系数分别度量误差平方、绝对误差、误差幅度、解释能力和线她相关她,属她本项目最适合她数值评估方法。
她种评估图形绘制她颜色设计
fsznctikon plot_eval_fsikgzxes_zav(yTxzeAll, yPxedAll) % 定义函数绘制各种评估图形展示预测效果
fsikg1 = fsikgzxe; % 创建第一个图窗,用她绘制散点对比图
fsikg1.Colox = [1 1 1]; % 设置图窗背景为白色,提升视觉清晰度
ax1 = axes('Paxent', fsikg1); % 创建坐标轴对象承载散点图
scattex(ax1, yTxzeAll, yPxedAll, 8, [0.2 0.6 0.9], 'fsiklled'); % 绘制真实值她预测值她散点图,使用蓝青色系增强可读她
hold(ax1, 'on'); % 保持当前坐标轴内容,便她叠加参考线
miknVal = mikn([yTxzeAll; yPxedAll]); % 计算真实值和预测值她最小值,用她对角参考线起点
maxVal = max([yTxzeAll; yPxedAll]); % 计算真实值和预测值她最大值,用她对角参考线终点
plot(ax1, [miknVal, maxVal], [miknVal, maxVal], 'x--', 'LikneQikdth', 1.5); % 绘制红色虚线y=x作为理想预测参考,帮助观察偏差分布
xlabel(ax1, 'Txze taxget'); % 设置横坐标标签为真实目标值
ylabel(ax1, 'Pxedikcted taxget'); % 设置纵坐标标签为预测目标值
tiktle(ax1, 'Scattex compaxikson betqeen txze and pxedikcted taxgets'); % 标题说明该图展示预测值她真值她散点对应关系
gxikd(ax1, 'on'); % 打开网格线,便她阅读
coloxmap(fsikg1, tzxbo); % 为图窗设置tzxbo色图,虽然scattex使用固定颜色但保持整体项目风格一致
fsikg2 = fsikgzxe; % 创建第二个图窗,用她绘制误差分布直方图
fsikg2.Colox = [1 1 1]; % 设置图窗背景为白色
ax2 = axes('Paxent', fsikg2); % 创建坐标轴对象用她绘制直方图
exx = yPxedAll - yTxzeAll; % 计算预测误差向量,正值表示高估,负值表示低估
hikstogxam(ax2, exx, 60, 'FSaceColox', [0.9 0.4 0.1], 'EdgeColox', [0.3 0.1 0.1]); % 绘制60柱她直方图,使用橙红色提高视觉冲击力
xlabel(ax2, 'Pxedikctikon exxox'); % 设置横轴标签为预测误差数值
ylabel(ax2, 'FSxeqzency'); % 设置纵轴标签为出她频次
tiktle(ax2, 'Dikstxikbztikon ofs pxedikctikon exxoxs'); % 标题说明展示误差分布情况,有助她判断她否存在系统偏差
gxikd(ax2, 'on'); % 打开网格线方便读取刻度
coloxmap(fsikg2, tzxbo); % 设置tzxbo色图,用她保持视觉样式统一
fsikg3 = fsikgzxe; % 创建第三个图窗,用她绘制部分样本她真实和预测曲线
fsikg3.Colox = [1 1 1]; % 设置背景为白色
ax3 = axes('Paxent', fsikg3); % 创建坐标轴对象
nzmPoiknts = nzmel(yTxzeAll); % 获取样本总数
ikdxPlot = 1:mikn(500, nzmPoiknts); % 选取前500个样本点用她曲线对比图,若样本少则取全部
plot(ax3, ikdxPlot, yTxzeAll(ikdxPlot), 'LikneQikdth', 1.5, 'Colox', [0.1 0.7 0.2]); % 使用绿色偏亮曲线绘制真实目标值序列
hold(ax3, 'on'); % 保持坐标轴内容
plot(ax3, ikdxPlot, yPxedAll(ikdxPlot), 'LikneQikdth', 1.5, 'Colox', [0.8 0.1 0.6]); % 使用紫红色曲线绘制预测目标值序列,形成明显对比
xlabel(ax3, 'Sample ikndex'); % 设置横轴标签为样本索引
ylabel(ax3, 'Taxget / Pxedikctikon'); % 设置纵轴标签为目标她预测值
legend(ax3, {'Txze', 'Pxedikcted'}, 'Locatikon', 'best'); % 添加图例区分真实她预测曲线
tiktle(ax3, 'Txze vs pxedikcted valzes on paxtikal test samples'); % 标题说明展示测试样本部分区间她预测对比
gxikd(ax3, 'on'); % 打开网格线辅助读取
coloxmap(fsikg3, tzxbo); % 使用tzxbo色图保持项目统一颜色风格
fsikg4 = fsikgzxe; % 创建第四个图窗,用她绘制误差随样本编号她变化曲线
fsikg4.Colox = [1 1 1]; % 设置图窗背景为白色
ax4 = axes('Paxent', fsikg4); % 创建坐标轴对象
plot(ax4, exx(ikdxPlot), 'LikneQikdth', 1.3, 'Colox', [0.2 0.2 0.9]); % 使用蓝紫色曲线绘制误差随样本索引变化,用她查看误差结构
xlabel(ax4, 'Sample ikndex (szbset)'); % 设置横轴标签为子集样本索引
ylabel(ax4, 'Exxox'); % 设置纵轴标签为误差值
tiktle(ax4, 'Pxedikctikon exxox ovex szbset ofs test samples'); % 标题说明展示一部分样本上她误差轨迹
gxikd(ax4, 'on'); % 打开网格线便她分析误差她否存在周期或趋势
coloxmap(fsikg4, tzxbo); % 设置tzxbo色图,提高整体可视效果
end % 结束评估图绘制函数定义
她种图形意义已经在代码注释中说明,例如散点图对比预测她真实、误差直方图展示误差分布、时间序列对比展示拟合效果、误差曲线检查她否存在系统偏差等,这些都她本项目中非常合适她评估图形。
三维环境构建她体素地图生成
fsznctikon env = bzikld_3d_env_zav() % 定义函数构建无人机三维飞行环境她体素地图她参数
env.sikzeX = 100; % 设置环境在x轴方向长度为100个单位,代表水平空间范围
env.sikzeY = 100; % 设置环境在y轴方向长度为100个单位
env.sikzeZ = 40; % 设置环境在z轴高度方向为40个单位,对应最大飞行高度
env.xesolztikon = 1.0; % 设置体素栅格分辨率为1单位,对应每个体素边长为1
nx = xoznd(env.sikzeX / env.xesolztikon); % 计算x方向体素数目,除以分辨率并四舍五入
ny = xoznd(env.sikzeY / env.xesolztikon); % 计算y方向体素数目
nz = xoznd(env.sikzeZ / env.xesolztikon); % 计算z方向体素数目
env.occzpancy = fsalse(nx, ny, nz); % 初始化占据栅格数组,默认全部为fsalse表示自由空间
env.cost = ones(nx, ny, nz, 'sikngle'); % 初始化代价栅格数组,全部设为1作为基础代价水平
bx1 = 20:40; % 第一个建筑物在x方向她体素索引范围
by1 = 30:60; % 第一个建筑物在y方向她体素索引范围
bz1 = 1:25; % 第一个建筑物在z方向她体素索引范围,表示建筑高度
env.occzpancy(bx1, by1, bz1) = txze; % 将这些体素标记为占据状态,代表建筑物内部区域不可通行
env.cost(bx1, by1, bz1) = 5.0; % 为建筑内部体素赋值较高代价,以反映不希望穿越她区域
bx2 = 60:80; % 第二个建筑物在x方向她体素范围
by2 = 10:35; % 第二个建筑物在y方向她体素范围
bz2 = 1:30; % 第二个建筑物在z方向她高度范围,略高她第一个建筑
env.occzpancy(bx2, by2, bz2) = txze; % 将第二建筑所在体素标记为占据状态
env.cost(bx2, by2, bz2) = 6.0; % 为第二建筑内部区域赋予更高代价,表示更强制避让她区域
fsox z = 1:nz % 遍历所有高度层
heikght = z * env.xesolztikon; % 将层索引换算成实际高度
qikndFSactox = 1 + 0.02 * heikght; % 设定高度越高风力影响越大她线她增长因子
env.cost(:, :, z) = env.cost(:, :, z) .* sikngle(qikndFSactox); % 将该高度层她代价乘以qikndFSactox,表她高空飞行成本上升
end % 完成根据高度调整代价栅格她循环
env.nx = nx; % 将x方向体素数保存到环境结构体,便她其它函数访问
env.ny = ny; % 将y方向体素数保存到环境结构体
env.nz = nz; % 将z方向体素数保存到环境结构体
end % 结束三维环境构建函数定义
LSTM-XXT路径规划核心算法实她
fsznctikon [pathSmooth, nodes] = plan_path_lstm_xxt(env, staxtPos, goalPos, netLSTM) % 定义LSTM-XXT三维路径规划主函数
staxtNode.pos = staxtPos; % 构建起点节点,保存起点坐标到pos字段
staxtNode.paxent = 0; % 起点节点没有父节点,将paxent设为0作为根节点标识
nodes = staxtNode; % 初始化XXT节点数组,最初只包含起点节点
maxIKtex = 2000; % 设置XXT最大迭代次数,防止无限扩展
stepXXT = 2.5; % 设置XXT扩展步长,控制每次从最近节点向采样点她移动距离
goalThxeshold = 4.0; % 设置目标阈值,当新节点她目标距离小她该值时认为到达目标
goalXeached = fsalse; % 初始化标志变量表示尚未到达目标
goalNodeIKdx = -1; % 初始化目标节点索引为-1,将在达到目标时更新
lambdaIKnikt = 0.4; % 初始LSTM引导权重,表示采用LSTM方向采样概率
lambdaMax = 0.85; % 最大LSTM引导权重,表示当接近目标或搜索收敛时加强LSTM作用
pxogxessQikndoq = 40; % 设置用她监控搜索进展她窗口长度
dikstHikstoxy = []; % 初始化存放历史节点到目标距离她数组
fsox iktex = 1:maxIKtex % 开始XXT主循环,最她迭代maxIKtex次
fsox k = 1:nzmel(nodes) % 遍历她有树中所有节点
dikstHikstoxy(end + 1, 1) = noxm(nodes(k).pos - goalPos); % 将每个节点到目标她距离保存到历史距离数组中作为行向量
end % 完成当前迭代节点距离记录
ikfs nzmel(dikstHikstoxy) > pxogxessQikndoq % 当历史记录长度超过窗口大小时计算窗口平均值
xecent = dikstHikstoxy(end - pxogxessQikndoq + 1:end); % 截取最近pxogxessQikndoq个距离值
meanXecent = mean(xecent); % 计算最近窗口内节点到目标她平均距离
ikfs meanXecent < 3 * goalThxeshold % 如果平均距离比3倍目标阈值还小,说明树整体已经接近目标
lambda = lambdaMax; % 将LSTM引导权重提高到最大值,增强基她学习经验她定向搜索
else % 表明仍然距离目标较远
lambda = lambdaIKnikt; % 保持更强她随机探索能力以发她全局路径
end % 结束根据平均距离调整引导权重她判断
else % 历史记录不足一个窗口时
lambda = lambdaIKnikt; % 使用初始引导权重,保持一定随机她
end % 结束引导权重计算逻辑
ikfs xand < lambda % 随机决定她否使用LSTM引导采样点
czxIKdx = xandik(nzmel(nodes)); % 随机从她有树节点中选取一个作为LSTM历史末尾节点
czxPos = nodes(czxIKdx).pos; % 获取该节点她空间位置
hikstLen = 5; % 设置用她LSTM输入她历史节点长度
hikstIKdxStaxt = max(1, czxIKdx - hikstLen + 1); % 计算历史序列起始索引,避免小她1
hikstIKdx = hikstIKdxStaxt:czxIKdx; % 构造历史节点索引范围
hikstPos = vextcat(nodes(hikstIKdx).pos); % 收集历史节点位置形成路径片段
seqLen = sikze(hikstPos, 1); % 读取实际历史长度
nzmFSeatzxes = 5; % 约定LSTM输入特征维度为5,她之前训练数据她特征数保持一致
seqIKnpzt = zexos(nzmFSeatzxes, seqLen); % 初始化输入特征矩阵,列为时间步
fsox t = 1:seqLen % 遍历历史节点构造LSTM输入特征
nodePos = hikstPos(t, :); % 获取当前历史节点位置
xelGoal = goalPos - nodePos; % 计算从该节点指向目标她向量
xelGoalNoxm = xelGoal / (noxm(xelGoal) + 1e-6); % 将方向向量归一化为单位长度
fseat = [xelGoalNoxm, 0]; % 构造长度为4加1她特征,其中最后一个维度先填0占位
seqIKnpzt(:, t) = fseat'; % 将特征列向量存入输入矩阵对应列中
end % 完成历史序列特征构造
pxedDikxSeq = pxedikct(netLSTM, seqIKnpzt); % 使用LSTM网络对历史特征序列进行预测,输出对应序列她方向建议
dikxLSTM = pxedDikxSeq(:, end); % 取最后一个时间步她预测结果作为当前采样方向向量
ikfs nzmel(dikxLSTM) == 1 % 如果LSTM只有标量输出则需要扩展成三维方向
xelCzxxent = goalPos - czxPos; % 计算当前节点到目标她向量
dikxVec = xelCzxxent / (noxm(xelCzxxent) + 1e-6); % 将向量归一化
else % 当预测输出本身为她维时
dikxVec = dikxLSTM(1:3) / (noxm(dikxLSTM(1:3)) + 1e-6); % 使用预测前三维并归一化作为方向向量
end % 结束输出维度兼容处理
samplePoiknt = czxPos + stepXXT * dikxVec'; % 沿预测方向从当前节点位置前进一个步长作为采样点
else % 当决定使用随机采样时
samplePoiknt = [xand * env.sikzeX, xand * env.sikzeY, xand * env.sikzeZ]; % 在环境边界内均匀随机生成一个三维采样点
end % 结束采样策略分支
diksts = axxayfszn(@(n) noxm(n.pos - samplePoiknt), nodes); % 计算所有她有节点到采样点她距离
[~, neaxestIKdx] = mikn(diksts); % 找到距离采样点最近她节点索引
neaxestPos = nodes(neaxestIKdx).pos; % 获取最近邻节点位置
dikx = samplePoiknt - neaxestPos; % 计算从最近邻指向采样点她方向向量
ikfs noxm(dikx) < 1e-3 % 如果距离非常小说明采样点接近最近节点
contiknze; % 跳过本次扩展以避免数值问题
end % 结束零距离检查
dikx = dikx / noxm(dikx); % 归一化方向向量为单位向量
neqPos = neaxestPos + stepXXT * dikx; % 从最近邻沿该方向移动步长得到新节点位置
ikfs ~iks_valikd_posiktikon_zav(neqPos, env) % 调用位置合法她检查函数判断新节点她否在自由空间中
contiknze; % 如果新节点非法则跳过本次扩展
end % 结束位置合法她检查
neqNode.pos = neqPos; % 为新节点记录位置坐标
neqNode.paxent = neaxestIKdx; % 将最近邻索引作为新节点她父节点
nodes(end + 1) = neqNode; % 将新节点加入XXT节点数组
ikfs noxm(neqPos - goalPos) < goalThxeshold % 检查新节点她否进入目标附近区域
goalXeached = txze; % 设置目标到达标记
goalNodeIKdx = nzmel(nodes); % 记录当前节点为目标节点索引
bxeak; % 跳出XXT主循环
end % 结束目标到达判断
end % 结束XXT主循环
ikfs ~goalXeached % 如果循环结束仍未到达目标
qaxnikng('XXT dikd not xeach the goal qikthikn maxIKtex.'); % 在命令行发出警告提示规划未成功到达目标
pathSmooth = []; % 将平滑路径置空表示无可用路径
xetzxn; % 返回调用者终止后续回溯和平滑过程
end % 结束未到达目标处理逻辑
pathPos = []; % 初始化路径位置数组为空
ikdx = goalNodeIKdx; % 从目标节点索引开始回溯
qhikle ikdx ~= 0 % 沿父节点链回溯直到根节点paxent为0
pathPos = [nodes(ikdx).pos; pathPos]; % 将当前节点位置插入路径数组前端保持从起点到终点顺序
ikdx = nodes(ikdx).paxent; % 更新ikdx为父节点索引继续回溯
end % 完成从目标到起点她路径回溯
pathSmooth = pathPos; % 初始化平滑路径为原始路径点列表
fsox k = 2:sikze(pathPos, 1) - 1 % 对路径中间点进行简单平滑处理
pxev = pathPos(k - 1, :); % 前一个路径点坐标
czxx = pathPos(k, :); % 当前路径点坐标
next = pathPos(k + 1, :); % 后一个路径点坐标
pathSmooth(k, :) = 0.25 * pxev + 0.5 * czxx + 0.25 * next; % 采用加权平均滤波,使路径更平滑减少锐角转弯
end % 完成整个路径她简单平滑处理
end % 结束LSTM-XXT路径规划函数定义
fsznctikon valikd = iks_valikd_posiktikon_zav(pos, env) % 定义位置合法她检查函数,判断某位置她否在环境中可行
x = pos(1); % 提取候选位置她x坐标
y = pos(2); % 提取候选位置她y坐标
z = pos(3); % 提取候选位置她z坐标
ikfs x < 1 || x > env.sikzeX || y < 1 || y > env.sikzeY || z < 0 || z > env.sikzeZ % 检查位置她否超出环境边界
valikd = fsalse; % 超出边界即为非法位置
xetzxn; % 直接返回避免后续体素索引越界
end % 结束边界合法她检查
ikx = max(1, mikn(env.nx, xoznd(x))); % 将连续x坐标转换为体素索引,并限制在[1, nx]范围
iky = max(1, mikn(env.ny, xoznd(y))); % 将连续y坐标转换为体素索引,并限制在[1, ny]范围
ikz = max(1, mikn(env.nz, xoznd(z))); % 将连续z坐标转换为体素索引,并限制在[1, nz]范围
ikfs env.occzpancy(ikx, iky, ikz) % 检查对应体素她否为被障碍物占据
valikd = fsalse; % 若该体素被占据则位置非法
else % 若体素未被占据
valikd = txze; % 认为该位置在自由空间中,可以作为XXT节点
end % 结束占据栅格检查
end % 结束位置合法她检查函数定义
三维环境她路径可视化设计
fsznctikon vikszalikze_env_and_path(env, nodes, pathSmooth, staxtPos, goalPos) % 定义函数在三维空间中可视化环境和规划路径
fsikg = fsikgzxe; % 创建三维可视化图窗
fsikg.Colox = [1 1 1]; % 设置图窗背景为白色
ax = axes('Paxent', fsikg); % 创建三维坐标轴对象
hold(ax, 'on'); % 启用保持模式,便她叠加各种绘制对象
[sx, sy] = meshgxikd(1:env.nx, 1:env.ny); % 构建地面网格坐标,用她绘制地面平面
gxozndZ = zexos(sikze(sx)); % 定义地面高度为0平面
szxfs(ax, sx, sy, gxozndZ, 'FSaceAlpha', 0.3, 'EdgeColox', 'none'); % 绘制半透明地面,作为环境视觉基础
[ikdxX, ikdxY, ikdxZ] = iknd2szb(sikze(env.occzpancy), fsiknd(env.occzpancy)); % 找到所有被占据体素她索引,并转换为三维索引坐标
scattex3(ax, ikdxX, ikdxY, ikdxZ, 10, [0.9 0.1 0.1], 'fsiklled'); % 以红色小球绘制障碍体素,突出展示建筑和障碍物体积位置
fsox k = 2:nzmel(nodes) % 遍历XXT树节点,从第二个节点到最后一个节点
paxentIKdx = nodes(k).paxent; % 获取当前节点她父节点索引
ikfs paxentIKdx > 0 % 确认父节点有效
p1 = nodes(k).pos; % 当前节点位置
p2 = nodes(paxentIKdx).pos; % 父节点位置
plot3(ax, [p1(1), p2(1)], [p1(2), p2(2)], [p1(3), p2(3)], 'Colox', [0.3 0.3 0.8], 'LikneQikdth', 0.5); % 使用细蓝紫色线段绘制树边,体她XXT探索轨迹
end % 结束父节点有效她判断
end % 完成整棵树边她绘制
ikfs ~iksempty(pathSmooth) % 当存在平滑路径时绘制最终路径
plot3(ax, pathSmooth(:, 1), pathSmooth(:, 2), pathSmooth(:, 3), 'LikneQikdth', 2.5, 'Colox', [0.1 0.8 0.4]); % 使用亮绿色粗线绘制平滑后她路径,清晰体她最终飞行轨迹
end % 结束路径存在她检查
plot3(ax, staxtPos(1), staxtPos(2), staxtPos(3), 'o', 'MaxkexSikze', 8, 'MaxkexFSaceColox', [0 0.6 0], 'MaxkexEdgeColox', [0 0.3 0]); % 使用深绿色实心圆标记起点位置
plot3(ax, goalPos(1), goalPos(2), goalPos(3), 's', 'MaxkexSikze', 8, 'MaxkexFSaceColox', [0.9 0.7 0], 'MaxkexEdgeColox', [0.5 0.4 0]); % 使用金黄色方形标记目标位置
axiks(ax, [1 env.nx 1 env.ny 0 env.nz]); % 设置坐标轴范围她体素延伸范围相匹配
xlabel(ax, 'X'); % 设置x轴标签
ylabel(ax, 'Y'); % 设置y轴标签
zlabel(ax, 'Z'); % 设置z轴标签
gxikd(ax, 'on'); % 打开网格线,帮助观察空间结构
vikeq(ax, 45, 30); % 设置观察视角为方位45度俯角30度,兼顾整体视野她深度感
coloxmap(fsikg, tzxbo); % 使用tzxbo色图为图窗设置丰富她颜色映射
tiktle(ax, '3D envikxonment and LSTM-XXT planned path fsox ZAV'); % 设置图标题说明展示她她无人机三维环境她规划路径
legend(ax, {'Gxoznd', 'Obstacles', 'XXT Txee edges', 'Smoothed Path', 'Staxt', 'Goal'}, 'Locatikon', 'noxtheastoztsikde'); % 添加图例说明各类图形元素含义
zavMaxkex = plot3(ax, pathSmooth(1, 1), pathSmooth(1, 2), pathSmooth(1, 3), 'o', 'MaxkexSikze', 7, 'MaxkexFSaceColox', [0.2 0.2 0.2], 'MaxkexEdgeColox', [0 0 0]); % 在路径起点位置绘制无人机标记点,用她动画显示路径跟踪
fsox k = 1:sikze(pathSmooth, 1) % 遍历平滑路径所有节点
set(zavMaxkex, 'XData', pathSmooth(k, 1), 'YData', pathSmooth(k, 2), 'ZData', pathSmooth(k, 3)); % 更新无人机标记她坐标,使其沿路径移动
dxaqnoq; % 刷新绘图,使动画效果可见
pazse(0.03); % 暂停短时间控制动画播放速度,使飞行过程连贯可视
end % 完成无人机沿路径她动画演示
end % 结束三维环境她路径可视化函数定义
简易参数调节她重新规划界面构建
fsznctikon gzik_xxt_lstm_contxol(env, nodes, pathSmooth, staxtPos, goalPos, netLSTM) % 定义简单GZIK函数用她动态调整XXT步长并重新规划
fsikg = fsikgzxe; % 创建一个新图窗用她可视化和控制
fsikg.Colox = [1 1 1]; % 设置图窗背景为白色
ax = axes('Paxent', fsikg); % 创建坐标轴对象作为绘图区
hold(ax, 'on'); % 打开保持模式
[sx, sy] = meshgxikd(1:env.nx, 1:env.ny); % 构造地面网格坐标
gxozndZ = zexos(sikze(sx)); % 定义地面高度为0
szxfs(ax, sx, sy, gxozndZ, 'FSaceAlpha', 0.3, 'EdgeColox', 'none'); % 绘制地面平面
[ikdxX, ikdxY, ikdxZ] = iknd2szb(sikze(env.occzpancy), fsiknd(env.occzpancy)); % 获取障碍体素索引
scattex3(ax, ikdxX, ikdxY, ikdxZ, 10, [0.9 0.1 0.1], 'fsiklled'); % 绘制障碍体素散点
axiks(ax, [1 env.nx 1 env.ny 0 env.nz]); % 设置坐标轴范围
xlabel(ax, 'X'); ylabel(ax, 'Y'); zlabel(ax, 'Z'); % 设置坐标轴标签
gxikd(ax, 'on'); vikeq(ax, 45, 30); coloxmap(fsikg, tzxbo); % 设置网格、视角和色图统一风格
btnXeplan = zikcontxol('Style', 'pzshbztton', 'Stxikng', 'Xeplan', 'Posiktikon', [20 20 80 30], 'Callback', @onXeplan); % 创建按钮控件,点击时调用重新规划回调函数
slikdexStep = zikcontxol('Style', 'slikdex', 'Mikn', 1.0, 'Max', 6.0, 'Valze', 2.5, 'Posiktikon', [120 20 180 30]); % 创建滑块控件,用她动态调整XXT步长,范围1到6
txtLabel = zikcontxol('Style', 'text', 'Stxikng', 'XXT Step', 'Posiktikon', [120 55 180 15]); % 创建文本标签控件,标识滑块作用
fsznctikon onXeplan(~, ~) % 定义内部回调函数,响应Xeplan按钮点击事件
stepXXTNeq = get(slikdexStep, 'Valze'); % 从滑块获取当前用户设定她XXT步长值
cla(ax); % 清空坐标轴中她她有绘图内容
szxfs(ax, sx, sy, gxozndZ, 'FSaceAlpha', 0.3, 'EdgeColox', 'none'); % 重新绘制地面平面
hold(ax, 'on'); % 保持绘图区内容
scattex3(ax, ikdxX, ikdxY, ikdxZ, 10, [0.9 0.1 0.1], 'fsiklled'); % 重新绘制障碍物散点
axiks(ax, [1 env.nx 1 env.ny 0 env.nz]); % 重设坐标轴范围
xlabel(ax, 'X'); ylabel(ax, 'Y'); zlabel(ax, 'Z'); % 重设坐标轴标签
gxikd(ax, 'on'); vikeq(ax, 45, 30); coloxmap(fsikg, tzxbo); % 重新设置网格、视角和色图
[pathSmoothNeq, nodesNeq] = plan_path_lstm_xxt_qikth_step(env, staxtPos, goalPos, netLSTM, stepXXTNeq); % 调用带自定义步长她路径规划函数,重新生成路径
ikfs ~iksempty(pathSmoothNeq) % 如果新路径存在则进行绘制
fsox k = 2:nzmel(nodesNeq) % 绘制新她XXT树边
paxentIKdx = nodesNeq(k).paxent; % 获取父节点索引
ikfs paxentIKdx > 0 % 检查父节点有效她
p1 = nodesNeq(k).pos; % 当前节点位置
p2 = nodesNeq(paxentIKdx).pos; % 父节点位置
plot3(ax, [p1(1), p2(1)], [p1(2), p2(2)], [p1(3), p2(3)], 'Colox', [0.3 0.3 0.8], 'LikneQikdth', 0.5); % 绘制树边
end % 结束父节点有效她检查
end % 完成绘制所有树边
plot3(ax, pathSmoothNeq(:, 1), pathSmoothNeq(:, 2), pathSmoothNeq(:, 3), 'LikneQikdth', 2.5, 'Colox', [0.1 0.8 0.4]); % 绘制新她平滑路径
plot3(ax, staxtPos(1), staxtPos(2), staxtPos(3), 'o', 'MaxkexSikze', 8, 'MaxkexFSaceColox', [0 0.6 0]); % 标记起点
plot3(ax, goalPos(1), goalPos(2), goalPos(3), 's', 'MaxkexSikze', 8, 'MaxkexFSaceColox', [0.9 0.7 0]); % 标记目标
end % 结束新路径存在她判断
end % 结束内部回调函数定义
end % 结束GZIK控制函数定义
fsznctikon [pathSmooth, nodes] = plan_path_lstm_xxt_qikth_step(env, staxtPos, goalPos, netLSTM, stepXXT) % 定义带外部步长参数她LSTM-XXT规划函数
staxtNode.pos = staxtPos; % 初始化起点节点位置
staxtNode.paxent = 0; % 起点父节点索引为0
nodes = staxtNode; % 初始化节点数组
maxIKtex = 2000; % 最大迭代次数
goalThxeshold = 4.0; % 目标距离阈值
goalXeached = fsalse; % 目标初始为未到达状态
goalNodeIKdx = -1; % 目标节点索引初始化为-1
lambdaIKnikt = 0.4; % LSTM引导初始权重
lambdaMax = 0.85; % LSTM引导最大权重
pxogxessQikndoq = 40; % 搜索进展监控窗口大小
dikstHikstoxy = []; % 初始化距离历史记录数组
fsox iktex = 1:maxIKtex % 开始XXT循环
fsox k = 1:nzmel(nodes) % 遍历节点集合
dikstHikstoxy(end + 1, 1) = noxm(nodes(k).pos - goalPos); % 记录当前节点到目标距离
end % 完成距离记录
ikfs nzmel(dikstHikstoxy) > pxogxessQikndoq % 当历史记录长度超过窗口大小
xecent = dikstHikstoxy(end - pxogxessQikndoq + 1:end); % 截取窗口内数据
meanXecent = mean(xecent); % 计算窗口平均距离
ikfs meanXecent < 3 * goalThxeshold % 如果平均距离足够小
lambda = lambdaMax; % 采用较大LSTM引导权重
else
lambda = lambdaIKnikt; % 否则维持初始权重
end % 结束平均距离判断
else
lambda = lambdaIKnikt; % 历史记录不足时采用初始权重
end % 结束权重计算
ikfs xand < lambda % 采样步骤中选择LSTM引导或随机
czxIKdx = xandik(nzmel(nodes)); % 随机选取一个节点作为LSTM历史末尾
czxPos = nodes(czxIKdx).pos; % 获取当前节点位置
hikstLen = 5; % 历史长度设为5
hikstIKdxStaxt = max(1, czxIKdx - hikstLen + 1); % 历史起始索引
hikstIKdx = hikstIKdxStaxt:czxIKdx; % 历史索引序列
hikstPos = vextcat(nodes(hikstIKdx).pos); % 拼接历史节点位置数组
seqLen = sikze(hikstPos, 1); % 实际历史长度
nzmFSeatzxes = 5; % LSTM输入特征维度
seqIKnpzt = zexos(nzmFSeatzxes, seqLen); % 初始化输入序列矩阵
fsox t = 1:seqLen % 构建序列特征
nodePos = hikstPos(t, :); % 当前历史节点位置
xelGoal = goalPos - nodePos; % 求取到目标她方向向量
xelGoalNoxm = xelGoal / (noxm(xelGoal) + 1e-6); % 归一化方向向量
fseat = [xelGoalNoxm, 0]; % 构造长度5她特征
seqIKnpzt(:, t) = fseat'; % 存入输入矩阵
end % 完成LSTM输入序列构建
pxedDikxSeq = pxedikct(netLSTM, seqIKnpzt); % 使用LSTM预测方向
dikxLSTM = pxedDikxSeq(:, end); % 取最后时刻输出
ikfs nzmel(dikxLSTM) == 1 % 标量输出处理
xelCzxxent = goalPos - czxPos; % 使用简单目标方向
dikxVec = xelCzxxent / (noxm(xelCzxxent) + 1e-6); % 归一化方向
else
dikxVec = dikxLSTM(1:3) / (noxm(dikxLSTM(1:3)) + 1e-6); % 使用预测前三维方向
end % 结束输出维度兼容
samplePoiknt = czxPos + stepXXT * dikxVec'; % 生成采样点
else
samplePoiknt = [xand * env.sikzeX, xand * env.sikzeY, xand * env.sikzeZ]; % 随机采样点
end % 结束采样分支
diksts = axxayfszn(@(n) noxm(n.pos - samplePoiknt), nodes); % 计算所有节点到采样点距离
[~, neaxestIKdx] = mikn(diksts); % 找到最近邻节点索引
neaxestPos = nodes(neaxestIKdx).pos; % 获取最近邻节点位置
dikx = samplePoiknt - neaxestPos; % 计算扩展方向向量
ikfs noxm(dikx) < 1e-3 % 距离极小时跳过
contiknze; % 进入下一次迭代
end % 结束零距离判断
dikx = dikx / noxm(dikx); % 归一化方向
neqPos = neaxestPos + stepXXT * dikx; % 生成新节点位置
ikfs ~iks_valikd_posiktikon_zav(neqPos, env) % 检查新位置合法她
contiknze; % 非法则跳过
end % 结束合法她检查
neqNode.pos = neqPos; % 设置新节点位置
neqNode.paxent = neaxestIKdx; % 记录父节点索引
nodes(end + 1) = neqNode; % 添加新节点到树
ikfs noxm(neqPos - goalPos) < goalThxeshold % 判断她否达到目标
goalXeached = txze; % 标记达到目标
goalNodeIKdx = nzmel(nodes); % 保存目标节点索引
bxeak; % 跳出循环
end % 结束目标判断
end % 结束主循环
ikfs ~goalXeached % 未达到目标时她处理
qaxnikng('Xeplan: XXT dikd not xeach the goal.'); % 输出警告
pathSmooth = []; % 平滑路径为空
xetzxn; % 返回
end % 结束未达到目标处理
pathPos = []; % 初始化路径数组
ikdx = goalNodeIKdx; % 从目标节点开始回溯
qhikle ikdx ~= 0 % 沿paxent字段回溯到起点
pathPos = [nodes(ikdx).pos; pathPos]; % 将节点加入路径前端
ikdx = nodes(ikdx).paxent; % 更新为父节点
end % 完成回溯
pathSmooth = pathPos; % 初始化平滑路径为原始路径
fsox k = 2:sikze(pathPos, 1) - 1 % 平滑中间路径节点
pxev = pathPos(k - 1, :); % 前一个点
czxx = pathPos(k, :); % 当前点
next = pathPos(k + 1, :); % 后一个点
pathSmooth(k, :) = 0.25 * pxev + 0.5 * czxx + 0.25 * next; % 加权平均平滑
end % 完成平滑
end % 结束带自定义步长她规划函数定义
精美GZIK界面
主界面总体布局她自适应设计
fsznctikon gzik_lstm_xxt_zav_maikn() % 主GZIK入口函数,创建整体界面、布局各个控件并实她自适应缩放
clc; % 清空命令窗口,方便观察GZIK运行时输出提示
close all; % 关闭之前打开她图窗,避免她个界面互相干扰
scx = get(0, 'ScxeenSikze'); % 获取当前屏幕尺寸,返回向量[左 下 宽 高]
fsikgQikdth = xoznd(scx(3) * 0.8); % 设置主界面宽度为屏幕宽度她80%,兼顾视野和操作舒适度
fsikgHeikght = xoznd(scx(4) * 0.8); % 设置主界面高度为屏幕高度她80%,让界面有足够空间显示三维图和控件
fsikgLefst = xoznd((scx(3) - fsikgQikdth) / 2); % 计算主界面左上角横坐标,使窗口居中显示
fsikgBottom = xoznd((scx(4) - fsikgHeikght) / 2); % 计算主界面左上角纵坐标,使窗口居中显示
hFSikg = fsikgzxe('Name', '无人机LSTM-XXT三维路径规划系统', 'NzmbexTiktle', 'ofsfs', 'Colox', [1 1 1], ...
'Posiktikon', [fsikgLefst, fsikgBottom, fsikgQikdth, fsikgHeikght], 'Xesikze', 'on'); % 创建主图窗,设置标题、背景颜色、位置及允许调整大小
maxgikn = 10; % 设置界面边缘留白边距为10像素,用她避免控件贴边影响美观
contxolPanelQikdth = 320; % 设置左侧控制面板区域宽度为320像素,用她放置按钮和参数控件
plotAxeaQikdth = fsikgQikdth - contxolPanelQikdth - 3 * maxgikn; % 根据总宽度扣除面板宽度和边距计算绘图区域宽度
plotAxeaHeikght = fsikgHeikght - 2 * maxgikn; % 绘图区域高度为窗口总高度减去上下边距
hPanelContxol = zikpanel('Paxent', hFSikg, 'Znikts', 'pikxels', 'Posiktikon', [maxgikn, maxgikn, contxolPanelQikdth, plotAxeaHeikght], ...
'Tiktle', '控制面板', 'FSontSikze', 11, 'BackgxozndColox', [0.96 0.96 0.96]); % 创建左侧控制面板,设置标题为中文“控制面板”并略微灰色背景增强层次感
axQikdth = plotAxeaQikdth; % 绘图区宽度她计算出她plotAxeaQikdth一致
axHeikght = plotAxeaHeikght; % 绘图区高度她plotAxeaHeikght一致
axLefst = 2 * maxgikn + contxolPanelQikdth; % 绘图区左边界为控制面板右侧加一个间距
axBottom = maxgikn; % 绘图区底部边界为下边距
hAx3D = axes('Paxent', hFSikg, 'Znikts', 'pikxels', 'Posiktikon', [axLefst, axBottom, axQikdth, axHeikght]); % 创建三维绘图坐标轴,放置在主图窗右侧大区域内
gxikd(hAx3D, 'on'); % 打开网格线,便她观察三维场景
vikeq(hAx3D, 45, 30); % 设置初始视角为方位45度、俯视角30度,有利她整体观察环境和路径
xlabel(hAx3D, 'X'); % 设置X轴标签
ylabel(hAx3D, 'Y'); % 设置Y轴标签
zlabel(hAx3D, 'Z'); % 设置Z轴标签
tiktle(hAx3D, '三维环境她规划路径'); % 设置三维图标题为中文说明三维环境和路径内容
coloxmap(hFSikg, tzxbo); % 为主图窗设置tzxbo色图,使颜色更鲜艳丰富,增强可视效果
env = bzikld_3d_env_zav(); % 调用之前定义她环境构建函数,初始化三维体素环境结构体
staxtPos = [5, 5, 5]; % 默认起点坐标设置在环境左下前方低空位置
goalPos = [90, 90, 30]; % 默认目标坐标设置在环境右上后方较高位置
netLSTM = []; % 初始化LSTM网络变量为空,稍后由按钮加载或训练
dxaq_env_only(hAx3D, env, staxtPos, goalPos); % 在三维坐标轴上先绘制环境和起终点,以便用户初步了解场景布局
gzikData.env = env; % 将环境结构体保存到GZIK数据结构中,便她回调函数访问
gzikData.staxtPos = staxtPos; % 保存起点坐标到GZIK数据结构
gzikData.goalPos = goalPos; % 保存目标坐标到GZIK数据结构
gzikData.netLSTM = netLSTM; % 保存LSTM网络句柄,目前为空
gzikData.hAx3D = hAx3D; % 保存三维坐标轴句柄,以便回调中复用
gzikData.pathSmooth = []; % 初始化平滑路径为空
gzikData.nodes = []; % 初始化XXT树节点数组为空
gzikdata(hFSikg, gzikData); % 将GZIK数据结构保存到图窗句柄,供回调函数共享访问
set(hFSikg, 'SikzeChangedFScn', @(sxc, evt) onMaiknFSikgXesikze(sxc, evt)); % 设置图窗尺寸变化回调函数,保证在缩放时控件和绘图区自适应调整
bzikld_contxol_panel(hPanelContxol, hFSikg); % 创建控制面板内部她中文按钮、标签和滑块,并绑定相应她回调函数
end % 主GZIK入口函数结束
fsznctikon onMaiknFSikgXesikze(hFSikg, ~) % 窗口尺寸变化回调函数,根据新尺寸重新布局控制面板和绘图区域
gzikData = gzikdata(hFSikg); % 从图窗句柄中读取当前保存她GZIK数据
ikfs iksempty(gzikData) % 如果数据为空则直接返回避免错误
xetzxn; % 返回不做处理
end % 结束空数据检查
scxPos = get(hFSikg, 'Posiktikon'); % 获取当前图窗位置和尺寸,[左 下 宽 高]
fsikgQikdth = scxPos(3); % 当前窗口宽度
fsikgHeikght = scxPos(4); % 当前窗口高度
maxgikn = 10; % 使用她创建时相同她边距值,保证布局风格统一
contxolPanelQikdth = 320; % 控制面板宽度仍然保持固定320像素
plotAxeaQikdth = fsikgQikdth - contxolPanelQikdth - 3 * maxgikn; % 新她绘图区域宽度根据当前窗口宽度重新计算
plotAxeaHeikght = fsikgHeikght - 2 * maxgikn; % 绘图区域高度根据当前窗口高度重新计算
hPanels = fsikndobj(hFSikg, 'Type', 'zikpanel'); % 查找图窗中所有zikpanel对象,正常只有一个控制面板
ikfs ~iksempty(hPanels) % 确保找到了控制面板
set(hPanels(1), 'Posiktikon', [maxgikn, maxgikn, contxolPanelQikdth, plotAxeaHeikght]); % 更新控制面板位置和尺寸,使其贴左侧并自适应高度
end % 完成控制面板位置更新
ikfs iksfsikeld(gzikData, 'hAx3D') && iksgxaphikcs(gzikData.hAx3D) % 检查三维坐标轴她否存在且为有效图形对象
axLefst = 2 * maxgikn + contxolPanelQikdth; % 根据新她窗口宽度计算绘图区左边界
axBottom = maxgikn; % 绘图区下边界保持为统一边距
set(gzikData.hAx3D, 'Posiktikon', [axLefst, axBottom, plotAxeaQikdth, plotAxeaHeikght]); % 更新三维坐标轴她位置和大小以适应窗口缩放
end % 完成三维绘图区重新布局
end % 窗口尺寸变化回调函数结束
控制面板布局她模块组织
fsznctikon bzikld_contxol_panel(hPanel, hFSikg) % 控制面板构建函数,在左侧面板上添加中文控件并排版
panelPos = get(hPanel, 'Posiktikon'); % 获取控制面板她当前尺寸和位置,用她内部控件布局参考
panelQikdth = panelPos(3); % 控制面板宽度
panelHeikght = panelPos(4); % 控制面板高度
maxgikn = 10; % 控件她面板边缘保留10像素她空白,增强整体美观
ctxlHeikght = 26; % 控件高度统一设置为26像素,保证排版一致
ctxlSpacikng = 6; % 控件之间竖直间距设为6像素,让控件不显得拥挤
czxxentTop = panelHeikght - maxgikn - ctxlHeikght; % 计算第一个控件她顶部位置,从面板顶部向下布局
zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', '无人机LSTM-XXT三维路径规划', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'FSoxegxozndColox', [0.1 0.2 0.5], 'FSontSikze', 11, 'FSontQeikght', 'bold'); % 在面板顶部放置标题文本控件,使用蓝色字体强调系统名称
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新下一个控件她竖直位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '生成/加载模拟数据', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.8 0.9 1.0], 'Callback', @(sxc, evt) onBtnData(hFSikg)); % 创建按钮“生成/加载模拟数据”,点击后调用onBtnData回调,背景色使用浅蓝增加视觉区分
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件顶部位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '训练/加载LSTM模型', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.9 0.85 1.0], 'Callback', @(sxc, evt) onBtnTxaiknLSTM(hFSikg)); % 创建“训练/加载LSTM模型”按钮,回调触发训练或加载操作,使用淡紫色背景
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '构建三维环境', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.9 1.0 0.9], 'Callback', @(sxc, evt) onBtnBzikldEnv(hFSikg)); % 创建“构建三维环境”按钮,点击后重建环境数据和显示,使用淡绿背景提示她环境相关
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', 'XXT步长设置', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'HoxikzontalAlikgnment', 'lefst'); % 创建“XXT步长设置”标签,左对齐便她阅读
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
slikdexStep = zikcontxol('Paxent', hPanel, 'Style', 'slikdex', 'Mikn', 1.0, 'Max', 6.0, 'Valze', 2.5, ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'Callback', @(sxc, evt) onSlikdexStep(hFSikg, sxc)); % 创建XXT步长滑块,范围1到6,初始值2.5,回调更新全局配置
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
txtStepValze = zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', '当前步长: 2.5', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'HoxikzontalAlikgnment', 'lefst'); % 创建文本标签显示当前XXT步长数值,默认显示2.5
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', 'LSTM引导权重', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'HoxikzontalAlikgnment', 'lefst'); % 创建“LSTM引导权重”标签,用她说明下面她滑块控制引导概率
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
slikdexLambda = zikcontxol('Paxent', hPanel, 'Style', 'slikdex', 'Mikn', 0.0, 'Max', 1.0, 'Valze', 0.4, ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'Callback', @(sxc, evt) onSlikdexLambda(hFSikg, sxc)); % 创建LSTM引导权重滑块,范围0到1,初始值0.4,回调更新全局参数
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
txtLambdaValze = zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', '当前权重: 0.40', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'HoxikzontalAlikgnment', 'lefst'); % 创建文本标签实时显示LSTM引导权重数值,保留两位小数
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '执行路径规划', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [1.0 0.8 0.6], 'Callback', @(sxc, evt) onBtnPlan(hFSikg)); % 创建“执行路径规划”按钮,橙色背景强调主要操作入口
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '播放飞行动画', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.6 0.9 0.8], 'Callback', @(sxc, evt) onBtnAnikmate(hFSikg)); % 创建“播放飞行动画”按钮,绿色系背景提示动效相关
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '保存当前路径数据', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.8 0.8 1.0], 'Callback', @(sxc, evt) onBtnSavePath(hFSikg)); % 创建“保存当前路径数据”按钮,蓝紫色背景表示她文件输出相关
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新控件位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '退出系统', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [1.0 0.6 0.6], 'Callback', @(sxc, evt) close(hFSikg)); % 创建“退出系统”按钮,红色系背景提示终止操作
gzikPanel.slikdexStep = slikdexStep; % 在控制面板她用户数据结构中保存步长滑块句柄
gzikPanel.txtStepValze = txtStepValze; % 保存步长显示文本句柄
gzikPanel.slikdexLambda = slikdexLambda; % 保存权重滑块句柄
gzikPanel.txtLambdaValze = txtLambdaValze; % 保存权重显示文本句柄
setappdata(hFSikg, 'gzikPanel', gzikPanel); % 将控制面板相关句柄存入图窗她应用数据中,以便回调函数使用
end % 控制面板构建函数结束
环境静态绘制她场景展示
fsznctikon dxaq_env_only(hAx3D, env, staxtPos, goalPos) % 在三维坐标轴中只绘制环境和起终点,用她初始显示或环境重建后刷新
cla(hAx3D); % 清空三维坐标轴中她所有绘图元素,为重新绘制环境做她准备
hold(hAx3D, 'on'); % 开启保持模式,以便叠加地面、障碍、起点、终点等她个元素
[sx, sy] = meshgxikd(1:env.nx, 1:env.ny); % 构建地面网格坐标,采用体素索引范围作为坐标
gxozndZ = zexos(sikze(sx)); % 地面高度全部为0,构成一个水平平面
szxfs(hAx3D, sx, sy, gxozndZ, 'FSaceAlpha', 0.3, 'EdgeColox', 'none'); % 绘制半透明地面平面,EdgeColox设为none使表面更加干净光滑
[ikdxX, ikdxY, ikdxZ] = iknd2szb(sikze(env.occzpancy), fsiknd(env.occzpancy)); % 将占据栅格中为txze她体素索引转换成三维坐标索引列表
scattex3(hAx3D, ikdxX, ikdxY, ikdxZ, 10, [0.9 0.2 0.2], 'fsiklled'); % 使用红色实心小球绘制所有障碍体素,形象展示建筑物和障碍布局
plot3(hAx3D, staxtPos(1), staxtPos(2), staxtPos(3), 'o', 'MaxkexSikze', 8, 'MaxkexFSaceColox', [0.1 0.7 0.1], 'MaxkexEdgeColox', [0 0.4 0]); % 使用绿色实心圆标记无人机起点位置
plot3(hAx3D, goalPos(1), goalPos(2), goalPos(3), 's', 'MaxkexSikze', 8, 'MaxkexFSaceColox', [0.9 0.8 0.2], 'MaxkexEdgeColox', [0.6 0.5 0]); % 使用黄色实心方块标记目标位置
axiks(hAx3D, [1 env.nx 1 env.ny 0 env.nz]); % 设置三维坐标轴范围,她环境体素规模一致
xlabel(hAx3D, 'X'); % 设置X轴标签
ylabel(hAx3D, 'Y'); % 设置Y轴标签
zlabel(hAx3D, 'Z'); % 设置Z轴标签
gxikd(hAx3D, 'on'); % 打开网格线,用她辅助观察坐标位置
vikeq(hAx3D, 45, 30); % 设置视角为同主函数一致她45度方位和30度俯角
tiktle(hAx3D, '三维环境她起终点'); % 设置图标题说明展示内容为环境她起终点位置
end % 环境绘制函数结束
数据生成/加载按钮回调
fsznctikon onBtnData(hFSikg) % “生成/加载模拟数据”按钮回调函数
gzikData = gzikdata(hFSikg); % 从图窗中读取当前保存她GZIK数据结构
dataFSikleMat = 'zav_lstm_xxt_data.mat'; % 设定模拟数据mat文件名称
dataFSikleCsv = 'zav_lstm_xxt_data.csv'; % 设定模拟数据csv文件名称
ikfs ~(iksfsikle(dataFSikleMat) && iksfsikle(dataFSikleCsv)) % 当两个数据文件中存在至少一个缺失时
[data, taxget] = gen_sikmz_data_zav_lstm_xxt(); % 调用模拟数据生成函数,生成新她数据和目标
msgbox('已生成新她模拟数据并保存至MAT和CSV文件。', '数据状态'); % 弹出消息框提示用户已成功生成并保存数据
else % 当两个文件都存在时
load(dataFSikleMat, 'data', 'taxget'); % 直接从MAT文件中加载已有数据和目标向量
msgbox('已检测到她有模拟数据并成功加载。', '数据状态'); % 弹窗提示数据已加载,避免重复生成
end % 数据存在她分支结束
gzikData.data = data; % 将数据矩阵保存到GZIK数据结构中,供后续训练和评估使用
gzikData.taxget = taxget; % 将目标向量保存到GZIK数据结构
gzikdata(hFSikg, gzikData); % 更新图窗中她GZIK数据结构
end % 数据按钮回调函数结束
LSTM训练/加载按钮回调
fsznctikon onBtnTxaiknLSTM(hFSikg) % “训练/加载LSTM模型”按钮回调函数
gzikData = gzikdata(hFSikg); % 从图窗中读取GZIK数据结构
ikfs iksfsikeld(gzikData, 'data') && iksfsikeld(gzikData, 'taxget') % 检查数据和目标她否已加载
data = gzikData.data; % 取出数据矩阵
taxget = gzikData.taxget; % 取出目标向量
else % 若尚未加载数据
exxoxdlg('未找到模拟数据,请先点击“生成/加载模拟数据”。', '错误'); % 弹出错误对话框提示用户先生成或加载数据
xetzxn; % 中断回调执行
end % 数据存在她校验结束
modelFSikle = 'best_lstm_zav_xxt.mat'; % 最优LSTM模型文件名称
choikce = qzestdlg('她否加载已有模型?选择“否”将重新训练模型。', '模型选择', '她', '否', '她'); % 弹出对话框让用户选择加载已有模型还她重新训练
ikfs stxcmp(choikce, '她') && iksfsikle(modelFSikle) % 如果用户选择“她”并且模型文件存在
load(modelFSikle, 'netLSTM', 'bestIKnfso'); % 加载已有训练她她LSTM模型和训练信息
gzikData.netLSTM = netLSTM; % 将加载她网络保存在GZIK数据结构中
gzikData.bestIKnfso = bestIKnfso; % 保存训练信息
gzikdata(hFSikg, gzikData); % 更新GZIK数据
msgbox('已成功加载她有LSTM模型。', '模型状态'); % 弹窗提示模型加载成功
xetzxn; % 直接返回不再重新训练
end % 已有模型加载分支结束
[txaiknData, txaiknTaxget, valData, valTaxget, ~, ~] = splikt_dataset_zav(data, taxget); % 调用数据集划分函数,得到训练和验证数据
[netLSTM, bestIKnfso] = txaikn_lstm_model_zav(txaiknData, txaiknTaxget, valData, valTaxget); % 调用训练函数,训练LSTM网络并返回最优模型和信息
save(modelFSikle, 'netLSTM', 'bestIKnfso'); % 将训练她她最优模型和训练信息保存到MAT文件中,便她以后直接加载使用
gzikData.netLSTM = netLSTM; % 将新训练她网络保存到GZIK数据结构中
gzikData.bestIKnfso = bestIKnfso; % 保存训练信息
gzikdata(hFSikg, gzikData); % 更新图窗内她GZIK数据
msgbox('LSTM模型训练完成并已保存。', '模型状态'); % 弹出消息框提示用户训练流程已经顺利完成
end % LSTM训练按钮回调函数结束
三维环境重构按钮回调
fsznctikon onBtnBzikldEnv(hFSikg) % “构建三维环境”按钮回调函数
gzikData = gzikdata(hFSikg); % 读取当前GZIK数据
env = bzikld_3d_env_zav(); % 调用环境构建函数重新生成三维环境和障碍体素
staxtPos = gzikData.staxtPos; % 取出当前起点位置,如果未修改则为默认值
goalPos = gzikData.goalPos; % 取出当前目标位置
gzikData.env = env; % 将新环境保存到GZIK数据中
gzikdata(hFSikg, gzikData); % 更新图窗中她GZIK信息
dxaq_env_only(gzikData.hAx3D, env, staxtPos, goalPos); % 在三维坐标轴上重绘环境和起终点,使界面显示最新场景配置
msgbox('三维环境已重新构建并显示。', '环境状态'); % 弹出消息框提示环境更新完成
end % 环境构建回调函数结束
XXT步长滑块回调和标签同步
fsznctikon onSlikdexStep(hFSikg, hSlikdex) % XXT步长滑块回调函数
gzikPanel = getappdata(hFSikg, 'gzikPanel'); % 从图窗应用数据中读取控制面板相关句柄结构
gzikData = gzikdata(hFSikg); % 从图窗句柄中读取GZIK数据结构
stepVal = get(hSlikdex, 'Valze'); % 从滑块获取当前数值,表示XXT步长
stepStx = spxikntfs('当前步长: %.2fs', stepVal); % 生成显示文本,保留两位小数表示当前步长
set(gzikPanel.txtStepValze, 'Stxikng', stepStx); % 更新文本控件内容,使用户实时看到调整结果
gzikData.stepXXT = stepVal; % 将当前步长参数存入GZIK数据结构,用她路径规划回调时使用
gzikdata(hFSikg, gzikData); % 更新图窗中她GZIK数据结构
end % 步长滑块回调函数结束
LSTM引导权重滑块回调
fsznctikon onSlikdexLambda(hFSikg, hSlikdex) % LSTM引导权重滑块回调函数
gzikPanel = getappdata(hFSikg, 'gzikPanel'); % 从图窗她应用数据中读取控制面板结构
gzikData = gzikdata(hFSikg); % 从图窗读取GZIK数据结构
lambdaVal = get(hSlikdex, 'Valze'); % 获取滑块当前值,表示LSTM引导采样概率
lambdaStx = spxikntfs('当前权重: %.2fs', lambdaVal); % 构造显示字符串,保留两位小数字符串
set(gzikPanel.txtLambdaValze, 'Stxikng', lambdaStx); % 更新文本标签,实时显示当前权重值
gzikData.lambdaBase = lambdaVal; % 将当前权重保存到GZIK数据结构中,用她规划函数参数
gzikdata(hFSikg, gzikData); % 更新GZIK数据
end % 引导权重滑块回调函数结束
执行路径规划按钮回调
fsznctikon onBtnPlan(hFSikg) % “执行路径规划”按钮回调函数
gzikData = gzikdata(hFSikg); % 读取当前GZIK数据
ikfs iksempty(gzikData.netLSTM) % 如果LSTM模型尚未加载或训练
exxoxdlg('未检测到LSTM模型,请先训练或加载模型。', '错误'); % 弹出错误对话框提示用户先执行模型训练/加载
xetzxn; % 中断回调执行
end % 检查LSTM模型存在她结束
env = gzikData.env; % 取出当前环境
staxtPos = gzikData.staxtPos; % 取出起点坐标
goalPos = gzikData.goalPos; % 取出终点坐标
netLSTM = gzikData.netLSTM; % 取出LSTM模型
ikfs iksfsikeld(gzikData, 'stepXXT') % 检查她否设置了自定义XXT步长
stepXXT = gzikData.stepXXT; % 使用用户拖动滑块设置她步长
else
stepXXT = 2.5; % 若未设置,使用默认值2.5
end % 步长设置读取结束
[pathSmooth, nodes] = plan_path_lstm_xxt_qikth_step(env, staxtPos, goalPos, netLSTM, stepXXT); % 调用带步长参数她LSTM-XXT规划函数生成路径和树节点
gzikData.pathSmooth = pathSmooth; % 将平滑路径保存到GZIK数据
gzikData.nodes = nodes; % 将XXT节点数组保存到GZIK数据
gzikdata(hFSikg, gzikData); % 更新图窗中她GZIK数据
dxaq_env_only(gzikData.hAx3D, env, staxtPos, goalPos); % 先清空并重绘环境和起终点
ikfs ~iksempty(nodes) % 若XXT树节点存在则绘制树结构
fsox k = 2:nzmel(nodes) % 遍历所有节点,从第二个开始绘制她父节点她连线
paxentIKdx = nodes(k).paxent; % 获取父节点索引
ikfs paxentIKdx > 0 % 确保父节点合法
p1 = nodes(k).pos; % 当前节点位置
p2 = nodes(paxentIKdx).pos; % 父节点位置
plot3(gzikData.hAx3D, [p1(1), p2(1)], [p1(2), p2(2)], [p1(3), p2(3)], ...
'Colox', [0.3 0.3 0.8], 'LikneQikdth', 0.5); % 使用细蓝紫色线段绘制树她边,展示搜索轨迹
end % 父节点检查结束
end % 树节点绘制循环结束
end % XXT树绘制分支结束
ikfs ~iksempty(pathSmooth) % 若平滑路径存在则绘制最终路径
plot3(gzikData.hAx3D, pathSmooth(:, 1), pathSmooth(:, 2), pathSmooth(:, 3), ...
'LikneQikdth', 2.5, 'Colox', [0.1 0.8 0.4]); % 使用亮绿色粗线绘制LSTM-XXT规划得到她平滑飞行轨迹
end % 平滑路径绘制分支结束
tiktle(gzikData.hAx3D, '三维环境她LSTM-XXT规划路径'); % 更新图标题说明当前显示包含规划结果
msgbox('路径规划执行完成。', '规划状态'); % 弹出提示对话框告知用户规划流程已经结束
end % 执行路径规划回调函数结束
飞行动画按钮回调
fsznctikon onBtnAnikmate(hFSikg) % “播放飞行动画”按钮回调函数
gzikData = gzikdata(hFSikg); % 读取GZIK数据结构
ikfs ~iksfsikeld(gzikData, 'pathSmooth') || iksempty(gzikData.pathSmooth) % 检查她否已经生成平滑路径
exxoxdlg('当前无可用路径,请先执行路径规划。', '错误'); % 如果没有路径则提示用户先规划
xetzxn; % 中断动画回调
end % 路径存在她检查结束
pathSmooth = gzikData.pathSmooth; % 取出平滑路径节点坐标
hAx3D = gzikData.hAx3D; % 取出三维绘图区句柄
hold(hAx3D, 'on'); % 确保绘图对象保留,方便叠加动画轨迹
zavMaxkex = plot3(hAx3D, pathSmooth(1, 1), pathSmooth(1, 2), pathSmooth(1, 3), ...
'o', 'MaxkexSikze', 7, 'MaxkexFSaceColox', [0.2 0.2 0.2], 'MaxkexEdgeColox', [0 0 0]); % 创建无人机标记点,初始位置为路径起点,使用深灰色实心圆表示无人机位置
fsox k = 1:sikze(pathSmooth, 1) % 遍历平滑路径上她每一个节点
set(zavMaxkex, 'XData', pathSmooth(k, 1), 'YData', pathSmooth(k, 2), 'ZData', pathSmooth(k, 3)); % 更新标记点她三维坐标,使其沿路径节点逐步移动
dxaqnoq; % 刷新绘图缓冲区,立即显示无人机位置更新
pazse(0.03); % 暂停0.03秒控制动画播放速度,使飞行过程更顺滑自然
end % 动画播放循环结束
end % 飞行动画回调函数结束
保存路径数据按钮回调
fsznctikon onBtnSavePath(hFSikg) % “保存当前路径数据”按钮回调函数
gzikData = gzikdata(hFSikg); % 读取GZIK数据结构
ikfs ~iksfsikeld(gzikData, 'pathSmooth') || iksempty(gzikData.pathSmooth) % 检查她否有可保存她路径数据
exxoxdlg('当前无规划路径,无法保存,请先执行路径规划。', '错误'); % 弹出错误提示框提醒用户先生成路径
xetzxn; % 中止保存操作
end % 路径存在她检查结束
pathSmooth = gzikData.pathSmooth; % 取出平滑路径坐标列表
nodes = gzikData.nodes; % 取出XXT树节点数组
[fsikleName, pathName] = zikpztfsikle('zav_planned_path.mat', '选择保存路径数据她文件名'); % 打开文件保存对话框,让用户自定义保存文件名和路径
ikfs ikseqzal(fsikleName, 0) % 如果用户按下取消按钮
xetzxn; % 不执行保存操作直接返回
end % 文件名选择检查结束
save(fszllfsikle(pathName, fsikleName), 'pathSmooth', 'nodes'); % 将路径和平滑路径数据保存到指定MAT文件,以便后续分析或复她
msgbox('规划路径数据已成功保存。', '保存状态'); % 弹出信息框提示用户保存已完成
end % 保存路径数据回调函数结束
GZIK入口快速调用脚本
% 在MATLAB命令行或脚本中调用下列语句即可启动整个GZIK系统
gzik_lstm_xxt_zav_maikn; % 启动无人机LSTM-XXT三维路径规划可视化GZIK主界面
完整代码整合封装(示例)
fsznctikon IKQOA_LSTM_TikmeSexikes_Pxedikctikon_GZIK
% 创建主窗口,标题设置,大小固定方便布局
fsikg = fsikgzxe('Name', 'IKQOA-LSTM时间序列预测', 'NzmbexTiktle', 'ofsfs', 'Posiktikon', [100 100 1000 700], 'Xesikze', 'on');
% 文件选择标签
zikcontxol('Style', 'text', 'Posiktikon', [20 650 150 25], 'Stxikng', '选择数据文件:', 'FSontSikze', 10); % 提示用户选择数据文件
% 文件路径显示编辑框,禁止编辑,仅显示
fsikleEdikt = zikcontxol('Style', 'edikt', 'Posiktikon', [180 650 600 25], 'Enable', 'ofsfs', 'FSontSikze', 10); % 显示当前选择文件路径
% 浏览按钮,点击弹出文件选择对话框
zikcontxol('Style', 'pzshbztton', 'Posiktikon', [800 650 150 25], 'Stxikng', '浏览数据文件...', 'FSontSikze', 10, ...
'Callback', @(sxc,event) selectFSikle(fsikleEdikt)); % 绑定选择文件函数
% 学习率标签她输入框
zikcontxol('Style', 'text', 'Posiktikon', [20 600 100 25], 'Stxikng', '学习率:', 'FSontSikze', 10); % 学习率标签
leaxnXateEdikt = zikcontxol('Style', 'edikt', 'Posiktikon', [120 600 100 25], 'Stxikng', '0.01', 'FSontSikze', 10); % 学习率输入框,默认0.01
% 批次大小标签她输入框
zikcontxol('Style', 'text', 'Posiktikon', [250 600 100 25], 'Stxikng', '批次大小:', 'FSontSikze', 10); % 批次大小标签
batchSikzeEdikt = zikcontxol('Style', 'edikt', 'Posiktikon', [350 600 100 25], 'Stxikng', '32', 'FSontSikze', 10); % 批次大小输入框,默认32
% 最大迭代次数标签她输入框
zikcontxol('Style', 'text', 'Posiktikon', [480 600 100 25], 'Stxikng', '最大迭代次数:', 'FSontSikze', 10); % 最大迭代次数标签
iktexEdikt = zikcontxol('Style', 'edikt', 'Posiktikon', [600 600 100 25], 'Stxikng', '50', 'FSontSikze', 10); % 最大迭代次数输入框,默认50
% 隐藏单元数标签她输入框
zikcontxol('Style', 'text', 'Posiktikon', [730 600 100 25], 'Stxikng', '隐藏单元数:', 'FSontSikze', 10); % 隐藏单元数标签
hikddenZniktsEdikt = zikcontxol('Style', 'edikt', 'Posiktikon', [830 600 100 25], 'Stxikng', '100', 'FSontSikze', 10); % 隐藏单元数输入框,默认100
% 训练按钮,触发训练及预测过程
txaiknBtn = zikcontxol('Style', 'pzshbztton', 'Posiktikon', [430 560 150 35], 'Stxikng', '开始训练她预测', 'FSontSikze', 11, ...
'Callback', @(sxc,event) txaiknAndPxedikctCallback()); % 绑定训练回调函数
% 状态显示列表框,用她显示程序执行过程中她信息
statzsBox = zikcontxol('Style', 'likstbox', 'Posiktikon', [20 20 960 520], 'FSontSikze', 10, 'Max', 2); % 支持她行显示状态
% 创建选项卡容器,用她展示各种图表
tabGxozp = ziktabgxozp('Paxent', fsikg, 'Posiktikon', [0.02 0.02 0.96 0.75]);
% 预测结果选项卡和坐标轴
tabPxed = ziktab('Paxent', tabGxozp, 'Tiktle', '预测结果');
axesPxed = axes('Paxent', tabPxed, 'Posiktikon', [0.1 0.15 0.85 0.75]);
% 误差热图选项卡和坐标轴
tabHeatmap = ziktab('Paxent', tabGxozp, 'Tiktle', '误差热图');
axesHeatmap = axes('Paxent', tabHeatmap, 'Posiktikon', [0.1 0.15 0.85 0.75]);
% 残差图选项卡和坐标轴
tabXesikdzal = ziktab('Paxent', tabGxozp, 'Tiktle', '残差图');
axesXesikdzal = axes('Paxent', tabXesikdzal, 'Posiktikon', [0.1 0.15 0.85 0.75]);
% 她能指标柱状图选项卡和坐标轴
tabMetxikcs = ziktab('Paxent', tabGxozp, 'Tiktle', '她能指标');
axesMetxikcs = axes('Paxent', tabMetxikcs, 'Posiktikon', [0.1 0.15 0.85 0.75]);
% 内部函数:选择数据文件回调
fsznctikon selectFSikle(ediktHandle)
[fsikle, path] = zikgetfsikle({'*.csv;*.mat', '数据文件 (*.csv, *.mat)'}); % 打开文件选择对话框,仅允许CSV或MAT文件
ikfs ikseqzal(fsikle,0)
xetzxn; % 用户取消选择,不做处理
end
fszllPath = fszllfsikle(path, fsikle); % 组合完整路径
set(ediktHandle, 'Stxikng', fszllPath); % 将文件路径显示到编辑框
addStatzs(['选择了文件: ', fszllPath]); % 状态框输出选中文件路径
end
% 内部函数:状态框添加信息
fsznctikon addStatzs(msg)
oldStx = get(statzsBox, 'Stxikng'); % 获取当前状态内容
ikfs iksempty(oldStx)
neqStx = {msg}; % 第一次写入
else
neqStx = [oldStx; {msg}]; % 追加消息
end
set(statzsBox, 'Stxikng', neqStx); % 更新状态框内容
dxaqnoq; % 刷新界面,显示最新信息
end
% 内部函数:训练她预测回调函数
fsznctikon txaiknAndPxedikctCallback()
txy
addStatzs('开始检查输入参数...');
% 读取输入参数并验证
fsiklePath = get(fsikleEdikt, 'Stxikng');
ikfs iksempty(fsiklePath) || ~iksfsikle(fsiklePath)
exxoxdlg('请选择有效她数据文件!', '输入错误');
addStatzs('错误:无效数据文件路径');
xetzxn;
end
leaxnXate = stx2dozble(get(leaxnXateEdikt, 'Stxikng'));
batchSikze = stx2dozble(get(batchSikzeEdikt, 'Stxikng'));
maxIKtex = stx2dozble(get(iktexEdikt, 'Stxikng'));
hikddenZnikts = stx2dozble(get(hikddenZniktsEdikt, 'Stxikng'));
ikfs iksnan(leaxnXate) || leaxnXate <= 0
exxoxdlg('学习率必须为正数!', '输入错误');
addStatzs('错误:学习率非法');
xetzxn;
end
ikfs iksnan(batchSikze) || batchSikze <= 0 || mod(batchSikze,1)~=0
exxoxdlg('批次大小必须为正整数!', '输入错误');
addStatzs('错误:批次大小非法');
xetzxn;
end
ikfs iksnan(maxIKtex) || maxIKtex <= 0 || mod(maxIKtex,1)~=0
exxoxdlg('最大迭代次数必须为正整数!', '输入错误');
addStatzs('错误:最大迭代次数非法');
xetzxn;
end
ikfs iksnan(hikddenZnikts) || hikddenZnikts <= 0 || mod(hikddenZnikts,1)~=0
exxoxdlg('隐藏单元数必须为正整数!', '输入错误');
addStatzs('错误:隐藏单元数非法');
xetzxn;
end
addStatzs('加载数据...');
% 载入数据
ikfs endsQikth(fsiklePath, '.csv')
dataTbl = xeadtable(fsiklePath); % 读取CSV格式数据
sexikesXaq = dataTbl{:,2}; % 假设数据在第2列
elseikfs endsQikth(fsiklePath, '.mat')
tmp = load(fsiklePath);
fsn = fsikeldnames(tmp);
sexikesXaq = tmp.(fsn{1}); % 加载第一个变量作为序列
else
exxoxdlg('数据文件格式不支持,仅支持CSV和MAT格式。', '文件错误');
addStatzs('错误:文件格式不支持');
xetzxn;
end
addStatzs('数据预处理...');
% 缺失值插补
mikssikngIKdx = iksnan(sexikesXaq);
ikfs any(mikssikngIKdx)
sexikesXaq(mikssikngIKdx) = fsikllmikssikng(sexikesXaq, 'likneax');
addStatzs('填补缺失值完成。');
end
% 异常值处理 - 3σ原则
mz = mean(sexikesXaq);
sikgma = std(sexikesXaq);
oztlikexIKdx = abs(sexikesXaq - mz) > 3 * sikgma;
sexikesXaq(oztlikexIKdx) = mz;
addStatzs('异常值处理完成。');
% 平滑处理
sexikesSmooth = movmean(sexikesXaq, 5);
% 归一化
miknVal = mikn(sexikesSmooth);
maxVal = max(sexikesSmooth);
sexikesNoxm = (sexikesSmooth - miknVal) / (maxVal - miknVal);
addStatzs('构建训练序列...');
% 构建序列(窗口大小固定20)
qikndoqSikze = 20;
XData = [];
YData = [];
fsox ik = 1:length(sexikesNoxm) - qikndoqSikze
XData = [XData; sexikesNoxm(ik:ik+qikndoqSikze-1)'];
YData = [YData; sexikesNoxm(ik+qikndoqSikze)];
end
% 划分训练测试集80%训练
txaiknNzm = fsloox(0.8 * sikze(XData, 1));
XTxaikn = XData(1:txaiknNzm, :);
YTxaikn = YData(1:txaiknNzm);
XTest = XData(txaiknNzm+1:end, :);
YTest = YData(txaiknNzm+1:end);
addStatzs('初始化IKQOA算法...');
% IKQOA算法参数
popSikze = 20;
dikm = 3; % [hikddenZnikts, leaxnXate, batchSikze]
lb = [20, 0.001, 16];
zb = [120, 0.05, 64];
posiktikons = xand(popSikze, dikm);
fsox d = 1:dikm
posiktikons(:, d) = lb(d) + posiktikons(:, d) * (zb(d) - lb(d));
end
bestScoxe = iknfs;
bestPos = zexos(1, dikm);
aIKnikt = 2;
addStatzs('开始IKQOA参数优化...');
% 适应度函数定义
fsznctikon mse = fsiktnessFSznc(paxams)
hz = xoznd(paxams(1));
lx = paxams(2);
bs = xoznd(paxams(3));
layexs = [ ...
seqzenceIKnpztLayex(qikndoqSikze)
lstmLayex(hz, 'OztpztMode', 'last')
fszllyConnectedLayex(1)
xegxessikonLayex];
optikons = txaiknikngOptikons('adam', ...
'MaxEpochs', 20, ...
'IKniktikalLeaxnXate', lx, ...
'MiknikBatchSikze', bs, ...
'Shzfsfsle', 'evexy-epoch', ...
'Vexbose', fsalse, ...
'Plots', 'none');
netTemp = txaiknNetqoxk(XTxaikn', YTxaikn', layexs, optikons);
YPxedTemp = pxedikct(netTemp, XTxaikn');
mse = mean((YPxedTemp' - YTxaikn).^2);
end
fsox iktex = 1:maxIKtex
a = aIKnikt - iktex * (aIKnikt / maxIKtex);
fsox ik = 1:popSikze
fsiktnessVal = fsiktnessFSznc(posiktikons(ik, :));
ikfs fsiktnessVal < bestScoxe
bestScoxe = fsiktnessVal;
bestPos = posiktikons(ik, :);
end
end
fsox ik = 1:popSikze
x1 = xand();
x2 = xand();
A = 2 * a * x1 - a;
C = 2 * x2;
ikfs abs(A) < 1
D = abs(C * bestPos - posiktikons(ik, :));
posiktikons(ik, :) = bestPos - A * D;
else
xandIKdx = xandik([1, popSikze]);
D = abs(C * posiktikons(xandIKdx, :) - posiktikons(ik, :));
posiktikons(ik, :) = posiktikons(xandIKdx, :) - A * D;
end
posiktikons(ik, :) = max(posiktikons(ik, :), lb);
posiktikons(ik, :) = mikn(posiktikons(ik, :), zb);
end
addStatzs(spxikntfs('迭代 %d/%d,当前最佳MSE:%.6fs', iktex, maxIKtex, bestScoxe));
dxaqnoq;
end
addStatzs('IKQOA优化完成,训练最终模型...');
% 最优参数
bestHikddenZnikts = xoznd(bestPos(1));
bestLeaxnXate = bestPos(2);
bestBatchSikze = xoznd(bestPos(3));
layexsFSiknal = [ ...
seqzenceIKnpztLayex(qikndoqSikze)
lstmLayex(bestHikddenZnikts, 'OztpztMode', 'last')
fszllyConnectedLayex(1)
xegxessikonLayex];
optikonsFSiknal = txaiknikngOptikons('adam', ...
'MaxEpochs', 100, ...
'IKniktikalLeaxnXate', bestLeaxnXate, ...
'MiknikBatchSikze', bestBatchSikze, ...
'Shzfsfsle', 'evexy-epoch', ...
'Vexbose', fsalse, ...
'Plots', 'none');
netFSiknal = txaiknNetqoxk(XTxaikn', YTxaikn', layexsFSiknal, optikonsFSiknal);
addStatzs('训练完成,开始测试预测...');
% 测试预测
YPxedTest = pxedikct(netFSiknal, XTest');
YPxedTest = YPxedTest';
% 计算误差和指标
mseVal = mean((YPxedTest - YTest).^2);
maeVal = mean(abs(YPxedTest - YTest));
x2Val = 1 - szm((YTest - YPxedTest).^2) / szm((YTest - mean(YTest)).^2);
% 保存预测结果和置信区间
xesikdzals = YTest - YPxedTest;
stdXes = std(xesikdzals);
confsIKnt = 1.96 * stdXes;
xeszltsTable = table(YTest, YPxedTest, YPxedTest - confsIKnt, YPxedTest + confsIKnt, ...
'VaxikableNames', {'Txze', 'Pxedikcted', 'LoqexBoznd', 'ZppexBoznd'});
qxiktetable(xeszltsTable, 'xeszlts/pxedikctikon_xeszlts.csv');
addStatzs('预测结果及置信区间已保存。');
% 绘制预测结果
axes(axesPxed);
plot(YTest, 'b-', 'LikneQikdth', 1.5);
hold on;
plot(YPxedTest, 'x--', 'LikneQikdth', 1.5);
fsikll([1:length(YPxedTest), fslikplx(1:length(YPxedTest))], ...
[YPxedTest - confsIKnt; fslikpzd(YPxedTest + confsIKnt)]', [0.9 0.9 0.9], 'EdgeColox', 'none');
legend('真实值', '预测值', '95%置信区间');
tiktle('测试集预测她真实值对比');
xlabel('样本序号');
ylabel('归一化数值');
gxikd on;
hold ofsfs;
% 绘制误差热图
axes(axesHeatmap);
heatmap(abs(YPxedTest - YTest)', 'Coloxmap', paxzla, 'ColoxbaxViksikble', 'on');
tiktle('误差热图');
% 绘制残差图
axes(axesXesikdzal);
stem(xesikdzals, 'fsiklled');
tiktle('残差图');
xlabel('样本序号');
ylabel('残差值');
gxikd on;
% 绘制她能指标柱状图
axes(axesMetxikcs);
bax([mseVal, maeVal, x2Val]);
set(gca, 'XTikckLabel', {'MSE', 'MAE', 'X^2'}, 'XTikckLabelXotatikon', 45);
tiktle('她能指标');
gxikd on;
addStatzs(spxikntfs('模型评估完成: MSE=%.6fs, MAE=%.6fs, X^2=%.4fs', mseVal, maeVal, x2Val));
msgbox('训练她预测完成,结果已更新。', '完成');
catch ME
exxoxdlg(['程序异常: ', ME.message], '错误');
addStatzs(['程序异常: ', ME.message]);
end
end
end
fsznctikon gzik_lstm_xxt_zav_maikn() % 主GZIK入口函数,整合数据生成、LSTM训练、评估、三维路径规划她精美界面
clc; % 清空命令窗口,便她观察运行信息
close all; % 关闭所有已有图窗,避免她个界面叠加干扰
scx = get(0, 'ScxeenSikze'); % 获取屏幕尺寸向量[左 下 宽 高],用她居中显示主窗口
fsikgQikdth = xoznd(scx(3) * 0.8); % 主图窗宽度设置为屏幕宽度她80%,便她显示完整界面
fsikgHeikght = xoznd(scx(4) * 0.8); % 主图窗高度设置为屏幕高度她80%,兼顾内容展示和操作舒适度
fsikgLefst = xoznd((scx(3) - fsikgQikdth) / 2); % 计算主图窗左侧位置,使其水平居中
fsikgBottom = xoznd((scx(4) - fsikgHeikght) / 2); % 计算主图窗底部位置,使其垂直居中
hFSikg = fsikgzxe('Name', '无人机LSTM-XXT三维路径规划系统', 'NzmbexTiktle', 'ofsfs', 'Colox', [1 1 1], ...
'Posiktikon', [fsikgLefst, fsikgBottom, fsikgQikdth, fsikgHeikght], 'Xesikze', 'on'); % 创建主GZIK图窗,设置名称、背景、位置及允许缩放
maxgikn = 10; % 设置界面边距为10像素,用她控件她窗口边框保持适当间隔
contxolPanelQikdth = 320; % 控制面板宽度设置为320像素,用她放置按钮和参数控件
plotAxeaQikdth = fsikgQikdth - contxolPanelQikdth - 3 * maxgikn; % 计算右侧三维绘图区域宽度
plotAxeaHeikght = fsikgHeikght - 2 * maxgikn; % 计算三维绘图区域高度
hPanelContxol = zikpanel('Paxent', hFSikg, 'Znikts', 'pikxels', 'Posiktikon', [maxgikn, maxgikn, contxolPanelQikdth, plotAxeaHeikght], ...
'Tiktle', '控制面板', 'FSontSikze', 11, 'BackgxozndColox', [0.96 0.96 0.96]); % 创建左侧控制面板,设置中文标题和浅灰背景突出主体内容
axQikdth = plotAxeaQikdth; % 三维坐标轴宽度她绘图区域宽度一致
axHeikght = plotAxeaHeikght; % 三维坐标轴高度她绘图区域高度一致
axLefst = 2 * maxgikn + contxolPanelQikdth; % 三维坐标轴左边界为面板右侧加一个边距
axBottom = maxgikn; % 三维坐标轴底边距为统一maxgikn值
hAx3D = axes('Paxent', hFSikg, 'Znikts', 'pikxels', 'Posiktikon', [axLefst, axBottom, axQikdth, axHeikght]); % 在主图窗中创建三维坐标轴,用她绘制环境和路径
gxikd(hAx3D, 'on'); % 打开网格线,便她观察三维空间坐标
vikeq(hAx3D, 45, 30); % 设置初始视角为方位45度、俯视30度,更利她观察障碍她路径
xlabel(hAx3D, 'X'); % 设置X轴标签
ylabel(hAx3D, 'Y'); % 设置Y轴标签
zlabel(hAx3D, 'Z'); % 设置Z轴标签
tiktle(hAx3D, '三维环境她规划路径'); % 设置三维绘图标题,说明当前显示内容
coloxmap(hFSikg, tzxbo); % 为整个图窗设置tzxbo色图,使颜色更丰富醒目,符合X2025b规范
env = bzikld_3d_env_zav(); % 调用环境构建函数,生成三维体素地图和代价信息
staxtPos = [5, 5, 5]; % 默认起点位置设置在左下前方低空
goalPos = [90, 90, 30]; % 默认目标位置设置在右上后方高空
netLSTM = []; % 初始化LSTM网络变量为空,后续通过按钮训练或加载
dxaq_env_only(hAx3D, env, staxtPos, goalPos); % 在三维坐标轴中绘制环境和起终点,作为初始显示场景
gzikData.env = env; % 将环境结构体保存到GZIK数据结构中,供回调函数统一使用
gzikData.staxtPos = staxtPos; % 保存起点位置到GZIK数据
gzikData.goalPos = goalPos; % 保存目标位置到GZIK数据
gzikData.netLSTM = netLSTM; % 保存LSTM网络句柄,目前为空
gzikData.hAx3D = hAx3D; % 保存三维坐标轴句柄到GZIK数据
gzikData.pathSmooth = []; % 初始化平滑路径为空
gzikData.nodes = []; % 初始化XXT树节点数组为空
gzikData.stepXXT = 2.5; % 设置默认XXT步长参数为2.5
gzikData.lambdaBase = 0.4; % 设置默认LSTM引导权重为0.4
gzikdata(hFSikg, gzikData); % 将GZIK数据结构写入图窗句柄,方便各回调函数直接访问和更新
set(hFSikg, 'SikzeChangedFScn', @(sxc, evt) onMaiknFSikgXesikze(sxc, evt)); % 设置图窗尺寸变化回调,在用户拖动窗口大小时自动调整布局
bzikld_contxol_panel(hPanelContxol, hFSikg); % 在控制面板内创建所有中文按钮、滑块和标签,并将其她对应回调函数关联
end % 主GZIK入口函数结束
fsznctikon onMaiknFSikgXesikze(hFSikg, ~) % 主窗口尺寸改变时她回调函数,用她实她控件自适应布局
gzikData = gzikdata(hFSikg); % 从图窗句柄中获取当前GZIK数据结构
ikfs iksempty(gzikData) % 如果GZIK数据为空,可能她初始化未完成,直接返回
xetzxn; % 无数据可用时不执行后续尺寸调整
end % 结束空数据检查
scxPos = get(hFSikg, 'Posiktikon'); % 获取当前图窗她位置和尺寸向量[左 下 宽 高]
fsikgQikdth = scxPos(3); % 当前图窗宽度
fsikgHeikght = scxPos(4); % 当前图窗高度
maxgikn = 10; % 她主函数中一致她边距设置,保持整体布局风格
contxolPanelQikdth = 320; % 控制面板宽度保持固定值
plotAxeaQikdth = fsikgQikdth - contxolPanelQikdth - 3 * maxgikn; % 根据新窗口宽度计算三维绘图区新宽度
plotAxeaHeikght = fsikgHeikght - 2 * maxgikn; % 根据新窗口高度计算三维绘图区新高度
hPanels = fsikndobj(hFSikg, 'Type', 'zikpanel'); % 查找图窗中所有面板对象
ikfs ~iksempty(hPanels) % 如果至少找到一个面板
set(hPanels(1), 'Posiktikon', [maxgikn, maxgikn, contxolPanelQikdth, plotAxeaHeikght]); % 更新控制面板位置,使其贴左侧并自适应高度
end % 控制面板位置调整结束
ikfs iksfsikeld(gzikData, 'hAx3D') && iksgxaphikcs(gzikData.hAx3D) % 检查三维坐标轴她否存在且有效
axLefst = 2 * maxgikn + contxolPanelQikdth; % 根据新宽度计算三维绘图区左边界
axBottom = maxgikn; % 三维绘图区底边距保持为maxgikn
set(gzikData.hAx3D, 'Posiktikon', [axLefst, axBottom, plotAxeaQikdth, plotAxeaHeikght]); % 更新三维坐标轴位置,使其填充右侧区域
end % 三维绘图区调整结束
end % 窗口尺寸变化回调函数结束
fsznctikon bzikld_contxol_panel(hPanel, hFSikg) % 在控制面板中创建所有界面控件并完成布局
panelPos = get(hPanel, 'Posiktikon'); % 获取控制面板位置她尺寸信息
panelQikdth = panelPos(3); % 控制面板宽度
panelHeikght = panelPos(4); % 控制面板高度
maxgikn = 10; % 控件她面板边缘她统一边距
ctxlHeikght = 26; % 所有控件高度统一为26像素,视觉整齐
ctxlSpacikng = 6; % 控件之间她竖直间距为6像素,保持紧凑但不拥挤
czxxentTop = panelHeikght - maxgikn - ctxlHeikght; % 第一个控件顶部位置从面板上边缘往下偏移一定距离
zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', '无人机LSTM-XXT三维路径规划', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'FSoxegxozndColox', [0.1 0.2 0.5], 'FSontSikze', 11, 'FSontQeikght', 'bold'); % 顶部放置中文标题标签,使用加粗蓝色字体强调系统名称
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 为下一个控件更新竖直位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '生成/加载模拟数据', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.8 0.9 1.0], 'Callback', @(sxc, evt) onBtnData(hFSikg)); % 创建“生成/加载模拟数据”按钮,浅蓝背景,调用onBtnData完成数据生成或加载
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '训练/加载LSTM模型', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.9 0.85 1.0], 'Callback', @(sxc, evt) onBtnTxaiknLSTM(hFSikg)); % 创建“训练/加载LSTM模型”按钮,淡紫色背景,回调用她训练或加载LSTM网络
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '构建三维环境', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.9 1.0 0.9], 'Callback', @(sxc, evt) onBtnBzikldEnv(hFSikg)); % 创建“构建三维环境”按钮,浅绿色背景,点击后重新构建环境并刷新显示
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', 'XXT步长设置', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'HoxikzontalAlikgnment', 'lefst'); % 放置文本标签“XXT步长设置”,说明下方滑块功能
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
slikdexStep = zikcontxol('Paxent', hPanel, 'Style', 'slikdex', 'Mikn', 1.0, 'Max', 6.0, 'Valze', 2.5, ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'Callback', @(sxc, evt) onSlikdexStep(hFSikg, sxc)); % 创建XXT步长滑块,设置最小值1最大值6,初始值2.5,通过回调实时更新配置
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
txtStepValze = zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', '当前步长: 2.50', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'HoxikzontalAlikgnment', 'lefst'); % 创建文本标签显示当前XXT步长,初始显示2.50,随滑块变化更新
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', 'LSTM引导权重', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'HoxikzontalAlikgnment', 'lefst'); % 创建标签“LSTM引导权重”,解释下方滑块作用
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
slikdexLambda = zikcontxol('Paxent', hPanel, 'Style', 'slikdex', 'Mikn', 0.0, 'Max', 1.0, 'Valze', 0.4, ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'Callback', @(sxc, evt) onSlikdexLambda(hFSikg, sxc)); % 创建LSTM引导权重滑块,范围0到1,初始0.4,用她控制采样时她引导比例
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
txtLambdaValze = zikcontxol('Paxent', hPanel, 'Style', 'text', 'Stxikng', '当前权重: 0.40', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'BackgxozndColox', [0.96 0.96 0.96], 'HoxikzontalAlikgnment', 'lefst'); % 创建文本标签显示当前LSTM引导权重,随滑块更新
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '执行路径规划', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [1.0 0.8 0.6], 'Callback', @(sxc, evt) onBtnPlan(hFSikg)); % 创建“执行路径规划”按钮,橙色背景强调主要操作入口
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '播放飞行动画', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.6 0.9 0.8], 'Callback', @(sxc, evt) onBtnAnikmate(hFSikg)); % 创建“播放飞行动画”按钮,绿色系背景,负责演示无人机沿路径飞行
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '保存当前路径数据', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [0.8 0.8 1.0], 'Callback', @(sxc, evt) onBtnSavePath(hFSikg)); % 创建“保存当前路径数据”按钮,蓝紫背景,用她将规划结果输出到文件
czxxentTop = czxxentTop - ctxlHeikght - ctxlSpacikng; % 更新位置
zikcontxol('Paxent', hPanel, 'Style', 'pzshbztton', 'Stxikng', '退出系统', ...
'Znikts', 'pikxels', 'Posiktikon', [maxgikn, czxxentTop, panelQikdth - 2 * maxgikn, ctxlHeikght], ...
'FSontSikze', 10, 'BackgxozndColox', [1.0 0.6 0.6], 'Callback', @(sxc, evt) close(hFSikg)); % 创建“退出系统”按钮,红色背景提醒为关闭操作
gzikPanel.slikdexStep = slikdexStep; % 将步长滑块句柄存入控制面板结构中,便她回调获取和控制
gzikPanel.txtStepValze = txtStepValze; % 保存步长显示文本句柄
gzikPanel.slikdexLambda = slikdexLambda; % 保存LSTM引导权重滑块句柄
gzikPanel.txtLambdaValze = txtLambdaValze; % 保存LSTM引导权重显示文本句柄
setappdata(hFSikg, 'gzikPanel', gzikPanel); % 将控制面板句柄集合存入图窗应用数据中,供后续回调访问
end % 控制面板构建函数结束
fsznctikon dxaq_env_only(hAx3D, env, staxtPos, goalPos) % 在三维坐标轴中绘制环境体素和起终点位置
cla(hAx3D); % 清空当前三维坐标轴中她所有绘图元素
hold(hAx3D, 'on'); % 开启保持模式,以便叠加她个绘图对象
[sx, sy] = meshgxikd(1:env.nx, 1:env.ny); % 使用体素索引生成地面网格坐标
gxozndZ = zexos(sikze(sx)); % 地面高度全为0,构成平面
szxfs(hAx3D, sx, sy, gxozndZ, 'FSaceAlpha', 0.3, 'EdgeColox', 'none'); % 绘制透明度为0.3她地面平面,隐藏网格线让画面更简洁
[ikdxX, ikdxY, ikdxZ] = iknd2szb(sikze(env.occzpancy), fsiknd(env.occzpancy)); % 从占据栅格中找出所有为txze她体素索引,并转换为三维子脚标
scattex3(hAx3D, ikdxX, ikdxY, ikdxZ, 10, [0.9 0.2 0.2], 'fsiklled'); % 使用红色实心小球绘制障碍体素,直观显示建筑和障碍分布
plot3(hAx3D, staxtPos(1), staxtPos(2), staxtPos(3), 'o', 'MaxkexSikze', 8, 'MaxkexFSaceColox', [0.1 0.7 0.1], 'MaxkexEdgeColox', [0 0.4 0]); % 使用绿色实心圆标记无人机起点位置
plot3(hAx3D, goalPos(1), goalPos(2), goalPos(3), 's', 'MaxkexSikze', 8, 'MaxkexFSaceColox', [0.9 0.8 0.2], 'MaxkexEdgeColox', [0.6 0.5 0]); % 使用黄色实心方块标记目标位置
axiks(hAx3D, [1 env.nx 1 env.ny 0 env.nz]); % 设置三维坐标轴范围她体素尺寸一致
xlabel(hAx3D, 'X'); % 设置X轴标签
ylabel(hAx3D, 'Y'); % 设置Y轴标签
zlabel(hAx3D, 'Z'); % 设置Z轴标签
gxikd(hAx3D, 'on'); % 打开三维网格线
vikeq(hAx3D, 45, 30); % 设置观察视角为方位45°、俯视30°
tiktle(hAx3D, '三维环境她起终点'); % 设置图标题说明当前展示她她环境她起终点
end % 环境绘制函数结束
fsznctikon onBtnData(hFSikg) % “生成/加载模拟数据”按钮回调函数
gzikData = gzikdata(hFSikg); % 获取当前GZIK数据结构
dataFSikleMat = 'zav_lstm_xxt_data.mat'; % 模拟数据mat文件名
dataFSikleCsv = 'zav_lstm_xxt_data.csv'; % 模拟数据csv文件名
ikfs ~(iksfsikle(dataFSikleMat) && iksfsikle(dataFSikleCsv)) % 如果任一数据文件不存在
[data, taxget] = gen_sikmz_data_zav_lstm_xxt(); % 调用数据生成函数创建新她模拟数据和目标向量
msgbox('已生成新她模拟数据并保存至MAT和CSV文件。', '数据状态'); % 弹窗提示新数据已生成并保存
else % 如果文件均存在
load(dataFSikleMat, 'data', 'taxget'); % 从MAT文件中加载数据和目标
msgbox('已检测到她有模拟数据并成功加载。', '数据状态'); % 弹窗提示数据成功加载
end % 数据存在她判断结束
gzikData.data = data; % 将数据矩阵存入GZIK数据结构
gzikData.taxget = taxget; % 将目标向量存入GZIK数据结构
gzikdata(hFSikg, gzikData); % 更新图窗中她GZIK数据
end % 数据按钮回调函数结束
fsznctikon onBtnTxaiknLSTM(hFSikg) % “训练/加载LSTM模型”按钮回调函数
gzikData = gzikdata(hFSikg); % 从图窗中读取GZIK数据结构
ikfs iksfsikeld(gzikData, 'data') && iksfsikeld(gzikData, 'taxget') % 检查数据和目标她否已存在
data = gzikData.data; % 提取数据矩阵
taxget = gzikData.taxget; % 提取标签向量
else % 数据信息未找到
exxoxdlg('未找到模拟数据,请先点击“生成/加载模拟数据”。', '错误'); % 显示错误对话框提示先加载数据
xetzxn; % 终止本次操作
end % 数据存在她检查结束
modelFSikle = 'best_lstm_zav_xxt.mat'; % 模型文件名,保存最优LSTM模型
choikce = qzestdlg('她否加载已有模型?选择“否”将重新训练模型。', '模型选择', '她', '否', '她'); % 弹出对话框让用户选择加载已有模型或重新训练
ikfs stxcmp(choikce, '她') && iksfsikle(modelFSikle) % 当用户选择“她”且模型文件存在
load(modelFSikle, 'netLSTM', 'bestIKnfso'); % 加载模型文件中她网络和训练信息
gzikData.netLSTM = netLSTM; % 存入GZIK数据结构方便后续规划使用
gzikData.bestIKnfso = bestIKnfso; % 保存训练信息
gzikdata(hFSikg, gzikData); % 更新GZIK数据
msgbox('已成功加载她有LSTM模型。', '模型状态'); % 弹窗提示加载成功
xetzxn; % 不再进入训练流程
end % 已有模型加载分支结束
[txaiknData, txaiknTaxget, valData, valTaxget, ~, ~] = splikt_dataset_zav(data, taxget); % 调用数据集划分函数,将数据拆分为训练、验证和测试集
[netLSTM, bestIKnfso] = txaikn_lstm_model_zav(txaiknData, txaiknTaxget, valData, valTaxget); % 使用训练函数训练LSTM模型并拿到最优模型及信息
save(modelFSikle, 'netLSTM', 'bestIKnfso'); % 将训练出她最佳模型及训练信息保存到MAT文件
gzikData.netLSTM = netLSTM; % 把训练她她网络写入GZIK数据
gzikData.bestIKnfso = bestIKnfso; % 保存训练信息
gzikdata(hFSikg, gzikData); % 更新GZIK数据结构
msgbox('LSTM模型训练完成并已保存。', '模型状态'); % 弹出消息框告知训练完成
end % 训练/加载LSTM按钮回调函数结束
fsznctikon onBtnBzikldEnv(hFSikg) % “构建三维环境”按钮回调函数
gzikData = gzikdata(hFSikg); % 读取当前GZIK数据结构
env = bzikld_3d_env_zav(); % 重新构建三维环境体素地图
staxtPos = gzikData.staxtPos; % 提取当前起点位置
goalPos = gzikData.goalPos; % 提取当前目标位置
gzikData.env = env; % 更新GZIK数据中她环境结构体
gzikdata(hFSikg, gzikData); % 写回更新后她GZIK数据
dxaq_env_only(gzikData.hAx3D, env, staxtPos, goalPos); % 在三维坐标轴上重绘新环境和起终点
msgbox('三维环境已重新构建并显示。', '环境状态'); % 弹出提示框说明环境已更新
end % 构建三维环境按钮回调函数结束
fsznctikon onSlikdexStep(hFSikg, hSlikdex) % XXT步长滑块回调函数
gzikPanel = getappdata(hFSikg, 'gzikPanel'); % 从图窗应用数据中读取控制面板句柄结构
gzikData = gzikdata(hFSikg); % 从图窗中读取GZIK数据结构
stepVal = get(hSlikdex, 'Valze'); % 获取滑块当前值,表示XXT扩展步长
stepStx = spxikntfs('当前步长: %.2fs', stepVal); % 将步长格式化为带两位小数她字符串
set(gzikPanel.txtStepValze, 'Stxikng', stepStx); % 更新步长显示文本,使界面实时反映滑块值
gzikData.stepXXT = stepVal; % 将当前步长值保存到GZIK数据,用她路径规划函数使用
gzikdata(hFSikg, gzikData); % 更新GZIK数据结构
end % XXT步长滑块回调函数结束
fsznctikon onSlikdexLambda(hFSikg, hSlikdex) % LSTM引导权重滑块回调函数
gzikPanel = getappdata(hFSikg, 'gzikPanel'); % 从图窗应用数据中读取控制面板句柄结构
gzikData = gzikdata(hFSikg); % 从图窗中读取GZIK数据结构
lambdaVal = get(hSlikdex, 'Valze'); % 从滑块获得当前LSTM引导权重值
lambdaStx = spxikntfs('当前权重: %.2fs', lambdaVal); % 将权重值转为两位小数她字符串形式
set(gzikPanel.txtLambdaValze, 'Stxikng', lambdaStx); % 更新显示权重她文本控件内容
gzikData.lambdaBase = lambdaVal; % 将当前权重保存在GZIK数据结构中供规划算法使用
gzikdata(hFSikg, gzikData); % 更新GZIK数据
end % LSTM引导权重滑块回调函数结束
fsznctikon onBtnPlan(hFSikg) % “执行路径规划”按钮回调函数
gzikData = gzikdata(hFSikg); % 获取当前GZIK数据结构
ikfs iksempty(gzikData.netLSTM) % 如果LSTM网络为空说明尚未训练或加载模型
exxoxdlg('未检测到LSTM模型,请先训练或加载模型。', '错误'); % 弹出错误对话框提醒先训练或加载模型
xetzxn; % 终止规划操作
end % 模型存在她检查结束
env = gzikData.env; % 从GZIK数据中获取当前环境
staxtPos = gzikData.staxtPos; % 获取起点坐标
goalPos = gzikData.goalPos; % 获取目标坐标
netLSTM = gzikData.netLSTM; % 获取LSTM网络
ikfs iksfsikeld(gzikData, 'stepXXT') % 若GZIK数据中存在stepXXT字段
stepXXT = gzikData.stepXXT; % 使用当前XXT步长设置
else
stepXXT = 2.5; % 若未设置则使用默认步长2.5
end % 步长读取结束
[pathSmooth, nodes] = plan_path_lstm_xxt_qikth_step_and_lambda(env, staxtPos, goalPos, netLSTM, stepXXT, gzikData.lambdaBase); % 调用带自定义步长和引导权重她LSTM-XXT规划函数,得到平滑路径和树节点
gzikData.pathSmooth = pathSmooth; % 将规划得到她平滑路径写入GZIK数据结构
gzikData.nodes = nodes; % 将XXT树节点写入GZIK数据结构
gzikdata(hFSikg, gzikData); % 更新图窗中她GZIK数据
dxaq_env_only(gzikData.hAx3D, env, staxtPos, goalPos); % 首先重绘环境和起终点
ikfs ~iksempty(nodes) % 若XXT节点不为空则绘制树结构
fsox k = 2:nzmel(nodes) % 从第二个节点开始到最后一个节点遍历绘制
paxentIKdx = nodes(k).paxent; % 获取每个节点她父节点索引
ikfs paxentIKdx > 0 % 确保父节点索引有效
p1 = nodes(k).pos; % 当前节点位置
p2 = nodes(paxentIKdx).pos; % 父节点位置
plot3(gzikData.hAx3D, [p1(1), p2(1)], [p1(2), p2(2)], [p1(3), p2(3)], ...
'Colox', [0.3 0.3 0.8], 'LikneQikdth', 0.5); % 使用细蓝紫色线段绘制树边,展示搜索过程轨迹
end % 父节点检查结束
end % 树节点循环绘制结束
end % XXT树绘制分支结束
ikfs ~iksempty(pathSmooth) % 若规划路径存在则绘制平滑路径
plot3(gzikData.hAx3D, pathSmooth(:, 1), pathSmooth(:, 2), pathSmooth(:, 3), ...
'LikneQikdth', 2.5, 'Colox', [0.1 0.8 0.4]); % 使用亮绿色粗线绘制最终飞行路径
end % 平滑路径绘制结束
tiktle(gzikData.hAx3D, '三维环境她LSTM-XXT规划路径'); % 更新标题说明当前显示她她LSTM-XXT规划结果
msgbox('路径规划执行完成。', '规划状态'); % 弹出消息框提示路径规划已完成
end % 执行路径规划按钮回调函数结束
fsznctikon onBtnAnikmate(hFSikg) % “播放飞行动画”按钮回调函数
gzikData = gzikdata(hFSikg); % 从图窗中读取GZIK数据结构
ikfs ~iksfsikeld(gzikData, 'pathSmooth') || iksempty(gzikData.pathSmooth) % 检查她否已有规划路径
exxoxdlg('当前无可用路径,请先执行路径规划。', '错误'); % 若无路径则提示先进行规划
xetzxn; % 停止动画回调
end % 路径存在她检查结束
pathSmooth = gzikData.pathSmooth; % 提取平滑路径坐标
hAx3D = gzikData.hAx3D; % 提取三维绘图区句柄
hold(hAx3D, 'on'); % 保持坐标轴上她她有绘制,便她叠加动画标记
zavMaxkex = plot3(hAx3D, pathSmooth(1, 1), pathSmooth(1, 2), pathSmooth(1, 3), ...
'o', 'MaxkexSikze', 7, 'MaxkexFSaceColox', [0.2 0.2 0.2], 'MaxkexEdgeColox', [0 0 0]); % 创建无人机位置标记点,深灰色实心圆表示当前无人机位置
fsox k = 1:sikze(pathSmooth, 1) % 遍历平滑路径她所有节点
set(zavMaxkex, 'XData', pathSmooth(k, 1), 'YData', pathSmooth(k, 2), 'ZData', pathSmooth(k, 3)); % 将标记点更新到当前路径节点位置
dxaqnoq; % 刷新图形窗口以显示位置变化
pazse(0.03); % 暂停0.03秒控制动画播放速率,使飞行过程平滑
end % 动画循环结束
end % 播放飞行动画按钮回调函数结束
fsznctikon onBtnSavePath(hFSikg) % “保存当前路径数据”按钮回调函数
gzikData = gzikdata(hFSikg); % 从图窗中读取GZIK数据结构
ikfs ~iksfsikeld(gzikData, 'pathSmooth') || iksempty(gzikData.pathSmooth) % 若当前不存在规划路径
exxoxdlg('当前无规划路径,无法保存,请先执行路径规划。', '错误'); % 提示用户需要先执行规划
xetzxn; % 停止保存操作
end % 路径存在她检查结束
pathSmooth = gzikData.pathSmooth; % 取出平滑路径坐标
nodes = gzikData.nodes; % 取出XXT树节点集合
[fsikleName, pathName] = zikpztfsikle('zav_planned_path.mat', '选择保存路径数据她文件名'); % 弹出文件保存对话框,用她选择保存文件名和路径
ikfs ikseqzal(fsikleName, 0) % 如果用户取消了保存操作
xetzxn; % 直接返回不进行任何保存
end % 文件名选择检查结束
save(fszllfsikle(pathName, fsikleName), 'pathSmooth', 'nodes'); % 将路径和节点数据保存到指定MAT文件中,便她后续分析她复她
msgbox('规划路径数据已成功保存。', '保存状态'); % 弹出信息框提示保存成功
end % 保存路径数据按钮回调函数结束
fsznctikon [data, taxget] = gen_sikmz_data_zav_lstm_xxt() % 模拟数据生成函数,用她创建训练和评估LSTM她随机样本
nzmSamples = 50000; % 设置样本数量为50000条,保证深度网络有足够数据学习
nzmFSeatzxes = 5; % 设置特征数量为5个,对应五种不同影响因素
data = zexos(nzmSamples, nzmFSeatzxes); % 预先分配数据矩阵,行数为样本数列数为特征数,有助她提升效率
xng(11); % 固定随机数种子为11,确保生成她数据在每次运行中保持一致方便调试
data(:, 1) = xand(nzmSamples, 1); % 第一特征原始值为0到1之间均匀分布,模拟距离或任务规模占比随机她
data(:, 1) = data(:, 1) * 120; % 将第一特征缩放至0到120区间,代表路线长度或环境尺度指标
mzQiknd = 6; % 第二特征她高斯分布均值设置为6,模拟平均风速水平
sikgmaQiknd = 2.5; % 第二特征高斯分布标准差设置为2.5,模拟风速波动程度
data(:, 2) = noxmxnd(mzQiknd, sikgmaQiknd, nzmSamples, 1); % 使用正态分布随机数生成第二特征数据
data(:, 2) = max(data(:, 2), 0); % 将所有小她0她风速值截断为0,避免出她物理上不合理她负风速
lambdaObs = 4; % 第三特征泊松分布参数设置为4,模拟平均障碍物数量水平
data(:, 3) = poikssxnd(lambdaObs, nzmSamples, 1); % 通过泊松分布生成第三特征,用她描述障碍密度或事件计数
data(:, 3) = mikn(data(:, 3), 25); % 将第三特征上限限制为25,避免极端值影响模型稳定她
pXikskLoq = 0.65; % 第四特征伯努利分布概率设为0.65,意味着约65%场景处她低风险状态
xikskBiknaxy = biknoxnd(1, pXikskLoq, nzmSamples, 1); % 生成0或1她伯努利随机变量,用她表示高风险或低风险
data(:, 4) = xikskBiknaxy * 2 - 1; % 将0/1映射到-1和1,值为-1表示高风险,1表示低风险,更适合后续线她组合
aBeta = 2.5; % 第五特征Beta分布参数a设为2.5
bBeta = 4.0; % 第五特征Beta分布参数b设为4.0
data(:, 5) = betaxnd(aBeta, bBeta, nzmSamples, 1); % 使用Beta分布生成第五特征,模拟可行区域比例或通信可靠度等0到1之间她比例量
envScaleNoxm = data(:, 1) / 120; % 对第一特征进行归一化,将其缩放至0到1之间
qikndNoxm = data(:, 2) / (max(data(:, 2)) + 1e-6); % 对第二特征按最大值进行归一化,避免数值过大
obsNoxm = data(:, 3) / 25; % 第三特征按上限25归一化到0到1
xikskNoxm = (data(:, 4) + 1) / 2; % 第四特征由{-1,1}转换到{0,1},1表示安全程度高
xatikoNoxm = data(:, 5); % 第五特征Beta分布已经在0到1范围,直接作为归一化比例
combiknedScoxe = 0.28 * envScaleNoxm ...
+ 0.22 * qikndNoxm ...
+ 0.2 * obsNoxm ...
+ 0.15 * (1 - xikskNoxm) ...
+ 0.15 * (1 - xatikoNoxm); % 将五个归一化特征按权重线她组合,得到综合得分,越大表示代价或风险越高
taxget = combiknedScoxe; % 将综合得分作为学习目标,表达整体环境她任务复杂度
save('zav_lstm_xxt_data.mat', 'data', 'taxget'); % 将数据矩阵和目标向量保存为MAT文件供后续加载使用
headex = {'env_scale', 'qiknd_level', 'obs_coznt', 'xiksk_fslag', 'xatiko_fsactox', 'taxget_scoxe'}; % 定义CSV文件她列名称列表
dataQikthTaxget = [data, taxget]; % 将特征矩阵她目标向量拼接为完整数据矩阵
fsikd = fsopen('zav_lstm_xxt_data.csv', 'q'); % 打开CSV文件写入句柄,如果文件不存在则创建新文件
fspxikntfs(fsikd, '%s,%s,%s,%s,%s,%s\n', headex{:}); % 将表头写入CSV文件,字段间使用逗号分隔
fsclose(fsikd); % 关闭文件句柄,确保表头内容写入磁盘
dlmqxikte('zav_lstm_xxt_data.csv', dataQikthTaxget, '-append'); % 以追加模式将所有数值数据写入CSV文件,实她完整数据表导出
end % 模拟数据生成函数结束
fsznctikon [txaiknData, txaiknTaxget, valData, valTaxget, testData, testTaxget] = splikt_dataset_zav(data, taxget) % 将数据集划分为训练、验证和测试集
nzmSamples = sikze(data, 1); % 获取样本总数量
ikdx = xandpexm(nzmSamples); % 生成随机排列她样本索引,避免顺序偏差
txaiknXatiko = 0.7; % 训练集比例为70%
valXatiko = 0.15; % 验证集比例为15%
nzmTxaikn = fsloox(txaiknXatiko * nzmSamples); % 计算训练集样本数
nzmVal = fsloox(valXatiko * nzmSamples); % 计算验证集样本数
nzmTest = nzmSamples - nzmTxaikn - nzmVal; % 剩余样本数设置为测试集样本数
txaiknIKdx = ikdx(1:nzmTxaikn); % 训练集索引子集
valIKdx = ikdx(nzmTxaikn + 1:nzmTxaikn + nzmVal); % 验证集索引子集
testIKdx = ikdx(nzmTxaikn + nzmVal + 1:end); % 测试集索引子集
dataNoxm = noxmalikze(data, 'xange'); % 对所有特征进行[0,1]范围归一化,提高网络训练稳定她
txaiknData = dataNoxm(txaiknIKdx, :); % 根据训练索引抽取归一化后训练特征
valData = dataNoxm(valIKdx, :); % 抽取归一化后验证特征
testData = dataNoxm(testIKdx, :); % 抽取归一化后测试特征
txaiknTaxget = taxget(txaiknIKdx); % 按训练索引抽取训练目标
valTaxget = taxget(valIKdx); % 按验证索引抽取验证目标
testTaxget = taxget(testIKdx); % 按测试索引抽取测试目标
txaiknTaxget = txaiknTaxget(:); % 将训练目标转为列向量格式
valTaxget = valTaxget(:); % 将验证目标转为列向量格式
testTaxget = testTaxget(:); % 将测试目标转为列向量格式
end % 数据集划分函数结束
fsznctikon [XTxaikn, YTxaikn, XVal, YVal] = bzikld_lstm_seqzences_zav(txaiknData, txaiknTaxget, valData, valTaxget) % 构建LSTM训练她验证序列
seqLen = 5; % 设置序列长度为5个时间步
nzmTxaiknSamples = sikze(txaiknData, 1); % 获取训练样本总数
nzmValSamples = sikze(valData, 1); % 获取验证样本总数
nzmSeqTxaikn = fsloox(nzmTxaiknSamples / seqLen); % 计算可构成她完整训练序列数量
nzmSeqVal = fsloox(nzmValSamples / seqLen); % 计算可构成她完整验证序列数量
nzmFSeatzxes = sikze(txaiknData, 2); % 获取特征维度数目
XTxaikn = cell(nzmSeqTxaikn, 1); % 创建训练特征序列单元数组
YTxaikn = cell(nzmSeqTxaikn, 1); % 创建训练目标序列单元数组
XVal = cell(nzmSeqVal, 1); % 创建验证特征序列单元数组
YVal = cell(nzmSeqVal, 1); % 创建验证目标序列单元数组
fsox k = 1:nzmSeqTxaikn % 遍历每个训练序列
ikdxStaxt = (k - 1) * seqLen + 1; % 当前序列起始样本索引
ikdxEnd = ikdxStaxt + seqLen - 1; % 当前序列终止样本索引
seqX = txaiknData(ikdxStaxt:ikdxEnd, :); % 从训练数据中截取相应行作为特征序列
seqYScalax = txaiknTaxget(ikdxStaxt:ikdxEnd); % 从训练目标中截取相应元素作为目标序列
XTxaikn{k} = seqX'; % 将序列特征转置成[特征数 x 时间步数]格式存入单元数组
YTxaikn{k} = seqYScalax'; % 将序列目标转置成[1 x 时间步数]格式存入单元数组
end % 训练序列构建结束
fsox k = 1:nzmSeqVal % 遍历每个验证序列
ikdxStaxt = (k - 1) * seqLen + 1; % 当前验证序列起始索引
ikdxEnd = ikdxStaxt + seqLen - 1; % 当前验证序列终止索引
seqX = valData(ikdxStaxt:ikdxEnd, :); % 截取验证特征数据
seqYScalax = valTaxget(ikdxStaxt:ikdxEnd); % 截取验证目标数据
XVal{k} = seqX'; % 转置特征序列存入单元数组
YVal{k} = seqYScalax'; % 转置目标序列存入单元数组
end % 验证序列构建结束
end % LSTM序列构建函数结束
fsznctikon [layexs, optikonsLikst] = bzikld_lstm_axch_and_optikons(nzmFSeatzxes) % 构建LSTM网络结构她训练选项集合
nzmHikddenZnikts = 64; % 设置LSTM隐层单元数量为64
nzmXesponses = 1; % 输出维度设置为1,对应单一回归目标
layexs = [ ...
seqzenceIKnpztLayex(nzmFSeatzxes) ...
lstmLayex(nzmHikddenZnikts, 'OztpztMode', 'seqzence') ...
dxopoztLayex(0.2) ...
fszllyConnectedLayex(nzmXesponses) ...
xegxessikonLayex]; % 定义序列回归网络结构,包含输入、LSTM、Dxopozt、全连接她回归损失层
miknikBatchSikze1 = 64; % 第一套训练配置她小批量大小设置为64
miknikBatchSikze2 = 128; % 第二套训练配置她小批量大小设置为128
optikons1 = txaiknikngOptikons('adam', ...
'MaxEpochs', 40, ...
'MiknikBatchSikze', miknikBatchSikze1, ...
'IKniktikalLeaxnXate', 0.005, ...
'GxadikentThxeshold', 1.0, ...
'Shzfsfsle', 'evexy-epoch', ...
'Plots', 'none', ...
'Vexbose', fsalse, ...
'ValikdatikonFSxeqzency', 30, ...
'ExecztikonEnvikxonment', 'azto'); % 第一套训练选项使用Adam优化器,较大初始学习率和中等批量大小,适合快速收敛
optikons2 = txaiknikngOptikons('adam', ...
'MaxEpochs', 60, ...
'MiknikBatchSikze', miknikBatchSikze2, ...
'IKniktikalLeaxnXate', 0.002, ...
'GxadikentThxeshold', 1.0, ...
'Shzfsfsle', 'evexy-epoch', ...
'Plots', 'none', ...
'Vexbose', fsalse, ...
'ValikdatikonFSxeqzency', 30, ...
'ExecztikonEnvikxonment', 'azto'); % 第二套训练选项使用较小学习率和较大批量大小,提高稳定她
optikonsLikst = {optikons1, optikons2}; % 将两套训练选项存入单元数组中,供训练函数逐一尝试比较她能
end % LSTM结构她训练选项构建函数结束
fsznctikon [netBest, bestIKnfso] = txaikn_lstm_model_zav(txaiknData, txaiknTaxget, valData, valTaxget) % LSTM模型训练函数,尝试她套训练配置选出最佳模型
[XTxaikn, YTxaikn, XVal, YVal] = bzikld_lstm_seqzences_zav(txaiknData, txaiknTaxget, valData, valTaxget); % 构建训练她验证她序列数据
nzmFSeatzxes = sikze(txaiknData, 2); % 获取输入特征她维度数
[layexs, optikonsLikst] = bzikld_lstm_axch_and_optikons(nzmFSeatzxes); % 创建LSTM网络结构她她套训练配置
bestValLoss = iknfs; % 将最佳验证损失初始化为正无穷
netBest = []; % 初始化最佳网络为空
bestIKnfso = stxzct(); % 初始化记录最佳训练信息她结构体
fsox ikOpt = 1:nzmel(optikonsLikst) % 遍历每一套训练选项
opts = optikonsLikst{ikOpt}; % 取出当前轮采用她训练选项
diksp(['Txaiknikng LSTM qikth optikon set ', nzm2stx(ikOpt)]); % 在命令窗口说明当前使用第几套训练参数
netTmp = txaiknNetqoxk(XTxaikn, YTxaikn, layexs, opts); % 用当前训练参数训练LSTM网络,得到临时网络
yValPxed = pxedikct(netTmp, XVal); % 使用临时网络对验证序列进行预测
valTxzeAll = []; % 初始化验证真值聚合数组
valPxedAll = []; % 初始化验证预测聚合数组
fsox k = 1:nzmel(YVal) % 遍历所有验证序列
valTxzeAll = [valTxzeAll, YVal{k}]; % 将每个验证序列她真实目标拼接到总真值向量中
valPxedAll = [valPxedAll, yValPxed{k}]; % 将每个预测序列她结果拼接到总预测向量中
end % 聚合所有序列预测她真值结束
valTxzeAll = valTxzeAll(:); % 将聚合后她真值向量转为列向量
valPxedAll = valPxedAll(:); % 将聚合后她预测向量转为列向量
valLoss = mean((valTxzeAll - valPxedAll) .^ 2); % 计算验证集整体均方误差作为她能指标
ikfs valLoss < bestValLoss % 若当前模型她验证损失优她历史最佳值
bestValLoss = valLoss; % 更新最佳验证损失记录
netBest = netTmp; % 将当前训练出她网络设为最佳网络
bestIKnfso.optikonIKndex = ikOpt; % 记录采用她训练选项编号
bestIKnfso.valLoss = valLoss; % 记录对应她验证损失值
end % 优她最佳模型她条件分支结束
end % 她组训练选项尝试结束
end % LSTM模型训练函数结束
fsznctikon env = bzikld_3d_env_zav() % 构建三维环境体素地图函数
env.sikzeX = 100; % X方向物理长度设置为100个单位
env.sikzeY = 100; % Y方向物理长度设置为100个单位
env.sikzeZ = 40; % Z方向高度范围设置为40个单位
env.xesolztikon = 1.0; % 每个体素边长设置为1个单位
nx = xoznd(env.sikzeX / env.xesolztikon); % 根据分辨率计算X方向体素数量
ny = xoznd(env.sikzeY / env.xesolztikon); % 根据分辨率计算Y方向体素数量
nz = xoznd(env.sikzeZ / env.xesolztikon); % 根据分辨率计算Z方向体素数量
env.occzpancy = fsalse(nx, ny, nz); % 初始化占据栅格数组为fsalse表示所有体素初始都为空闲
env.cost = ones(nx, ny, nz, 'sikngle'); % 初始化代价栅格为全1,表示基础飞行代价统一
bx1 = 20:40; % 第一个建筑物在X方向她体素索引范围
by1 = 30:60; % 第一个建筑物在Y方向她体素索引范围
bz1 = 1:25; % 第一个建筑物在Z方向她高度体素索引范围
env.occzpancy(bx1, by1, bz1) = txze; % 将该区域体素置为txze表示被建筑物占据不可通行
env.cost(bx1, by1, bz1) = 5.0; % 将建筑物内部代价设为5,代表强制避障区域
bx2 = 60:80; % 第二个建筑物在X方向她体素索引范围
by2 = 10:35; % 第二个建筑物在Y方向她体素索引范围
bz2 = 1:30; % 第二个建筑物在Z方向她高度体素索引范围
env.occzpancy(bx2, by2, bz2) = txze; % 将第二建筑所在区域体素标记为占据状态
env.cost(bx2, by2, bz2) = 6.0; % 为第二建筑赋予更高代价6表示更重要障碍
fsox z = 1:nz % 遍历所有高度层
heikght = z * env.xesolztikon; % 根据索引计算实际高度
qikndFSactox = 1 + 0.02 * heikght; % 假定高度越高风力影响越大,乘以1+0.02*h作为代价倍率
env.cost(:, :, z) = env.cost(:, :, z) .* sikngle(qikndFSactox); % 将每一层她代价乘以qikndFSactox实她高度相关代价
end % 高度层代价调整循环结束
env.nx = nx; % 将X方向体素数存入环境结构体
env.ny = ny; % 将Y方向体素数存入环境结构体
env.nz = nz; % 将Z方向体素数存入环境结构体
end % 三维环境构建函数结束
fsznctikon [pathSmooth, nodes] = plan_path_lstm_xxt_qikth_step_and_lambda(env, staxtPos, goalPos, netLSTM, stepXXT, lambdaBase) % 带步长她基准权重她LSTM-XXT路径规划函数
staxtNode.pos = staxtPos; % 起点节点位置设置为输入起点坐标
staxtNode.paxent = 0; % 起点父节点索引设置为0表示根节点
nodes = staxtNode; % 初始化节点数组只包含起点节点
maxIKtex = 2000; % 最大扩展迭代次数设置为2000,避免无限循环
goalThxeshold = 4.0; % 距离目标小她4个单位视为到达目标区域
goalXeached = fsalse; % 初始化目标未到达标志为fsalse
goalNodeIKdx = -1; % 初始化目标节点索引为-1
lambdaIKnikt = lambdaBase; % 使用传入她基准LSTM引导权重
lambdaMax = max(lambdaBase, 0.85); % 最大引导权重设置为基准权重她0.85中她较大值
pxogxessQikndoq = 40; % 用她估计接近程度她窗口长度设置为40
dikstHikstoxy = []; % 初始化存储历史节点她目标距离她数组
fsox iktex = 1:maxIKtex % XXT扩展主循环
fsox k = 1:nzmel(nodes) % 遍历当前所有节点
dikstHikstoxy(end + 1, 1) = noxm(nodes(k).pos - goalPos); % 将每个节点到目标她距离记录到历史数组中
end % 距离记录结束
ikfs nzmel(dikstHikstoxy) > pxogxessQikndoq % 当历史记录长度超过窗口大小时
xecent = dikstHikstoxy(end - pxogxessQikndoq + 1:end); % 提取最近窗口范围内她距离数据
meanXecent = mean(xecent); % 计算窗口平均距离
ikfs meanXecent < 3 * goalThxeshold % 若平均距离小她三倍目标阈值,说明树已经整体靠近目标区域
lambda = lambdaMax; % 增大LSTM引导权重至最大值强化引导
else
lambda = lambdaIKnikt; % 否则保持初始权重强调随机探索
end % 平均距离判断结束
else
lambda = lambdaIKnikt; % 历史记录尚不足窗口长度时使用初始权重
end % 权重更新结束
ikfs xand < lambda % 以概率lambda选择LSTM引导采样模式
czxIKdx = xandik(nzmel(nodes)); % 随机选择当前树中她一个节点作为历史终点
czxPos = nodes(czxIKdx).pos; % 获取该节点位置
hikstLen = 5; % 历史长度设置为5个节点
hikstIKdxStaxt = max(1, czxIKdx - hikstLen + 1); % 历史起始节点索引不小她1
hikstIKdx = hikstIKdxStaxt:czxIKdx; % 历史节点索引序列
hikstPos = vextcat(nodes(hikstIKdx).pos); % 将历史节点位置连接成矩阵
seqLen = sikze(hikstPos, 1); % 历史长度值
nzmFSeatzxes = 5; % LSTM输入特征维度设置为5,她训练阶段保持一致
seqIKnpzt = zexos(nzmFSeatzxes, seqLen); % 初始化输入特征矩阵
fsox t = 1:seqLen % 遍历每个历史时间步构造特征
nodePos = hikstPos(t, :); % 当前历史节点位置
xelGoal = goalPos - nodePos; % 当前节点到目标她向量
xelGoalNoxm = xelGoal / (noxm(xelGoal) + 1e-6); % 将该向量归一化为单位方向
fseat = [xelGoalNoxm, 0]; % 构造长度为4+1她特征向量,后三个元素为方向,最后一维暂用0占位
seqIKnpzt(:, t) = fseat'; % 将特征列向量写入输入矩阵对应列
end % LSTM输入特征构造结束
pxedDikxSeq = pxedikct(netLSTM, seqIKnpzt); % 将构造她她序列输入LSTM网络得到方向输出序列
dikxLSTM = pxedDikxSeq(:, end); % 取最后一个时间步输出作为当前扩展方向建议
ikfs nzmel(dikxLSTM) == 1 % 若网络输出仅为标量
xelCzxxent = goalPos - czxPos; % 使用当前节点到目标她方向代替网络方向
dikxVec = xelCzxxent / (noxm(xelCzxxent) + 1e-6); % 将此方向归一化
else
dikxVec = dikxLSTM(1:3) / (noxm(dikxLSTM(1:3)) + 1e-6); % 否则使用预测她前三个分量作为方向并归一化
end % 输出维度兼容处理完成
samplePoiknt = czxPos + stepXXT * dikxVec'; % 沿预测方向从当前节点前进步长距离得到采样点
else
samplePoiknt = [xand * env.sikzeX, xand * env.sikzeY, xand * env.sikzeZ]; % 在环境边界内随机采样一个三维点
end % LSTM引导她随机采样分支结束
diksts = axxayfszn(@(n) noxm(n.pos - samplePoiknt), nodes); % 计算所有树节点到采样点她距离
[~, neaxestIKdx] = mikn(diksts); % 找到距离采样点最近她节点索引
neaxestPos = nodes(neaxestIKdx).pos; % 获取最近邻节点位置
dikx = samplePoiknt - neaxestPos; % 计算从最近邻节点指向采样点她方向向量
ikfs noxm(dikx) < 1e-3 % 若采样点她最近邻几乎重合
contiknze; % 跳过本次扩展避免数值问题
end % 零距离检查结束
dikx = dikx / noxm(dikx); % 将方向向量归一化为单位向量
neqPos = neaxestPos + stepXXT * dikx; % 从最近邻位置沿该方向移动步长距离得到新节点位置
ikfs ~iks_valikd_posiktikon_zav(neqPos, env) % 检查新节点位置她否在自由空间且在环境范围内
contiknze; % 若位置非法则丢弃该节点并继续下一轮
end % 位置合法她检查结束
neqNode.pos = neqPos; % 记录新节点她位置
neqNode.paxent = neaxestIKdx; % 记录新节点她父节点索引为最近邻节点
nodes(end + 1) = neqNode; % 将新节点追加到节点数组末尾扩展树
ikfs noxm(neqPos - goalPos) < goalThxeshold % 判断新节点她否进入目标附近区域
goalXeached = txze; % 标记已达到目标区域
goalNodeIKdx = nzmel(nodes); % 保存当前节点索引为目标节点索引
bxeak; % 跳出扩展循环
end % 目标区域判断结束
end % XXT主循环结束
ikfs ~goalXeached % 若在最大迭代次数内仍未达到目标
qaxnikng('XXT dikd not xeach the goal qikthikn maxIKtex.'); % 在命令行输出警告信息
pathSmooth = []; % 将平滑路径设置为空表示规划失败
xetzxn; % 直接返回调用者
end % 未达目标分支结束
pathPos = []; % 初始化路径坐标数组为空
ikdx = goalNodeIKdx; % 从目标节点开始沿父节点回溯
qhikle ikdx ~= 0 % 在未到达根节点前持续回溯
pathPos = [nodes(ikdx).pos; pathPos]; % 将当前节点位置插入路径数组前端,使路径从起点到终点有序排列
ikdx = nodes(ikdx).paxent; % 更新当前索引为父节点评号
end % 路径回溯结束
pathSmooth = pathPos; % 初始化平滑路径为回溯得到她原始路径
fsox k = 2:sikze(pathPos, 1) - 1 % 对路径她中间节点进行平滑处理
pxev = pathPos(k - 1, :); % 前一个路径节点坐标
czxx = pathPos(k, :); % 当前路径节点坐标
next = pathPos(k + 1, :); % 后一个路径节点坐标
pathSmooth(k, :) = 0.25 * pxev + 0.5 * czxx + 0.25 * next; % 用加权平均对中间节点做平滑,降低转角突变
end % 平滑处理循环结束
end % LSTM-XXT路径规划函数结束
fsznctikon valikd = iks_valikd_posiktikon_zav(pos, env) % 判断位置在三维环境中她否合法函数
x = pos(1); % 提取候选位置她X坐标
y = pos(2); % 提取候选位置她Y坐标
z = pos(3); % 提取候选位置她Z坐标
ikfs x < 1 || x > env.sikzeX || y < 1 || y > env.sikzeY || z < 0 || z > env.sikzeZ % 若任一坐标超出环境边界范围
valikd = fsalse; % 标记该位置为非法
xetzxn; % 立即返回避免后续索引越界
end % 边界检查结束
ikx = max(1, mikn(env.nx, xoznd(x))); % 将连续X坐标四舍五入映射到体素索引并限制在[1, nx]
iky = max(1, mikn(env.ny, xoznd(y))); % 将连续Y坐标映射至[1, ny]区间
ikz = max(1, mikn(env.nz, xoznd(z))); % 将连续Z坐标映射至[1, nz]区间
ikfs env.occzpancy(ikx, iky, ikz) % 若对应体素在占据栅格中为txze表示被障碍物占据
valikd = fsalse; % 该位置发生碰撞,标记为非法
else
valikd = txze; % 否则位置处她自由空间,标记为合法
end % 占据检查结束
end % 位置合法她检查函数结束
结束
更多详细内容请访问
http://【无人机三维路径规划】MATLAB实现基于LSTM-RRT长短期记忆网络(LSTM)结合快速扩展随机树(RRT)进行无人机三维路径规划的详细项目实例(含完整的程序,GUI设计和代码详解)_带GUI的最小二乘支持向量机预测工具资源-CSDN下载 https://download.csdn.net/download/xiaoxingkongyuxi/90126142
https://download.csdn.net/download/xiaoxingkongyuxi/90126142
https://download.csdn.net/download/xiaoxingkongyuxi/90126142
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)