openai-gym LunarLander 自杀烧伤模拟

Eka*_*Eka 5 python simulation physics game-physics openai-gym

我想模拟自杀烧伤来学习和理解火箭着陆。OpenAI 健身房已经有一个 LunarLander 环境,用于训练强化学习代理。我正在使用这个环境来模拟 python 中的自杀烧伤。我已经(x,y)从这个环境的状态向量的前两个值中提取了坐标。根据这些值,将y坐标视为高度;我已经使用这些方程计算了降落着陆器的速度和加速度

velocity(v) = delta_y/ delta_t
acceleartion(a) = delta_v/delta_t
Run Code Online (Sandbox Code Playgroud)

随着模拟逐步递增,时间差delta_t被视为 1。无法找到 LunarLander 的重力参数,我给了它一个默认值g=1。然后使用此reddit 评论中的以下等式

开始自杀燃烧的高度 = [(当前高度)(重力加速度)+(1/2)(当前速度)2 ] /(发动机加速度)

我试图计算高度以开始自杀烧伤。这是我的完整 python 代码。我只计划使用四个可能操作中的两个操作 0(什么都不做)和 2(启动主引擎)。

import gym
env = gym.make('LunarLander-v2')
env.seed(0)

g = 1
delta_t = 1
action = 0

state = env.reset()

# x0 = state[0]
y0 = state[1]
v0 = 0

for t in range(3000):
    state, reward, done, _  = env.step(action)
    y = state[1]
    if done or y <0:
        break
    v = (y-y0)/delta_t  # velocity
    a = (v - v0)/delta_t # acceleration

    # (altitude to start suicide burn) = [ (current altitude)(acceleration of gravity) + (1/2)(current velocity)2 ] / (acceleration of engines)
    alt_burn = [y*g+0.5*v*v]/a

    v0 = v
    y0 = y

    print(" y",round(y,5)," v",round(v,5)," a",round(a,5)," Alt_burn",round(alt_burn[0],5))
Run Code Online (Sandbox Code Playgroud)

输出结果看起来像这样

 y 1.41542  v 0.00196  a 0.00196  Alt_burn 722.35767
 y 1.41678  v 0.00136  a -0.0006  Alt_burn -2362.78166
 y 1.41754  v 0.00076  a -0.0006  Alt_burn -2362.63867
 y 1.4177  v 0.00016  a -0.0006  Alt_burn -2362.43506
 y 1.41726  v -0.00044  a -0.0006  Alt_burn -2362.64046
 y 1.41622  v -0.00104  a -0.0006  Alt_burn -2359.03148
 y 1.41458  v -0.00164  a -0.0006  Alt_burn -2358.17355
 y 1.41233  v -0.00224  a -0.0006  Alt_burn -2353.50518
 y 1.40949  v -0.00284  a -0.0006  Alt_burn -2349.24118
 y 1.40605  v -0.00344  a -0.0006  Alt_burn -2343.51016
 y 1.40201  v -0.00404  a -0.0006  Alt_burn -2336.31535
 y 1.39737  v -0.00464  a -0.0006  Alt_burn -2329.04954
Run Code Online (Sandbox Code Playgroud)

如果我们看一下高度(y),它是一个非常小的值,小于 1.5,而计算出的开始自杀燃烧的高度非常高。我怎么解决这个问题?

在 reddit 评论中,他们只提到启动引擎而不是结束引擎。有人知道动态杀死引擎的数学吗?

Wil*_*ler 5

您的代码有两个问题:

  1. delta_t应该1.0/50.0根据lunar_lander来源
 FPS = 50
 #...
 self.world.Step(1.0/FPS, 6*30, 2*30)
Run Code Online (Sandbox Code Playgroud)

与指示典型时间步长的Box2D文档

 # [...]Typically we use a time step of 1/60 of a
 # second (60Hz) and 6 velocity/2 position iterations. This provides a 
 # high quality simulation in most game scenarios.
 timeStep = 1.0 / 60
Run Code Online (Sandbox Code Playgroud)
  1. 发动机的加速度不应被定义为当前加速度,因为它在
alt_burn = [y*g+0.5*v*v]/a
Run Code Online (Sandbox Code Playgroud)

但是通过引擎的推动力,这里定义为

MAIN_ENGINE_POWER  = 13.0
Run Code Online (Sandbox Code Playgroud)

着陆器的质量不是在着陆器主体创建中指定的,而是使用

 FPS = 50
 #...
 self.world.Step(1.0/FPS, 6*30, 2*30)
Run Code Online (Sandbox Code Playgroud)

我们可以找到质量为4.82。鉴于此,发动机的正确加速度为1

 # [...]Typically we use a time step of 1/60 of a
 # second (60Hz) and 6 velocity/2 position iterations. This provides a 
 # high quality simulation in most game scenarios.
 timeStep = 1.0 / 60
Run Code Online (Sandbox Code Playgroud)

如果我们运行上述修改的代码,

alt_burn = [y*g+0.5*v*v]/a
Run Code Online (Sandbox Code Playgroud)

我们得到了一个更合理的燃烧高度答案:

MAIN_ENGINE_POWER  = 13.0
Run Code Online (Sandbox Code Playgroud)

自杀燃烧2的执行现在是微不足道的,我们只需要在着陆器低于燃烧高度时激活引擎,并在着陆器低于截止高度时停用它们。

env.lander.mass
Run Code Online (Sandbox Code Playgroud)

着陆器将悬停:

在此处输入图片说明


1可耻的是我找不到这个方程的来源。我拥有应用物理学学位,重点是天体物理学和超过 1000 小时的KSP - 所以我绝对确定这个方程是正确的,但我一生都记不起我是从哪里得到的。

2这种自杀式烧伤也被称为气垫猛击。SpaceX 创造了这个术语,因为当猎鹰 9 助推器着陆时,一台发动机在最小推力下产生的 TWR 大于 1.00,这意味着没有像阿波罗任务那样使用动力下降的能力。因此,只有瞬时悬停 - 因此hoverslam