Rotation.from_euler 是 Python 科学计算库 scipy 中 scipy.spatial.transform.Rotation 类的核心方法,用于从欧拉角创建旋转对象,实现欧拉角与旋转矩阵、四元数等计算机友好型旋转表示的转换,广泛应用于机器人学、计算机视觉、三维姿态计算等领域。
- 将直观的欧拉角(按指定旋转顺序)转换为
Rotation 类实例。 - 支持单个姿态或批量多个姿态的欧拉角转换。
- 转换后的
Rotation 实例可灵活导出为旋转矩阵、四元数、轴角等格式,便于后续旋转运算、坐标变换。
from scipy.spatial.transform import Rotation
rot = Rotation.from_euler(seq, angles, degrees=False)
- 内在旋转(默认):每次旋转绕刚体自身坐标系的轴(随刚体旋转),如
'zyx'对应 “偏航 - 俯仰 - 滚转”(机械臂 / 飞行器常用)。 - 外在旋转:每次旋转绕固定参考坐标系的轴,需在轴名后加
'+',如'xyz+'(较少用)。 - 常见有效
seq值:'xyz'、'zyx'、'xzy'、'yzx'、'zxy'、'yxz'(均为内在旋转)。
返回 scipy.spatial.transform.Rotation 类的实例(记为rot),该实例支持以下常用方法导出不同旋转表示:
from scipy.spatial.transform import Rotation
import numpy as np
yaw = np.deg2rad(30)
pitch = np.deg2rad(20)
roll = np.deg2rad(10)
angles = [yaw, pitch, roll]
rot = Rotation.from_euler(seq='zyx', angles=angles, degrees=False)
rot_matrix = rot.as_matrix()
print("旋转矩阵:\n", np.round(rot_matrix, 4))
quat = rot.as_quat()
print("四元数 (x,y,z,w):\n", np.round(quat, 4))
from scipy.spatial.transform import Rotation
angles_deg = [15, 30, 45]
rot = Rotation.from_euler(seq='xyz', angles=angles_deg, degrees=True)
rot_vec = rot.as_rotvec()
print("旋转向量(轴角):\n", np.round(rot_vec, 4))
from scipy.spatial.transform import Rotation
import numpy as np
angles_multi = np.array([
[np.deg2rad(10), np.deg2rad(20), np.deg2rad(30)],
[np.deg2rad(5), np.deg2rad(15), np.deg2rad(25)]
])
rots = Rotation.from_euler(seq=‘zyx’, angles=angles_multi, degrees=False)
rot_matrices = rots.as_matrix()
print(“多姿态旋转矩阵形状:”, rot_matrices.shape)
print(“第一个姿态的旋转矩阵:\n”, np.round(rot_matrices[0], 4))
from scipy.spatial.transform import Rotation
rot1 = Rotation.from_euler(‘x’, 30, degrees=True)
rot2 = Rotation.from_euler(‘z’, 45, degrees=True)
rot_compose = rot2 * rot1
compose_euler = rot_compose.as_euler(‘zyx’, degrees=True)
print(“复合后的欧拉角(zyx顺序,角度制):\n”, np.round(compose_euler, 2))
- 旋转顺序必须匹配业务定义:相同欧拉角在不同
seq下结果完全不同(如'zyx'≠'xyz'),需与机械臂 / 相机的姿态描述一致。 - 角度单位不可混淆:默认
degrees=False(弧度制),输入角度值时需手动转换为弧度,或设置degrees=True。 - 万向锁问题:欧拉角本身存在万向锁(中间轴旋转 ±90° 时丢失自由度),
Rotation.from_euler不解决该问题,高精度场景建议用四元数。 - 数据形状要求:
angles为单个姿态时需是长度 3 的数组(如[x, y, z]),多姿态时需是 (n, 3) 的二维数组。 - 版本兼容性:
scipy版本需≥1.4.0(更早版本无Rotation类),安装命令:pip install scipy>=1.4.0。
- 报错 “ValueError: invalid rotation sequence”:
seq参数输入错误,需是x/y/z的 3 个不重复组合(如'zyx'),不可含其他字符。 - 旋转结果与预期不符:检查
seq顺序是否正确,或degrees参数是否与输入角度单位匹配。 - 批量处理时报错 “ValueError: shapes mismatch”:
angles数组形状错误,多姿态需确保是 (n, 3) 格式。
Rotation.from_euler 是欧拉角与计算机旋转表示的核心转换工具,核心优势是简洁易用、支持批量处理,且可无缝衔接后续旋转运算。使用时需重点关注seq(旋转顺序)和degrees(角度单位)两个参数,确保与业务场景一致。
- 复制本文档全部内容(从标题到结尾);
- 在本地新建文本文件,粘贴内容后保存;
- 将文件扩展名改为
.md(如 Rotation_from_euler详解.md),即可完成下载。
要不要我帮你生成一份带代码注释的完整示例文件(.py 格式),可直接运行验证效果?