scipy.spatial.transform.Rotation.

as_davenport#

Rotation.as_davenport(self, axes, order, degrees=False)#

表示为 Davenport 角。

任何方向都可以表示为三个基本旋转的组合。

对于欧拉角和达文波特角,连续的轴必须是正交的(axis2axis1axis3 都正交)。对于欧拉角,axis1axis3 之间还有一个额外的关系,有两种可能性:

  • axis1axis3 也是正交的(非对称序列)

  • axis1 == axis3 (对称序列)

对于达文波特角,最后一个关系被放宽 [1],只保持连续正交轴的要求。

已使用 [2] 中的算法的略微修改版本,来计算关于给定轴序列的 Davenport 角。

达文波特角,就像欧拉角一样,存在万向节锁的问题 [3],即表示法失去了一个自由度,无法唯一确定第一和第三角度。在这种情况下,会发出警告,并将第三角度设置为零。但请注意,返回的角度仍然表示正确的旋转。

参数:
array_like, 形状 (3,) 或 ([1 或 2 或 3], 3)

旋转轴,如果是一维的。如果是二维的,描述了旋转的轴序列,其中每个 axes[i, :] 是第 i 个轴。如果给出了多个轴,那么第二个轴必须与第一个和第三个轴正交。

顺序字符串

如果它属于集合 {‘e’, ‘extrinsic’},序列将被视为外部的。如果它属于集合 {‘i’, ‘intrinsic’},序列将被视为内部的。

度数布尔值,可选

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

返回:
角度ndarray, 形状 (3,) 或 (N, 3)

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

  • 第一个角度属于 [-180, 180] 度(包括 -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

达文波特角是欧拉角的一种推广,当我们使用标准基轴时:

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