为什么旋转矩阵的欧拉解在MatLab和Python语言中不同

c9x0cxw0  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(226)

当我用MatLab和Python从Euler变换到旋转矩阵时,我得到了不同的结果,我不知道为什么。
Python代码

from scipy.spatial.transform import Rotation as R
cam_angle = 45
R.from_euler('xyz', [-90-cam_angle, 0, -90], degrees=True).as_matrix()

提供:

array([[ 0.        , -0.70710678,  0.70710678],
       [-1.        ,  0.        ,  0.        ],
       [ 0.        , -0.70710678, -0.70710678]])

MatLab代码

cam_angle = 45
eul2rotm(deg2rad([-90-cam_angle, 0, -90]),'xyz')

提供:

0.0000    1.0000         0
0.7071   -0.0000    0.7071
0.7071   -0.0000   -0.7071

有谁有主意吗?

k5ifujac

k5ifujac1#

在您的Python代码中,from_eulerseq参数使用大写的'XYZ',以使用内部旋转,这似乎是您的MATLAB正在使用的约定。(此约定在不同的MatLab函数中有所不同。参见詹姆斯·特萨的评论。)

from scipy.spatial.transform import Rotation as R
cam_angle = 45
R.from_euler('XYZ', [-90-cam_angle, 0, -90], degrees=True).as_matrix()

结果:

array([[ 0.        ,  1.        ,  0.        ],
       [ 0.70710678,  0.        ,  0.70710678],
       [ 0.70710678,  0.        , -0.70710678]])

来自Scipy Docs的评论:
参数:seq字符串
指定旋转轴的顺序。最多3个字符属于集合{‘X’,‘Y’,‘Z’}用于内部旋转,或{‘x’,‘y’,‘z’}用于外部旋转。外部旋转和内部旋转不能在一个函数调用中混合使用。

相关问题