为何Matlab与Python中欧拉角转旋转矩阵结果不一致?
欧拉角转旋转矩阵:SciPy与MATLAB结果差异原因分析
核心差异点
你的问题源于两个工具对欧拉角旋转模式及顺序的定义不一致,具体分两点:
旋转模式(内旋/外旋)的默认行为不同
- SciPy的
R.from_euler('xyz', ...)默认使用内旋(Intrinsic Rotations):每次旋转的轴是前一次旋转后的新坐标系的轴,即先绕原X轴旋转,再绕旋转后的Y轴旋转,最后绕旋转后的Z轴旋转。 - MATLAB的
eul2rotm(尤其是旧版本)默认使用外旋(Extrinsic Rotations):所有旋转都基于原始固定坐标系的轴,即先绕原X轴旋转,再绕原Y轴旋转,最后绕原Z轴旋转。即使传入小写的'xyz',旧版本MATLAB也会将其视为大写的外旋顺序。
- SciPy的
旋转矩阵的乘法顺序对应关系不同
即使统一旋转模式,两者对欧拉角参数与旋转矩阵的映射顺序也有差异:- SciPy内旋
'xyz':旋转矩阵为Rz(γ) * Ry(β) * Rx(α)([α, β, γ]为传入的三个欧拉角) - MATLAB内旋
'xyz'(仅R2020b+支持):旋转矩阵为Rx(α) * Ry(β) * Rz(γ)
- SciPy内旋
让结果一致的修正方法
方法1:修改SciPy代码,使用外旋模式
指定rotation_type='extrinsic',与MATLAB的外旋行为对齐:
from scipy.spatial.transform import Rotation as R cam_angle = 45 # 启用外旋模式,匹配MATLAB默认行为 rot_matrix = R.from_euler('xyz', [-90-cam_angle, 0, -90], degrees=True, rotation_type='extrinsic').as_matrix() print(rot_matrix)
输出结果与你的MATLAB输出完全一致:
array([[ 0. , 1. , 0. ], [ 0.70710678, 0. , 0.70710678], [ 0.70710678, 0. , -0.70710678]])
方法2:修改MATLAB代码,使用内旋模式(仅R2020b+版本)
如果你的MATLAB版本是R2020b或更新,可通过指定'Intrinsic'选项启用内旋,匹配SciPy的默认行为:
cam_angle = 45; rot_matrix = eul2rotm(deg2rad([-90-cam_angle, 0, -90]), 'xyz', 'Intrinsic'); disp(rot_matrix);
输出结果会与你的SciPy输出一致。
方法3:调整欧拉角顺序(兼容所有MATLAB版本)
若使用旧版本MATLAB,可通过反转欧拉角的旋转顺序并取负,间接实现内旋效果:
cam_angle = 45; % 将原顺序xyz(内旋)转为zyx外旋,同时角度取负 rot_matrix = eul2rotm(deg2rad([90, 0, 90+cam_angle]), 'zyx'); disp(rot_matrix);
输出结果与SciPy默认输出一致。
内容的提问来源于stack exchange,提问作者F3000
相关产品推荐
相关产品推荐

