Если вы не ищете очень общее решение, которое работает в Интернете, то есть простое решение.Что я имею в виду онлайн, так это непрерывный перерасчет действий по полной траектории.
Предполагая, что корабль находится в состоянии покоя при старте, просто поверните его к своей целевой точке (пока он еще в покое).Теперь ваш корабль может достичь цели, ускоряясь на t
секунды, поворачиваясь назад во время движения (на 0,5 секунды согласно вашему ограничению) и замедляясь еще на t секунд.Если расстояние между текущей точкой и пунктом назначения составляет d
, то уравнение, которое вам необходимо решить, будет:
d = 0.5*a*t^2 + 0.5*a*t + 0.5*a*t^2
Первый член - это расстояние, пройденное при ускорении.Второе слагаемое - это пройденное расстояние при вращении (v*t_rot
, v=a*t
, t_rot=0.5
).Последний термин - расстояние, пройденное при замедлении.Решите выше для t
, и у вас есть траектория.
Если корабль движется при старте, я бы сначала остановил его (просто повернул в противоположном направлении от вектора скорости и замедлился до покоя),Теперь мы знаем, как добраться до пункта назначения.
Проблема с вычислением траектории в автономном режиме заключается в том, что он не очень точен.Есть большая вероятность, что вы окажетесь в непосредственной близости от цели, но не совсем на ней.
Давайте сделаем задачу немного более интересной: корабль не может вращаться без ускорения.Давайте назовем этот вектор ускорения a_r
, вектор, который находится под определенным углом по отношению к направлению движения корабля (что-то вроде наличия двигателя под углом сзади).Ваша задача теперь состоит в том, чтобы вращать корабль и ускоряться в таком направлении, чтобы составляющая скорости, перпендикулярная вектору, соединяющему текущую позицию с целью, была отменена.Вместо того, чтобы пытаться вычислять векторы в автономном режиме, я бы использовал сетевой подход с этим.
Самое простое, что можно сделать, это добавить следующий алгоритм, вычисляемый через каждый интервал времени:
- Рассчитайте вектор, указывающий от корабля к месту назначения.
- Разделите ваш текущий вектор скорости на две составляющие: к месту назначения и перпендикулярно ему.
- Если перпендикулярная скорость равна нулю, пропустите 4
- Начните вращаться в направлении отрицательного направления вектора перпендикуляра.Если вы уже отводите взгляд от него (не совсем наоборот, а просто отводите взгляд), то также ведите подруливающее устройство.
Это будет немного колебаться, я подозреваю, что через некоторое время оно также стабилизируется.Должен признать, я не знаю, как заставить его остановиться в пункте назначения.
И последний подход - смоделировать динамику корабля и попытаться линеаризовать его.Это будет нелинейная система, поэтому потребуется второй шаг.Затем преобразуйте модель в систему с дискретным временем.И, наконец, примените правило контроля, чтобы оно достигло целевой точки.Для этого вы можете изменить свое пространство состояний от положения и скорости к ошибке в положении и (возможно) ошибке в скорости и, наконец, добавить элемент управления регулированием (контур управления, который принимает текущее состояние и генерирует входные данные таким образом, чтобы состояниепеременные будут приближаться к нулю).
Последняя задача довольно сложна в математическом отделении, и вам, вероятно, придется немного изучить контрольную технику, чтобы это сделать.Однако вы получите намного лучшие результаты, чем приведенный выше упрощенный алгоритм, который, по общему признанию, может даже не работатьКроме того, теперь вы можете применять к нему различные правила оптимизации: минимизировать время достижения цели, минимизировать расход топлива, минимизировать пройденное расстояние и т. Д.