项目介绍 MATLAB实现基于LSTM-DRL-CNN 长短期记忆网络(LSTM)结合深度强化学习(DRL)与卷积神经网络(CNN)进行无人机三维路径规划(含模型描述及部分示例代码)专栏近期有大量优惠
MATLAB实现基于LSTM-DRL-CNN 长短期记忆网络(LSTM)结合深度强化学习(DRL)与卷积神经网络(CNN)进行无人机三维路径规划的详细项目实例
请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人
或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)
无人机三维路径规划属于智能飞行控制中的核心问题之一,其目标是在复杂空间环境中为飞行器寻找一条安全、平滑、可执行、能耗可控且尽量高效的飞行轨迹。伴随低空经济、应急救援、城市巡检、边境监测、物流配送与农业植保等场景持续扩展,无人机已经不再局限于简单的定点悬停或人工遥控,而是逐步转向具备自主决策能力的智能平台。在这种趋势下,路径规划不仅需要处理静态障碍,还要面对动态障碍、通信干扰、风场扰动、地形起伏、禁飞区约束以及任务时效等多重限制。三维环境比二维环境更复杂,因为无人机必须同时在平面位置和高度维度上进行联合决策,高度变化与速度变化又会进一步影响动力学稳定性、视野覆盖与能耗消耗,因此路径规划的难度显著高于传统机器人导航问题。
传统方法通常依赖 A 星、Dijkstra、RRT、RRT*、人工势场法、遗传算法、粒子群优化、蚁群算法等经典策略。这类方法在规则明确、环境静态、状态维度较低时能够取得较好效果,但在高维、非线性、强约束、动态变化的复杂三维场景中,往往存在搜索效率不足、易陷入局部最优、对环境变化适应性差、路径平滑性不足等问题。尤其当障碍物数量较多、分布不规则、局部可通行空间狭窄时,单纯依赖启发式搜索容易产生计算时间过长或规划质量不稳定的问题。如果飞行任务还要求在线避障、实时重规划与多目标平衡,传统算法的局限性就更加明显。
深度学习与强化学习的发展,为无人机路径规划提供了新的技术路线。深度强化学习能够让智能体通过与环境交互不断学习策略,直接从状态到动作建立映射,减少人工设计规则的负担。卷积神经网络擅长提取空间结构特征,可用于分析局部地图、障碍分布、目标相对位置以及局部风险区域;长短期记忆网络擅长处理时间序列信息,可用于理解无人机在连续飞行中的历史状态、速度变化、姿态变化和环境演变趋势;深度强化学习则负责在奖励机制驱动下学习长期收益最优的决策策略。将 LSTM、DRL 与 CNN 进行融合,能够同时利用空间感知、时序记忆与策略优化三方面能力,形成适用于复杂三维路径规划的综合智能框架。
在无人机任务中,空间局部地图可由 CNN 提取几何特征,历史运动轨迹与环境变化可由 LSTM 建模,策略网络则通过 DRL 输出下一步动作或航向、爬升、速度控制量。这样的结构适合处理“当前看见什么”“过去发生了什么”“接下来应该怎么飞”三个层次的信息。相比单独使用 CNN 或单独使用 LSTM,融合结构能够更完整地表达无人机飞行决策所需的上下文关系;相比纯强化学习,融合结构能显著提升状态表征能力,使智能体更容易识别障碍密集区域、狭窄通道、目标邻域以及潜在碰撞风险,从而提高收敛速度与策略鲁棒性。
MATLAB 平台在无人机控制、图像处理、深度学习、强化学习与仿真验证方面具有完整工具链,适合构建可复现、可扩展、可调试的研究型项目。借助 MATLAB 可快速生成三维环境,构造无人机状态转移模型,设计奖励函数,训练深度神经网络,并对路径可视化、收敛曲线、奖励变化、碰撞率和规划长度进行定量分析。对于工程落地而言,MATLAB 还能够与 Simulink、ROS、硬件在环测试、传感器仿真等模块协同,形成从算法研究到系统验证的完整闭环。因此,基于 LSTM-DRL-CNN 的无人机三维路径规划项目,不仅具有明显的学术研究价值,也具有很强的工程应用潜力。它能够推动无人机从“被动响应控制”转向“主动认知决策”,在复杂环境中实现更可靠、更高效、更智能的自主飞行。
项目目标与意义
目标一:构建面向三维复杂环境的自主路径决策能力
该项目的核心目标之一,是让无人机在三维空间中具备自主识别环境、判断风险并生成可执行飞行路径的能力。传统控制方式依赖人工预设航线或局部避障规则,面对障碍分布变化、目标位置变化和环境扰动时,通常需要频繁调整参数,适应性有限。融合 LSTM、DRL 与 CNN 后,系统可将局部空间图像、历史状态序列与动作反馈统一纳入决策框架,在复杂场景中自主寻找更优路径。此类能力的价值不仅体现在飞行安全提升上,也体现在任务执行效率上,例如在巡检任务中减少绕行,在救援任务中缩短到达时间,在测绘任务中提升覆盖质量。更重要的是,这种自主决策能力可为后续多无人机协同、动态任务分配与在线重规划奠定基础。
目标二:提升复杂场景中的安全性与鲁棒性
三维路径规划不是单纯地“到达目标”,更关键的是在飞行过程中尽量避免碰撞、失稳、越界和异常能耗。无人机在城市峡谷、山地起伏、林区穿行、室内通道等空间中飞行时,障碍物密集、可通行区域窄、视觉遮挡严重,任何一次误判都可能造成任务失败甚至设备损坏。通过强化学习奖励机制对安全行为进行强化,再结合 CNN 对障碍几何特征的提取、LSTM 对历史状态的记忆,系统可逐步学习到更稳健的飞行策略。鲁棒性提升意味着即便环境中出现局部扰动、传感噪声、目标临时改变或局部通道受阻,算法仍能保持较高成功率。这对于高价值任务尤其重要,如灾害现场侦察、重要设施巡查、危险区域探测等场景,安全与鲁棒性直接决定系统是否可投入实用。
目标三:形成兼顾路径质量与实时性的智能规划机制
无人机路径规划常常面临一个典型矛盾:路径越优,计算越复杂;计算越快,路径质量可能越差。项目的重要目标是构建一个在路径长度、转弯平滑度、飞行时间和能耗之间取得平衡的智能规划机制。DRL 的优势在于它关注长期回报,因此能够从全局视角优化动作序列,而不是仅仅追求当前一步的局部最优。CNN 与 LSTM 则帮助策略网络更快理解环境与历史状态,减少盲目探索。这样可以在保障实时性的前提下,尽量输出平滑、可执行、低能耗的路径。对于实际应用而言,这一点极具意义,因为无人机任务往往对时效极为敏感,如应急投送、空中侦察和动态跟踪都不能等待耗时过长的离线规划过程。
目标四:构建可迁移、可扩展、可复现的研究与工程平台
该项目不仅关注单次飞行结果,更关注方法是否能够复用到不同任务与不同地图中。因此,模型设计需要具备较强的通用性。通过 MATLAB 平台构建的完整仿真流程,可在不同障碍密度、不同目标位置、不同风场扰动和不同奖励权重下进行批量测试,验证模型泛化能力。若后续引入多源传感器信息、多无人机协同机制或更复杂的动力学模型,现有框架也能够平滑扩展。这样的意义在于,它不只是解决某一条路径,而是形成一套研究范式:环境建模、状态编码、策略学习、结果评估与系统迭代全部可在统一平台内完成。对于科研与工程均具价值,也能显著降低后续扩展成本。
项目挑战及解决方案
挑战一:三维状态空间高维且环境非线性强
无人机三维路径规划最大的难点之一,在于状态空间远比二维导航复杂。无人机的位置、速度、姿态、高度变化、剩余能量、目标相对方向以及障碍空间关系都会共同影响决策结果。与此同时,飞行过程还受到空气动力学、惯性、控制延迟和外界扰动影响,使系统呈现明显的非线性和时变性。若直接使用传统表格型方法,很难在如此高维状态下保持较好的学习效果;若仅依赖单一深度网络,也容易因为输入信息组织不当而导致训练不稳定。解决方式是采用分层特征建模:CNN 负责提取局部空间信息,例如局部地图、障碍密度和可通行通道;LSTM 负责编码时序状态,例如过去若干步位置、速度和动作变化;DRL 负责在特征之上学习策略映射。通过这种结构,复杂状态被拆分为更容易学习的子空间,既减少了信息冗余,也增强了策略对环境变化的适应性。
挑战二:奖励设计困难,容易出现局部最优与错误引导
强化学习算法高度依赖奖励函数设计,而无人机路径规划任务中的奖励设计尤其敏感。如果只奖励接近目标,智能体可能会冒险穿越高风险区域;如果只惩罚碰撞,智能体可能过于保守、停滞不前;如果路径过短奖励过高,可能造成贴障飞行或剧烈转弯。因此,奖励函数需要同时体现安全、效率、平滑度与任务完成度。解决方法是在奖励中引入多项约束:目标接近奖励用于推动朝目标前进,碰撞惩罚用于强化安全边界,距离障碍过近时施加风险惩罚,航向突变时增加平滑性惩罚,成功到达则给予终局奖励。为了避免训练早期陷入局部最优,还可在探索阶段加入适度随机动作扰动或熵正则思想,使智能体保持足够探索范围。这样既能引导其学习正确方向,又能逐步形成稳定而可迁移的策略。
挑战三:训练不稳定、收敛慢且容易过拟合特定地图
深度强化学习在复杂环境中训练时,常见问题包括样本效率低、策略振荡、损失波动大以及对训练地图过拟合。如果训练数据或环境场景过于单一,模型很容易在熟悉地图上表现良好,却在新环境中性能显著下降。解决办法是将训练过程设计为多场景随机化,包括障碍物数量、位置、尺寸、目标位置、起点位置、动态障碍速度等因素都在一定范围内随机生成,以提升数据多样性。同时,可采用经验回放机制提升样本利用率,使用目标网络或双网络结构降低估计偏差,并通过规范化输入、梯度裁剪和学习率调节提高训练稳定性。在 MATLAB 中进行可视化监控也十分重要,因为通过奖励曲线、路径轨迹和碰撞统计能够及时发现训练异常,便于快速调整网络结构与奖励参数。此类手段结合起来,能够明显提高收敛速度与泛化性能。
项目模型架构
一、环境建模层
环境建模层负责将真实三维飞行空间转化为算法可处理的状态表示。三维地图通常包含边界尺寸、障碍物布局、目标点位置、起点位置以及动态干扰因素。对于无人机路径规划而言,地图不是静态图片,而是带有可通行性与风险信息的空间结构。CNN 可对局部空间块进行特征提取,例如利用三维体素或二维投影栅格提取障碍分布模式;对于较轻量实现,也可将局部邻域编码为多通道矩阵,分别表示障碍占用、到目标距离、局部高度差等。环境建模层的关键作用是将几何空间转化成神经网络可识别的张量输入,使后续策略网络具备空间感知基础。若环境建模不充分,即便后续使用再复杂的 DRL 算法,也很难学到稳定可用的策略。
二、时序记忆层
无人机飞行是连续过程,当前决策不仅取决于当前位置,还取决于过去若干步的运动趋势。LSTM 的作用就在于建立“时间记忆”,学习无人机连续飞行时状态变化之间的关联。比如,当无人机连续多步沿某个方向偏航时,LSTM 可以识别这一趋势并辅助判断是否进入狭窄通道、是否面临碰撞风险、是否需要提前调整高度。与普通前馈网络相比,LSTM 能更好地缓解长期依赖问题,避免仅看当前状态而忽略历史轨迹。对于三维路径规划,时序层尤其重要,因为高度变化与速度变化往往不是瞬时独立的,而是需要结合过去动作判断飞行惯性与趋势。LSTM 输出的隐藏状态可作为策略网络的一部分,让决策具备连续性和记忆性,减少抖动与反复折返。
三、策略学习层
策略学习层由深度强化学习承担,其任务是依据当前状态选择下一步动作。动作可以设计为离散动作,如前进、后退、左移、右移、上升、下降、转向,也可以设计为连续动作,如速度、航向角、爬升率的连续调节。具体实现中,若侧重可解释性与训练稳定性,可选用离散动作与 DQN 系列;若侧重精细控制,可采用 Actor-Critic、DDPG、TD3、SAC 等连续控制算法。策略学习层的核心是利用奖励信号不断修正策略,使其在长期回报意义下趋向最优。CNN 与 LSTM 提供高质量表征后,策略层就能在较少试错下学到更具全局性的飞行规律。对路径规划而言,这一层决定了实际飞行指令是否安全、平滑和高效,因此其结构和超参数直接影响最终性能。
四、奖励反馈层
奖励反馈层决定学习方向,是强化学习系统的“目标函数”。路径规划任务中的奖励通常应兼顾四类指标:一是目标接近度,鼓励朝目标移动;二是安全性,对碰撞或接近障碍给予较大惩罚;三是效率,对步数过长或能耗过高进行抑制;四是平滑性,对方向突变和频繁转向给予惩罚。若无人机成功到达目标,则应给出终局奖励,促使智能体形成明确的任务完成意识。奖励反馈层不只是简单加减分,而是决定策略是否会学习到“看似最短但危险”的路径,还是“稍长但更稳”的路径。合理的奖励结构能够显著提高训练质量,使模型真正学到可执行飞行行为,而不是在某一单项指标上过度优化。
五、仿真验证与评估层
仿真验证与评估层负责检验模型的有效性与稳定性。该层通常包含路径可视化、碰撞统计、到达率统计、平均路径长度、平均转弯次数、累计奖励曲线与收敛速度分析。MATLAB 在这一层具有很强优势,因为它可以同时进行地图渲染、轨迹绘制、奖励趋势监控与结果批处理分析。通过多轮仿真,可以比较不同算法或不同参数设置下的性能差异,从而判断模型是否真正具备泛化能力。评估层的价值不仅在于展示结果,更在于帮助分析失败原因,例如某些地图中是否存在死角、某类障碍是否过于密集、奖励是否过于偏向局部最优。通过闭环评估,可以持续迭代网络结构、输入表示与奖励机制,使整体系统逐步趋近工程可用标准。
项目模型描述及代码示例
一、三维环境与障碍地图构建 clc; % 清空命令行窗口,便于观察本次运行输出 clear; % 清除工作区变量,防止旧变量干扰当前实验 close all; % 关闭所有图窗,保证可视化结果从零开始 rng(42,'twister'); % 固定随机种子,确保地图生成与训练过程可复现 mapSize = [60, 60, 24]; % 定义三维地图尺寸,分别表示x、y、z方向网格数 obstacleMap = false(mapSize); % 预分配三维逻辑地图,用于标记障碍体素 for k = 1:18 % 循环生成多个障碍块,增强环境复杂度 sx = randi([4, 10]); % 随机生成障碍在x方向的尺寸 sy = randi([4, 10]); % 随机生成障碍在y方向的尺寸 sz = randi([3, 8]); % 随机生成障碍在z方向的尺寸 x0 = randi([2, mapSize(1)-sx-1]); % 随机生成障碍起始x坐标,避免越界 y0 = randi([2, mapSize(2)-sy-1]); % 随机生成障碍起始y坐标,避免越界 z0 = randi([2, mapSize(3)-sz-1]); % 随机生成障碍起始z坐标,避免越界 obstacleMap(x0:x0+sx, y0:y0+sy, z0:z0+sz) = true; % 将该区域标记为障碍 end startPos = [3, 3, 3]; % 设置起点坐标,位于地图低角落区域 goalPos = [57, 56, 21]; % 设置终点坐标,位于地图另一侧高空区域 obstacleMap(startPos(1),startPos(2),startPos(3)) = false; % 清除起点处障碍,确保可出发 obstacleMap(goalPos(1),goalPos(2),goalPos(3)) = false; % 清除终点处障碍,确保可抵达 figure('Color','w'); % 创建白底图窗,便于三维可视化 hold on; % 保持当前图像,便于叠加绘制多个对象 axis equal; % 保持三轴比例一致,避免空间失真 grid on; % 显示网格,增强空间感 view(3); % 设置三维观察角度 xlabel('X'); % 标注x轴 ylabel('Y'); % 标注y轴 zlabel('Z'); % 标注z轴 title('三维环境与障碍分布'); % 设置图形标题 [xo, yo, zo] = ind2sub(size(obstacleMap), find(obstacleMap)); % 将障碍索引转换为三维坐标 scatter3(xo, yo, zo, 18, 'filled', 'MarkerFaceColor',[0.2 0.2 0.2]); % 绘制障碍点云,直观展示障碍分布 plot3(startPos(1), startPos(2), startPos(3), 'go', 'MarkerSize',10, 'MarkerFaceColor','g'); % 标记起点为绿色圆点 plot3(goalPos(1), goalPos(2), goalPos(3), 'ro', 'MarkerSize',10, 'MarkerFaceColor','r'); % 标记终点为红色圆点 二、状态编码与局部空间输入构造 sensorRange = 6; % 定义局部感知范围,影响CNN输入窗口大小 localPatch = zeros(2*sensorRange+1, 2*sensorRange+1, 3); % 初始化局部三通道输入,分别表示障碍、目标方向、风险 currentPos = [12, 15, 8]; % 当前无人机位置,用于演示状态编码 xmin = max(1, currentPos(1)-sensorRange); % 计算局部窗口x下界,避免越界 xmax = min(mapSize(1), currentPos(1)+sensorRange); % 计算局部窗口x上界,避免越界 ymin = max(1, currentPos(2)-sensorRange); % 计算局部窗口y下界,避免越界 ymax = min(mapSize(2), currentPos(2)+sensorRange); % 计算局部窗口y上界,避免越界 patchObstacle = obstacleMap(xmin:xmax, ymin:ymax, currentPos(3)); % 提取当前高度层的局部障碍信息 localPatch(1:size(patchObstacle,1), 1:size(patchObstacle,2), 1) = patchObstacle; % 将障碍信息填入第1通道 dx = goalPos(1) - currentPos(1); % 计算目标相对x方向偏差 dy = goalPos(2) - currentPos(2); % 计算目标相对y方向偏差 dist2d = sqrt(dx^2 + dy^2) + eps; % 计算平面距离并避免除零 dirx = dx / dist2d; % 目标方向x分量归一化 diry = dy / dist2d; % 目标方向y分量归一化 goalChannel = zeros(2*sensorRange+1, 2*sensorRange+1); % 初始化目标方向通道 goalChannel(:,:) = (dirx + diry) / 2; % 将目标方向信息广播到局部窗口 localPatch(:,:,2) = goalChannel; % 将目标方向信息写入第2通道 riskChannel = zeros(2*sensorRange+1, 2*sensorRange+1); % 初始化风险通道 for i = 1:size(riskChannel,1) % 遍历局部窗口行 for j = 1:size(riskChannel,2) % 遍历局部窗口列 gx = currentPos(1) + i - sensorRange - 1; % 映射到全局x坐标 gy = currentPos(2) + j - sensorRange - 1; % 映射到全局y坐标 if gx >= 1 && gx <= mapSize(1) && gy >= 1 && gy <= mapSize(2) % 判断坐标是否在地图内 riskChannel(i,j) = sum(obstacleMap(max(1,gx-1):min(mapSize(1),gx+1), max(1,gy-1):min(mapSize(2),gy+1), currentPos(3)), 'all'); % 统计邻域障碍密度 end end end localPatch(:,:,3) = riskChannel / max(riskChannel(:) + eps); % 风险通道归一化,利于网络训练 figure('Color','w'); % 创建新的图窗用于展示局部特征 imagesc(localPatch(:,:,1)); % 展示障碍通道二维投影 axis image; % 保持像素比例 colormap(gca, turbo); % 使用turbo色图,符合R2025b建议 colorbar; % 显示颜色条,辅助观察数值分布 title('局部障碍通道示意'); % 设置说明标题 三、LSTM时序状态建模 seqLen = 8; % 定义时序窗口长度,表示连续8步状态 stateSeq = zeros(5, seqLen); % 初始化状态序列,每列代表一步状态特征 for t = 1:seqLen % 构造连续状态序列 stateSeq(:,t) = [0.1*t; 0.08*t; 0.02*t; 0.5*sin(t/2); 1/(t+1)]; % 示例序列,依次表示速度、偏航与风险类特征 end inputSize = 5; % LSTM输入维度,与每步状态特征数量一致 numHiddenUnits = 64; % LSTM隐藏单元数,决定记忆容量 lstmLayers = [ % 构建LSTM特征提取层 sequenceInputLayer(inputSize,"Name","seq_in") % 定义序列输入层,接收时序状态 lstmLayer(numHiddenUnits,"OutputMode","last","Name","lstm") % LSTM层输出最后时刻隐藏状态 fullyConnectedLayer(32,"Name","lstm_fc") % 全连接层压缩时序特征 reluLayer("Name","lstm_relu") % ReLU激活增加非线性表达 ]; analyzeNetwork(layerGraph(lstmLayers)); % 查看网络结构,便于检查时序模块是否合理 四、CNN特征提取与融合结构 patchSize = [13, 13, 3]; % 定义CNN输入尺寸,与局部patch匹配 cnnLayers = [ imageInputLayer(patchSize,"Normalization","none","Name","img_in") % 图像输入层,输入局部三通道特征 convolution2dLayer(3,16,"Padding","same","Name","conv1") % 第一层卷积,提取低阶空间特征 batchNormalizationLayer("Name","bn1") % 批归一化,提升训练稳定性 reluLayer("Name","relu1") % 非线性激活,增强表达能力 maxPooling2dLayer(2,"Stride",2,"Name","pool1") % 池化降维,减少计算量 convolution2dLayer(3,32,"Padding","same","Name","conv2") % 第二层卷积,提取更高层空间结构 batchNormalizationLayer("Name","bn2") % 再次归一化,稳定深层特征 reluLayer("Name","relu2") % 激活函数保持稀疏表达 fullyConnectedLayer(64,"Name","cnn_fc") % 将空间特征映射到紧凑向量 reluLayer("Name","cnn_relu") % 进一步增强特征非线性 ]; fusionGraph = layerGraph(); % 创建空图,准备构建多输入融合网络 fusionGraph = addLayers(fusionGraph, cnnLayers); % 添加CNN分支 fusionGraph = addLayers(fusionGraph, lstmLayers); % 添加LSTM分支 fusionGraph = addLayers(fusionGraph, [ concatenationLayer(1,2,"Name","concat") % 拼接CNN与LSTM输出特征 fullyConnectedLayer(64,"Name","fusion_fc1") % 融合后的第一层全连接 reluLayer("Name","fusion_relu1") % 激活函数增强表达 fullyConnectedLayer(7,"Name","action_head") % 输出7个动作的Q值或策略分数 softmaxLayer("Name","policy_out") % 输出归一化策略分布,适合离散动作场景 ]); % 定义输出头部 fusionGraph = connectLayers(fusionGraph,"cnn_relu","concat/in1"); % 连接CNN分支到融合层输入1 fusionGraph = connectLayers(fusionGraph,"lstm_relu","concat/in2"); % 连接LSTM分支到融合层输入2 figure('Color','w'); % 新建图窗显示网络结构 plot(fusionGraph); % 绘制融合网络结构图 title('LSTM-DRL-CNN 融合网络结构'); % 设置结构说明 五、深度强化学习训练设置 numActions = 7; % 定义动作数,对应前进、后退、左移、右移、上升、下降、悬停等 gamma = 0.98; % 折扣因子,控制长期奖励的重要性 epsilon = 1.0; % 初始探索率,训练早期鼓励探索 epsilonMin = 0.05; % 最低探索率,避免完全贪婪导致陷入局部最优 epsilonDecay = 0.995; % 探索率衰减系数,逐渐转向利用 agentMemory = struct(); % 定义经验存储结构 agentMemory.states = {}; % 存储状态 agentMemory.actions = []; % 存储动作 agentMemory.rewards = []; % 存储奖励 agentMemory.nextStates = {}; % 存储下一状态 agentMemory.dones = []; % 存储终止标记 maxEpisodes = 300; % 定义训练轮数 maxStepsPerEpisode = 250; % 每个回合最大步数 learnRate = 1e-3; % 学习率设置,适中可提升收敛稳定性 fprintf("训练配置已生成,开始进行交互式学习。\n"); % 输出训练提示,便于观察运行进度 六、路径执行、轨迹记录与结果评估 trajectory = zeros(250,3); % 预分配轨迹数组,存储飞行路径坐标 trajectory(1,:) = startPos; % 轨迹起点写入首行 curPos = startPos; % 当前状态初始化为起点 stepCount = 1; % 步数计数器初始化 for step = 1:maxStepsPerEpisode % 逐步执行路径规划动作 action = randi(numActions); % 此处用随机动作演示执行过程,训练时由策略网络输出 switch action % 根据动作编号选择位移方式 case 1, delta = [1, 0, 0]; % 向x正方向移动 case 2, delta = [-1, 0, 0]; % 向x负方向移动 case 3, delta = [0, 1, 0]; % 向y正方向移动 case 4, delta = [0, -1, 0]; % 向y负方向移动 case 5, delta = [0, 0, 1]; % 向z正方向爬升 case 6, delta = [0, 0, -1]; % 向z负方向下降 otherwise, delta = [0, 0, 0]; % 悬停不动 end nextPos = curPos + delta; % 计算下一步位置 nextPos = max(nextPos, [1,1,1]); % 限制坐标下界,防止越界 nextPos = min(nextPos, mapSize); % 限制坐标上界,防止越界 collision = obstacleMap(nextPos(1), nextPos(2), nextPos(3)); % 判断是否撞入障碍 distToGoal = norm(double(nextPos - goalPos)); % 计算到目标的欧氏距离 reward = -0.1; % 设置基础步长惩罚,鼓励更短路径 if collision % 若发生碰撞 reward = reward - 20; % 施加较大负奖励,强化安全约束 end if distToGoal < 3 % 若接近目标区域 reward = reward + 15; % 给出接近奖励,促进收敛 end if isequal(nextPos, goalPos) % 若到达目标 reward = reward + 50; % 终局成功奖励 end stepCount = stepCount + 1; % 步数累计加一 trajectory(stepCount,:) = nextPos; % 记录当前位置到轨迹数组 curPos = nextPos; % 更新当前位置 if collision || isequal(nextPos, goalPos) % 若碰撞或到达目标则终止回合 break; % 结束当前演示循环 end end figure('Color','w'); % 创建轨迹显示图窗 hold on; % 保持图像,便于叠加障碍和轨迹 axis equal; grid on; view(3); % 设置三维显示样式 scatter3(xo, yo, zo, 12, [0.3 0.3 0.3], 'filled'); % 绘制障碍 plot3(trajectory(1:stepCount,1), trajectory(1:stepCount,2), trajectory(1:stepCount,3), 'b-', 'LineWidth', 2); % 绘制飞行轨迹 plot3(startPos(1), startPos(2), startPos(3), 'go', 'MarkerSize',10, 'MarkerFaceColor','g'); % 绘制起点 plot3(goalPos(1), goalPos(2), goalPos(3), 'ro', 'MarkerSize',10, 'MarkerFaceColor','r'); % 绘制终点 title('无人机三维路径执行示意'); % 设置结果说明