You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:30:51