AI: выбор непосредственного ускорения/вращения для получения до конечного пункта

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

  • P0 (x, y) = вектор Текущей позиции
  • V0 (x, y) = Текущий вектор скорости (единицы/секунда)
  • θ0 = Текущее направление (радианы)
  • τmax = скорость поворота Max (радианы/секунда)
  • αmax = ускорение Max (units/second^2)
  • |V|max = Абсолютная максимальная скорость (единицы/секунда)
  • Pf (x, y) = Целевой радиус-вектор
  • VF (x, y) = Целевой вектор скорости (единицы/секунда)
  • θf = Целевое вращение (радианы)

Выберите непосредственное:

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

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

  • t = Общее время для перемещения к месту назначения
  • |Pt-Pf| = Расстояние от целевого положения в конце
  • |Vt-Vf| = Отклонение от целевой скорости в конце
  • | θt-θf| = Отклонение от целевого вращения в конце (перенесенный к (-π,π))

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

Рис. 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 кадр/с)? Самым простым, самым наивным путем я могу думать:

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

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

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

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

Какие-либо идеи? Существует ли простое решение для этого, я отсутствую?

Спасибо, Robert

5
задан Robert Fraser 8 February 2010 в 04:20
поделиться

2 ответа

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

это для ускорения по курсу

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

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

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

каламбур.

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

3
ответ дан 14 December 2019 в 19:12
поделиться

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

2
ответ дан 14 December 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: