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,即使用标量最后顺序。
- 返回值:
- quat
numpy.ndarray
,形状为 (4,) 或 (N, 4) 形状取决于用于初始化的输入的形状。
- quat
参考
示例
>>> 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.])