scipy.spatial.transform.Rotation.

as_euler#

Rotation.as_euler(seq, degrees=False, *, suppress_warnings=False)[source]#

表示为欧拉角。

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

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

欧拉角存在万向锁问题 [3],即表示失去一个自由度,无法唯一确定第一个和第三个角度。 在这种情况下,会发出警告(除非使用了 suppress_warnings 选项),并且第三个角度设置为零。 但是,请注意,返回的角度仍然代表正确的旋转。

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

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

degreesboolean, optional

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

suppress_warnings布尔值,可选

禁用有关万向锁的警告。 默认值为 False。

返回:
anglesndarray,形状为 (…, 3)

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

  • 第一个角度属于 [-180, 180] 度(含正负值)

  • 第三个角度属于 [-180, 180] 度(含正负值)

  • 第二个角度属于

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

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

附注

数组 API 标准支持

as_euler 对 Python Array API Standard 兼容的后端具有实验性支持,除了 NumPy 之外。 请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。 支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

Dask

不适用

有关更多信息,请参阅 对数组 API 标准的支持

参考文献

[2]

Bernardes E, Viollet S (2022) Quaternion to Euler angles conversion: A direct, general and computationally efficient method. 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)