Предположим, у вас есть объект, свободно плавающий в пространстве. У вас есть вектор, на который этот объект должен указывать, и вектор, представляющий направление, в котором он находится в данный момент. Из этих двух можно получить вращение (матрица, кватернион и т. Д.), Представляющее изменение ориентации, чтобы привести два вектора в выравнивание.
Если у вас есть только возможность применить крутящий момент (производная от угловой скорости) к вашему объекту, каков хороший алгоритм для применения крутящего момента во времени, который не будет превышать / не достигать цели?
(В данном случае это космический корабль, который хочет автоматически ориентироваться в направлении движения с помощью движителей. Ролл не имеет значения.)
physics
orientation
Karantza
источник
источник
Ответы:
Это может быть обработано как аналогичный случай для линейного ускорения.
Первый факт, на который следует обратить внимание: поскольку корабль начинает с угловой скорости, равной нулю, и если вы хотите, чтобы у него была угловая скорость, равная нулю, это означает, что общее изменение скорости должно равняться нулю.
Отсюда видно, что интеграл ускорения по времени должен равняться нулю - положительного ускорения должно быть ровно столько же, сколько отрицательного ускорения.
Следовательно, ваше решение, каким бы оно ни было, должно быть ограничено этим свойством: равное «общее» ускорение вперед и назад.
Вот как должна выглядеть форма вашего графика ускорения во времени:
Глядя на это, есть так много возможных форм и форм, в которых ваше ускорение может быть! Давайте сделаем некоторые предположения относительно формы ускорения, которую вы хотите, чтобы дать простой / краткий ответ.
Ради простого ответа у меня будет ускорение в одном из трех состояний: вперед, назад или ноль. Вперед и назад будут одинаковой величины, и состояния могут переключаться мгновенно. (нет постепенного увеличения ускорения)
Вы можете найти изменение расстояния для данного ускорения за определенный период времени с помощью этого уравнения:
Самым простым решением здесь будет ускорение, пока вы не достигнете половины пути, а затем замедление до конца пути.
Мы возьмем
P
в качестве общего расстояния, которое вы хотите переместить:Итак, в основном:
a
течениеsqrt(P/a)
единиц времени (единицы на основе ваших единиц для ускорения)Это не единственное решение. Он доставит вас туда в кратчайшие сроки (
2*sqrt(P/a)
). Но что, если вы хотите более расслабленную версию?В этом случае вы можете ускорить 1/3 пути, развернуться на 1/3 и замедлить оставшуюся часть третьего. Или 1/4, уклон на 1/2, замедление также на 1/4.
Или, может быть, вы могли бы ускоряться в течение фиксированного промежутка времени, а затем замедляться в течение фиксированного промежутка времени, но подождите, пока не достигнете точной позиции, прежде чем начать замедление.
источник