学习之路 | 欧拉角-四元数-旋转矩阵相互转化 ZYZ / ZXZ / ZYX - 附Matlab代码

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)

3D Rotation Converter

矩阵计算器

用的比较多的几个网站连接

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值