Вращение в локальной системе отсчета, выраженное в кватернионе

На следующем изображении показаны две системы координат A и B, расположенные в глобальном фрейме G: конфигурация систем координат

Мне нужно найти кватернион, который вращает A в B, но выражается в кадре, локальном для A.

Первая часть проста, B.conjugate()*A (вычитая поворот B из поворота A), что дает поворот на π / 2 вокруг (-1,0,0). Это очевидно правильно, поскольку поворот A вокруг глобальной оси -x на 90 ° дает B.

Теперь мне нужно выразить этот результат в A; желаемый результат - π / 2 около (0,0,-1) (это то, что global -x находится в A), но я не могу достичь этого только с помощью композиции вращения.

Я могу преобразовать кватернион в представление оси угла (π / 2 вокруг (-1,0,0)), повернуть ось как A*(-1,0,0)=(0,0,-1) и преобразовать обратно в кватернион, но я бы хотел избежать этого преобразования, если это возможно.

Как получить вращение, используя только умножение кватернионов?


Сам код - c ++, но я проверяю это на python с помощью minieigen:

from minieigen import *
from math import *
A=Quaternion((0,-1,0),pi/2)
B=Quaternion((sqrt(3)/3,-sqrt(3)/3,sqrt(3)/3),(2/3.)*pi)
# rotation in global frame:
rg=B.conjugate()*A           # is Quaternion((-1,0,0),pi/2)
# rotation in local frame:
# ?? what now?! hack around with angle-axis
aa=rg.toAngleAxis()
rl=Quaternion(A*aa[1],aa[0]) # is Quaternion((0,0,-1),pi/2)

for q in A,B,rg,rl: print q

который дает:

Quaternion((0,-1,0),1.5707963267948966)
Quaternion((0.5773502691896257,-0.5773502691896257,0.5773502691896257),2.0943951023931953)
Quaternion((-1,-7.850462293418876e-17,-7.850462293418876e-17),1.5707963267948968)
Quaternion((-1.1102230246251568e-16,-7.850462293418877e-17,-1),1.5707963267948968)

person eudoxos    schedule 13.04.2013    source источник


Ответы (2)


Это было несложно, но я оставлю его здесь для протокола:

A*B.conjugate()
person eudoxos    schedule 13.04.2013

Ваши уравнения мне не подходят.

Я буду использовать Q ' для Q.conjugate. Теперь мы знаем, что Q '* Q - это тождество, поэтому это Q * Q'. Поэтому, если вы хотите узнать кватернион, который преобразует A в B (в глобальном фрейме, поскольку A и B находятся в глобальном фрейме), затем вы начинаете с этого уравнения (предполагая, что эти кватернионы представляют собой повороты, применяемые к векторам-столбцам):

Q * A = B

затем вы перемещаете A на другую сторону

Q * A * A '= B * A' = Q

Как мы видим, это правильно, потому что B * A '* A = B. Уравнение в ваших вопросах говорит, что B '* A * A = B. Я думаю, что в целом это не так.

Теперь, если вы хотите, чтобы поворот выполнялся в кадре A, а не в глобальном кадре, это эквивалентно тому, что вы хотите B в A . Это то же самое, что удалить A из B. Вот так: A '* B. Таким образом, если вы перейдете от кадра A к глобальному кадру, вы снова получите B: A * A '* B = B .

person JCooper    schedule 14.04.2013