基于液体神经网络与强化学习的无人机视觉自主导航系统实践
2026/8/29 4:34:41 网站建设 项目流程

简介:端到端控制是机器人自主导航的重要范式,它直接从感知映射到动作,有效规避传统模块化架构中误差逐级累积的痛点。强化学习通过与环境试错互动优化策略,在连续动作空间和高维状态任务中展现出独特优势;液体神经网络受生物神经元时间连续动力学启发,具备自适应时间常数与强泛化能力,能更好地应对仿真与真实环境的分布偏移。两者结合为无人机视觉导航提供了高鲁棒、轻量级的可行方案。在AirSim高保真仿真环境中,利用PPO算法训练端到端策略网络,可完成复杂场景下的自主飞行与避障。本文从系统架构设计、仿真环境配置、状态动作空间定义到训练调优细节展开,并分享关键踩坑经验,为空中机器人研究者和强化学习应用开发者提供可落地的工程参考。 最近在整理一套基于液体神经网络(Liquid Neural Network)和强化学习的无人机视觉自主导航系统,用AirSim高保真仿真环境做端到端控制,纯视觉输入加上低维状态数据,训练智能体在复杂环境里自主飞行和避障。这套东西做完之后我觉得很值得拿出来聊聊,因为它不是那种堆料式的demo,而是把这两年比较前沿的两个方向真正结合到了一起:一边是液体神经网络这种动态模型,另一边是PPO这类强化学习算法。如果你正在做无人机自主导航、空中机器人相关的研究,或者单纯想找一个能落地的端到端视觉控制方案,这篇文章应该能帮你省下不少折腾时间。

做这个项目之前,我其实经历了一段比较长的“方案焦虑期”。当时摆在我面前的选择实在太多了:传统SLAM加路径规划、端到端模仿学习、纯强化学习、模型预测控制等等。最后我选择液体神经网络加强化学习这个组合,不是因为它听起来够前沿,而是因为在反复对比和技术验证之后,这个方案在泛化能力、参数量、真机迁移潜力这三个维度上综合表现最好。下文我会从为什么选这个路线开始,逐步拆解系统架构、仿真环境配置、训练实现和踩坑记录,尽量把每一个决策背后的原因都讲清楚。

1. 为什么要用液体神经网络和强化学习做视觉导航

1.1 传统无人机自主导航方案的瓶颈在哪里

传统无人机自主导航最经典的路线是模块化pipeline:视觉SLAM或者基于里程计构建地图,然后在地图上做路径规划,最后把规划出来的轨迹交给底层飞控去跟踪。这套方案在工业界和学术界用了很多年,成熟度确实高,但有一个绕不开的痛点——每一级模块都有自己的误差,感知误差会传递到地图构建,地图误差又会影响规划结果,规划误差再传导给控制模块,整条链路的误差是累积放大的。

更麻烦的是,每个模块都要针对特定场景单独调参。在室内走廊跑得好好的参数,拿到室外树荫下可能立刻失效。SLAM在光照变化剧烈、纹理稀疏或者动态物体多的时候容易丢特征,规划算法在复杂静态环境里计算量暴增,遇到动态障碍物还得额外接一个预测模块。整个系统做下来,代码量好几万行,部署到真机上还要处理各种传感器的标定、时间同步问题。我见过太多团队在仿真里跑得飞起,一上真机就各种翻车,本质上就是因为模块化架构里每一环的误差在真实环境中被放大了。

那为什么不干脆跳过中间表示,直接从视觉输入映射到控制指令?这就是端到端控制的核心思想——让神经网络自己学会“看到什么就做什么”。而端到端路线里最有潜力的两个驱动引擎,一个是模仿学习,另一个就是强化学习。模仿学习需要大量带标签的专家数据,采集成本高,而且学到的策略往往只是专家行为的插值,遇到没见过的状态就容易崩。强化学习则完全不需要人工标签,让智能体自己在环境里试错,用奖励信号来引导行为,这个思路对无人机这种“动作空间连续、状态空间高维”的任务非常合适。

1.2 液体神经网络到底是什么、强在哪里

在讲液体神经网络之前,先说说传统神经网络在时序控制任务里为什么不够用。LSTM和GRU虽然能处理序列数据,但它们本质上是离散时间步的隐状态更新,网络在训练时学到的时序模式会强烈依赖训练数据的采样频率。也就是说,如果你在30Hz的仿真数据上训练了一个LSTM策略网络,把它拿到控制频率不同的另一套系统上,性能会明显下降。

