Как предотвратить предотвращение использования самонаводящихся ракет на орбите?

Я разрабатываю двумерную космическую игру без трения, и мне очень легко заставить самонаводящуюся ракеточку вращаться вокруг своей цели. Мне интересно об анти-орбитальных стратегиях.

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

Проблема с орбитами

  • В раме 1 ракета движется прямо к цели, никаких проблем.
  • В кадре 2 цель переместилась в новую позицию, как показано. Ракета продолжает ускоряться непосредственно к цели (красным цветом), все еще двигаясь к тому месту, где раньше использовалась цель (черным) из-за существующей скорости.
  • В кадре 3 скорость ракеты продолжает переносить ракету вокруг цели (черный), в то время как вектор ускорения отчаянно пытается вывести ракету к цели.
  • В кадрах 4 и далее ракета попадает в потенциально стабильную орбиту вокруг цели и никогда не достигает своей цели. Черные стрелки указывают вектор скорости, а красные линии указывают векторы ускорения в один и тот же момент времени.

Учитывая, что в космосе нет трения, нет ничего, чтобы замедлить скорость ракеты и свернуть орбиту. Возможным решением было бы нацелить «за» цель, и это приведет к закрытию орбиты, но как это делается с точки зрения программирования?

Как я могу заставить самонаводящуюся ракету достичь своей цели?

2d ai
77 голосов | спросил John McDonald 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 08:34:11 +0400 2011, 08:34:11

9 ответов


49

Прежде всего, вы должны сделать все расчеты о том, какое ускорение необходимо применить в кадре ракеты (вот где ракета неподвижна и все вокруг перемещается вокруг нее, также часто называемой «координаты объекта» «или« локальные координаты »в игровых машинах, хотя в нашем случае мы хотим, чтобы скорость была точно равна нулю).

Идея тогда заключается не в том, чтобы нацелиться на цель, а на том, чтобы цель была в момент предполагаемого воздействия. Таким образом, общий алгоритм выглядит следующим образом:

  1. Оцените, сколько времени потребуется, чтобы ракета достигла цели. Если цель летит прямо на него (помните, что ракета стационарная ), это может быть так же просто, как вычисление distance /speed , в в других случаях это может быть более сложным. Если цель может попытаться уклониться от вас, вы все равно не сможете сделать идеальную оценку, так что это нормально, чтобы не быть очень точным.

  2. Предполагая постоянную скорость (оценка 1-й степени) или постоянное ускорение (оценка 2-й степени) цели, вычислите, где она будет находиться в предполагаемое время выше.

  3. Рассчитайте ускорение, которое приведет к тому, что ракета будет находиться примерно в одном месте одновременно.

  4. Повторно запрограммируйте ускорение назад из рамы ракеты в глобальную, используйте это.

Важная роль здесь заключается в том, чтобы получить оценку времени в приблизительном шаровом поле и не забывать о возможностях ускорения ракет во время этого. Например, лучшая оценка «цель прямо перед нами и летит в нашем направлении» - это решить уравнение.

расстояние = скорость x время + 1/2 x ускорение x время 2

... для время (используйте отрицательную скорость для объектов, летящих прямо away с ракеты), с решением, которое вы ищете, используя стандартный квадратичная формула , которая ...

время = (âš ( скорость 2 + 2 x ускорение x расстояние ) - скорость ) /ускорение

Добавление дополнительных параметров - например, перетаскивание - быстро превращает это в дифференциальные уравнения без алгебраических решений. Это , почему ракетостроение настолько тяжелое.

ответил Martin Sojka 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 08:55:39 +0400 2011, 08:55:39
42

@ Мартин Сойка уже сказал вам, что делать. Вместо улучшения его ответа я хочу предложить вам еще один простой подход: DELOCK

Как я сказал в проецируемой траектории транспортного средства? объекты с ограниченными возможностями рулевого управления «проецируют» пару теневых циклов: две области, которые не могут быть достигнуты прямым управлением (тором и гипертоном в более высоких измерениях).

Когда вы видите, что ваша цель входит в одну из таких рулевых теней, вы можете остановить самонаведение своей цели и сохранить другое направление в течение ограниченного времени.

Триггер дебокса может быть легко вычислен путем аппроксимации ваших торов с помощью (двойного) конуса *:

Delock trigger

Вам нужно просто вычислить скалярное произведение между вашим (нормализованным) вектором направления и вектором перемещения цели ( Цель - Объект /| Цель - Объект |).

