helicopter-rl
用 PPO 算法在 Pygame 像素风游戏中训练 RL 智能体,Stable-Baselines3
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用 PPO 算法在 Pygame 像素风游戏中训练 RL 智能体,Stable-Baselines3
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你在玩一款复古的隧道直升机游戏,需要在不断逼近的岩石隧道中保持飞行,不能碰墙、不能坠地。一局又一局,你靠肌肉记忆躲避障碍——而现在,一个 PPO 强化学习智能体正在学习做同样的事,而且学得比你还好。这就是 helicopter-rl 项目最直观的意义:一个用现代 RL 框架复现经典强化学习实验的完整案例。
强化学习(Reinforcement Learning,RL)是 AI 领域最直观的分支之一——没有标注数据,智能体通过"试错"学会最大化累积奖励。1980 年代,直升机/飞行器控制就是 RL 领域的经典 benchmark,这个传统延续至今。
本项目的作者 rossning92 并没有选择复杂的 3D 模拟器或昂贵的 GPU 集群,而是用 Pygame 从零手写了一个纯 Python 的 2D 像素风直升机游戏,封装为 Gymnasium 环境,然后用 Stable-Baselines3 的 PPO 算法训练它。135 颗 GitHub Stars 说明这个简洁优雅的方案得到了社区认可。
PPO(Proximal Policy Optimization,近端策略优化)是 OpenAI 在 2017 年提出的策略梯度算法,目前是 RL 领域最流行的基线方法。相比原始策略梯度,PPO 通过**裁剪(clip)**策略更新幅度来避免灾难性的大幅更新,使训练过程更加稳定。本项目默认使用 Stable-Baselines3 内置的 PPO 实现,默认设备为 CPU(device="cpu"),这意味着任何一台普通电脑都能跑。
Gymnasium(原 gym)是 RL 研究的标准化环境接口,本项目的 HelicopterEnv 完全遵循其规范:
action_space = Discrete(2):只有两个动作——向上推力(SPACE)或自由落体。极简的动作空间让问题聚焦于何时施力的时序决策。observation_space = Box(0,1,shape=(10,)):状态向量包含 10 维:直升机垂直位置、垂直速度,加上 4 个最近隧道段的 (x, y) 坐标,全部归一化到 [0,1]。智能体不需要视觉输入,纯靠数值状态就能学会。reward = 0 if game_over else 1:存活即奖励,坠毁即终止。稀疏但明确。这种设计非常适合 RL 新手理解环境与智能体之间的交互机制。
训练脚本使用 make_vec_env 默认并行 100 个环境实例(--n-envs 可调),配合 VecMonitor 收集统计信息。100 个直升机同时飞行,共享同一个策略网络,梯度从 batch 中汇总更新——这是 RL 训练的标准提速手段,在 Stable-Baselines3 中开箱即用。
CheckpointCallback 每隔 1000 步自动保存模型快照(含 replay buffer 和 VecNormalize 归一化器),训练中断可无缝续跑。TensorBoard 日志记录在 tmp/tensorboard/ 目录,可直观观察 reward 曲线、损失变化等。
游戏核心在 helicopter_game.py(约 15KB),纯 Pygame 实现,不依赖任何物理引擎。关键设计:
GRAVITY=0.5、推力 THRUST=0.3,每帧叠加更新直升机垂直速度。简洁的弹簧模型足够让 PPO 学出合理的飞行策略。_get_jagged_boundary() 用随机扰动 + 正弦波叠加,实时生成起伏不平的隧道壁。TUNNEL_HEIGHT=100 像素的走廊宽度刚好给直升机留出足够的操作空间但又不至于太宽松。SpriteSheet 类从 PNG 雪碧图中截取帧,直升机螺旋桨持续旋转、爆炸效果帧循环播放,复古感十足。渲染分辨率为 360×240 像素,通过 SCALE=2 上采样到 720×480 输出——足够清晰又足够轻量。
eval.py 实现了完整的模型评估流程:加载 checkpoint 后在环境中运行最多 3000 步,每步打印动作、观察值、奖励。如果指定 --out-video,则通过 FFmpeg 将 RGB Array 帧编码为 H.264 视频(CRF=1 保证高质量),这是展示 RL 智能体"飞行技艺"的最佳方式。
test_env.py 则提供了更灵活的调试工具:支持输出帧图片序列、元数据 JSON,甚至可以指定固定动作(--action 0/1)来复现特定行为。
项目依赖极简(仅 stable-baselines3、gymnasium、pygame、tensorboard 四个包),Python 3.11+ 即可运行。默认训练 1 亿步,推荐配置 n_envs=32 并行 + total_timesteps=5000000,在一台普通笔记本上大约需要数小时。
想先看看效果?eval.py 会自动加载 tmp/ 下最新的 checkpoint,无模型时直接运行 helicopter_game.py 手动玩一局,理解了人类直觉后再看 RL 学到了什么——这个对比过程本身就是很好的学习体验。
device="cpu",PPO 训练速度受 CPU 性能限制;大 n_envs 时可能吃满所有核心。device="cuda" 并安装 PyTorch。helicopter-rl 代表了 RL 入门教育的一个优秀方向——用最小化的代码 footprint 覆盖完整的 RL 训练闭环:环境定义 → 智能体选择 → 向量化训练 → 评估可视化。对比 OpenAI 的 Gym 或 RL-Baselines3-Zoo,它的游戏化特性让训练过程更直观、更有趣。对于想入门 RL 但被复杂环境配置劝退的开发者,这个项目是一个极佳的起点。