下图显示了位于全局坐标系 G 中的两个坐标系 A 和 B:
我需要找到将 A 旋转到 B,但在 A 本地的框架中表示的四元数。
第一部分很简单,B.conjugate()*A
(从 的旋转中减去 的旋转B
)A
,得到围绕 的 π/2 旋转(-1,0,0)
。这显然是正确的,因为A
绕全局-x
轴旋转 90° 得到B
.
现在我需要用 ; 来表达这个结果A
。期望的结果是 π/2 左右(0,0,-1)
(这就是 A 中的全局-x
),但我无法仅通过旋转组合到达那里。
我可以将四元数转换为角轴表示(π/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)