Matlab化简机械臂正运动学表达式(采用DH矩阵推导)

我们在求解机械臂的正运动学的时候,对于在写论文的过程,我们需要对最终的位姿矩阵进行相应的化简,比如把sin(q1) 写成 S1,cos(q1) 写成 C1等等之类,之前我在处理这些表达式的时候,都是一个一个手动去替换,一个一个 ctrl+F,对于六自由度的机械臂来说真心好累。
  今天我利用Matlab 中的一些基本语句实现了对位姿矩阵的自动化简。
  一般在DH参数中 theta 和 alpha 会有角度的变化,一般都是 加减 pi/2,对于alpha 我在DH函数中进行了处理。而对于theta 的角度变化,在DH 函数中不好进行处理,所以需要在求出位姿矩阵之后统一化简处理。

%% 采用DH法计算机械臂的正运动学
%% 输入为 角度 单位是 弧度
function T=FK_DH_S()

syms  q S C real;
syms  qq_1 qq_2 qq_3 qq_4 qq_5 qq_6 real;
syms   a2 a3  real;
syms   S1 S2 S3 S4 S5 S6 C1 C2 C_3 C4 C5 C6 real ;

A1 = DH (qq_1, 0, 0, 0);
A2 = DH (qq_2, 0, a2, pi/2);
A3 = DH (qq_3-pi/2, 0, a3, 0);

T = A1*A2*A3;
T_temp=T;

n=3; %机械臂自由度的个数
% theta 常见的角度组合
SC_simplify=[sin(q) sin(q+pi/2) sin(q-pi/2) cos(q) cos(q+pi/2) cos(q-pi/2)] ;
% theta常见角度的正余弦变换
sc_simplify=[S -C C C -S S];

qq=[qq_1 qq_2 qq_3 qq_4 qq_5 qq_6];

sc_simplify_temp=sc_simplify;

for i=1:1:n
   SC_simplify_temp=subs(SC_simplify,q,qq(i));
    for j=1:1:6
      sc_simplify_temp(j)=sprintf('%s%d',sc_simplify(j),i);
      T=subs(T, SC_simplify_temp(j),sc_simplify_temp(j));
    end
end

disp(T);
disp(T_temp);

end



function A = DH(theta_z, d_z, a_x, alpha_x)

A_R_z = [cos(theta_z) -sin(theta_z) 0 0;
         sin(theta_z) cos(theta_z) 0 0;
         0 0 1 0;
         0 0 0 1];

A_T_z = [1 0 0 0;
         0 1 0 0;
         0 0 1 d_z;
         0 0 0 1];

A_T_x = [1 0 0 a_x;
         0 1 0 0;
         0 0 1 0;
         0 0 0 1];

if alpha_x==0
     A_R_x = [1 0 0 0;
         0 1 0  0;
         0 0 1 0;
         0 0 0 1];
 elseif alpha_x==pi/2
       A_R_x = [1 0 0 0;
         0 0 -1  0;
         0 1 0 0;
         0 0 0 1];
 elseif alpha_x==-pi/2
       A_R_x = [1 0 0 0;
         0 0 1  0;
         0 -1 0 0;
         0 0 0 1];
 else
     A_R_x = [1           0             0          0;
         0      cos( alpha_x)     -sin( alpha_x) 0;
         0       sin( alpha_x)    cos( alpha_x) 0;
         0      0                 0           1];
 end

A = A_R_z*A_T_z*A_T_x*A_R_x;
end

结果如下:

T =
 
[ -S3*(S1*S2 - C1*C2),  C3*(S1*S2 - C1*C2), C1*S2 + C2*S1, C1*C2*a2 - S3*a3*(S1*S2 - C1*C2) - S1*S2*a2]
[  S3*(C1*S2 + C2*S1), -C3*(C1*S2 + C2*S1), S1*S2 - C1*C2, C1*S2*a2 + C2*S1*a2 + S3*a3*(C1*S2 + C2*S1)]
[                  C3,                  S3,             0,                                       C3*a3]
[                   0,                   0,             0,                                           1]
 
 
T_temp =
 
[ cos(qq_3 - pi/2)*(cos(qq_1)*cos(qq_2) - sin(qq_1)*sin(qq_2)), -sin(qq_3 - pi/2)*(cos(qq_1)*cos(qq_2) - sin(qq_1)*sin(qq_2)), cos(qq_1)*sin(qq_2) + cos(qq_2)*sin(qq_1), a3*cos(qq_3 - pi/2)*(cos(qq_1)*cos(qq_2) - sin(qq_1)*sin(qq_2)) + a2*cos(qq_1)*cos(qq_2) - a2*sin(qq_1)*sin(qq_2)]
[ cos(qq_3 - pi/2)*(cos(qq_1)*sin(qq_2) + cos(qq_2)*sin(qq_1)), -sin(qq_3 - pi/2)*(cos(qq_1)*sin(qq_2) + cos(qq_2)*sin(qq_1)), sin(qq_1)*sin(qq_2) - cos(qq_1)*cos(qq_2), a3*cos(qq_3 - pi/2)*(cos(qq_1)*sin(qq_2) + cos(qq_2)*sin(qq_1)) + a2*cos(qq_1)*sin(qq_2) + a2*cos(qq_2)*sin(qq_1)]
[                                             sin(qq_3 - pi/2),                                              cos(qq_3 - pi/2),                                         0,                                                                                               a3*sin(qq_3 - pi/2)]
[                                                            0,                                                             0,                                         0,                                                                                                                 1]
 

从结果中可以看出,化简的结果都是正确的。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独坐寒江边

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值