На следующем изображении показаны две системы координат 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)