scipy.spatial.transform.Rotation.

as_quat#

Rotation.as_quat(self, canonical=False, *, scalar_first=False)#

表示为四元数。

三维旋转可以使用单位范数四元数表示 [1]

四元数的 4 个分量分为标量部分 w 和向量部分 (x, y, z),可以从旋转的角度 theta 和轴 n 表示如下

w = cos(theta / 2)
x = sin(theta / 2) * n_x
y = sin(theta / 2) * n_y
z = sin(theta / 2) * n_z

有两种约定来排列四元数中的分量

  • 标量优先顺序 – (w, x, y, z)

  • 标量最后顺序 – (x, y, z, w)

选择由 scalar_first 参数控制。默认情况下,它是 False,并且使用标量最后顺序。

从四元数到旋转的映射是二对一的,即四元数 q-q,其中 -q 只是反转每个分量的符号,表示相同的空间旋转。

参数:
canonicalbool,默认 False

是否将旋转空间的冗余双覆盖映射到唯一的“规范”单覆盖。如果为 True,则从 {q, -q} 中选择四元数,使得 w 项为正。如果 w 项为 0,则选择四元数,使得 x、y 和 z 项的第一个非零项为正。

scalar_firstbool,可选

标量分量是放在最前面还是最后面。默认值为 False,即使用标量最后顺序。

返回值:
quatnumpy.ndarray,形状为 (4,) 或 (N, 4)

形状取决于用于初始化的输入的形状。

参考

示例

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

旋转可以用标量最后(默认)或标量优先分量顺序的四元数表示。这显示了单个旋转

>>> r = R.from_matrix(np.eye(3))
>>> r.as_quat()
array([0., 0., 0., 1.])
>>> r.as_quat(scalar_first=True)
array([1., 0., 0., 0.])

当多个旋转存储在单个 Rotation 对象中时,结果将是一个二维数组

>>> r = R.from_rotvec([[np.pi, 0, 0], [0, 0, np.pi/2]])
>>> r.as_quat().shape
(2, 4)

四元数可以从旋转空间的冗余双覆盖映射到 w 项为正的规范表示。

>>> r = R.from_quat([0, 0, 0, -1])
>>> r.as_quat()
array([0. , 0. , 0. , -1.])
>>> r.as_quat(canonical=True)
array([0. , 0. , 0. , 1.])