На следующем рисунке показаны две системы координат А и В, расположенный в глобальной раме G: Вращение в локальной системе координат, выраженное в виде кватерниона
мне нужно найти кватернион, который вращается от А до B, но выражается в кадр местного А.
Первая часть легко, B.conjugate()*A
(вычитая вращение B
от вращения A
), что дает я/2 вращение вокруг (-1,0,0)
. Это, очевидно, верно, поскольку вращение A
вокруг глобальной оси -x
на 90 ° дает B
.
Теперь мне нужно выразить этот результат в A
; желаемый результат - π/2 около (вот что глобально -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)