AirsimDRL
深度强化学习训练四旋翼无人机,仅凭深度图像实现无碰撞自主导航穿越障碍
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
深度强化学习训练四旋翼无人机,仅凭深度图像实现无碰撞自主导航穿越障碍
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你花了一学期的时间,训练一个 AI 智能体,让它在没有任何人类遥控的情况下,仅凭一双眼——一帧深度图像——就能自主穿越狭窄的窗口、绕过立柱、躲避曲面墙,最终精准降落在目标点。
这就是 AirsimDRL,一个由韩国首尔某高校本科生在 capstone 课程中完成的"毕业设计疯狂实验"。项目用深度强化学习(DRL)训练四旋翼无人机(Quadrotor),在微软 AirSim 仿真平台上实现无碰撞自主导航。
传统飞控的局限:传统无人机控制依赖精确的数学模型和传感器融合,但面对未知障碍物时,要么需要预先建模(成本高),要么依赖规则判断(无法应对复杂场景)。
强化学习的优势:强化学习让智能体通过"试错"学会策略——撞墙就扣分,到达目标就加分。学到一定程度后,它甚至能泛化到训练时没见过的障碍物布局。这种"让机器自己摸索"的方式,天然适合仿真环境中的复杂导航任务。
AirsimDRL 选择了 AirSim 作为仿真平台——微软开源的基于 Unreal Engine 4(虚幻引擎)的无人机/车辆仿真器。相比 Gazebo,AirSim 提供逼真的光照和物理反馈,更接近真实飞行体验,但代价是必须在 Windows 环境下运行(这也是项目部署复杂的主要原因)。
项目的技术架构非常清晰,可以分为三个核心模块:
AirSim 的 Python SDK 提供了 MultirotorClient,airsim_env.py 封装了这个接口,将其转化为强化学习框架熟悉的 Gym 风格接口:
class Env:
def reset(self):
self.client.reset()
self.client.enableApiControl(True)
self.client.armDisarm(True)
# 起飞并悬停
self.client.moveByVelocityAsync(0, 0, -1, 2 * timeslice).join()
self.client.hoverAsync().join()
# 获取深度图像
responses = self.client.simGetImages([
airsim.ImageRequest(1, airsim.ImageType.DepthVis, True)
])
return observation # [depth_image, linear_velocity]
def step(self, quad_offset):
self.client.moveByVelocityAsync(...) # 执行动作
# 碰撞检测、奖励计算、done 判断
关键设计:每个动作执行 0.5 秒(timeslice),仿真时间可调(clockspeed)。State 包含深度图像(144×256 或 72×128)和线性速度。
项目实现了 5 种 DR 智能体,从简单到复杂:
| Agent | 算法 | 特点 |
|---|---|---|
rdqn.py | Recurrent DQN | 引入 RNN 记忆,处理时序依赖 |
ra2c.py | Recurrent A2C | Actor-Critic 架构,RNN 增强 |
rddpg.py | Recurrent DDPG | 连续动作空间,Actor-Critic + DPG |
rddpg_per.py | R-DDPG + PER | 加入优先经验回放,提升采样效率 |
td3_per.py | Twin Delayed DDPG + PER | 双 Critic 抑制过估计,PER 加速收敛 |
以最成熟的 td3_per.py 为例(25793 字符),架构如下:
Actor 网络:输入为 depth image(Conv2D) + velocity(Dense),经 3 层卷积提取图像特征,与速度向量拼接后通过 GRU 处理时序,最后输出连续动作(3 自由度速度指令)。
Critic 网络:双 Critic(避免 Q 值过估计),接受 (state, action) 输入,估计 Q 值。梯度从 Critic 反向传回 Actor,实现策略优化。
Prioritized Experience Replay(PER):PER.py 实现了 SumTree 数据结构,优先回放高 TD-error 的经验,加速收敛。Memory 类封装了 Beta 衰减的 IS 权重修正。
reward = {
'forward': 0.1, # 前进给正奖励
'normal': -0.1, # 一般情况轻微惩罚
'slow': -0.05, # 速度过慢惩罚
'dead': -2.0, # 碰撞或越界重罚
'goal': 2.0, # 到达目标重奖
}
设计逻辑:鼓励前进、惩罚后退和怠速,严重惩罚死亡(碰撞/越界),巨大奖励引导到达终点。
项目定义了多套障碍物环境:
入门环境(Easy):单个障碍——垂直柱、水平柱、窗口、垂直曲面墙。
进阶环境(Normal):多个障碍组合,如"窗口→水平柱→曲面墙→垂直柱"。
地狱环境(Hard):不同类型的障碍——水平曲面墙、反向ㄷ形、ㄷ形、对角柱。
目标点序列 [7, 17, 27.5, 45, 57] 表示沿 Y 轴方向的多个检查点,每到达一个增加难度。
图1:垂直柱障碍训练环境
图2:窗口穿越训练环境
核心框架:TensorFlow 1.x + Keras(代码使用 tf.Session 和 K.set_session,是 TF 1.x 时代的典型写法)。
仿真平台:Microsoft AirSim(Python SDK)+ Unreal Engine 4(Windows 专用)。
DRL 算法:自实现的 DQN/A2C/DDPG/TD3,代码从零构建,包含完整的网络构建、经验回放、目标网络更新逻辑。
其他依赖:OpenCV(图像处理)、NumPy(数值计算)、PIL(图像读写)。
主要文件体积:
td3_per.py:25793 字符(最完整的实现)rddpg.py:21285 字符airsim_env.py:4963 字符PER.py:2932 字符(PER 算法核心)作者在 README 中坦承:
"It did work when I tried, but there were many trial and errors. I'm sorry that I didn't consider any reproducibility (e.g. random seed)."
这不是谦虚。代码存在以下问题:
test_*.py,无法验证训练好的策略是否真的有效。config.py 和 airsim_env.py 中,扩展需改两个文件。但这些局限并不影响项目的价值——对于研究目的来说,代码可读性好(命名清晰、注释充分),算法实现正确,足够用于复现和改进了。
如前所述,这个项目几乎不可能一键部署。完整流程:
pip install tensorflow-gpu==1.15 keras airsim opencv-python numpy如果只是想看效果,可以直接下载作者提供的演示视频(YouTube 链接在 README),无需本地复现。
AirsimDRL 是一个典型的 "本科生 DRL 入门 + AirSim 仿真" 项目。从代码体量(17 个文件,~80KB)、算法覆盖(DQN→A2C→DDPG→TD3)、到环境复杂度(3 档难度),都体现了作者大量的调试心血。
优点:
缺点:
适合人群:想学习 DRL 在无人机控制中应用的入门研究者,或想了解 AirSim + TensorFlow 1.x 时代强化学习实现的开发者。
不适合:追求生产级代码、需要容器化部署、或需要 Python 3.8+ 兼容性的用户。