液体神经网络的核心思路来自神经科学,具体来说是秀丽隐杆线虫(C. elegans)这种只有302个神经元但能表现出复杂行为的生物。MIT的研究人员受到线虫神经系统的时间连续动力学特性启发,提出了一种叫液体时间常数网络(Liquid Time-Constant Network,LTC)的模型。它和传统RNN/LSTM最大的区别在于:神经元的状态不是靠离散的循环权重矩阵来更新的,而是通过一组常微分方程(ODE)来描述,神经元的时间常数本身会随着输入信号动态调整。

举个不太严谨但很好理解的类比:LSTM像是一个固定节拍器,不管外部节奏怎么变,它都按自己的固定步长走;液体神经网络则更像一个自适应节拍器,输入信号一旦变化,神经元的响应速度和敏感度会跟着变。这种特性让它对时序输入的频率变化、噪声干扰和分布偏移都有很强的鲁棒性。MIT的论文里展示过一个很有意思的实验:用LNN训练自动驾驶车辆,在训练环境里只见过晴天和特定道路,但测试时遇到从未见过的阴雨天气和陌生道路,LNN依然能保持较好表现,而传统神经网络性能会崩得很快。

无人机视觉导航恰好就是这种“训练环境和真实环境差异巨大”的任务。仿真里学到的视觉特征、运动规律,迁移到真机时面临的光照、纹理、动态障碍物、传感器噪声都会变。液体神经网络更小的参数量也带来了额外的好处——它可以用更少的样本达到和LSTM相当甚至更好的效果,这对我来说意味着训练时间更短,调参压力更小,而且部署到树莓派这样的低功耗硬件上也更现实。

2. 整体系统架构与仿真环境选型

2.1 端到端控制系统的整体框架拆解

整套系统的架构说起来不算复杂,核心就三个模块:感知编码器、液体神经网络策略网络、奖励反馈模块。感知编码器接收无人机前置摄像头采集的RGB图像,把它压缩成一个特征向量;液体神经网络接收这个视觉特征向量,同时拼接上无人机本身的低维状态数据(包括速度、姿态角、角速度等),输出底层的控制指令;奖励反馈模块则在训练阶段计算每步的奖励值,驱动策略网络朝着“安全到达目标”的方向更新。

我特意把视觉信息和低维状态数据分开处理,而不是直接把所有数据一股脑塞进网络。原因有两个:第一,视觉特征和低维状态的时间尺度不同,图像变化相对平缓,而姿态角速度变化很快,分开处理可以让网络更容易学习到不同模态的特征;第二,在实际部署时,低维状态数据可以来自飞控的IMU估算,视觉特征来自相机,两条数据链路本身的延迟和噪声特性也不同,分开处理方便做时间对齐和故障隔离。

整个训练闭环是这样的:智能体在AirSim仿真环境中获取当前帧图像和状态信息,策略网络输出归一化的控制指令(比如横向速度、纵向速度、垂直速度和偏航角速度),AirSim的飞控模型把这些指令转成电机转速并推进仿真世界,一帧结束后返回新的图像、状态和一个奖励值,这个四元组存进经验缓冲区,供PPO算法更新策略网络。训练目标很简单也很直接:让累计奖励期望最大化。

2.2 为什么选AirSim而不是Gazebo、Unreal或其他仿真器

这个选择我做了很久的调研。先看Gazebo加PX4或者ArduPilot的组合,它在无人机仿真圈子里用得非常广,物理模型细腻,支持完整的飞控固件仿真,如果你要验证底层的飞控逻辑或者传感器的真实噪声特性,Gazebo确实是好选择。但Gazebo的视觉渲染能力一直偏弱,画面简单、纹理粗糙、光照效果不真实,这对视觉导航任务来说是致命的——神经网络在仿真里学到的视觉特征,如果画面质量不够高,迁移到真机上基本等于白学。

Unreal Engine本身渲染质量很高,但要自己搭建一套无人机动力学模型和传感器仿真接口工作量太大。微软开源的AirSim刚好把这两件事都做了:它本身跑在Unreal Engine 4上,画面保真度可以做到接近照片级;同时官方已经把多旋翼的动力学、GPS、IMU、气压计、相机等传感器全部封装好了,还提供了一套非常干净的Python API,可以直接获取图像、状态信息、设置碰撞事件,也能发送控制指令。对于我这种以“视觉导航策略训练”为核心任务的人来说,AirSim等于帮我省掉了自己写底层无人机动模型和传感器模型的巨大工作量。

