SciPy 库的 spatial.transform
模块 Rotation
类 是一个工具类,用于在多种旋转表示形式(例如旋转矩阵、四元数、旋转向量、欧拉角等)之间进行转换,以及执行旋转操作。
示例代码
1. 构造旋转对象
from scipy.spatial.transform import Rotation as scipy_R
import numpy as np# 定义一个旋转向量 (绕 Z 轴旋转 π/2 弧度)
rotvec = np.array([0, 0, np.pi / 2])# 从旋转向量构造旋转对象
rotation = scipy_R.from_rotvec(rotvec)# 输出旋转矩阵
print("Rotation matrix:\n", rotation.as_matrix())
解释:
rotvec = [0, 0, π/2]
表示绕 Z-轴旋转 90∘ (π/2 弧度)。as_matrix()
方法将Rotation
对象转换为 3×3 旋转矩阵。
2. 批量操作
# 一组旋转向量 (分别表示绕 X, Y, Z 轴旋转 π/3)
rotvecs = np.array([[np.pi / 3, 0, 0], # X-axis[0, np.pi / 3, 0], # Y-axis[0, 0, np.pi / 3] # Z-axis
])# 从旋转向量批量构造旋转对象
rotations = scipy_R.from_rotvec(rotvecs)# 转换为旋转矩阵
rotation_matrices = rotations.as_matrix()
print("Batch Rotation matrices:\n", rotation_matrices)
解释:
- 使用批量旋转向量构造一组旋转对象。
as_matrix()
转换每个旋转向量对应的旋转为旋转矩阵。- 结果是一个形状为 (3,3,3) 的数组,包含三个旋转矩阵。
3. 反向操作
# 给定一个旋转矩阵
rot_matrix = np.array([[0, -1, 0],[1, 0, 0],[0, 0, 1]
])# 从旋转矩阵构造 Rotation 对象并转换为旋转向量
rotation = scipy_R.from_matrix(rot_matrix)
rotvec = rotation.as_rotvec()
print("Rotation vector:", rotvec)
解释:
- 给定旋转矩阵 R,从中提取旋转向量 r。
- 输出的旋转向量会重新编码角度和轴。
from_rotvec函数
的应用场景
- 机器人学: 处理关节的旋转或末端执行器姿态。
- 计算机图形学: 执行刚体变换或相机旋转。
- 分子建模: 处理分子的旋转。
- 扩散模型: 在 SO(3)SO(3) 上进行采样与噪声扩散。
- 姿态估计: 从旋转向量计算旋转矩阵并应用于运动分析。
通过 scipy_R.from_rotvec
,可以将紧凑的旋转向量形式高效地转换为其他旋转表示,满足多种科学与工程需求。