scipy.spatial.transform.Rotation.

from_quat#

classmethod Rotation.from_quat(cls, quat, *, scalar_first=False)#

从四元数初始化。

可以使用单位范数四元数 [1] 来表示 3 维空间中的旋转。

四元数的 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,并假定为标量最后顺序。

高级用户可能对四元数表示的 3D 空间的“双覆盖”感兴趣 [2]。从 1.11.0 版本开始,保证以下子集(且仅此子集)的 Rotation r 操作对应于四元数 q 保留双覆盖属性:r = Rotation.from_quat(q)r.as_quat(canonical=False)r.inv(),以及使用 * 运算符进行合成,例如 r*r

参数:
quatarray_like,形状为 (N, 4) 或 (4,)

每一行都是一个(可能不是单位范数的)四元数,表示一个主动旋转。每个四元数都将归一化为单位范数。

scalar_firstbool,可选

标量分量是第一个还是最后一个。默认值为 False,即假定为标量最后顺序。

返回:
rotationRotation 实例

包含输入四元数表示的旋转的对象。

参考文献

[2]

Hanson, Andrew J. “Visualizing quaternions.” Morgan Kaufmann Publishers Inc., San Francisco, CA. 2006.

示例

>>> from scipy.spatial.transform import Rotation as R

可以从标量最后(默认)或标量优先分量顺序的四元数初始化旋转,如下所示

>>> r = R.from_quat([0, 0, 0, 1])
>>> r.as_matrix()
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>> r = R.from_quat([1, 0, 0, 0], scalar_first=True)
>>> r.as_matrix()
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

可以通过传递二维数组在单个对象中初始化多个旋转

>>> r = R.from_quat([
... [1, 0, 0, 0],
... [0, 0, 0, 1]
... ])
>>> r.as_quat()
array([[1., 0., 0., 0.],
       [0., 0., 0., 1.]])
>>> r.as_quat().shape
(2, 4)

也可以有一个单个旋转的堆栈

>>> r = R.from_quat([[0, 0, 0, 1]])
>>> r.as_quat()
array([[0., 0., 0., 1.]])
>>> r.as_quat().shape
(1, 4)

四元数在初始化之前会被归一化。

>>> r = R.from_quat([0, 0, 1, 1])
>>> r.as_quat()
array([0.        , 0.        , 0.70710678, 0.70710678])