Когда скалярное произведение обращается в нуль, ваше целевое направление становится перпендикулярным к вашему направлению, ведущему к круговой траектории **. Когда цель попадает в голубой регион, вы можете инвертировать направление рулевого управления, чтобы вы могли вывести его за пределы недоступной области и повторного возвращения.

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

** Эта траектория вряд ли будет круговой, не эллиптической или даже закрытой. Вероятность того, что траектория будет следовать по спирографу, подобному траектории (гипотрохии) в 2D или даже других монстрах в 3 и более измерениях. В любом случае вы не можете достичь центра таких кривых, и они выглядят как круги так «круговой» траектории.

ответил FxIII 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 14:06:00 +0400 2011, 14:06:00
8

Ваша система управления основана на предположении, что ускорение непосредственно к цели в конечном итоге приведет к столкновению объектов. Поскольку это предположение неверно, руководство AI, основанное на этом предположении, также не увенчалось успехом.

Так прекратите ускорение напрямую к цели. Добавьте некоторую логику, чтобы определить, находится ли положение цели несколько перпендикулярно направлению движения ракеты. Если это так, то ракета должна ускориться к цели, но также замедлить ее движение вперед. Таким образом, вместо того, чтобы идти прямо к цели, она смещает направление своего ускорения так, что текущая скорость в направлении движения замедляется.

Кроме того, вам понадобится триггер, чтобы убедиться, что вы не слишком медленны. Поэтому добавьте некоторую пороговую скорость, чтобы, если вы ниже этого порога, вы перестаете делать смещение.

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

ответил Nicol Bolas 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 08:52:26 +0400 2011, 08:52:26
5

Самый простой и продвинутый метод для использования в играх (и в реальной жизни) - Пропорциональная навигация.

Под постоянной Bearing понижающие Range (CBDR) логики, когда два объекта (ракетные и целевые) путешествуют в одном направлении без изменения визирования между друг другом, они будет Collide.

Sightline или Line of Sight (LOS) - это воображаемая линия между ракетой и мишенью - вектор между позицией ракеты и позицией цели. Скорость углового изменения этого LOS равна скорости вращения LOS.

Когда скорость вращения LOS становится равной нулю, тогда линия визирования больше не изменяется - два объекта теперь находятся на курсе столкновения. Подумайте о себе как о погоне за кем-то, играя в футбол /футбол. Если вы проводите его так, чтобы его тело выглядело «замороженным» в вашем поле зрения (видимость между вами и ним больше не меняется), вы столкнетесь с ним, пока вы поддерживаете свое ускорение бега, чтобы его тело выглядело замороженным ваш взгляд.

При Пропорциональной навигации (PN) ракета ускоряет «N» раз быстрее, чем скорость вращения LOS. Это заставит ракету привести цель до тех пор, пока скорость вращения ЛОС не станет нулевой - то есть ракета и мишень окажутся замороженными в состоянии, так как линия визирования больше не изменяется - теперь они идут на столкновение. Переменная «N» известна как «Навигационная константа» (постоянный множитель).

Команда управления ракетами должна быть указана следующим образом:

Ускорение = скорость закрытия * N * скорость LOS

Скорость LOS может быть легко получена путем измерения вектора LOS (позиция цели - позиция ракеты) и сохранения его переменной. Вектор LOS из нового кадра (LOS1) вычитается вектором LOS из старого кадра (LOS0) для генерации дельта LOS - теперь у вас есть примитивная скорость вращения LOS.

Чтобы упростить Closing Velocity, вы можете просто использовать текущий вектор LOS на своем месте, таким образом:

Ускорение = (target_pos - missile_pos) * LOS_delta * N

N - постоянная навигации - в реальном мире она обычно устанавливается между 3 и 5, но фактическая работоспособная фигура в игре несколько зависит от частоты дискретизации, при которой вы получаете скорость /дельта LOS. Попробуйте случайное число (начинайте с 3) и увеличивайте до 1500, 2000 и т. Д., Пока не увидите желаемый главный эффект в игре. Обратите внимание, что чем выше константа навигации, тем быстрее ракета будет реагировать на изменения скорости LOS на ранней стадии полета. Если модель имитационной модели ракеты несколько реалистична, чрезмерная навигационная константа может перегрузить аэродинамические возможности вашей ракеты, поэтому вам следует использовать сбалансированное число, основанное на пробной версии и ошибке.

ответил James Jun 26 J000000Thursday12 2012, 22:27:09
4