选型时我还对比过微软的另一个项目Project Bonsai和Unity的ML-Agents,但前者更偏向业务级决策优化,不适合低层控制;后者虽然也能做无人机,但物理模型精度和无人机相关传感器支持都比AirSim差一个量级。至于热词里提到的MuJoCo这类机器人强化学习平台,它在机械臂、足式机器人上非常出色,物理仿真效率极高,但用于无人机视觉导航时,视觉渲染依然不是它的强项。我的结论是:无人机视觉导航任务里,AirSim在当前开源方案里没有明显对手。

这里顺便提一下AirSim和ROS2的集成。如果你的后续方案需要和PX4、MAVROS等飞控生态打通,AirSim官方提供了ROS2接口包,可以把无人机的状态信息和图像话题发出来,也可以用/airsim_drone/cmd_vel这类话题发布控制指令。我在后期做真机迁移模拟时就是通过ROS2接口把AirSim伪装的传感器数据接进去的,整个数据流的组织方式和真机非常接近。

仿真器视觉保真度无人机动力学传感器支持Python APIROS2支持
AirSim完整多旋翼相机、IMU、GPS、气压计、激光雷达完善官方支持
Gazebo完整飞控丰富但精度依赖插件一般官方支持
MuJoCo刚体物理有限完善第三方
Unity ML-Agents简化的刚体有限需要封装第三方

3. 强化学习环境搭建与传感器配置

3.1 AirSim环境搭建与settings.json关键配置解析

搭建AirSim环境有两条路径比较省事:一条是直接下载AirSim官方预编译好的二进制环境,比如最简单的Blocks环境,优点是下载完就能跑,不需要自己装Unreal Engine;另一条是下载AirSim仓库然后编译到自己的Unreal工程里,适合要自建高逼真场景的进阶玩家。第一次上手的时候我强烈建议先走第一条路径,把训练流程跑通之后再去折腾自建场景,不然很容易陷入“环境搭建三天、训练逻辑一行没写”的困境。

AirSim最关键的一个文件是settings.json,它决定了仿真世界里有哪几台无人机、装了哪些传感器、传感器参数是什么。我放一个整理过的示例,里面配置了前置RGB相机、深度相机、IMU和GPS:

{ "SettingsVersion": 1.2, "SimMode": "Multirotor", "ClockSpeed": 1.0, "Vehicles": { "Drone1": { "VehicleType": "SimpleFlight", "DefaultVehicleState": "Armed", "EnableCollision": true, "AllowAPIAlways": true, "RC": { "RemoteControlID": 0, "AllowAPIWhenDisconnected": true }, "Sensors": { "FrontCamera": { "SensorType": 1, "CaptureSettings": [ { "Width": 256, "Height": 144, "ImageType": 0, "FOV_Degrees": 90 } ] }, "DepthCamera": { "SensorType": 1, "CaptureSettings": [ { "Width": 256, "Height": 144, "ImageType": 2, "FOV_Degrees": 90 } ] }, "Imu": { "SensorType": 2 }, "Gps": { "SensorType": 3 } } } } }

这里有几个参数值得展开解释。ClockSpeed是仿真时钟倍率,调到1.0就是实时仿真,训练的时候我会视情况调整——前期网络还比较菜、容易撞机的时候保持1.0,等策略初步收敛后可以把ClockSpeed调到2.0甚至更高来加速训练。注意不是所有机器都能扛住高倍速仿真,因为AirSim的物理和渲染都是吃CPU和GPU的,如果调到2.0后画面出现明显掉帧,数据时间戳会乱掉,反而影响训练稳定性。

传感器配置里我特意关掉了图像噪声相关的选项。AirSim的相机默认是不加噪声的,画面非常干净,这对训练AI任务来说是好事,因为神经网络的输入分布更稳定。但这也带来一个隐患:模型对噪声的鲁棒性会比较差。我的做法是在训练后期,以一定概率在图像上叠加高斯噪声、随机亮度和对比度扰动,相当于做了一个简单的域随机化,这样训练出来的策略对仿真和真机之间的视觉差异有更强的耐受度。

3.2 状态空间、动作空间与奖励函数的设计

