2

下图显示了位于全局坐标系 G 中的两个坐标系 A 和 B: 坐标系配置

我需要找到将 A 旋转到 B,但在 A 本地的框架中表示的四元数。

第一部分很简单,B.conjugate()*A(从 的旋转中减去 的旋转BA,得到围绕 的 π/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)
4

2 回答 2

0

这很容易,但我把它留在这里记录下来:

A*B.conjugate()
于 2013-04-13T10:19:59.717 回答
0

你的方程式不太适合我。

我将使用Q'表示 Q.conjugate。现在我们知道Q'*Q是恒等式,所以它是Q*Q'。因此,如果您想知道将A转换为B的四元数(在全局框架中,因为AB都在全局框架中),那么您从该等式开始(假设这些四元数表示应用于列向量的旋转):

Q*A=B

然后你把A移到另一边

Q*A*A'=B*A'=Q

我们可以看到这是正确的,因为B*A'*A=B。您问题中的方程式说B'*A*A=B。我认为,这在一般情况下并不成立。

现在,如果您希望旋转在A的框架而不是全局框架中,这相当于说您想要BA的框架中。这与从B中删除A相同。像这样:A'*B。这样,如果你从A的框架旋转到全局框架,你会再次得到BA*A'*B=B

于 2013-04-14T03:10:51.053 回答