scipy.spatial.transform.Rotation

class scipy.spatial.transform.Rotation

三维旋转。

此类提供了一个接口,用于通过以下方式初始化和表示旋转:

  • 四元数

  • 旋转矩阵

  • 旋转矢量

  • 修改的Rodrigues参数

  • 欧拉角

支持以下旋转操作:

  • 向量的应用

  • 旋转构图

  • 旋转反转

  • 旋转分度

支持在一次旋转中编制索引,因为可以将多个旋转变换存储在一个 Rotation 实例。

要创建 Rotation 对象使用 from_... 方法(请参见下面的示例)。 Rotation(...) 不应直接实例化。

参见

Slerp

注意事项

示例

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

A Rotation 实例可以上述任何一种格式初始化,并转换为其他任何一种格式。底层对象独立于用于初始化的表示形式。

考虑绕z轴逆时针旋转90度。这对应于以下四元数(采用最后标量格式):

>>> r = R.from_quat([0, 0, np.sin(np.pi/4), np.cos(np.pi/4)])

旋转可以用任何其他格式表示:

>>> r.as_matrix()
array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
[ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
[ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])
>>> r.as_rotvec()
array([0.        , 0.        , 1.57079633])
>>> r.as_euler('zyx', degrees=True)
array([90.,  0.,  0.])

可以使用旋转矩阵初始化相同的旋转:

>>> r = R.from_matrix([[0, -1, 0],
...                    [1, 0, 0],
...                    [0, 0, 1]])

以其他格式表示:

>>> r.as_quat()
array([0.        , 0.        , 0.70710678, 0.70710678])
>>> r.as_rotvec()
array([0.        , 0.        , 1.57079633])
>>> r.as_euler('zyx', degrees=True)
array([90.,  0.,  0.])

对应于此旋转的旋转向量由以下表达式给出:

>>> r = R.from_rotvec(np.pi/2 * np.array([0, 0, 1]))

以其他格式表示:

>>> r.as_quat()
array([0.        , 0.        , 0.70710678, 0.70710678])
>>> r.as_matrix()
array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
       [ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])
>>> r.as_euler('zyx', degrees=True)
array([90.,  0.,  0.])

这个 from_euler 方法在其支持的输入格式范围内相当灵活。在这里,我们围绕单个轴初始化单个旋转:

>>> r = R.from_euler('z', 90, degrees=True)

同样,该对象与表示无关,并且可以转换为任何其他格式:

>>> r.as_quat()
array([0.        , 0.        , 0.70710678, 0.70710678])
>>> r.as_matrix()
array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
       [ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])
>>> r.as_rotvec()
array([0.        , 0.        , 1.57079633])

还可以使用以下任一方法在单个实例中初始化多个旋转 from_... 功能。在这里,我们使用 from_euler 方法:

>>> r = R.from_euler('zyx', [
... [90, 0, 0],
... [0, 45, 0],
... [45, 60, 30]], degrees=True)

其他表示现在也返回3个旋转的堆栈。例如:

>>> r.as_quat()
array([[0.        , 0.        , 0.70710678, 0.70710678],
       [0.        , 0.38268343, 0.        , 0.92387953],
       [0.39190384, 0.36042341, 0.43967974, 0.72331741]])

将上述旋转应用于向量:

>>> v = [1, 2, 3]
>>> r.apply(v)
array([[-2.        ,  1.        ,  3.        ],
       [ 2.82842712,  2.        ,  1.41421356],
       [ 2.24452282,  0.78093109,  2.89002836]])

A Rotation 实例可以像单个1D数组或列表一样进行索引和切片:

>>> r.as_quat()
array([[0.        , 0.        , 0.70710678, 0.70710678],
       [0.        , 0.38268343, 0.        , 0.92387953],
       [0.39190384, 0.36042341, 0.43967974, 0.72331741]])
>>> p = r[0]
>>> p.as_matrix()
array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
       [ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])
>>> q = r[1:3]
>>> q.as_quat()
array([[0.        , 0.38268343, 0.        , 0.92387953],
       [0.39190384, 0.36042341, 0.43967974, 0.72331741]])

实际上,它可以转换为numpy.array:

>>> r_array = np.asarray(r)
>>> r_array.shape
(3,)
>>> r_array[0].as_matrix()
array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
       [ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
       [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])

可以使用 * 操作员:

>>> r1 = R.from_euler('z', 90, degrees=True)
>>> r2 = R.from_rotvec([np.pi/4, 0, 0])
>>> v = [1, 2, 3]
>>> r2.apply(r1.apply(v))
array([-2.        , -1.41421356,  2.82842712])
>>> r3 = r2 * r1 # Note the order
>>> r3.apply(v)
array([-2.        , -1.41421356,  2.82842712])

最后,还可以反转旋转:

>>> r1 = R.from_euler('z', [90, 45], degrees=True)
>>> r2 = r1.inv()
>>> r2.as_euler('zyx', degrees=True)
array([[-90.,   0.,   0.],
       [-45.,   0.,   0.]])

这些示例可作为对 Rotation 分类并突出显示主要功能。有关支持的输入和输出格式范围的更全面示例,请参考各个方法的示例。

属性
single

此实例是否表示单个旋转。

方法:

__len__ 

此对象中包含的旋转次数。

from_quat 

从四元数初始化。

from_matrix 

从旋转矩阵初始化。

from_rotvec 

从旋转向量初始化。

from_mrp 

根据修改的罗德里格斯参数(MRP)进行初始化。

from_euler 

从欧拉角度初始化。

as_quat 

表示为四元数。

as_matrix 

表示为旋转矩阵。

as_rotvec 

表示为旋转向量。

as_mrp 

表示为修正的罗德里格斯参数(MRP)。

as_euler 

表示为欧拉角。

concatenate 

串联一个序列 Rotation 对象。

apply 

将此旋转应用于一组向量。

__mul__ 

将这一旋转与另一旋转组合在一起。

inv 

反转这个旋转方向。

magnitude 

获取旋转的幅度。

mean 

求旋转的平均值。

reduce 

使用提供的循环组减少此循环。

create_group 

创建3D旋转组。

__getitem__ 

从对象中提取给定索引处的旋转。

identity 

获取身份轮换。

random 

生成均匀分布的旋转。

align_vectors 

估计旋转以最佳地对齐两组矢量。