飞船推进的AI:控制飞船在x=0和v=0着陆的力

AI of spaceship's propulsion: control the force to land a ship at x=0 and v=0

我必须编写 AI 代码来控制游戏中 space 飞船的许多推进喷气机。

为简单起见:-
让 space 为一维。
宇宙飞船是一个点,只有一架飞机。

规则与问题

xva是space飞船的位置、速度、加速度。
F 为适用于船舶的射流力。

我知道 space 飞船的质量 m,假设 m=1。

这是一个总结:-

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

objective是让船以0速度降落在某个位置:- x=0 and v=0.

AI可以"accelerate"或"decelerate"喷气式飞机:-

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 是一个神奇的数字 - 需要多少时间才能使 spaceship 的 x=0.

想法2:最后,v应该=0。

(current v) + a*t = 0

我混合了两种想法:-

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

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

这是一个结果:-


该图有噪声,因为质量是由另一个 AI 近似得出的,并且存在一些小的随机外力。

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

首先 - 你是打算降落在一个物体上(有质量),还是只是在 space 中的某个任意点停下来?你的问题是 "land",所以我假设是前者,在这种情况下你还需要考虑重力因素。这应该很容易做到:F_actual = F_engine - F_gravity.

其次 - 你在现实生活中会怎么做?现实生活中的飞行员希望 "establish" 他们的飞机在 "glide slope" 上(远在到达 运行 航线之前),飞机 "trimmed" 这样在理想条件下(无风,等)飞机可以在没有控制输入的情况下自行降落(我正在简化一点,并忽略耀斑等)

对于火箭,我可能想让自己处于这样一种情况,即在地面以上的某个安全高度,我的下降率是这样的,即在发动机 运行 保持恒定功率的情况下,火箭会自行降落到地面,除了在着陆点关闭发动机外,不需要我的额外输入。 (实际上,我希望飞行系统能让我在着陆时进行自动杀伤。)

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

那个抛物线就是你的"glide slope"。现在,与其尝试同时获得 x=0v=0(没有 x 变为负数),您的问题变成了 "How do I hit the glide slope at a safe height?"。所以你的逻辑应该是这样的:

  1. 如果 x=0,则终止引擎。
  2. 否则,如果您在下滑道上,请将发动机功率设置为所需的(恒定)减速。坐等物理学为您完成所有艰苦的工作。
  3. 否则,如果 x < min_approach_height 并且您不在下滑道上,请努力燃烧以爬升。
  4. 否则,调整发动机功率以达到下滑道。

一些注意事项:

  1. "glide slope",我并不是要暗示水平运动。我只是通过类比固定翼飞机来使用该术语。我的意思是 vx 的情节允许常数 a 产生温和的着陆而无需额外的控制输入。
  2. 你降落的物体有大气层吗?如果是这样,你的火箭将有一个终端速度,在这种情况下,逻辑简化为:以足够快的速度进入大气层,以达到下滑道以上的终端速度。等待下滑道。当你爬上斜坡时,以恒定的功率发动引擎。亲吻地面时关闭引擎。
  3. 到现在为止,我一直忽略 "approximated" 质量和 "random external forces"。只要这些不会让你离下滑道太远,对力量的小调整应该会让你回到斜坡。下降时不断进行这些修正。如果您偏离斜坡太远,请使用 MAX BURN 并重试。
  4. 顺便说一句,如果不是因为那些随机效应,这种下滑道方法使得使用只有两个设置的引擎轻轻着陆相当简单,恒定减速功率和关闭。
  5. 我还没有解决你的问题,只是把它变成了一个不同的问题 - 但是,解决这个新问题应该会让你的游戏更加逼真(希望提高沉浸感)。此外,这个问题最终可能比原来的问题更简单(见上面的注释 2 和 4)。最后,尽早设置下滑道,然后只进行小的校正调整意味着您的 AI 不必处理极端情况,或提供极端控制输入。

嗯嗯 - 即使在编辑之后,这个 post 还是很长。我想我应该马上停止......现在。

第一步是实现手动控制的游戏。用物理学建立一个模拟,并为飞行员制作一些按钮。如果宇宙飞船的手动着陆比第一个 AI 原型的时间更有效。这通常实现为单臂老虎机,这意味着随机生成器计算加速度。用户除了观看和希望之外别无选择。下一个也将手动实现的 AI 原型使用​​伪随机生成器。这意味着,爆发在一定范围内,但仍然是随机的。问题不是,如果AI能够落地,问题是:需要AI 10次试验还是100次试验。降低故障率的最佳做法是使用 OP 中的规则。这些启发式方法并非在所有情况下都有效,它们只能改进伪随机生成器。有点像程序生成。