关于SciPy欧拉角与旋转矩阵转换逻辑的技术咨询
SciPy欧拉角与旋转矩阵转换的误区解析
1. 核心错误:旋转顺序与矩阵乘法的方向
你对from_euler("ZYX", angles)的理解偏差在于旋转顺序对应的矩阵乘法方向:
- SciPy的
Rotation.from_euler("ZYX", (yaw, pitch, roll))实现的是内旋(intrinsic)Z-Y-X顺序:先绕初始Z轴旋转yaw,接着绕旋转后的Y轴旋转pitch,最后绕旋转后的X轴旋转roll。 - 在SciPy中,Rotation对象的乘法
r_a * r_b表示先执行r_b的旋转,再执行r_a的旋转(复合旋转的顺序是右到左)。
你的r2函数中,乘法顺序写反了:你用了r_x * r_y * r_z(先X旋转,再Y,再Z),但内旋Z-Y-X对应的正确乘法顺序应该是r_z * r_y * r_x(先Z旋转,再Y,再X)。
2. 修正后的代码
将r2函数的乘法顺序调整后,结果就会和r1一致:
from scipy.spatial.transform import Rotation as R def r1(roll, pitch, yaw): r = R.from_euler("ZYX", (yaw, pitch, roll), degrees=True) yaw, pitch, roll = r.as_euler("ZYX", degrees=True) print(f"r:{roll:5.1f} p:{pitch:5.1f} y:{yaw:5.1f}") def r2(roll, pitch, yaw): # 按Z-Y-X内旋顺序构造:先Z轴旋转,再Y轴,再X轴 r_z = R.from_euler("ZYX", (yaw, 0, 0), degrees=True) r_y = R.from_euler("ZYX", (0, pitch, 0), degrees=True) r_x = R.from_euler("ZYX", (0, 0, roll), degrees=True) # 乘法顺序:先执行r_x,再r_y,再r_z → 对应内旋Z-Y-X r = r_z * r_y * r_x yaw_out, pitch_out, roll_out = r.as_euler("ZYX", degrees=True) print(f"r:{roll_out:5.1f} p:{pitch_out:5.1f} y:{yaw_out:5.1f}") r1(35, 25, 115) # 输出: r: 35.0 p: 25.0 y: 115.0 r2(35, 25, 115) # 输出: r: 35.0 p: 25.0 y: 115.0
3. 关键概念澄清
- 内旋(Intrinsic Rotations):每次旋转绕的是当前坐标系的轴(旋转后的轴),而非初始固定坐标系的轴。这是
from_euler默认的旋转模式(可通过extrinsic=False参数显式指定)。 - Rotation乘法规则:
r = r1 * r2等价于对向量先应用r2的旋转,再应用r1的旋转,对应矩阵乘法中的R = R1 @ R2(矩阵左乘)。
内容的提问来源于stack exchange,提问作者iter
相关产品推荐
相关产品推荐

