scipy.spatial.transform.Rotation.

from_davenport#

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

从 Davenport 角初始化。

三维空间中的旋转可以用围绕一系列轴的三个连续旋转序列来表示。

这三个旋转可以在全局参考系 (外在) 或物体中心参考系 (内在) 中进行,该参考系附着在旋转物体上并随着物体一起移动 [1].

对于欧拉角和 Davenport 角,连续轴必须是正交的 (axis2axis1axis3 正交)。对于欧拉角,在 axis1axis3 之间存在额外的关系,有两种可能性

  • axis1axis3 也正交 (不对称序列)

  • axis1 == axis3 (对称序列)

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

参数::
axesarray_like,shape (3,) 或 ([1 或 2 或 3], 3)

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

order字符串

如果它等于 'e' 或 'extrinsic',则该序列将是外在的。如果它等于 'i' 或 'intrinsic',则序列将被视为内在的。

angles浮点数或 array_like,shape (N,) 或 (N, [1 或 2 或 3])

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

  • 单个值

  • shape 为 (N,) 的 array_like,其中每个 angles[i] 对应于单个旋转

  • shape 为 (N, 1) 的 array_like,其中每个 angles[i, 0] 对应于单个旋转

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

  • shape 为 (W,) 的 array_like,其中 W 是 axes 的行数,对应于具有 W 个轴的单个旋转

  • shape 为 (N, W) 的 array_like,其中每个 angles[i] 对应于描述单个旋转的一系列 Davenport 角

degrees布尔值,可选

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

返回值::
rotationRotation 实例

包含由围绕给定轴以给定角度的旋转序列表示的旋转的对象。

参考

[2]

Shuster, Malcolm & Markley, Landis. (2003). Generalization of the Euler Angles. Journal of the Astronautical Sciences. 51. 123-132. 10.1007/BF03546304.

示例

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

Davenport 角是欧拉角的推广,当我们使用规范基轴时

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