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) 形状取决于用于初始化的输入的形状。
- 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.])