scipy.spatial.transform.Rotation.

as_quat#

Rotation.as_quat(canonical=False, *, scalar_first=False)[source]#

表示为四元数。

三维旋转可以使用单位范数四元数 [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)

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

附注

数组 API 标准支持

as_quat 对 Python Array API Standard 兼容的后端具有实验性支持,除了 NumPy 之外。请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

Dask

不适用

有关更多信息,请参阅 对数组 API 标准的支持

参考文献

示例

>>> 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 对象形状加上最后维度的大小为 4。例如,如果 Rotation 对象包含 N 维数组(N, M, K)的旋转,则结果将是 4 维数组

>>> r = R.from_rotvec(np.ones((2, 3, 4, 3)))
>>> r.as_quat().shape
(2, 3, 4, 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.])