代码之家  ›  专栏  ›  技术社区  ›  Robert Fraser

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

  •  5
  • Robert Fraser  · 技术社区  · 14 年前

    我正在做一个游戏,在游戏循环的每次更新中,人工智能都会运行。在此更新期间,我有机会转动人工智能控制实体并/或使其加速 朝着它所面对的方向 .我希望它到达一个最终的位置(在合理的范围内),并且在那个位置有一个特定的速度和方向(同样,它不需要精确),也就是说,给定一个电流:

    • (x,y) =当前位置矢量
    • (x,y) =当前速度矢量(单位/秒)
    • γ 0 =电流方向(弧度)
    • γ 最大值 =最大转弯速度(弧度/秒)
    • γ± 最大值 =最大加速度(单位/秒^2)
    • 最大值 =绝对最大速度(单位/秒)
    • f (x,y) =目标位置矢量
    • V f (x,y) =目标速度矢量(单位/秒)
    • γ f =目标旋转(弧度)

    选择一个 立即的 以下内容:

    • γ =a转弯速度,在之内 最大值 最大值 ]
    • γ± =加速度标度在[0,_± 最大值 ](必须朝着它当前所面对的方向加速)

    使其最小化:

    • T =移动到目的地的总时间
    • P T -P f | =与末端目标位置的距离
    • T -V f γ =末端与目标速度的偏差
    • β T f γ =末端与目标旋转的偏差(包裹到(-,))。

    参数可以在游戏循环的每次迭代中重新计算。一张图片上写着1000个单词,所以 例如 鉴于目前的状态是蓝色的,达到 大约 在尽可能短的时间内,红人的状态(箭头是速度):

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

    假设t(理想溶液为t_ 认为 ,我的数学可能是关的):

    Equations http://public.blu.livefilestore.com/y1p6zWlGWeATDTF9DZsTdHiio4dAKGrvSzg904W9cOeaeLpAE3MJzGZFokcZ-ZY21d0RGQ7VTxHIS88uC8-iDAV7g/equations.gif

    (编辑:最后一个应该是_=_ +~(β)t

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

    1. 选择一个“t”等于游戏循环更新之间最后几个“t”的平均值(即非常小)
    2. 对于(_±,_„)=0,_±的所有组合,计算下一步的上述5个方程。 最大值 }{{ } 最大值 ,0,α 最大值 }(每种语调只有6个语调和5个方程式,因此不应花费太长的时间,而且由于它们经常运行,因此相当有限的范围将在最后进行分摊)
    3. 为位置、速度和旋转指定权重。也许这些权重是动态的(即,实体离位置越远,权重就越大)。
    4. 从现在开始,贪婪地选择一个将这些最小化的位置。

    但是,它的速度可能很快且简单,这方面存在一些明显的问题:

    • 任意选择权重
    • 这是一种贪婪的算法,(从本质上讲)无法回溯
    • 它没有真正考虑问题空间
    • 如果它经常改变加速度或转弯,动画可能看起来“急促”。

    注意,虽然算法可以(也可能应该)在迭代之间保存状态,但是p f V f 和γ f 可以更改每个迭代(即,如果实体试图跟踪/定位自己靠近另一个迭代),因此算法需要能够适应不断变化的条件。

    有什么想法吗?有没有一个简单的解决方法可以解决我的问题?

    谢谢, 罗伯特

    2 回复  |  直到 14 年前
        1
  •  3
  •   Chris H    14 年前

    听起来你想要一个警察局长。基本上从当前位置到目标画一条线。然后以弧度为直线方向,这就是你的目标弧度。以弧度表示的当前误差是当前航向线航向。叫它吧。(航向误差)那么你说现在的转弯率是kp EH+D/DT-EH Kd。每走一步都要换一条新线。

    那是航向

    加速是“加速到我达到最大速度,否则我无法及时停止”。你抛出了一堆积分,所以我相信你会接受这个计算。

    如果你想知道,是的,我以前解决过这个问题,PD控制器工作。别费心pid,在这种情况下不需要它。Matlab中的原型。我遗漏了一件事,你需要一个触发器,比如“我现在真的很接近了”,所以我应该开始转向目标。我刚刚读到你关于“只朝着我们前进的方向加速”的澄清。这会改变一些,但不会太大。这意味着需要“从后面”接近目标,也就是说,直线目标必须在实际目标的后面,当你接近后面的目标时,跟随一条新的线,引导你到达真正的目标。你也要跟着线走,而不仅仅是选一个标题,然后努力坚持下去。所以不要每帧更新一行,只要说误差等于当前目标行的有符号距离。PD会给你一个转弯率,加速度很小,所以你已经设定好了。你需要通过头部调整kd和kp,这就是为什么我先说matlab。(八度也不错)

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

    双关语

    编辑:我刚刚读了…很多东西,写得很快。这是一个针对你的问题的线跟踪解决方案,如果你想把这个解决方案作为解决问题的基础,只需谷歌线跟踪这个答案。

        2
  •  2
  •   mcdowella    14 年前

    我建议你不要考虑 http://en.wikipedia.org/wiki/Bang%E2%80%93bang_control (开关控制)以及PID或PD。你试图最小化的事情似乎不会对把油门推到最远的位置产生任何惩罚,直到到了把刹车推到最远的位置为止,除了你对这看起来有多颠簸的观点。至少,这为您的初步猜测提供了某种理由。