在 2 次操作中进行欧拉旋转与在 1 次操作中进行不同的结果
Doing an Euler rotation in 2 operations different result than doing it in 1 operation
我想用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 个旋转操作:
- 绕 X 旋转 -90º
- 绕 Z 旋转 90º,然后绕 Y 旋转 90º
这些旋转可以组合成 1 个操作,这是我在第 2 个操作中所做的 print
:
- 绕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 个链式旋转)给出与第 2 个语句(第一个单次旋转)相同的结果?
我想要实现的是连续链接多个欧拉旋转以创建最终旋转矩阵。我目前的方法不能正常工作:
R.from_euler('zxy', arbitrary_rotation_2, degrees=True).apply(
R.from_euler('zxy', arbitrary_rotation_1, degrees=True).as_matrix())
更新:
@joostblack 的回答解决了我的问题。但是,我不明白为什么调用 Rotation.apply
returns 不是 2 个旋转矩阵的点积的矩阵。 Scipy's scipy.spatial.transform.Rotation.apply
documentation says,
In terms of rotation matricies, this application is the same as 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.]]
我想用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 个旋转操作:
- 绕 X 旋转 -90º
- 绕 Z 旋转 90º,然后绕 Y 旋转 90º
这些旋转可以组合成 1 个操作,这是我在第 2 个操作中所做的 print
:
- 绕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 个链式旋转)给出与第 2 个语句(第一个单次旋转)相同的结果?
我想要实现的是连续链接多个欧拉旋转以创建最终旋转矩阵。我目前的方法不能正常工作:
R.from_euler('zxy', arbitrary_rotation_2, degrees=True).apply(
R.from_euler('zxy', arbitrary_rotation_1, degrees=True).as_matrix())
更新:
@joostblack 的回答解决了我的问题。但是,我不明白为什么调用 Rotation.apply
returns 不是 2 个旋转矩阵的点积的矩阵。 Scipy's scipy.spatial.transform.Rotation.apply
documentation says,
In terms of rotation matricies, this application is the same as
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.]]