之路"/>
学习之路
ZYZ和ZXZ通常可以避免死解情况,因此在六轴末端解算时常被用到
对于其如何旋转(内旋 - 计算右乘)在此篇文章有较好的图解 马同学
1.ZYZ
2.ZXZ
3.ZYX
这里建议无论是用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];
endfunction 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.8560 0 0 1]OFFSET_ABC = M2A(OFFSET)
更多推荐
学习之路
发布评论