状态空间和动作空间的设计直接决定了强化学习问题的难度。我最终采用的状态空间分成两部分:视觉观测是一个256×144的RGB图像,低维状态向量包含三线速度、三轴姿态角(或四元数)、三轴角速度,以及当前无人机与目标点的相对位置和相对航向。为什么带上目标点相对位置?因为纯视觉很难精确估计距离,但如果完全不给目标信息,智能体只能盲目探索,学习效率极低。通过低维状态把“目标在哪”这个信息告诉智能体,视觉信息主要负责“怎么避开障碍物”,任务就变得清晰很多。

动作空间我选择的是连续控制:归一化的纵向速度、横向速度、垂直速度以及偏航角速度。这四个量组合起来可以描述无人机在三维空间里的基本运动意图。有人可能会问:为什么不直接用四个电机的转速作为动作空间?那样动作维度高、且和底层飞控耦合太紧,强化学习算法很难在如此高维的动作空间里学到稳定的策略。用一个中间层的速度控制,把电机转速这种底层控制交给AirSim自带的SimpleFlight飞控,训练难度会下降一个数量级。

奖励函数是整套系统里最需要反复打磨的部分。纯稀疏奖励(到达目标+大分、撞机-大分)训练效率太低,前期智能体根本得不到有效反馈。我用的奖励函数同时包含多个分量,核心逻辑如下:

def compute_reward(state, action, next_state, goal, collision): reward = 0.0 # 1. 距离变化奖励:鼓励靠近目标 dist = np.linalg.norm(next_state["position"] - goal) prev_dist = np.linalg.norm(state["position"] - goal) reward += 0.8 * (prev_dist - dist) # 2. 前进速度奖励:鼓励保持合理的前进速度 forward_speed = next_state["velocity"][0] reward += 0.05 * min(forward_speed, 3.0) # 3. 碰撞惩罚:撞机直接结束回合 if collision: reward -= 15.0 # 4. 到达目标:本回合成功 if dist < 1.5: reward += 25.0 # 5. 动作平滑惩罚:抑制剧烈抖动 reward -= 0.01 * (action[0]**2 + action[1]**2 + action[2]**2 + action[3]**2) return reward

这里的关键是距离变化奖励系数(0.8)和动作平滑惩罚(0.01)之间的平衡。系数调太大,智能体会变得很激进,贴着障碍物高速冲刺;调太小,智能体就会懒洋洋地原地盘旋,因为停留不动也不会扣分。我中间尝试过多个组合,最后发现0.8对0.01这个比例在大多数场景里都比较稳,智能体既愿意积极前进,又不会过度抖动。

4. 基于PPO与液体神经网络的训练实现

4.1 策略网络搭建与PPO超参数配置

策略网络是整个训练的核心。我用液体神经网络作为PPO的策略网络主体,第一步是让Stable-Baselines3支持自定义网络结构。Stable-Baselines3的PPO实现允许传入一个自定义的features_extractor,我们只需要把视觉观测转换成特征向量,然后和低维状态拼接,再交给一个MLP输出动作的均值和标准差。

我搭的模型主干大致是这样(简化版):

import torch import torch.nn as nn from stable_baselines3.common.torch_layers import BaseFeaturesExtractor class VisualEncoder(nn.Module): """把RGB图像压成特征向量""" def __init__(self, features_dim=128): super().__init__() self.cnn = nn.Sequential( nn.Conv2d(3, 32, kernel_size=5, stride=2), nn.ReLU(), nn.Conv2d(32, 64, kernel_size=3, stride=2), nn.ReLU(), nn.Conv2d(64, 64, kernel_size=3, stride=2), nn.ReLU(), nn.AdaptiveAvgPool2d((1, 1)) ) self.fc = nn.Linear(64, features_dim) def forward(self, obs): x = self.cnn(obs) return self.fc(x.flatten(1)) class LiquidPolicyExtractor(BaseFeaturesExtractor): """视觉特征 + 低维状态 -> 液体层 -> 动作特征""" def __init__(self, observation_space, low_dim_dim=10, features_dim=64): super().__init__(observation_space, features_dim) # 注意:这里需要根据实际观测空间的维度切分视觉和低维部分 self.visual_encoder = VisualEncoder() self.liquid_cell = LiquidCell(input_dim=128 + low_dim_dim, hidden_dim=64) self.output_layer = nn.Linear(64, features_dim) def forward(self, observations): # observations[0]是图像, observations[1]是低维状态 img, low_dim = observations visual_feat = self.visual_encoder(img) fused = torch.cat([visual_feat, low_dim], dim=1) liquid_out = self.liquid_cell(fused) return self.output_layer(liquid_out)

