【发布时间】:2013-04-13 05:47:45
【问题描述】:
下图显示了位于全局坐标系 G 中的两个坐标系 A 和 B:
我需要找到将 A 旋转到 B,但在 A 本地的框架中表示的四元数。
第一部分很简单,B.conjugate()*A(从A 的旋转中减去B 的旋转),得到围绕(-1,0,0) 的π/2 旋转。这显然是正确的,因为将 A 围绕全局 -x 轴旋转 90° 会得到 B。
现在我需要在A 中表达该结果;期望的结果是 (0,0,-1) 周围的 π/2(这就是 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)
【问题讨论】:
标签: rotation quaternions coordinate-transformation