在工业机器人坐标变换中,旋转矩阵与欧拉角有几个概念比较容易混淆,根据自己的理解整理如下,如有问题,欢迎指正
因为欧拉角相对旋转矩阵更为直观,直接用绕坐标轴的旋转可以得到,因此将旋转矩阵转换为欧拉角会方便分析
在位姿变换相关资料中(可参照 J. J. Craig 《Introduction to Robotics》),位姿矩阵的描述如下
上面这样的位姿描述,指的是主动旋转矩阵,即向量或子坐标系绕坐标轴主动旋转的旋转矩阵,也是机器人坐标变换通常会采取的旋转方式,写成 matlab 函数如下(a输入‘X’,'Y','Z',B输入旋转角度)
function y = Rot3( a ,B )
b = deg2rad(B);
switch a
case 'X'
y=[1,0,0;0,cos(b),-sin(b);0,sin(b),cos(b)];
case 'Y'
y=[cos(b),0,sin(b);0,1,0;-sin(b),0,cos(b)];
case 'Z'
y=[cos(b),-sin(b),0;sin(b),cos(b),0;0,0,1];
end
与此区分的是被动旋转矩阵,向量或子坐标系不变,基坐标系旋转的旋转矩阵,这类被动旋转矩阵与上面的三个矩阵互为转置(互为逆矩阵,对于旋转矩阵是等价的),也可以理解为被动旋转矩阵让向量或子坐标系旋转到基坐标系位置,而 matlab 中的 dcm2angle,angle2dcm 均对应的是被动旋转:
Mat_t = [cos(pi/3),-sin(pi/3),0;sin(pi/3),cos(pi/3),0;0,0,1];
[ra,rb,rc]=dcm2angle(Mat_t,'ZYX');
%此处 ra 为 -60 度,可见 Matlab 中采用的是被动旋转,sin的符号和主动旋转矩阵相反
因此,在采用matlab 中 dcm2angle 计算欧拉角时,需要注意对旋转矩阵进行转置(R3'),以‘ZYX’欧拉角为例:
R3 = Rot3('Z',20)*Rot3('Y',60)*Rot3('X',40)
[ra,rb,rc]=dcm2angle(R3','ZYX');
M3 = Rot3r('Z',ra)*Rot3r('Y',rb)*Rot3r('X',rc)
d=[ra,rb,rc]./pi.*180
这样,计算结果 d = 20.0000 60.0000 40.0000 ,与常用主动旋转矩阵一致,R3与M3也一致,如果R3‘转置去掉,改为
[ra,rb,rc]=dcm2angle(R3,'ZYX');
则结果为从R3转换到基坐标的欧拉角,对应M3为R3的逆矩阵
需要注意的是,主动/被动旋转不等同于基坐标系、连体坐标系的变换,在主动旋转矩阵下,仍然要区分按照固定基坐标系坐标轴,还是按照旋转后的连体坐标新坐标轴旋转,按照右乘连体左乘基的方式进行计算