月球着陆器

../../../_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)

导入

gymnasium.make("LunarLander-v3")

描述

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

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

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

python gymnasium/envs/box2d/lunar_lander.py

动作空间

有四个离散动作可用

  • 0:什么也不做

  • 1:点燃左侧方向发动机

  • 2:点燃主发动机

  • 3:点燃右侧方向发动机

观察空间

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

奖励

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

对于每一步,奖励

  • 着陆器越靠近/越远离着陆平台,奖励就会增加/减少。

  • 着陆器移动越慢/越快,奖励就会增加/减少。

  • 着陆器倾斜越多(角度不水平),奖励就会减少。

  • 每条与地面接触的腿都会获得 10 分奖励。

  • 每帧侧发动机点火,奖励就会减少 0.03 分。

  • 每帧主发动机点火,奖励就会减少 0.3 分。

如果着陆器坠毁或安全着陆,则该集将获得额外的 -100 或 +100 分奖励。

如果得分至少为 200 分,则该集被认为是解决方案。

初始状态

着陆器从视窗的顶部中央开始,在其质心上施加一个随机的初始力。

集终止

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

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

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

  3. 着陆器未处于唤醒状态。从 Box2D 文档 中,未处于唤醒状态的主体是指不移动且不与任何其他主体发生碰撞的主体

当 Box2D 确定一个主体(或一组主体)已停止运动时,该主体将进入休眠状态,其 CPU 开销非常小。如果一个处于唤醒状态的主体与一个休眠状态的主体发生碰撞,则休眠状态的主体将被唤醒。如果与主体连接的关节或接触被破坏,主体也将被唤醒。

参数

月球着陆器具有大量参数

>>> 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),以确保连续集之间的统计独立性(相关 GitHub 问题)。

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

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

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

  • 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、‘angle’: 1、‘angular velocity’: 2.5

修正后,状态的单位如下:‘x’: (单位)、‘y’: (单位)、‘vx’: (单位/秒)、‘vy’: (单位/秒)、‘angle’: (弧度)、‘angular velocity’: (弧度/秒)

致谢

作者:奥列格·克利莫夫