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
差异原因
- 欧拉角的多值性:同一个旋转矩阵可以对应多组等价的欧拉角,不同角度组合能实现完全相同的旋转效果。
- Eigen的角度范围约束:Eigen的
eulerAngles方法会强制将中间旋转轴(此处为Y轴,对应pitch)的角度限制在[-90°, 90°]区间内。当实际旋转需要中间轴角度超出该范围时,它会通过调整另外两个轴的角度生成等价的欧拉角表示。- 对应本例,Eigen将原本的
yaw=-160.82°, pitch=0°转换为了yaw=19.18°, pitch=180°(两者旋转效果完全一致),但你只对比了yaw值,忽略了pitch的差异。
- 对应本例,Eigen将原本的
- 其他方法的角度范围逻辑:Python的
scipy.spatial.transform.R和你实现的常规方法,默认将yaw的取值范围设为[-180°, 180°],不会对中间轴角度做强制约束,因此直接输出了该区间内的结果。
统一结果的方法
如果需要让Eigen的输出和其他方法一致,可以手动对结果做转换:
当Eigen返回的pitch为180°时,将yaw减去180°,同时将pitch设为0°,即可得到yaw=-160.82°的结果。
内容的提问来源于stack exchange,提问作者ry w
相关产品推荐
相关产品推荐

