XYZ旋转与Theta-Phi-Psi旋转的差异及Python转换方法咨询
Theta-Phi-Psi 与 XYZ 旋转的差异及转换方法
一、两者核心差异
- 旋转顺序与坐标系基准:
- XYZ旋转(通用欧拉角XYZ顺序)是绕固定世界坐标系的X轴→Y轴→Z轴依次完成旋转。
- Theta-Phi-Psi旋转(航空航天常用姿态角)一般遵循绕自身坐标系的Z轴(Psi/偏航)→Y轴(Phi/俯仰)→X轴(Theta/滚转)的内旋顺序,后续旋转的轴会随前序旋转同步变动。
- 适用场景:
- XYZ旋转多用于3D建模、机器人关节运动等通用3D领域。
- Theta-Phi-Psi更适配航空、航天场景,用来描述飞行器的姿态变化。
二、Python中Theta-Phi-Psi到XYZ旋转的转换步骤
已知你的Theta、Phi、Psi角度(单位:度),转换流程如下:
1. 角度转弧度
Python的旋转计算库默认使用弧度,先完成单位转换:
import numpy as np theta_deg = -0.66057811029304 phi_deg = 20.6061074480986 psi_deg = -0.471074371882115 theta = np.deg2rad(theta_deg) phi = np.deg2rad(phi_deg) psi = np.deg2rad(psi_deg)
2. 构建Theta-Phi-Psi旋转矩阵
按照内旋顺序(Psi(Z) → Phi(Y) → Theta(X)),分别生成单轴旋转矩阵后相乘得到总矩阵:
# 绕X轴(Theta)的旋转矩阵 Rx = np.array([ [1, 0, 0], [0, np.cos(theta), -np.sin(theta)], [0, np.sin(theta), np.cos(theta)] ]) # 绕Y轴(Phi)的旋转矩阵 Ry = np.array([ [np.cos(phi), 0, np.sin(phi)], [0, 1, 0], [-np.sin(phi), 0, np.cos(phi)] ]) # 绕Z轴(Psi)的旋转矩阵 Rz = np.array([ [np.cos(psi), -np.sin(psi), 0], [np.sin(psi), np.cos(psi), 0], [0, 0, 1] ]) # 内旋顺序的总旋转矩阵:R = Rx * Ry * Rz R_tpp = Rx @ Ry @ Rz
3. 转换为XYZ欧拉角
借助scipy的旋转模块,直接将旋转矩阵转成XYZ顺序的欧拉角:
from scipy.spatial.transform import Rotation as R # 从旋转矩阵创建旋转对象 rot = R.from_matrix(R_tpp) # 转换为XYZ顺序的欧拉角(输出单位:度) xyz_euler_deg = rot.as_euler('xyz', degrees=True) x_rot, y_rot, z_rot = xyz_euler_deg print(f"XYZ旋转角度(度):X={x_rot:.6f}, Y={y_rot:.6f}, Z={z_rot:.6f}")
注意事项
- 不同领域对Theta-Phi-Psi的轴对应关系、旋转顺序定义可能有差异,若结果不符,需确认是内旋还是外旋,以及各角度对应的旋转轴。
- 欧拉角存在万向锁问题,若需避免该问题,建议全程使用旋转矩阵或四元数作为中间载体。
内容的提问来源于stack exchange,提问作者houssein
相关产品推荐
相关产品推荐

