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

Eigen提取欧拉角Yaw值与其他方法结果不一致问题咨询

Eigen提取RPY角与其他方法结果差异的原因

目标旋转矩阵:

-0.944488  0.328545        -0
-0.328545 -0.944488         0
0         0         1

三种实现及输出

Eigen实现

Eigen::Vector3d euler = rotationMatrix.eulerAngles(2, 1, 0);
yaw = euler[0];
pitch = euler[1];
roll = euler[2];

输出:yaw: 19.1805(注:完整输出应为yaw:19.1805, pitch:180, roll:0)

Python实现

import numpy as np
from scipy.spatial.transform import Rotation as R

rotation_matrix = np.array([[-0.944488, 0.328545, -0],
                            [-0.328545, -0.944488, 0],
                            [0, 0, 1]])
r = R.from_matrix(rotation_matrix)
euler = r.as_euler('ZYX', degrees=True)
yaw = euler[0];
pitch = euler[1];
roll = euler[2];

输出:yaw: -160.81951023009094

常规方法实现

double yaw = std::atan2(R(1, 0), R(0, 0));

输出:yaw: -160.82

差异原因

  1. 欧拉角的多值性:同一个旋转矩阵可以对应多组等价的欧拉角,不同角度组合能实现完全相同的旋转效果。
  2. Eigen的角度范围约束:Eigen的eulerAngles方法会强制将中间旋转轴(此处为Y轴,对应pitch)的角度限制在[-90°, 90°]区间内。当实际旋转需要中间轴角度超出该范围时,它会通过调整另外两个轴的角度生成等价的欧拉角表示。
    • 对应本例,Eigen将原本的yaw=-160.82°, pitch=0°转换为了yaw=19.18°, pitch=180°(两者旋转效果完全一致),但你只对比了yaw值,忽略了pitch的差异。
  3. 其他方法的角度范围逻辑:Python的scipy.spatial.transform.R和你实现的常规方法,默认将yaw的取值范围设为[-180°, 180°],不会对中间轴角度做强制约束,因此直接输出了该区间内的结果。

统一结果的方法

如果需要让Eigen的输出和其他方法一致,可以手动对结果做转换:
当Eigen返回的pitch为180°时,将yaw减去180°,同时将pitch设为0°,即可得到yaw=-160.82°的结果。


内容的提问来源于stack exchange,提问作者ry w

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:17:44