Lunar Lander¶

此环境是 Box2D 环境的一部分,其中包含有关环境的通用信息。
动作空间 |
|
观测空间 |
|
import |
|
描述¶
此环境是经典的火箭轨迹优化问题。根据庞特里亚金最大值原理,全油门或关闭发动机是最佳选择。这就是此环境具有离散动作的原因:发动机开启或关闭。
有两个环境版本:离散或连续。着陆平台始终位于坐标 (0,0)。坐标是状态向量中的前两个数字。可以在着陆平台外着陆。燃料是无限的,因此智能体可以学习飞行,然后在首次尝试时着陆。
要查看启发式着陆,请运行
python gymnasium/envs/box2d/lunar_lander.py
动作空间¶
有四个离散动作可用
0:无操作
1:启动左侧方向引擎
2:启动主引擎
3:启动右侧方向引擎
观测空间¶
状态是一个 8 维向量:着陆器在 x
和 y
中的坐标,其在 x
和 y
中的线速度,其角度,其角速度,以及两个布尔值,表示每条腿是否与地面接触。
奖励¶
每一步之后都会获得奖励。一个 episode 的总奖励是该 episode 内所有步骤的奖励总和。
对于每一步,奖励
随着着陆器靠近/远离着陆平台而增加/减少。
随着着陆器移动速度减慢/加快而增加/减少。
随着着陆器倾斜度增加(角度非水平)而减少。
每条腿与地面接触时增加 10 分。
每次侧引擎点火时,每帧减少 0.03 分。
每次主引擎点火时,每帧减少 0.3 分。
对于坠毁或安全着陆,episode 分别获得额外的 -100 或 +100 分奖励。
如果 episode 得分至少为 200 分,则认为是一个解决方案。
起始状态¶
着陆器从视口顶部中心开始,对其质心施加随机初始力。
Episode 终止¶
如果发生以下情况,则 episode 结束
着陆器坠毁(着陆器主体与月球接触);
着陆器超出视口(
x
坐标大于 1);着陆器未唤醒。根据 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.0enable_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)。
将
x
、y
坐标的观测空间从 \(\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:初始版本
注释¶
环境的实现存在一些意想不到的错误。
着陆器主体上的侧推进器的位置会根据着陆器的方向而变化。这反过来导致施加到着陆器的扭矩与方向相关。
状态的单位不一致。即
角速度的单位为每秒 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 创建