Lunar Lander

../../../_images/lunar_lander.gif

此环境是 Box2D 环境的一部分,其中包含有关环境的通用信息。

动作空间

Discrete(4)

观测空间

Box([ -2.5 -2.5 -10. -10. -6.2831855 -10. -0. -0. ], [ 2.5 2.5 10. 10. 6.2831855 10. 1. 1. ], (8,), float32)

import

gymnasium.make("LunarLander-v3")

描述

此环境是经典的火箭轨迹优化问题。根据庞特里亚金最大值原理,全油门或关闭发动机是最佳选择。这就是此环境具有离散动作的原因:发动机开启或关闭。

有两个环境版本:离散或连续。着陆平台始终位于坐标 (0,0)。坐标是状态向量中的前两个数字。可以在着陆平台外着陆。燃料是无限的,因此智能体可以学习飞行,然后在首次尝试时着陆。

要查看启发式着陆,请运行

python gymnasium/envs/box2d/lunar_lander.py

动作空间

有四个离散动作可用

  • 0:无操作

  • 1:启动左侧方向引擎

  • 2:启动主引擎

  • 3:启动右侧方向引擎

观测空间

状态是一个 8 维向量:着陆器在 xy 中的坐标,其在 xy 中的线速度,其角度,其角速度,以及两个布尔值,表示每条腿是否与地面接触。

奖励

每一步之后都会获得奖励。一个 episode 的总奖励是该 episode 内所有步骤的奖励总和。

对于每一步,奖励

  • 随着着陆器靠近/远离着陆平台而增加/减少。

  • 随着着陆器移动速度减慢/加快而增加/减少。

  • 随着着陆器倾斜度增加(角度非水平)而减少。

  • 每条腿与地面接触时增加 10 分。

  • 每次侧引擎点火时,每帧减少 0.03 分。

  • 每次主引擎点火时,每帧减少 0.3 分。

对于坠毁或安全着陆,episode 分别获得额外的 -100 或 +100 分奖励。

如果 episode 得分至少为 200 分,则认为是一个解决方案。

起始状态

着陆器从视口顶部中心开始,对其质心施加随机初始力。

Episode 终止

如果发生以下情况,则 episode 结束

  1. 着陆器坠毁(着陆器主体与月球接触);

  2. 着陆器超出视口(x 坐标大于 1);

  3. 着陆器未唤醒。根据 Box2D 文档,未唤醒的物体是不移动且不与其他任何物体碰撞的物体

当 Box2D 确定物体(或物体组)已静止时,物体会进入睡眠状态,CPU 开销非常小。如果一个唤醒的物体与一个睡眠的物体碰撞,那么睡眠的物体就会被唤醒。如果连接到物体的关节或接触被破坏,物体也会被唤醒。

参数

Lunar Lander 有大量参数

>>> import gymnasium as gym
>>> env = gym.make("LunarLander-v3", continuous=False, gravity=-10.0,
...                enable_wind=False, wind_power=15.0, turbulence_power=1.5)
>>> env
<TimeLimit<OrderEnforcing<PassiveEnvChecker<LunarLander<LunarLander-v3>>>>>

  • continuous 确定将使用离散动作还是连续动作(对应于发动机的油门),动作空间分别为 Discrete(4)Box(-1, +1, (2,), dtype=np.float32)。对于连续动作,动作的第一个坐标确定主引擎的油门,而第二个坐标指定侧向推进器的油门。给定一个动作 np.array([main, lateral]),如果 main < 0,主引擎将完全关闭,对于 0 <= main <= 1,油门从 50% 到 100% 呈仿射缩放(特别是,主引擎在低于 50% 功率时不起作用)。同样,如果 -0.5 < lateral < 0.5,则侧向推进器根本不会点火。如果 lateral < -0.5,则左侧推进器将点火,如果 lateral > 0.5,则右侧推进器将点火。同样,油门在 -1 和 -0.5 之间(以及 0.5 和 1 之间,分别)从 50% 到 100% 呈仿射缩放。

  • gravity 决定重力常数,此值限制在 0 到 -12 之间。默认值为 -10.0

  • enable_wind 确定是否会对着陆器应用风力效应。风是使用函数 tanh(sin(2 k (t+C)) + sin(pi k (t+C))) 生成的,其中 k 设置为 0.01,C 在 -9999 到 9999 之间随机采样。

  • wind_power 决定应用于飞行器的线性风的最大强度。建议的 wind_power 值在 0.0 到 20.0 之间。

  • turbulence_power 决定应用于飞行器的旋转风的最大强度。建议的 turbulence_power 值在 0.0 到 2.0 之间。

版本历史

  • v3

    • 每当环境重置时,重置风和湍流偏移量 (C),以确保连续 episode 之间的统计独立性(相关 GitHub issue)。

    • 修复由于未完全销毁世界而导致的非确定性行为(相关 GitHub issue)。

    • xy 坐标的观测空间从 \(\pm 1.5\) 更改为 \(\pm 2.5\),速度从 \(\pm 5\) 更改为 \(\pm 10\),角度从 \(\pm \pi\) 更改为 \(\pm 2\pi\)(相关 GitHub issue)。

  • v2:计算能量消耗,在 v0.24 中,添加了具有风力和 turbulence_power 参数的湍流

  • v1:状态向量中添加了腿部与地面的接触;与地面接触给予 +10 奖励积分,然后失去接触则 -10;奖励重新归一化为 200;更难的初始随机推力。

  • v0:初始版本

注释

环境的实现存在一些意想不到的错误。

  1. 着陆器主体上的侧推进器的位置会根据着陆器的方向而变化。这反过来导致施加到着陆器的扭矩与方向相关。

  2. 状态的单位不一致。即

  • 角速度的单位为每秒 0.4 弧度。为了转换为弧度每秒,该值需要乘以 2.5 的因子。

对于 VIEWPORT_W、VIEWPORT_H、SCALE 和 FPS 的默认值,比例因子等于:“x”:10,“y”:6.666,“vx”:5,“vy”:7.5,“角度”:1,“角速度”:2.5

在进行校正后,状态的单位如下:“x”:(单位),“y”:(单位),“vx”:(单位/秒),“vy”:(单位/秒),“角度”:(弧度),“角速度”:(弧度/秒)

致谢

由 Oleg Klimov 创建