Как указывают другие ответы Мартина и Николь, вы, вероятно, хотите направлять свою ракету не непосредственно на цель, но таким образом, чтобы впоследствии она столкнулась с целью. Однако метод, описанный Мартином, сложный, и описанный Николом неэффективен.

Простейший способ - но все же довольно эффективный - управлять ракетой - регулировать ее угол в соответствии с изменением угла между ракетой и мишенью. На каждом тике вы вычисляете угол от ракеты до цели и сравниваете ее с углом от предыдущего тика. Разница - это точная разница, которую вы хотите сделать на ракете. Так что, если угол равен 0,77 в одном тике и 0,75 в следующем, вы хотите отрегулировать угол ракеты на -0,02. Этот метод прост, и пока цель находится «впереди» ракеты, она очень эффективна с точки зрения выбранного маршрута. Это также относится к любому числу измерений, а не только к 2d.

Имейте в виду, что:

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

  • Метод ломается, если цель и ракета летают на одной и той же линии, но в противоположных направлениях. Это действительно не может произойти в реальном мире, но не слишком необычно в дискретной игре. Чтобы проверить это, вам нужно добавить проверку угла в указанном выше алгоритме.

  • Если ваша ракета имеет ограниченную возможность поворота, просто сделайте ее максимальным поворотом каждый раз, когда вам нужно больше поворачиваться. Пока ракета достаточно далеко, она все равно будет работать. Если он слишком близко, см. Последнюю пулю.

  • Не забывайте проявлять снисходительность при проверке столкновения. В реальном мире многие ракеты полагаются на свою боеголовку, чтобы создать «зону убийства», поэтому им нужно только приблизиться к цели, а не столкнуться с ней.

  • Наконец, на практике ракета может по-прежнему пропустить , что возвращает нас к исходному вопросу. Я думаю, что хороший способ состоит в том, чтобы действительно отключить самонаведение на несколько тиков, позволяя ему достичь некоторого расстояния, а затем снова начать самонаведение. Я думаю, что метод, предложенный fxiii для определения мертвых зон, - отличный способ обнаружить, когда вам нужно отключить самонаведение.

ответил Oak 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 15:26:20 +0400 2011, 15:26:20
1

Несколько простых опций, которые были найдены «достаточно хорошими» для игр, в которых я работал в прошлом:

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

Если ваша конечная цель в вашем решении состоит в том, чтобы убедиться, что ваша ракета попала в цель, тогда я всего лишь за то, что она попала в цель. Опять же, это будет зависеть только от того, как выглядит решение.

2) Если вы обнаружите, что ваша ракета находится под прямым углом к ​​вашей цели, это может быть точкой, где блокировка «ломается», а ракета просто движется прямо, если цель снова не попадает «перед» ракетой .

Я всегда предпочитаю простые решения, когда это возможно. Если вы делаете игру, где самонаводящаяся ракета - это только одно из используемых вами оружия, то вы, скорее всего, избегаете этих действий, поскольку игроки, скорее всего, сгорят залп, а затем как можно скорее вернутся к своим постоянным боевым оружием. Однако, если вы делаете ракетное моделирование, то, несомненно, один из других ответов - лучший выбор.

Надеюсь, что это поможет.

ответил James 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 15 Sep 2011 19:47:26 +0400 2011, 19:47:26
0

Как уже было сказано, вы должны прицелиться в ракету, где ожидается цель, когда вы туда доберетесь, а не там, где цель сейчас. Это остановит ракеты МОСТ от выхода на орбиту, но орбита все еще возможна, если цель уклоняется вправо. Это законная тактика, используемая летчиками самолетов, чтобы уклониться от входящих ракет - так как ракета идет намного быстрее, чем вы, у нее будет больший радиус поворота, а резкий щелчок в нужный момент заставит ее продолжить. (Хотя вы все еще можете быть в опасности от детонации близости).

Поскольку мы имеем дело с ракетой, которая все еще может отслеживать и все еще тянуть, вы получаете ситуацию с орбитой, если цель уклоняется от одной из зон, о которых говорит сообщение FxIII.

Однако я не согласен с его решением проблемы. Вместо этого я запрограммировал бы ракеты следующим образом:

, если ракета тянулась на 90 градусов к своей линии движения на 360 градусов движения, вы находитесь на орбите. Отрегулируйте тягу на 120 градусов от линии движения. Ракетная ракета будет расширяться, так как она не превращается так сильно, но ракета также замедляется, что позволяет ей маневрировать лучше. Когда целевой диапазон откроется до 1,25x диаметра мертвой зоны (обратите внимание, что этот диаметр основан просто и только на скорости ракеты, во время выполнения не требуется сложных вычислений), ракета возвращается к нормальной работе отслеживания.