这里我没有展开LiquidCell的完整实现,因为用代码写一个能用的LTC细胞会占掉大量篇幅。实际项目中我参考了开源神经回路策略(Neural Circuit Policies)的PyTorch实现,核心是用一个带输入依赖时间常数的ODE来更新隐状态。如果你第一次接触,建议不要自己从头写,直接用现成的ncps库或者官方liquid-net仓库里的实现,会省很多debug时间。训练时只是把Stable-Baselines3自带的MlpExtractor替换成这个LiquidPolicyExtractor,PPO算法本身不用改。

PPO的超参数我按下面的表格来设置,这套配置在多个场景里都表现稳定:

超参数推荐值为什么这么设
learning_rate3e-4液体网络参数对学习率比较敏感,过高容易振荡
n_steps2048每次策略更新前收集的步数,和最大回合长度匹配
batch_size64mini-batch大小,太大降低更新频率,太小噪声大
gamma0.99折扣因子,让智能体兼顾短期避障和长期到达目标
gae_lambda0.95GAE平滑参数,降低奖励噪声的影响
clip_range0.2PPO裁剪范围,过大策略更新步长不稳
ent_coef0.01熵正则化,鼓励探索,防止过早收敛到局部最优
max_grad_norm0.5梯度裁剪,防止LNN训练时梯度爆炸

一个很重要的经验是:液体神经网络的隐状态是连续时间动态系统,更新步长和训练帧率要匹配。AirSim默认以大约30Hz的频率返回图像,我在训练循环里固定了每步间隔是0.1秒仿真时间。如果你把帧率调得太高或者太低,LNN模型学到的“时间尺度”和真实部署环境不一致,迁移时性能就会掉。

4.2 训练循环组织与课程学习策略

LiquidPolicyExtractor接入PPO之后,训练循环本身不算复杂,但有几个细节决定了最终效果。第一是回合结束条件的设定:除了碰撞和到达目标,我还加了一个超时机制——每个回合最多跑120秒仿真时间,如果超时没到达目标就强制结束,给一个小的惩罚。这个限制能让智能体学会“效率”,避免在环境里无意义地闲逛。

第二是环境随机化。如果每次训练都从同一个起点出发、障碍物位置完全一样,策略会过拟合到训练场景。我的做法是在每一个回合重置时,随机化无人机的初始位置、初始朝向、目标点位置,以及在场景里随机放置几个障碍物。AirSim的Python API支持通过simSetVehiclePose移动无人机,也支持加载独立的静态网格物体作为障碍物,灵活度很高。初始位置和目标点随机化之后,策略学到的不再是“某一条固定航线的肌肉记忆”,而是“看见什么就做出对应响应的通用导航能力”。

第三是课程学习。一开始训练的时候,我把场景设置成空旷地图,只有几个稀疏障碍物,让智能体先学会“朝着目标飞”。等它在简单场景里成功率上了80%,我再逐步增加障碍物密度、引入移动的障碍物、甚至添加动态干扰源。课程学习看起来多花了一点训练时间,但最终收敛效果远好于直接从困难场景开始训练。从困难场景开始的后果往往是智能体在一开始就频繁撞机,奖励一直很低,策略网络很难学到有意义的信息,训练基本白费。

训练过程中的监控也很重要。我每次训练都会在同一个“固定种子”的场景里跑几个回合,录一段视频,直观地看看智能体的表现。只看奖励曲线是不够的——奖励分数高不代表飞行轨迹合理,它可能在空中打转、贴着墙蹭,但因为实际位置离目标变近了一点所以拿到的奖励还可以。视频回放能帮你快速定位这种诡异的策略行为。

5. 训练过程中踩过的坑与排查技巧实录

5.1 常见问题速查表

下面这份速查表是我在项目里反复查看的排错手册,遇到类似问题可以对照排查:

