介绍一下 Rotation.from_euler

部署运行你感兴趣的模型镜像

Rotation.from_euler 方法详解(可下载版)

Rotation.from_euler 是 Python 科学计算库 scipyscipy.spatial.transform.Rotation 类的核心方法,用于从欧拉角创建旋转对象,实现欧拉角与旋转矩阵、四元数等计算机友好型旋转表示的转换,广泛应用于机器人学、计算机视觉、三维姿态计算等领域。

一、核心功能

  • 将直观的欧拉角(按指定旋转顺序)转换为 Rotation 类实例。
  • 支持单个姿态或批量多个姿态的欧拉角转换。
  • 转换后的 Rotation 实例可灵活导出为旋转矩阵、四元数、轴角等格式,便于后续旋转运算、坐标变换。

二、语法格式

python
运行
from scipy.spatial.transform import Rotation

# 基础语法
rot = Rotation.from_euler(seq, angles, degrees=False)

三、参数详解

参数名类型必选性说明
seqstr旋转顺序字符串,指定欧拉角绕 x/y/z 轴的旋转顺序(如'xyz''zyx'),默认表示内在旋转
anglesarray_like欧拉角数值,单个姿态为(3,)形状,多个姿态为(n, 3)形状(n 为姿态数量)
degreesbool角度单位标识:True表示角度制,False(默认)表示弧度制

关键参数:seq(旋转顺序)

  • 内在旋转(默认):每次旋转绕刚体自身坐标系的轴(随刚体旋转),如'zyx'对应 “偏航 - 俯仰 - 滚转”(机械臂 / 飞行器常用)。
  • 外在旋转:每次旋转绕固定参考坐标系的轴,需在轴名后加'+',如'xyz+'(较少用)。
  • 常见有效seq值:'xyz''zyx''xzy''yzx''zxy''yxz'(均为内在旋转)。

四、返回值说明

返回 scipy.spatial.transform.Rotation 类的实例(记为rot),该实例支持以下常用方法导出不同旋转表示:
方法名输出结果用途
rot.as_matrix()3x3 旋转矩阵(多姿态为 (n, 3, 3))坐标变换、旋转复合
rot.as_quat()四元数(格式 (x, y, z, w))避免万向锁、姿态插值
rot.as_rotvec()旋转向量(轴角表示,长度 = 旋转角度)简洁姿态描述
rot.as_euler()还原为欧拉角(需指定seq结果验证、直观展示

五、示例代码(可直接运行)

示例 1:基础用法(弧度制,单个姿态)

python
运行
from scipy.spatial.transform import Rotation
import numpy as np
# 定义欧拉角:绕z轴30°、y轴20°、x轴10°(zyx顺序,先转换为弧度)
yaw = np.deg2rad(30)    # 偏航角
pitch = np.deg2rad(20)  # 俯仰角
roll = np.deg2rad(10)   # 滚转角
angles = [yaw, pitch, roll]
# 从欧拉角创建Rotation实例
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))

示例 2:角度制输入(单个姿态)

python
运行
from scipy.spatial.transform import Rotation
# 角度制欧拉角:绕x轴15°、y轴30°、z轴45°(xyz顺序)
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))

示例 3:批量处理多个姿态

python
运行
from scipy.spatial.transform import Rotation
import numpy as np

# 2个姿态的欧拉角(zyx顺序,弧度制)
angles_multi = np.array([
[np.deg2rad(10), np.deg2rad(20), np.deg2rad(30)], # 姿态1
[np.deg2rad(5), np.deg2rad(15), np.deg2rad(25)] # 姿态2
])

# 批量创建Rotation实例
rots = Rotation.from_euler(seq=‘zyx’, angles=angles_multi, degrees=False)

# 批量导出旋转矩阵
rot_matrices = rots.as_matrix()
print(“多姿态旋转矩阵形状:”, rot_matrices.shape) # 输出 (2, 3, 3)
print(“第一个姿态的旋转矩阵:\n”, np.round(rot_matrices[0], 4))

示例 4:旋转复合运算(基于 Rotation 实例)

python
运行
from scipy.spatial.transform import Rotation

# 姿态1:绕x轴30°(角度制)
rot1 = Rotation.from_euler(‘x’, 30, degrees=True)
# 姿态2:绕z轴45°(角度制)
rot2 = Rotation.from_euler(‘z’, 45, degrees=True)

# 旋转复合:先执行rot1,再执行rot2(实例乘法)
rot_compose = rot2 * rot1

# 导出复合后的欧拉角(zyx顺序)
compose_euler = rot_compose.as_euler(‘zyx’, degrees=True)
print(“复合后的欧拉角(zyx顺序,角度制):\n”, np.round(compose_euler, 2))

六、关键注意事项

  1. 旋转顺序必须匹配业务定义:相同欧拉角在不同seq下结果完全不同(如'zyx''xyz'),需与机械臂 / 相机的姿态描述一致。
  2. 角度单位不可混淆:默认degrees=False(弧度制),输入角度值时需手动转换为弧度,或设置degrees=True
  3. 万向锁问题:欧拉角本身存在万向锁(中间轴旋转 ±90° 时丢失自由度),Rotation.from_euler不解决该问题,高精度场景建议用四元数。
  4. 数据形状要求angles为单个姿态时需是长度 3 的数组(如[x, y, z]),多姿态时需是 (n, 3) 的二维数组。
  5. 版本兼容性scipy版本需≥1.4.0(更早版本无Rotation类),安装命令:pip install scipy>=1.4.0

七、常见问题排查

  1. 报错 “ValueError: invalid rotation sequence”seq参数输入错误,需是x/y/z的 3 个不重复组合(如'zyx'),不可含其他字符。
  2. 旋转结果与预期不符:检查seq顺序是否正确,或degrees参数是否与输入角度单位匹配。
  3. 批量处理时报错 “ValueError: shapes mismatch”angles数组形状错误,多姿态需确保是 (n, 3) 格式。

总结

Rotation.from_euler 是欧拉角与计算机旋转表示的核心转换工具,核心优势是简洁易用、支持批量处理,且可无缝衔接后续旋转运算。使用时需重点关注seq(旋转顺序)和degrees(角度单位)两个参数,确保与业务场景一致。

下载说明

  1. 复制本文档全部内容(从标题到结尾);
  2. 在本地新建文本文件,粘贴内容后保存;
  3. 将文件扩展名改为 .md(如 Rotation_from_euler详解.md),即可完成下载。
要不要我帮你生成一份带代码注释的完整示例文件(.py 格式),可直接运行验证效果?

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值