scipy.spatial.transform.Rotation.as_euler

Rotation.as_euler()

表示为欧拉角。

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

中的算法 [2] 用于计算绕给定轴序列旋转的欧拉角。

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

参数
seq字符串,长度为3

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

degrees布尔值,可选

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

退货
anglesndarray,形状(3,)或(N,3)

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

  • 第一个角度属于 [-180, 180] 学位(包括学位和学位)

  • 第三个角度属于 [-180, 180] 学位(包括学位和学位)

  • 第二个角度属于:

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

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

参考文献

1(1,2)

https://en.wikipedia.org/wiki/Euler_angles#Definition_by_intrinsic_rotations

2

马尔科姆·D·舒斯特,F.兰迪斯·马克利,“提取欧拉角的一般公式”,“制导、控制和动力学杂志”,第一卷。29.1页,215-221页。2006年

3

https://en.wikipedia.org/wiki/Gimbal_lock#In_applied_mathematics

示例

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

表示单次旋转:

>>> 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)