AI: выбор немедленного ускорения / вращения, чтобы добраться до конечной точки - PullRequest
5 голосов
/ 08 февраля 2010

Я работаю над игрой, в которой при каждом обновлении игрового цикла запускается ИИ. Во время этого обновления у меня есть шанс повернуть объект, контролируемый ИИ, и / или заставить его ускоряться в направлении, к которому он обращен . Я хочу, чтобы оно достигло конечного местоположения (в разумных пределах) и в этом месте имело определенную скорость и направление (опять же, оно не должно быть точным), то есть с учетом тока:

  • P 0 (x, y) = Вектор текущей позиции
  • V 0 (x, y) = Текущий вектор скорости (единиц / сек)
  • θ 0 = Текущее направление (радианы)
  • τ max = Макс. Скорость поворота (радиан / сек)
  • α макс. = макс. Ускорение (ед. / Сек ^ 2)
  • | V | max = Абсолютная максимальная скорость (единиц / сек)
  • P f (x, y) = Вектор целевого положения
  • V f (x, y) = Целевой вектор скорости (единиц / сек)
  • θ f = Вращение цели (радианы)

Выберите немедленный :

  • τ = скорость поворота в пределах [-τ max , τ max ]
  • α = Скаляр ускорения в пределах [0, α max ] (должен ускоряться в направлении, в котором он сейчас находится)

Так, чтобы они были минимизированы:

  • t = Общее время для перемещения к месту назначения
  • | P t -P f | = Расстояние от конечной позиции в конце
  • | V t -V f | = Отклонение от скорости цели в конце
  • | θ t f | = Отклонение от цели вращения в конце (переносится в (-π, π))

Параметры могут пересчитываться во время каждой итерации игрового цикла. На рисунке написано 1000 слов, поэтому , например , учитывая текущее состояние синего парня, достичь приблизительно состояния красного парня за максимально короткое время (стрелки обозначают скорость):

Рис http://public.blu.livefilestore.com/y1p6zWlGWeATDQCM80G6gaDaX43BUik0DbFukbwE9I4rMk8axYpKwVS5-43rbwG9aZQmttJXd68NDAtYpYL6ugQXg/words.gif

Если предположить постоянные α и τ для Δt (Δt → 0 для идеального решения) и разбить позицию / скорость на компоненты, это дает (I думаю , моя математика, вероятно, выключена):

Уравнения http://public.blu.livefilestore.com/y1p6zWlGWeATDTF9DZsTdHiio4dAKGrvSzg904W9cOeaeLpAE3MJzGZFokcZ-ZY21d0RGQ7VTxHIS88uC8-iDAV7g/equations.gif

(РЕДАКТИРОВАТЬ: последний должен быть θ = θ 0 + τΔt)

Итак, как мне выбрать непосредственные значения α и τ (помните, что они будут пересчитываться на каждой итерации игрового цикла, обычно> 100 кадров в секунду)? Самый простой, самый наивный способ, который я могу придумать:

  1. Выберите Δt, равное среднему значению за последние несколько Δts между обновлениями игрового цикла (т. Е. Очень маленьким)
  2. Вычислите приведенные выше 5 уравнений следующего шага для всех комбинаций (α, τ) = {0, α max } x {-τ max , 0, τ max } (только 6 комбинаций и 5 уравнений для каждого, поэтому не должно занимать слишком много времени, и, поскольку они выполняются так часто, довольно ограниченные диапазоны будут амортизироваться в конце)
  3. Назначьте веса для положения, скорости и вращения. Возможно, эти веса могут быть динамическими (то есть, чем дальше от позиции находится объект, тем больше веса взвешено).
  4. С жадностью выберите тот, который минимизирует их для местоположения Δt с этого момента.

Это потенциально быстро и просто, однако есть несколько вопиющих проблем с этим:

  • Произвольный выбор весов
  • Это жадный алгоритм, который (по самой своей природе) не может вернуться
  • Это действительно не принимает во внимание проблемное пространство
  • Если оно часто меняет ускорение или развороты, анимация может выглядеть «рывком».

Обратите внимание, что в то время как алгоритмHm может (и, вероятно, должен) сохранять состояние между итерациями, но P f , V f и θ f могут изменять каждую итерацию (то есть, если объект пытается следовать / позиционировать себя рядом с другим), поэтому алгоритм должен быть в состоянии адаптироваться к изменяющимся условиям.

Есть идеи? Есть ли простое решение для этого я скучаю?

Спасибо, Роберт

Ответы [ 2 ]

3 голосов
/ 08 февраля 2010

звучит так, как будто вы хотите контроллер PD. В основном нарисуйте линию от текущей позиции до цели. Затем возьмите направление линии в радианах, это ваши радианы цели. Текущая ошибка в радианах - это текущий курс. Назовите это Эх. (ошибка курса), тогда вы говорите, что текущая скорость поворота будет Kp Eh + d / dt Eh Kd. делайте это каждый шаг с новой строкой.

То есть для заголовка

Ускорение: «Ускоряйтесь, пока я не достигну максимальной скорости или не смогу вовремя остановиться». вы выбросили кучу интегралов, так что я уверен, что вы будете в порядке с этим расчетом.

Если вам интересно, да, я уже решил эту проблему раньше, контроллер PD работает. не беспокойтесь о PID, в этом случае он не нужен. Прототип в матлаб. Есть одна вещь, которую я пропустил, вам нужно иметь триггер, такой как «я сейчас очень близко», поэтому я должен начать поворачиваться, чтобы попасть в цель. Я только что прочитал ваше разъяснение о «только ускорении в том направлении, в котором мы движемся». это немного меняет вещи, но не слишком сильно. это означает необходимость приблизиться к цели «сзади», означая, что линейная цель должна быть позади реальной цели, когда вы приблизитесь к задней цели, следуйте новой линии, которая приведет вас к реальной цели. Вы также захотите следовать линиям, а не просто выбрать заголовок и попытаться придерживаться его. Так что не обновляйте строку в каждом кадре, просто скажите, что ошибка равна ПОДПИСАННОЙ ДИСТАНЦИИ ИЗ ТЕКУЩЕЙ ЛИНИИ. ПД даст вам скорость поворота, ускорение тривиально, так что вы настроены. вам нужно настроить Kd и Kp по голове, поэтому я сначала сказал Matlab. (Октава тоже хороша)

удачи, надеюсь, это направит вас в правильном направлении;)

каламбур предназначен.

РЕДАКТИРОВАТЬ: Я только что прочитал ... много вещей, написал очень быстро. это строка, следующая за решением вашей проблемы, просто следуйте строке ответа Google, чтобы сопровождать этот ответ, если вы хотите использовать это решение в качестве основы для решения проблемы.

2 голосов
/ 08 февраля 2010

Я хотел бы предложить вам рассмотреть http://en.wikipedia.org/wiki/Bang%E2%80%93bang_control (контроль Bang-Bang), а также PID или PD. То, что вы пытаетесь свести к минимуму, похоже, не дает никакого штрафа за толчок акселератора до упора до тех пор, пока не наступит время отжать тормоз до упора. это будет выглядеть. По крайней мере, это дает какое-то оправдание вашей первоначальной догадке.

...