as_davenport#
- Rotation.as_davenport(self, axes, order, degrees=False)#
表示为 Davenport 角。
任何方向都可以表示为 3 个基本旋转的组合。
对于欧拉角和 Davenport 角,连续轴必须是正交的(
axis2
与axis1
和axis3
都正交)。对于欧拉角,axis1
或axis3
之间还有另一种关系,有两种可能性axis1
和axis3
也正交(不对称序列)axis1 == axis3
(对称序列)
对于 Davenport 角,这种最后的关系被放宽了[1],并且只保留连续正交轴的要求。
使用了来自 [2] 的算法的略微修改版本,以计算关于给定轴序列旋转的 Davenport 角。
Davenport 角,就像欧拉角一样,也存在万向节锁问题[3],其中表示失去了一个自由度,并且无法唯一地确定第一个和第三个角度。在这种情况下,会引发警告,并将第三个角度设置为零。但请注意,返回的角度仍然表示正确的旋转。
- 参数:
- axesarray_like, 形状 (3,) 或 ([1 或 2 或 3], 3)
旋转轴,如果是一维的。 如果是二维的,则描述旋转的轴序列,其中每个 axes[i, :] 是第 i 个轴。 如果给出多个轴,则第二个轴必须与第一个和第三个轴都正交。
- orderstring
如果它属于集合 {‘e’, ‘extrinsic’},则该序列将是外在的。 如果它属于集合 {‘i’, ‘intrinsic’},则该序列将被视为内在的。
- degreesboolean, 可选
如果此标志为 True,则返回的角度以度为单位,否则以弧度为单位。 默认值为 False。
- 返回:
- anglesndarray, 形状 (3,) 或 (N, 3)
形状取决于用于初始化对象的输入形状。 返回的角度在以下范围内
第一个角度属于 [-180, 180] 度(包括两端)
第三个角度属于 [-180, 180] 度(包括两端)
第二个角度属于大小为 180 度的集合,由以下公式给出:
[-abs(lambda), 180 - abs(lambda)]
,其中lambda
是第一个轴和第三个轴之间的角度。
参考
[1]Shuster, Malcolm & Markley, Landis. (2003). 欧拉角的概括. 《天文学科学杂志》. 51. 123-132. 10.1007/BF03546304.
[2]Bernardes E, Viollet S (2022) 四元数到欧拉角的转换:一种直接、通用且计算高效的方法。PLoS ONE 17(11): e0276302. 10.1371/journal.pone.0276302
示例
>>> from scipy.spatial.transform import Rotation as R >>> import numpy as np
Davenport 角是欧拉角的推广,当我们使用规范基轴时
>>> ex = [1, 0, 0] >>> ey = [0, 1, 0] >>> ez = [0, 0, 1]
表示单个旋转
>>> r = R.from_rotvec([0, 0, np.pi/2]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True) array([90., 0., 0.]) >>> r.as_euler('zxy', degrees=True) array([90., 0., 0.]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape (3,)
表示一堆单个旋转
>>> r = R.from_rotvec([[0, 0, np.pi/2]]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True) array([[90., 0., 0.]]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape (1, 3)
在单个对象中表示多个旋转
>>> r = R.from_rotvec([ ... [0, 0, 90], ... [45, 0, 0]], degrees=True) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True) array([[90., 0., 0.], [ 0., 45., 0.]]) >>> r.as_davenport([ez, ex, ey], 'extrinsic', degrees=True).shape (2, 3)