【问题标题】:Doing an Euler rotation in 2 operations different result than doing it in 1 operation在 2 次操作中进行欧拉旋转与在 1 次操作中进行不同的结果
【发布时间】:2022-01-14 22:29:00
【问题描述】:

我想用 Tait-Bryan 角度连续执行多次旋转,得到最终的旋转矩阵。我尝试使用 scipy.spatial.transform.Rotation 执行此操作,但没有按预期工作。

下面的例子演示了这个问题。

from scipy.spatial.transform import Rotation as R

print(
    R.from_euler('zxy', (90, 0, 90), degrees=True).apply(
        R.from_euler('xyz', (-90, 0, 0), degrees=True).as_matrix()))

print(R.from_euler('xzy', (-90, 90, 90), degrees=True).as_matrix())

在第一个print,我执行了2个旋转操作:

  1. 围绕 X 旋转 -90º
  2. 绕 Z 旋转 90º,然后绕 Y 旋转 90º

这些旋转可以组合成1个操作,我在第2个print做的:

  1. 围绕 X 旋转 -90º,然后围绕 Z 旋转 90º,然后围绕 Y 旋转 90º

输出:

[[ 0.00000000e+00  1.00000000e+00 -2.22044605e-16]
 [ 1.00000000e+00  4.93038066e-32  4.44089210e-16]
 [ 4.44089210e-16 -2.22044605e-16 -1.00000000e+00]]

[[ 0.00000000e+00 -1.00000000e+00  0.00000000e+00]
 [ 1.00000000e+00  0.00000000e+00  1.57009246e-16]
 [-1.57009246e-16  0.00000000e+00  1.00000000e+00]]

我不明白为什么这些矩阵不一样。

多次旋转的结果与单次旋转的结果相差 180º。

print(R.from_matrix(
    R.from_euler('zxy', (90, 0, 90), degrees=True).apply(
        R.from_euler('xyz', (-90, 0, 0), degrees=True).as_matrix()
    )).as_euler('zxy', degrees=True))

print(R.from_euler('xzy', (-90, 90, 90), degrees=True).as_euler('zxy', degrees=True))

这是打印旋转矩阵角度的输出:

[ 9.00000000e+01 -2.54444375e-14 -1.80000000e+02]
[90.  0.  0.]

如何让第一个语句(2 个链式旋转)给出与第二个语句(1 个单次旋转)相同的结果?


我想要实现的是连续链接多个欧拉旋转以创建最终的旋转矩阵。我目前无法正常工作的方法:

R.from_euler('zxy', arbitrary_rotation_2, degrees=True).apply(
    R.from_euler('zxy', arbitrary_rotation_1, degrees=True).as_matrix())

更新:

@joostblack 的回答解决了我的问题。但是,我不明白为什么调用 Rotation.apply 返回的矩阵不是 2 个旋转矩阵的点积。 Scipy's scipy.spatial.transform.Rotation.apply documentation says,

在旋转矩阵方面,这个应用和self.as_matrix().dot(vectors)一样。

那为什么不一样呢?

【问题讨论】:

    标签: python matrix vector scipy rotation


    【解决方案1】:

    要查看发生了什么,您可以打印中间的矩阵。

    第1步:绕z和y轴旋转90度:

    r1 = R.from_euler('xzy', (0, 90, 90), degrees=True).as_matrix()
    

    第2步:绕x轴旋转-90度:

    r2 = R.from_euler('xzy', (-90, 0, 0), degrees=True).as_matrix()
    

    第 3 步:乘以旋转矩阵:

    print(r1@r2)
    

    第 4 步:检查它是否与您的第二条语句相同:

    print(R.from_euler('xzy', (-90, 90, 90), degrees=True).as_matrix())
    

    输出:

    [[ 0. -1.  0.]
     [ 1.  0.  0.]
     [ 0.  0.  1.]]
    [[ 0. -1.  0.]
     [ 1.  0.  0.]
     [ 0.  0.  1.]]
    

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 2019-04-26
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      相关资源
      最近更新 更多