AI:选择立即加速/旋转以达到最终点

Rob*_*ser 5 puzzle algorithm math artificial-intelligence

我正在开发一款游戏,每次更新游戏循环时都会运行AI.在此更新期间,我有机会转动AI控制的实体和/或使其在其面向的方向上加速.我希望它到达最终位置(在合理范围内)并且在该位置具有特定的速度和方向(同样不需要精确)即,给定当前:

  • P 0(x,y) =当前位置矢量
  • V 0(x,y) =当前速度矢量(单位/秒)
  • θ 0 =当前方向(弧度)
  • τ 最大值 =最大转弯速度(弧度/秒)
  • α 最大 =最大加速度(单位/秒^ 2)
  • | V | max =绝对最大速度(单位/秒)
  • P f(x,y) =目标位置矢量
  • V f(x,y) =目标速度矢量(单位/秒)
  • θ ˚F =目标的旋转(弧度)

立即选择:

  • τ内= A转速度[-τ 最大最大值 ]
  • α = [0,αmax ] 内的加速度标量(必须在当前面向的方向上加速)

使这些最小化:

  • t =移动到目的地的总时间
  • | P t -P f | =距离目标位置的距离
  • | V t -V f | =最终偏离目标速度
  • ˚F | =结束时与目标旋转的偏差(包裹到(-π,π))

可以在游戏循环的每次迭代期间重新计算参数.一张图片说1000字,所以例如当前状态为蓝色花花公子,在尽可能短的时间内达到大约红色花花公子的状态(箭头是速度):

图片http://public.blu.livefilestore.com/y1p6zWlGWeATDQCM80G6gaDaX43BUik0DbFukbwE9I4rMk8axYpKwVS5-43rbwG9aZQmttJXd68NDAtYpYL6ugQXg/words.gif

假设Δt为常数α和τ(理想解的Δt→0)并将位置/速度分解为分量,这给出了(我认为,我的数学可能已经关闭):

方程式http://public.blu.livefilestore.com/y1p6zWlGWeATDTF9DZsTdHiio4dAKGrvSzg904W9cOeaeLpAE3MJzGZFokcZ-ZY21d0RGQ7VTxHIS88uC8-iDAV7g/equations.gif

(编辑:最后一个应该是θ= θ0 +τΔt)

那么,我如何选择立即α和τ(记住这些将在游戏循环的每次迭代中重新计算,通常> 100 fps)?我能想到的最简单,最简单的方式是:

  1. 选择Δt等于游戏循环更新之间的最后几个Δt的平均值(即非常小)
  2. 计算用于的所有组合的下一步骤的上述5分的式(α,τ)= {0,α 最大 }×{-τ 最大,0,τ 最大 }(只有6 combonations和5个方程的每个,所以不宜花费太长时间,并且由于它们经常运行,相当严格的范围最终会摊销)
  3. 为位置,速度和旋转指定权重.也许这些权重可以是动态的(即,实体的位置越远,权重越多).
  4. 从现在开始贪婪地选择最小化这些位置Δt的那个.

它的潜在快速和简单,然而,这有一些明显的问题:

  • 任意选择权重
  • 这是一种贪婪的算法(就其本质而言)无法回溯
  • 它没有真正考虑到问题空间
  • 如果它经常改变加速度或转动,动画可能看起来"生涩".

请注意,尽管算法可以(并且可能应该)在迭代之间保存状态,但是P f,V fθf可以在每次迭代时改变(即,如果实体试图跟随/将自己定位在另一个附近),那么算法需要能够适应不断变化的条件.

有任何想法吗?有一个简单的解决方案,我错过了吗?

谢谢,罗伯特

Chr*_*s H 3

听起来你想要一个 PD 控制器。基本上从当前位置到目标绘制一条线。然后以弧度为单位获取直线方向,这就是您的目标弧度。当前的弧度误差是当前航向 - 行航​​向。就称呼它为呃吧。(航向错误)那么你说当前的转弯速率将为 Kp Eh+d/dt Eh Kd。每一步都用新行执行此操作。

这就是标题

加速度是“加速直到达到最大速度,否则我将无法及时停止”。你提出了一堆积分,所以我相信你会很好地进行计算。

如果您想知道,是的,我以前已经解决过这个问题,PD 控制器可以工作。不要理会 PID,在这种情况下不需要它。matlab 中的原型。我遗漏了一件事,你需要有一个触发器,比如“我现在已经非常接近了”,所以我应该开始转向进入目标。我刚刚读到您关于“仅朝着我们前进的方向加速”的澄清。这会改变一些事情,但不会太大。这意味着需要“从后面”接近目标,这意味着线目标必须位于真实目标的后面,当您接近后面的目标时,请遵循一条新线,它将引导您到达真正的目标。您还需要遵循规则,而不是仅仅选择一个标题并尝试坚持下去。因此,不要每帧更新该线,只需说误差等于距当前目标线的签名距离即可。PD 会给你一个转弯速率,加速度是微不足道的,所以你已经设置好了。你需要手动调整 Kd 和 Kp,这就是为什么我首先说 matlab。(八度也不错)

祝你好运,希望这能为你指明正确的方向;)

双关语。

编辑:我刚刚读到……很多东西,写得很快。这是针对您的问题的行跟踪解决方案,如果您想将此解决方案作为解决问题的基础,只需谷歌行跟踪来配合此答案。