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,即使用标量最后顺序。
- 返回:
- quat
numpy.ndarray, 形状 (…, 4) 形状取决于用于初始化的输入的形状。
- quat
附注
数组 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.])