scipy.spatial.transform.Rotation.

来自达文波特#

classmethod Rotation.from_davenport(cls, axes, order, angles, degrees=False)#

从 Davenport 角度初始化。

三维旋转可以通过围绕一系列轴的三个旋转的序列来表示。

这三种旋转可以在全局参考系(外在的)或物体中心的参考系(内在的)中进行,后者附着于并随着旋转物体移动 [1]

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

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

  • axis1 == axis3 (对称序列)

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

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

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

顺序字符串

如果它等于 ‘e’ 或 ‘extrinsic’,序列将被视为外在的。如果它等于 ‘i’ 或 ‘intrinsic’,序列将被视为内在的。

角度float 或 array_like, 形状 (N,) 或 (N, [1 或 2 或 3])

以弧度指定的欧拉角(degrees 为 False)或以度数指定的欧拉角(degrees 为 True)。对于单个轴,angles 可以是:

  • 一个单一值

  • 类似数组的形状为 (N,),其中每个 angle[i] 对应于一个单独的旋转

  • 形状为 (N, 1) 的类数组对象,其中每个 angle[i, 0] 对应于一个单独的旋转

对于2轴和3轴,angles 可以是:

  • 形状为 (W,) 的类数组,其中 Waxes 的行数,对应于一个包含 W 个轴的单次旋转

  • 形状为 (N, W) 的类数组,其中每个 angle[i] 对应于描述单次旋转的 Davenport 角序列

度数bool, 可选

如果为 True,则假设给定的角度以度为单位。默认为 False。

返回:
旋转 : Rotation 实例旋转实例

包含旋转的对象,表示围绕给定轴按给定角度进行的旋转序列。

参考文献

[2]

Shuster, Malcolm & Markley, Landis. (2003). 欧拉角的推广。宇航学报。51. 123-132. 10.1007/BF03546304.

示例

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

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

>>> ex = [1, 0, 0]
>>> ey = [0, 1, 0]
>>> ez = [0, 0, 1]

使用给定的轴序列初始化单次旋转:

>>> axes = [ez, ey, ex]
>>> r = R.from_davenport(axes, 'extrinsic', [90, 0, 0], degrees=True)
>>> r.as_quat().shape
(4,)

在这种情况下,它等同于欧拉角:

>>> r.as_euler('zyx', degrees=True)
array([90.,  0., -0.])

在一个对象中初始化多个旋转:

>>> r = R.from_davenport(axes, 'extrinsic', [[90, 45, 30], [35, 45, 90]], degrees=True)
>>> r.as_quat().shape
(2, 4)

只使用一个或两个轴也是可能的:

>>> r = R.from_davenport([ez, ex], 'extrinsic', [[90, 45], [35, 45]], degrees=True)
>>> r.as_quat().shape
(2, 4)

非标准轴是可能的,它们不需要被归一化,只要连续的轴是正交的即可:

>>> e1 = [2, 0, 0]
>>> e2 = [0, 1, 0]
>>> e3 = [1, 0, 1]
>>> axes = [e1, e2, e3]
>>> r = R.from_davenport(axes, 'extrinsic', [90, 45, 30], degrees=True)
>>> r.as_quat()
[ 0.701057,  0.430459, -0.092296,  0.560986]