1、用Z-Y-X(α-β-γ)欧拉角约定表示法,写出matlab程序。当用户输入欧拉角α-β-γ时,计算旋转矩阵 [公式] ,例:1)α = 10°,β = 20°,γ = 30°

欧拉角每次都是绕运动坐标系的各轴旋转而不是绕固定坐标旋转。其旋转矩阵和示意图如下:

matlab程序:

 %输入欧拉角度
alpha = input('Roatate around the z-axis in alpha = ');
beta  = input('Roatate around the y-axis in alpha = ');
gamma = input('Roatate around the x-axis in alpha = ');
%分别计算出绕X、Y、Z轴的旋转算子
RZ = [cosd(alpha)  -sind(alpha)  0  
      sind(alpha)  cosd(alpha)   0  
         0           0         1];
RY = [cosd(beta)  0   sind(beta)   
           0      1       0       
     -sind(beta)   0   cosd(beta)];
RX = [ 1       0            0        
       0   cosd(gamma)   -sind(gamma)  
       0   sind(gamma)    cosd(gamma)];
T =RZ*RY*RX     %计算旋转矩阵TAB            

输入各角度后获得旋转矩阵:

2、编写一个MATLAB程序。当输入旋转矩阵R时,计算出欧拉角α-β-gamma(反解问题)。计算两个可能的解。证明1中情况的反解,并检查你的结果是否正确。

由于旋转轴的旋转方式不同,一共有3x2x2=12种方式,以下将主要求解Z-Y-X欧拉角和Z-Y-Z欧拉角两种方式的解。旋转矩阵采用1中的结果,其中Z-Y-X欧拉角:

Z-Y-Z欧拉角:

matlab代码:

R = T;
%Z-Y-X欧拉角
beta = atan2(-R(3,1),sqrt(R(1,1)^2+R(2,1)^2));
alpha = atan2(R(2,1)/cos(beta),R(1,1)/cos(beta));
gamma = atan2(R(3,2)/cos(beta),R(3,3)/cos(beta));
disp('Z-Y-X欧拉角为:')
A = rad2deg([alpha beta gamma])
%Z-Y-Z欧拉角
beta = atan2(sqrt(R(3,1)^2+R(3,2)^2),R(3,3));
alpha = atan2(R(2,3)/sin(beta),R(1,3)/sin(beta));
gamma = atan2(R(3,2)/sin(beta),-R(3,1)/sin(beta));
disp('Z-Y-Z欧拉角为:')
B = [alpha beta gamma]
%验证Z-Y-Z结果正确性
T1 = rotz(alpha)*roty(beta)*rotz(gamma)

经过验证,反解后的角度和1一样,同时采用另一种解验证结果也与1一样。

3、仅简单的绕Y轴旋转β角。已知β = 20°和 [公式] = [ 1 0 1]',计算 [公式] 

[公式]

beta = 20;     %旋转角度

%旋转矩阵
RY = [cosd(beta)  0   sind(beta)   
           0      1       0       
     -sind(beta)   0   cosd(beta)];  
 PB = [ 1 0 1]';   
 PA = RY*PB

4、通matlab Robotics工具箱验算上面的一些结果。使用rpy2r(),tr2rpy(),rotx(),roty(),rotz()等函数。

%输入欧拉角度
alpha = input('Roatate around the z-axis in alpha = ');
beta  = input('Roatate around the y-axis in alpha = ');
gamma = input('Roatate around the x-axis in alpha = ');
%计算旋转矩阵
T1 = rotz(alpha,'deg')*roty(beta,'deg')*rotx(gamma,'deg')
T2 = rpy2r(gamma,beta,alpha,'deg')
angle = rad2deg(tr2rpy(T2))

由上可知,求解旋转矩阵既可以用rotx()等函数,也可以使用rpy2r函数。使用方法可参考前面的文章。注意rpy2r()的使用方法和其原理。在matlab中输入edit rpy2r将可查看其函数代码。

T = rpy2r(roll,pitch,yaw,options)

该函数默认为绕Z-Y-X轴旋转,同时也可通过options选择其他旋转方法。在默认情况下,该函数结果相当于:[公式] = rotz(yaw)*roty(pitch)*rotx(roll) (注意角度的顺序)。知道rpy2r的原理后,tr2rpy(r)就是其逆过程。