仅需 10 行代码,让你的 AI 学会丝滑登月!Gymnasium LunarLander-v3 深度拆解

相关资源
Gymnasium官方文档:
https://gymnasium.farama.org/environments/box2d/lunar_lander/
Hugging Face Deep RL 课程:
https://huggingface.co/learn/deep-rl-course/unit8/hands-on-cleanrl
如果你曾梦想过指挥阿波罗号登月,或者对 SpaceX 的火箭回收技术感到着迷,那么 Gymnasium 中的 LunarLander-v3 就是你绝佳的数字化训练场。
认识LunarLander-v3
它是什么?
LunarLander(登月着陆器)是一个经典的物理仿真环境。你的任务很简单:控制一个带有三个引擎(左、右、底)的着陆器,在重力影响下,平稳地降落在由两面旗帜标记的“停机坪”上。
为什么它是小白进阶的“分水岭”?
物理仿真更真实:不同于网格世界,这里有重力、动量、推力和燃料消耗。
多维状态感知:着陆器需要时刻监控 8 个变量(位置、速度、角度等)。
精细化控制:推力大一点会飞天,小一点会坠毁。这模拟了真实机器人对力矩控制的需求。
新手实战:从“空中爆炸”到“平稳着陆”
第一步:安装“太空套件”
LunarLander 依赖于 Box2D 物理引擎。打开终端执行:
pip install gymnasium[box2d]注:如果安装报错,通常是系统缺少 swig。Windows 用户建议用 conda install swig,Mac 用户用 brew install swig。
第二步:理解“大脑”的决策循环
在写代码前,先看清楚 AI 是如何跟月球表面“沟通”的:
观察 (State):AI 获取当前的位置、水平/垂直速度、角度、角速度以及两条腿是否着地。
动作 (Action):AI 决定执行哪种操作:0(不动)、1(左喷火)、2(主引擎喷火)、3(右喷火)。
反馈 (Reward):离中心近加分,移动慢加分,腿着地加分;坠毁扣大分(-100),每喷一次火扣一点点(燃料费)。
第三步:编写第一个“随机飞行”脚本
创建一个 lunar_land.py,看看不加干预的情况下,着陆器会发生什么:
import gymnasium as gym
# 1. 创建环境(render_mode="human" 让我们能实时看到画面)
env = gym.make("LunarLander-v3", render_mode="human")
observation, info = env.reset()
for _ in range(500):
# 2. 随机采样一个动作(模拟乱按按钮的飞行员)
action = env.action_space.sample()
# 3. 执行动作并获取结果
observation, reward, terminated, truncated, info = env.step(action)
# 4. 如果坠毁或完成,重置环境
if terminated or truncated:
observation, info = env.reset()
env.close()写完随机飞行脚本后,你已经亲眼目睹了“人工智能胡乱操作导致机毁人亡”的惨状。接下来的目标是让它进化。
第四步:深度分析:观察那一串“神秘数字”

第五步:引入“教练” —— Stable Baselines3 (SB3)
推荐算法:PPO (Proximal Policy Optimization)。它是目前公认在 LunarLander 上表现最稳、最快的方法。
安装库:
pip install stable-baselines3[extra]编写训练脚本:只需几行代码,AI 就会开始通过“试错”来学习:
from stable_baselines3 import PPO
import gymnasium as gym
env = gym.make("LunarLander-v3")
# 定义模型:使用多层感知机(MlpPolicy)
model = PPO("MlpPolicy", env, verbose=1)
# 开始学习:训练 10 万步
model.learn(total_timesteps=100000)
# 保存模型
model.save("ppo_lunar_lander")验证:加载模型看表现
训练完后,你需要把 render_mode 改回 human,加载你保存好的 .zip 模型文件,看看现在的 AI 是不是能丝滑降落了。
你会发现的区别:
随机脚本:像个喝醉的司机,到处乱撞。
训练后的 AI:会精准地控制推力,在降落前会有明显的“减速平滑感”,并且努力让两条腿稳稳站在旗帜中间。
第六步:你接下来还可以做
当 PPO 算法能百分百成功着陆后,你可以尝试以下操作
调整参数:把 LunarLander-v3 的 continuous 模式打开(改为 True)。此时推力不再是“开关”,而是“0到1之间的连续值”,这更接近真实火箭的控制。
可视化训练:学习使用 TensorBoard 来观察奖励曲线,看看 AI 是在哪个时间点突然“开窍”的。
避坑指南
环境依赖
现象:ImportError: Box2D not found
解决方案:必须安装 gymnasium[box2d] 而不仅仅是 gymnasium。
版本冲突
现象:v2 还是 v3?
解决方案:官方已更新到 v3,参数略有变化。请确保代码中写的是 v3。
奖励陷阱
现象:奖励一直是负数?
解决方案:正常现象。AI 在学会降落前,坠毁是常态。不要轻易修改奖励函数,先让它跑 10 万次迭代再说。
死循环
现象:着陆器在空中无限飘荡
解决方案:检查 truncated(时间截断)标志。新版本 Gymnasium 强制要求处理这个变量。
总结
LunarLander 让你学到的是如何在物理约束下寻找最优解。