В качестве альтернативы используйте головорезы для поиска нумерации - когда целевой диапазон перестает считать вас детонирующим.

ответил Loren Pechtel 27 J000000Friday12 2012, 02:10:23
0

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

То, что вы действительно хотите сделать, это не ускорить к цели, а двигаться к цели. Способ думать об этом заключается в том, чтобы установить желаемую скорость, направленную на цель (или проекцию местоположения целей), а затем выяснить, какое ускорение вы можете наилучшим образом применить (учитывая любые ограничения, которые у вас есть, то есть ракета, вероятно, не может ускоряться прямо в обратном направлении) для достижения желаемой скорости (помня, что скорость - это вектор).

Вот пример, который я реализовал сегодня утром, в моем случае для игрока AI в спортивной симуляционной игре, где игрок пытается преследовать своего противника. Движение регулируется стандартной моделью «удар-дрейф», где ускорения применяются в начале временного периода для обновления скоростей, а затем объекты дрейфуют с этой скоростью в течение времени timestep.

Я бы опубликовал вывод этого, но я обнаружил, что на этом сайте не поддерживается математическая разметка. Бу! Вам просто нужно будет верить, что это оптимальное решение, учитывая, что у меня нет ограничений на направление ускорения, что не относится к объекту типа ракеты, поэтому для этого потребуются дополнительные ограничения.

Код находится в python, но должен быть доступен для чтения на любом языке. Для простоты я предполагаю, что каждый временной шаг имеет длину 1 и выражает скорость и ускорение в соответствующих единицах, чтобы отразить это.

self.x = # текущая координата x
self.y = # текущая координата y
self.angle = # текущий угол движения
self.current_speed = # текущая величина скорости
self.acc # Игрок с максимальным ускорением может воздействовать на себя
target_x = # x координата позиции цели или ее проекции
target_y = # y координата позиции цели или ее проекции
vx = self.current_speed * math.cos (self.angle) # текущая скорость x компонент
vy = self.current_speed * math.sin (self.angle) # текущая скорость y компонент
# Найдите лучшее направление для ускорения
acc_angle = math.atan2 (self.x + vx - target_x, self.y + vy - target_y)

Обратите внимание, что функция atan2 (a, b) вычисляет обратный tan a /b, но гарантирует, что углы находятся в правильном квадранте круга, что требует знания знака как a, так и b.

В моем случае, как только у меня есть ускорение, я применяю это, чтобы обновить скорость на

vx_new = vx + self.acc * math.cos (acc_angle)
vy_new = vy + self.acc * math.sin (acc_angle)
self.current_speed = math.sqrt (vx_new ** 2 + vy_new ** 2)
self.angle = math.atan2 (vy_new, vx_new)

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

Для всех, кто заинтересован в его выводе, я записал расстояние между игроком и мишенью после timstep в терминах начального положения, скорости, скорости ускорения и угла ускорения, затем взял производную по отношению к ускорению угол. Установка нуля равна минимальным значениям расстояния между игроком и мишенью после временной отметки в зависимости от угла ускорения, что мы и хотим знать. Интересно, что хотя скорость ускорения первоначально находилась в уравнениях, она отменяет выбор оптимального направления независимо от того, насколько вы действительно можете ускорить.

ответил Bogdanovist 19 AMpFri, 19 Apr 2013 06:24:16 +040024Friday 2013, 06:24:16
0

Вы используете постоянную скорость поворота. Это именно то, что вызывает хорошую идеально круговую орбиту.

Более реалистичным подходом для системы наведения было бы изменение скорости поворота с обратно пропорциональным расстоянием (меньшее расстояние -> больше скорости поворота). Это дало бы спираль, а не орбиту, и гарантировало бы столкновение с более медленной целью.

Это также дает гораздо более реалистичную траекторию полета. Постоянная скорость поворота неестественно совершенна. Вы также можете добавить случайные вариации к скорости поворота, чтобы имитировать турбулентность. Опять же, гораздо более реалистично, и на самом деле можно избежать устойчивых сценариев орбиты.

Нет необходимости в частичных уравнениях.

ответил Dominic Cerisano 8 MonEurope/Moscow2014-12-08T23:59:34+03:00Europe/Moscow12bEurope/MoscowMon, 08 Dec 2014 23:59:34 +0300 2014, 23:59:34

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132