scipy.spatial.transform.Rotation.
as_euler#
- Rotation.as_euler(self, seq, degrees=False)#
表示为欧拉角。
任何方向都可以表示为三个基本旋转的组合。一旦选择了轴序列,欧拉角就定义了围绕每个相应轴的旋转角度 [1]。
来自 [2] 的算法已被用于计算关于给定轴序列旋转的欧拉角。
欧拉角存在万向节锁的问题 [3],即表示法失去了一个自由度,无法唯一确定第一和第三角度。在这种情况下,会引发一个警告,并将第三角度设置为零。但请注意,返回的角度仍然表示正确的旋转。
- 参数:
- seq字符串,长度为3
3 个属于集合 {‘X’, ‘Y’, ‘Z’} 的字母用于内在旋转,或 {‘x’, ‘y’, ‘z’} 用于外在旋转 [1]. 相邻的轴不能相同。外在和内在旋转不能在一次函数调用中混合使用。
- 度数布尔值,可选
如果此标志为 True,则返回的角度以度为单位,否则以弧度为单位。默认值为 False。
- 返回:
- 角度ndarray, 形状 (3,) 或 (N, 3)
形状取决于用于初始化对象的输入形状。返回的角度在以下范围内:
第一个角度属于 [-180, 180] 度(包括 -180 和 180)
第三角度属于 [-180, 180] 度(包括两端)
第二个角度属于:
如果所有轴都不同(如 xyz),则为 [-90, 90] 度
[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)