在2个操作中执行Euler旋转与在1个操作中进行结果不同



我想用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中,我执行两个旋转操作:

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

这些旋转可以组合成1个操作,我在第二次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个单循环(相同的结果?


我想要实现的是连续链接多个Euler旋转,以创建最终的旋转矩阵。我目前的方法不正确:

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

更新:

@霍斯特布莱克的回答解决了我的问题。然而,我不明白为什么调用Rotation.apply会返回一个不是2个旋转矩阵的点积的矩阵。Scipy的scipy.spatial.transform.Rotation.apply文档称,

就旋转矩阵而言,此应用程序与self.as_matrix().dot(vectors)相同

为什么不一样?

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

步骤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.]]

相关内容

最新更新