下图显示了位于全局帧G中的两个坐标系A和B:
我需要找到将A旋转到B的四元数,但是在A的本地框架中表示。
第一部分很简单,B.conjugate()*A
(从B
的旋转中减去A
的旋转),这会在(-1,0,0)
周围产生π/ 2旋转。这显然是正确的,因为将全球A
轴周围的-x
旋转90°会得到B
。
现在我需要在A
中表达结果;期望的结果是(0,0,-1)
附近的π/ 2(这就是A中的全局-x
),但是我无法通过旋转合成达到目标。
我可以将四元数转换为角轴表示((-1,0,0)
周围的π/ 2),将轴旋转为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)
答案 0 :(得分:0)
这很简单,但我把它留在这里备案:
A*B.conjugate()
答案 1 :(得分:0)
你的方程式并不适合我。
我会将 Q'用于Q.conjugate。现在我们知道 Q'* Q 是身份,因此 Q * Q'。因此,如果您想知道将 A 转换为 B 的四元数(在 A 和 B 的全局框架中) >都在全局框架中),然后从该等式开始(假设这些四元数表示应用于列向量的旋转):
问* A = B 强>
然后你将A移到另一边
问* A * A '= B * A'= Q 强>
这,我们可以看到是正确的,因为 B * A'* A = B 。你问题中的等式表示, B'* A * A = B 。我认为这一般不成立。
现在,如果您希望轮换位于 A 的框架而不是全局框架中,那相当于在中表示您想要 B 一个的框架。这与从 B 中删除 A 相同。像这样: A'* B 。这样,如果您从 A 的框架旋转到全局框架,您最终会再次使用 B : A * A'* B = B 强>