scipy.spatial.transform.Rotation¶
- class scipy.spatial.transform.Rotation¶
三维旋转。
此类提供了一个接口,用于通过以下方式初始化和表示旋转:
四元数
旋转矩阵
旋转矢量
修改的Rodrigues参数
欧拉角
支持以下旋转操作:
向量的应用
旋转构图
旋转反转
旋转分度
支持在一次旋转中编制索引,因为可以将多个旋转变换存储在一个
Rotation
实例。要创建
Rotation
对象使用from_...
方法(请参见下面的示例)。Rotation(...)
不应直接实例化。参见
注意事项
示例
>>> 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
此实例是否表示单个旋转。
方法:
此对象中包含的旋转次数。
从四元数初始化。
从旋转矩阵初始化。
从旋转向量初始化。
根据修改的罗德里格斯参数(MRP)进行初始化。
从欧拉角度初始化。
表示为四元数。
表示为旋转矩阵。
表示为旋转向量。
表示为修正的罗德里格斯参数(MRP)。
表示为欧拉角。
串联一个序列
Rotation
对象。将此旋转应用于一组向量。
将这一旋转与另一旋转组合在一起。
反转这个旋转方向。
获取旋转的幅度。
求旋转的平均值。
使用提供的循环组减少此循环。
创建3D旋转组。
从对象中提取给定索引处的旋转。
获取身份轮换。
生成均匀分布的旋转。
估计旋转以最佳地对齐两组矢量。