Каков рекомендуемый способ ограничения положения кватерниона плавающей базы и угловой скорости?
Для объектов с плавающей базой вращение в обобщенном положении выражается четырехмерным кватернионом. Однако вращение в обобщенной скорости по-прежнему выражается как трехмерный вектор пространственного вращения.
Есть ли рекомендуемый способ их ограничения, например, для обратного Эйлера?
prog.AddConstraint(eq(q[t+1], q[t] + h[t] * qd[t+1]))
Уместно ли преобразовывать угловую скорость в кватернионную форму, например здесь ?
Или, как выразился Джон Т. Беттс в книге «Практические методы оптимального управления и оценивания с использованием нелинейного программирования».

Ответы
Я думаю, что для вашего варианта использования вы хотите наложить ограничение интеграции между соседними путевыми точками при планировании. В этом случае я бы не предлагал q[n] = q[n+1] - qdot[n+1] * dt
напрямую использовать интеграцию Эйлера . Причина в том, что кватернион всегда должен удовлетворять ограничению на единицу длины (т. Е. q[n]
И q[n+1]
оба находятся на поверхности единичной сферы в 4D). Следовательно, производная qdot
по времени находится вдоль касательной поверхности этой единичной сферы, а именно q[n+1] - qdot[n+1] * dt
на этой касательной поверхности. Никакая точка (кроме q[n+1]
) на касательной поверхности также не находится на поверхности единичной окружности. Следовательно, ограничение q[n+1] = q[n] + qdot[n+1] * dt
может быть выполнено только тогда dt=0
, когда вы соедините его с ограничением | q [n] | = | q [n + 1] | = 1. Графически вы можете использовать фигуру в разделе "касательная к окружности"https://www.toppr.com/guides/maths/circles/tangents-to-the-circle/. Обратите внимание, что он q[n+1] - qdot[n+1] * dt
находится на касательной к сфере и q[n]
на окружности, так что у вас не может быть q[n] = q[n+1] - qdot[n+1] * dt
.
Вместо этого я бы предложил рассмотреть следующее условие
q[n+1] = q[n] ⊗ Δq
где q[n]
- кватернион плавучей базы в n
'й путевой точке, q[n+1]
это кватернион плавучей базы в n+1
' й путевой точке. ⊗
является гамильтоновым произведением двух кватернионов q[n]
и Δq
. Итак, здесь вам нужно вычислить Δq из угловой скорости.
Предположим, что средняя угловая скорость между n-й и n + 1-й путевыми точками равна ω ∈ ℝ³. Это означает, что плавающая база вращается вокруг оси a = ω/|ω|
со скоростью |ω|
, следовательно,
Δq = [cos(|ω|Δt/2), a*sin(|ω|Δt/2)]
Видеть https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Using_quaternion_as_rotations для объяснения приведенного выше уравнения.
Если вы используете ω[n+1]
в качестве средней угловой скорости от n-й путевой точки до n + 1-й путевой точки (аналогично использованию v [n + 1] в обратном Эйлере), то ваше интеграционное ограничение будет
q[n+1] = q[n] ⊗ [cos(|ω[n+1]|Δt/2), a*sin(|ω[n+1]|Δt/2)]
Вы также можете использовать другие величины, например, как среднюю угловую скорость (ω[n] + ω[n+1])/2
.