ZYZ和ZXZ通常可以避免死解情况,因此在六轴末端解算时常被用到
对于其如何旋转(内旋 - 计算右乘)在此篇文章有较好的图解 马同学
1.ZYZ
2.ZXZ
ZXZ的公式经过计算有些许更改
3.ZYX
4.XYZ
这里建议无论是用Matlab/ python /C++进行计算都不要依靠现有函数 如Eigen Matlab的Robotic toolbox等计算欧拉角转旋转矩阵,还是自己手打一遍为妙,且弧度之间的计算对于精度往往有较高的要求
matlab代码
函数:
function euler_angles = M2A(R)
% 计算第二个 CAC 角度 beta
A1 = atan((R(1, 3)/-R(2, 3)));
% 计算第一个 CAC 角度 alpha
A2 = atan( sqrt(1-(R(3, 3)^2) )/ R(3, 3) );
% 计算第三个 CAC 角度 gamma
A3 = atan((R(3, 1)/R(3, 2)));
% 将角度转换为度
alpha_deg = rad2deg(A1);
beta_deg = rad2deg(A2);
gamma_deg = rad2deg(A3);
% 输出结果
euler_angles = [alpha_deg, beta_deg, gamma_deg];
end
function R = A2M(A)
% 将角度转换为弧度
a = deg2rad(A(1));
b = deg2rad(A(2));
c = deg2rad(A(3));
% 计算旋转矩阵 R
%R = [-sin(a)*cos(b)*sin(c)+cos(a)*cos(c), -sin(a)*cos(b)*cos(c)-cos(a)*cos(c), sin(a)*sin(b);
% cos(a)*cos(b)*sin(c)+sin(a)*cos(c), cos(a)*cos(b)*cos(c)-sin(a)*sin(c), -cos(a)*sin(b);
% sin(b)*sin(c), sin(b)*cos(c), cos(b)];
R = [
-sin(a)*cos(b)*sin(c)+cos(a)*cos(c), -sin(a)*cos(b)*cos(c)-cos(a)*cos(c), sin(a)*sin(b);
cos(a)*cos(b)*sin(c)+sin(a)*cos(c), cos(a)*cos(b)*cos(c)-sin(a)*sin(c), -cos(a)*sin(b);
sin(b)*sin(c), sin(b)*cos(c), cos(b)];
end
用法:
% 偏移量
OFFSET= [
0.999983345362356 -0.989320929731509 0.005769914357140 -0.698
-0.002653709599899 0.877378951203345 0.479790718762544 -60.547
-0.005125116903033 -0.479798039699098 0.877363991897110 400.856
0 0 0 1
]
OFFSET_ABC = M2A(OFFSET)
用的比较多的几个网站连接