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 评论中,他们只提到启动引擎而不是结束引擎。有人知道动态杀死引擎的数学吗?
您的代码有两个问题:
delta_t应该1.0/50.0根据lunar_lander来源Run Code Online (Sandbox Code Playgroud)FPS = 50 #... self.world.Step(1.0/FPS, 6*30, 2*30)
与指示典型时间步长的Box2D文档
Run Code Online (Sandbox Code Playgroud)# [...]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
alt_burn = [y*g+0.5*v*v]/a
Run Code Online (Sandbox Code Playgroud)
但是通过引擎的推动力,这里定义为
Run Code Online (Sandbox Code Playgroud)MAIN_ENGINE_POWER = 13.0
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。
| 归档时间: |
|
| 查看次数: |
432 次 |
| 最近记录: |