Я работаю над игрой, куда на каждом обновлении игрового цикла, AI выполняется. Во время этого обновления у меня есть шанс повернуть управляемый AI объект и/или заставить его ускориться в направлении, с которым это стоит. Я хочу, чтобы это достигло заключительного местоположения (в разумном диапазоне), и в том местоположении имеют определенную скорость и направление (снова, это не должно быть точно) таким образом, учитывая ток:
Выберите непосредственное:
Таким образом, что они минимизированы:
Параметры могут быть повторно вычислены во время каждого повторения игрового цикла. В изображении говорятся 1 000 слов так, например, учитывая текущее состояние как синий чувак, достигните приблизительно состояния красного чувака в течение максимально короткого времени (стрелки являются скоростью):
При принятии постоянного α и τ для Δt (Δt → 0 для идеального решения) и разделении положения/скорости на компоненты, это дает (я думаю, моя математика, вероятно, выключена):
(РЕДАКТИРОВАНИЕ: тот последний должен быть θ = θ0 + τΔt),
Так, как я выбираю непосредственный α, и τ (помните, что они будут повторно вычислены каждое повторение игрового цикла, обычно> 100 кадр/с)? Самым простым, самым наивным путем я могу думать:
Его потенциально быстрое и простое, однако, существуют несколько явных проблем с этим:
Обратите внимание, что, в то время как алгоритм может (и вероятно должен) сохраняют состояние между повторениями, но Pf, VF и θf могут изменить каждое повторение (т.е. если объект пытается следовать/располагать за собой около другого), таким образом, алгоритм должен смочь адаптироваться к изменяющимся условиям.
Какие-либо идеи? Существует ли простое решение для этого, я отсутствую?
Спасибо, Robert
похоже, что вам нужен контроллер PD. В основном нарисуйте линию от текущей позиции до цели. Затем возьмите направление линии в радианах, это ваши целевые радианы. Текущая ошибка в радианах - текущий заголовок - заголовок строки. Назовите это Эх. (ошибка направления), тогда вы говорите, что текущая скорость поворота будет Kp Eh + d / dt Eh Kd. делайте это каждый шаг с новой строки.
это для ускорения по курсу
: «Ускоряйтесь, пока я не достигну максимальной скорости, иначе я не смогу вовремя остановиться». вы подбросили кучу интегралов, так что я уверен, что вы справитесь с этим расчетом.
Если вам интересно, да, я уже решал эту проблему раньше, контроллер PD работает. не заморачивайтесь с PID, в этом случае он не нужен. Прототип в Matlab. Есть одна вещь, которую я упустил, у вас должен быть триггер, например, «я уже очень близко», поэтому я должен начать поворачиваться, чтобы попасть в цель. Я только что прочитал ваше разъяснение о том, что "ускоряемся только в том направлении, в котором мы движемся". это немного меняет ситуацию, но не слишком сильно. это означает, что вам нужно приближаться к цели «сзади», что означает, что линейная цель должна быть позади реальной цели, когда вы приближаетесь к задней цели, следуйте новой линии, которая приведет вас к реальной цели. Вы также захотите следовать линиям, а не просто выбирать заголовок и пытаться придерживаться его. Поэтому не обновляйте строку каждый кадр, просто скажите, что ошибка равна ПОДПИСАННОМУ РАССТОЯНИЮ ОТ ТЕКУЩЕЙ ЦЕЛЕВОЙ СТРОКИ. PD даст вам скорость поворота, ускорение тривиально, так что все готово. вам нужно будет настроить Kd и Kp головой, поэтому я сначала сказал Matlab.(Октав тоже хорош)
удачи, надеюсь, это укажет вам правильное направление;)
каламбур.
РЕДАКТИРОВАТЬ: Я только что прочитал это ... много всего, написал очень быстро. это строка, следующая за решением вашей проблемы, просто строка google, следующая за этим ответом, если вы хотите использовать это решение в качестве основы для решения проблемы.
Я хотел бы предложить вам рассмотреть http://en.wikipedia.org/wiki/Bang%E2%80%93bang_control (Bang-bang control), а также PID или PD. То, что вы пытаетесь свести к минимуму, похоже, не влечет за собой никаких штрафов за нажатие педали акселератора до упора, пока не придет время нажимать на педаль тормоза до упора, за исключением вашей точки зрения о том, насколько резко это будет смотреться. По крайней мере, это дает какое-то оправдание вашей первоначальной догадке.