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 只是简单地反转每个分量的符号,表示相同的旋转。

参数:
canonical : bool, 默认 Falsebool, 默认 False

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

scalar_firstbool, 可选

标量分量是放在首位还是末位。默认是 False,即使用标量-末位顺序。

返回:
quat : numpy.ndarray, 形状 (4,) 或 (N, 4)numpy.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.])