scipy.spatial.transform.Rotation.

as_euler#

Rotation.as_euler(self, seq, degrees=False)#

表示为欧拉角。

任何方向都可以表示为 3 个基本旋转的组合。一旦选择了轴顺序,欧拉角就定义了绕每个相应轴旋转的角度 [1].

来自 [2] 的算法已被用于计算绕给定轴顺序的旋转的欧拉角。

欧拉角存在万向节锁问题 [3],其中表示形式会失去一个自由度,并且无法唯一地确定第一个和第三个角度。在这种情况下,会发出警告,并将第三个角度设置为零。但是请注意,返回的角度仍然表示正确的旋转。

参数:
seq字符串,长度为 3

3 个属于集合 {‘X’, ‘Y’, ‘Z’} 的字符表示内在旋转,或 3 个属于集合 {‘x’, ‘y’, ‘z’} 的字符表示外在旋转 [1]。相邻轴不能相同。外在旋转和内在旋转不能在同一个函数调用中混合。

degrees布尔值,可选

如果此标志为 True,则返回的角度为度数,否则为弧度。默认值为 False。

返回值:
anglesndarray,形状为 (3,) 或 (N, 3)

形状取决于用于初始化对象的输入的形状。返回的角度在以下范围内

  • 第一个角度属于 [-180, 180] 度(两者都包含)

  • 第三个角度属于 [-180, 180] 度(两者都包含)

  • 第二个角度属于

    • [-90, 90] 度,如果所有轴都不同(如 xyz)

    • [0, 180] 度,如果第一个轴和第三个轴相同(如 zxz)

参考资料

[2]

Bernardes E, Viollet S (2022) 四元数到欧拉角转换:一种直接、通用且计算效率高的方法。PLoS ONE 17(11): e0276302。 https://doi.org/10.1371/journal.pone.0276302

示例

>>> from scipy.spatial.transform import Rotation as R
>>> import numpy as np

表示单个旋转

>>> r = R.from_rotvec([0, 0, np.pi/2])
>>> r.as_euler('zxy', degrees=True)
array([90.,  0.,  0.])
>>> r.as_euler('zxy', degrees=True).shape
(3,)

表示单个旋转的堆栈

>>> r = R.from_rotvec([[0, 0, np.pi/2]])
>>> r.as_euler('zxy', degrees=True)
array([[90.,  0.,  0.]])
>>> r.as_euler('zxy', degrees=True).shape
(1, 3)

在单个对象中表示多个旋转

>>> r = R.from_rotvec([
... [0, 0, np.pi/2],
... [0, -np.pi/3, 0],
... [np.pi/4, 0, 0]])
>>> r.as_euler('zxy', degrees=True)
array([[ 90.,   0.,   0.],
       [  0.,   0., -60.],
       [  0.,  45.,   0.]])
>>> r.as_euler('zxy', degrees=True).shape
(3, 3)