Дрон таргетинг

9

Представьте себе «дрон» и целевую точку на 2-й плоскости. Есть восемь параметров:

P = my position
Q = target position
V = my velocity
I = my moment of inertia
w = my angular velocity
s = my angular position
T = max thrust
U = max torque

(мы просто скажем, что цель неподвижна)

Задача дрона - как можно быстрее добраться до цели, соблюдая максимальный крутящий момент и максимальную тягу. Есть только два способа применить крутящий момент, так как это только в 2d плоскости. Тяга ограничена только движением в одном направлении относительно ориентации корабля и не может быть направлена ​​без вращения дрона. Пренебрегайте любым сопротивлением, вы можете просто притвориться, что оно плавает в 2-ом космосе. Допустим, беспилотник проверяет уравнение с интервалом времени t(может быть, примерно каждые 0,01 секунды), включает параметры и соответствующим образом регулирует свой крутящий момент и тягу. Какими должны быть уравнения для тяги и крутящего момента?

Гас
источник
3
Если тяга может идти только в одном направлении, вы никогда не будете менять направление.
MichaelHouse
1
Я должен был указать более четко - вы не можете подвесить тягу, то есть тяга может двигаться только в одном направлении относительно ориентации корабля. Вы все еще можете вращать корабль и менять направление тяги.
Гас
2
Этот вопрос связан с nodewar?
Сет Бэттин
1
Тогда я думаю, что смогу опубликовать хорошее решение для вас (чуть позже сегодня вечером). :)
Сет Бэттин,
1
Этот вопрос нуждается в более описательном названии, но я не могу придумать хорошего. Halp?
Анко

Ответы:

5

В свете контекста вашего вопроса, http://nodewar.com/ , есть несколько конкретных соображений для вашего решения:

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

Именно эти методы я решил использовать для достижения желаемого ускорения.

Ускорение, а не скорость

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

// My target velocity is for maintaining a circular orbit.  Yours may differ.
// Earlier, I calculated total gravity and the perpendicular direction.
// You may wish to subtract gravity from your total, rather than match it.
var targetVel = o.lib.vec.times(lateralDir, targetVelMag);

var targetAccel = lv.sum(
  o.lib.vec.diff(targetVel, o.me.vel), 
  o.lib.vec.times(gravity, 1 / o.me.mass)  
);

Направление в правильном направлении

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

// convert acceleration to an angle
var polar = o.lib.vec.toPolar(targetAccel);
var traj = polar[1];

// constrain the angle to +/-2PI, because the ship's rotation is not limited 
// by default
var fixed_rot = o.lib.ang.rescale(o.me.rot);

// limit the correction to be +/-1PI
var traj_correction = traj - fixed_rot;
if (traj_correction > (Math.PI)){
  traj_correction = (2 * Math.PI) - traj_correction;
} else if (traj_correction < (-1 * Math.PI)){
  traj_correction = (2 * Math.PI) + traj_correction;
}

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

if (traj_correction > 0){
  torque = 1;
} else if (traj_correction < 0){
  torque = -1;
}

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

var max_a_accel = c.MAX_TORQUE / o.me.m_i;
var a_deccel_time = Math.abs(o.me.a_vel) / max_a_accel;
// the same math as linear acceleration, now in angles.
var stopping_angle = 0.5 * max_a_accel * a_deccel_time * a_deccel_time;


if (stopping_angle >= Math.abs(traj_correction)){
  // slowdown required.  Reverse torque
  torque *= -1;
}

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

Скорость тарана

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

// if the heading is close to the final value, thrust.
if (Math.abs(traj_correction ) < 0.02) {  // about 1 degree
  if (true 
      // some logical test, in case you don't want to accelerate past
      // a maximum speed, or some such.  Not required for your stated purpose.
     ){
    thrust = 1;
  } 
}

В тех случаях, когда вам нужна частичная тяга, вы снова можете рассчитывать на то, что вы можете выбирать между 0 и 1 ударом много раз в секунду. Это дает вам эффективную частичную тягу без изменения фактического значения.

Удачи!

Сет Баттин
источник
Отлично, спасибо, это очень помогает. Мне придется немного изменить это, я думаю. Как зовут вашего вида?
Гас
Я не подтолкнул их к лестнице. У них нет способа атаковать. :)
Сет Бэттин
3

Подобный вопрос, с некоторыми хорошими ответами, включая очевидное название этого целого предмета, "планирование движения":
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics

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

План

  1. Поверните в определенном направлении, d , и удерживайте это направление.
  2. Дождитесь определенного времени t , затем сделайте один устойчивый толчок, пока цель не будет достигнута.

подробности

Я предлагаю итерационные методы, чтобы найти d и t :

  1. Предполагая отсутствие тяги, пройдите по будущей траектории беспилотника, используя цикл и небольшой временной шаг:

    • Для положения и скорости беспилотника в это время найдите направление d , чтобы устойчивый толчок доставил беспилотника к цели. Сделайте это, выбрав множество направлений от 0 до 360 градусов и найдя то, которое приблизит дрон к цели в кратчайшие сроки.
    • Проверьте, достаточно ли у нас времени между этим и будущим временем, чтобы обратиться к d . (Поворот нетривиален. См. Обсуждение в конце.)
    • Если у нас достаточно времени, то наш поиск завершен, так что вырвитесь из этого цикла.
  2. Теперь мы нашли д и т .

  3. Поверните на d как можно быстрее (снова см. Обсуждение ниже).
  4. Подождите до t , затем начните устойчивый толчок.
  5. Дрон должен в итоге поразить цель.

Превращение

Когда я говорю «поворот к d », я действительно имею в виду, «делайте последовательность моментов так, чтобы мы вращались к d как можно быстрее, одновременно сводя угловую скорость к нулю». Вероятно, есть уравнение для этого, включающее направление тока, текущую угловую скорость и максимальное угловое ускорение, но оно усложняется из-за поворота углов.

Эрик Андерсандер
источник
Интересный подход. Так что же определяет наш выбор в будущем? Кажется, что любой метод определения его имеет свои проблемы, поэтому итерации там также могут быть необходимы.
Гас