【问题标题】:Rotation in local frame, expressed as quaternion局部坐标系中的旋转,表示为四元数
【发布时间】: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


    【解决方案1】:

    这很简单,但我把它留在这里记录一下:

    A*B.conjugate()
    

    【讨论】:

      【解决方案2】:

      你的方程式不太适合我。

      我将使用 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的框架而不是全局框架,那相当于说你想要B,在 A 的框架。这与从 B 中删除 A 相同。像这样:A'*B。这样,如果你从 A 的框架旋转到全局框架,你最终会再次得到 BA*A'*B=B强>。

      【讨论】:

        猜你喜欢
        • 2013-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 2022-08-17
        • 2014-01-09
        • 2018-01-03
        • 1970-01-01
        相关资源
        最近更新 更多