【发布时间】:2016-12-31 21:36:52
【问题描述】:
分解旋转矩阵 (x,y',z'') - 笛卡尔角
我目前正在使用 旋转矩阵,但遇到以下问题:
给定三个重合的坐标系 (O0,x0,y0,z0; O1,x1,y1,z1; O2,x2,y2,z2)。我们首先相对于帧#0 旋转帧#1,然后相对于帧#1 旋转帧#2。
旋转的顺序:R = Rx_alpha * Ry_beta * Rz_gamma,所以首先是x,然后是y',然后是 z'',也称为 笛卡尔角。
如果 R1 代表第 1 次旋转,R2 代表第 2 次旋转,我们正在寻找第 2 帧相对于初始帧(#0)在两次旋转之后的角度。这可以通过分解旋转矩阵 R(其中:R = R1*R2)来完成。有很多文献可用,如何通过欧拉角和 RPY 角来完成,但我没有找到任何关于在笛卡尔角的情况下如何解决这个问题的文献。
我有一个 matlab 函数,它只能通过简单的旋转来工作。如果所有角度的值都不是 0(下例),那么结果就会变得非常不稳定。
第 1 帧相对于第 0 帧的方向:
alpha1 = 30*pi/180;
beta1 = 10*pi/180;
gamma1 = 0*pi/180;
第 2 帧相对于第 1 帧的方向
alpha2 = 10*pi/180;
beta2 = 10*pi/180;
gamma2 = 0*pi/180;
我用来解决问题的matlab函数:
function [q] = cartesian_angles(R)
beta = asin(R(1,3));
*% Catching the numerical singularty*
if abs(abs(beta)-pi/2) > eps;
*% singulartiy of acos*
gamma1 = acos(R(1,1) / cos(beta));
gamma2 = asin(-R(1,2) / cos(beta));
if gamma2<0
gamma=2*pi-gamma1;
else
gamma=gamma1;
end
alpha1 = acos(R(3,3) / cos(beta));
alpha2 = asin(-R(2,3) / cos(beta));
if alpha2<0
alpha = 2*pi-alpha1;
else
alpha = alpha1;
end
else
fprintf('beta=pi/2 \n')
gamma = 0;
alpha = 0;
beta = 0;
end;
alpha = alpha*180/pi;
beta = beta*180/pi;
gamma = gamma*180/pi;
q = [alpha; beta; gamma];
感谢您的帮助!如果您有任何问题,请不要犹豫!
马西
【问题讨论】:
-
首先,Matlab 有一个名为 atan2() 的函数,它可以为您节省一些麻烦。其次,我认为欧拉角与您在这里尝试使用的相同。我错了吗?
-
我知道 atan2 功能,但老实说,我对使用它还没有信心,我不知道如何将它包含到上面的代码中。通过欧拉角,第一次和最后一次旋转的轴总是相同的(例如:Z,X',Z'')。通过万向角,我们围绕每个轴旋转一次(例如:X、Y'、Z''),但是,旋转的顺序可能会有所不同(根据此链接:kwon3d.com/theory/euler/euler_angles.html)。在我的理解中,这意味着 Roll-Pitch-Yaw 角 (Z,Y',X'') 只是一种特殊的万向角。我在找什么:X,Y',Z''
标签: matlab rotational-matrices cartesian decomposition