宇宙飞船推进器的AI:在x = 0和v = 0时控制着陆船的力量

时间:2016-11-01 10:27:45

标签: algorithm artificial-intelligence physics

我必须编写AI来控制游戏中太空船的许多推进喷气机。

为简单起见: -
让空间为1D 宇宙飞船是一个点,只有一架喷气机。

规则和问题

xva为宇宙飞船的位置,速度和加速度。
F成为适用于船舶的喷射力。

我知道宇宙飞船的质量m,让我们说m = 1。

以下是摘要: -

acceleration = F/m;
v = vOld + acceleration*timestep;
x = xOld + v*timestep;

目标是将船降落在0速度的某个位置: - x = 0且v = 0。

AI可以加速"或者"减速"喷气机: -

F+=flexibility;
or 
F-=flexibility;

AI可以访问当前xvF。 AI也可以缓存它。

我该如何编程AI?

我糟糕的解决方案

创意1:最后,x应该= 0。

假设a是常数: -

(current x) + (current v) * t + 1/2 * a * t * t = 0

t是一个神奇的数字 - 需要多长时间才能使宇宙飞船x = 0。

创意2:最后,v应该= 0。

(current v) + a*t = 0

我混合了两个想法: -

if |x|>=thresholdX - >使用想法1
if |x|~0 - >用意念2
介于两者之间 - >重量平均为2个想法

在这里,thresholdX是另一个神奇的数字 我使用等式中的a来找到合适的F。 (F=ma

结果如下: -

enter image description here
图形有噪声,因为质量近似于另一个AI,并且存在一些小的随机外力。

如果有人问,我可以发布我的C ++代码(~100行)。

2 个答案:

答案 0 :(得分:5)

首先 - 您是否打算登陆身体(有质量),或者只是在太空中的某个任意点停下来?你的问题是“土地”,所以我假设前者,在这种情况下你也需要考虑引力。这应该很容易做到:F_actual = F_engine - F_gravity

其次 - 你会如何在现实生活中做到这一点?现实生活中的飞行员希望在“滑行坡道”(在到达跑道之前)“建立”他们的飞机,飞机“修剪”,以便在理想条件下(没有风等),飞机可以自行着陆而无法控制输入(我简化了一点,忽略了耀斑等)。

对于火箭,我可能想让自己进入一种情况,即在地面以上的某个安全高度,我的下降速度是这样的,当发动机以一定的恒定功率运转时,火箭将通过以下方式落地:本身,没有额外的输入,除了在着陆点杀死引擎。 (实际上,我希望飞行系统允许我在触地得分时自动杀死。)

要了解这是如何工作的,只需反过来运行问题。从x=0, v=0开始,使用a=some constant and reasonable acceleration that the engine can produce,随着火箭上升,随着时间的推移绘制x和v。显然,v=at(一条线)和x是这些值的总和(一条抛物线)。

抛物线是你的“滑坡”。现在,而不是试图同时获得x=0v=0(没有x变为负数),你的问题就变成了“如何在安全高度撞击滑翔坡?”。所以你的逻辑就像:

  1. 如果x = 0,则杀死引擎。
  2. 否则,如果您在滑行斜坡上,请将发动机功率设置为所需(恒定)减速。坐下来等待物理学为你完成所有艰苦工作。
  3. 否则,如果x < min_approach_height,你不在滑坡上,燃烧得足以攀爬。
  4. 否则,调整发动机功率以达到下滑斜率。
  5. 一些注意事项:

    1. 通过“滑行斜坡”,我并不是指暗示水平运动。我只是将这个术语用于固定翼飞机。我的意思是vx的情节,允许常数a产生轻柔的触地,而无需额外的控制输入。
    2. 你登陆的身体是否有气氛?如果是这样,你的火箭会有一个终端速度,在这种情况下,逻辑简化为:以足够快的速度进入大气层以达到滑翔斜率以上的终端速度。等待滑坡。当你撞到斜坡时,以恒定功率发动引擎。在你亲吻地面时杀死发动机。
    3. 到现在为止,我已经忽略了“近似”质量和“随机外力”。只要这些不会导致您离滑行斜坡太远,对功率的小幅调整应该会让您回到坡度。下降时连续进行这些修正。如果你偏离斜坡太远,MAX BURN再试一次。
    4. 顺便提一下,如果不是那些随机效果,这种滑行斜坡方法可以让发动机轻松着陆,只有两个设置,恒定的减速功率和关闭。
    5. 我没有解决你的问题,只是把它变成了一个不同的问题 - 但是,解决这个新问题应该让你的游戏更加真实(希望改善沉浸感)。此外,这个问题可能最终比原始问题更简单(见上面的注释2和4)。最后,尽早设置滑行斜率,然后只进行小的校正调整意味着您的AI不必处理极端情况,或提供极端控制输入。
    6. 嗯 - 即使在编辑之后,这篇文章也很长。我想我现在应该停止.....。

答案 1 :(得分:0)

第一步是用手动控制来实现游戏。用物理学建立模拟并为飞行员制作一些按钮。如果太空船的手动着陆比第一个AI原型的时间有效。这通常被实施为单臂强盗,这意味着随机发生器计算加速度。除了观察和希望,用户没有其他可能性。下一个AI原型也将手工实现,使用伪随机发生器。这意味着,爆发在一定范围内,但仍然是随机的。问题不在于,如果AI能够着陆,问题是:需要AI 10试验或100次试验。降低故障率的最佳做法是使用OP中的规则。这些启发式方法在每种情况下都不起作用,它们只能改进伪随机生成器。这有点像程序生成。