问题症状可能原因解决方法
训练开始后奖励一直不上升奖励函数设计有误,或者状态没有包含目标信息先检查智能体是否能看到目标位置信息;临时把奖励改成“距离差”或“到达惩罚”的稀疏版本做快速验证
策略收敛到“原地打转”动作平滑惩罚过大,或者超时惩罚不够降低动作平滑惩罚系数;把超时回合的奖励从0改成-1,让“不动”变得不划算
训练时频繁报“NaN loss”学习率过高,或者LNN层梯度爆炸调低learning_rate到1e-4;启用梯度裁剪;检查奖励值是否出现异常大的正数
碰撞检测不触发导致撞进障碍物AirSim的碰撞检测精度或者碰撞体的网格质量检查碰撞体是否启用;在settings.json里加上EnableCollision: true;确认障碍物使用的是凸碰撞体
训练速度极慢,GPU利用率低仿真渲染成了训练瓶颈降低图像分辨率;关闭不必要的后期处理效果;适当调高ClockSpeed;用多进程并行采集经验
仿真里表现好但换环境就崩过拟合到训练环境的视觉特征增加域随机化(亮度、对比度、颜色扰动);换不同的场景地图训练
无人机经常悬停不动策略网络输出的动作被限制在0附近检查动作空间的边界设置;把动作的平均值初始化拉开一点,或者调整奖励里前进速度的系数

5.2 三个最值得展开的坑

第一个坑是奖励函数的“作弊”行为。一开始我在奖励函数里加了一项“与目标点距离减少就给正奖励”,本意是引导智能体靠近目标。结果训练出来的策略学会了绕一个大圈,先远离目标再靠近,因为绕圈的过程中它拿到了很多次“距离减少”的正奖励。这就是典型的奖励黑客(reward hacking)。后来我改成用“当前距离和上一帧距离的差值”来计算,但依然没办法彻底杜绝这种绕圈行为。真正见效的办法是加入时间成本和超时惩罚,让每一帧都在倒扣分数,这样绕圈拿到的正奖励不足以弥补时间成本,策略自然就老老实实走直线了。

第二个坑和图像输入的时间戳有关。AirSim的图像API在请求图像之后会返回一个PIL Image或者numpy数组,但如果你在训练循环里先请求图像、再请求状态信息,然后再发起控制指令,这三个数据之间可能会有几十毫秒的时间差。一开始我没太在意这个时间差,结果训练出来的策略在仿真里看视频不算太差,但一遇到障碍物稍微密集一点的场景就反应迟缓。后来我把图像和状态放在同一个AirSim API响应里面拿,确保它们的时间戳对齐。训练和部署的时候一定要保证状态信息与图像的时间对齐,这对端到端系统的影响远超很多人的直觉预期。

第三个坑是液体神经网络在训练初期的敏感性问题。液体网络的时间常数是动态调整的,在初始阶段网络还没学到合理的输入依赖关系时,隐状态可能会异常敏感,稍微一点输入噪声就会让输出动作产生很大的抖动。这直接导致PPO在训练最开始的几万步里策略方差特别大,奖励曲线像心电图一样上下乱跳。解决方式有两个:一是把液体网络内部的初始时间常数设得比较大(比如初始时间常数设为2到5秒的量级),让网络一开始偏向平滑保守,之后再逐步让数据来决定时间常数的大小;二是在训练初期增加熵正则化的权重,让探索更充分之后再逐渐降低。

6. 从仿真到后续扩展的几点心得体会

最后分享一点个人体会。这个项目做下来,我最大的感受是:真正决定系统上限的不是单个模型的选取,而是状态空间、动作空间、奖励函数和训练策略这几者之间的匹配程度。液体神经网络和PPO都只是工具箱里的工具,它们能不能发挥出效果,取决于你有没有把任务以合适的方式表达给算法。压力测试显示,用这套方案在AirSim里训练好的策略,换成完全没见过的场景布局后,成功率从第一版的37%提升到了最后的82%,这个提升主要来源于奖励函数的修正、域随机化以及时间戳对齐这几个细节,而不是模型本身的变化。

如果你后续想从这个项目继续扩展,我建议可以往两个方向试试:一个是在AirSim里加入更多样的天气和光照条件,把训练域做得更宽,然后逐步引入更复杂的动态障碍物,让智能体学会预测和规避移动目标;另一个方向是把雷达或者深度相机加入观测空间,让系统在纯视觉失效的低光照条件下有第二重感知保障。仿真到真机的迁移永远是一个巨大的挑战,但先把仿真环境里的问题解决清楚,这一步做得越扎实,将来上真机时翻车的概率就越低。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询