当前位置:   article > 正文

MATLAB - 双连杆机械臂逆运动学的推导及应用_二连杆逆运动学

二连杆逆运动学

系列文章目录

 


前言

本示例展示了如何使用 MATLAB® 和 Symbolic Math Toolbox™ 对双连杆机械臂推导和应用逆运动学。

该示例以符号方式定义关节参数和末端执行器位置,计算正向和逆向运动学解法并将其可视化,同时求出系统雅各布系数,这对模拟机械臂的运动非常有用。

92e72b9b989147c187734bfd17e8acbe.png


 

一、步骤 1:定义几何参数

将机器人的连杆长度、关节角度和末端执行器位置定义为符号变量。

syms L_1 L_2 theta_1 theta_2 XE YE

指定机器人连杆长度的数值。

  1. L1 = 1;
  2. L2 = 0.5;

二、步骤 2:定义末端执行器的 X 和 Y 坐标

 c3b57ac1505d46a6a59a734a8a45d79e.png

 将末端执行器的 X 和 Y 坐标定义为关节角度 eq?%28%5Ctheta_1%2C%5Ctheta_2%29函数

XE_RHS = L_1*cos(theta_1) + L_2*cos(theta_1+theta_2)

eq?%5Ctext%7BXE%5C_RHS%7D%3DL_2%5Ccos%28%5Ctheta_1+%5Ctheta_2%29+L_1%5Ccos%28%5Ctheta_1%29

YE_RHS = L_1*sin(theta_1) + L_2*sin(theta_1+theta_2)

eq?%5Ctext%7BYE%5C_RHS%7D%3DL_2%5Csin%28%5Ctheta_1+%5Ctheta_2%29+L_1%5Csin%28%5Ctheta_1%29

将符号表达式转换为 MATLAB 函数。 

  1. XE_MLF = matlabFunction(XE_RHS,'Vars',[L_1 L_2 theta_1 theta_2]);
  2. YE_MLF = matlabFunction(YE_RHS,'Vars',[L_1 L_2 theta_1 theta_2]);

 三、步骤 3:计算正运动学并将其可视化

前向运动学将关节角度转换为末端执行器位置: eq?%28%5Ctheta_1%2C%5Ctheta_2%29%5Clongrightarrow%20f%28%5Ctheta_1%2C%5Ctheta_2%29%5Clongrightarrow%28X_E%2CY_E%29。给定具体的关节角度值,使用前向运动学计算末端执行器位置。

指定关节角度的输入值为 eq?0%5E%7B%5Ccirc%7D%3C%5Ctheta_%7B1%7D%3C90%5E%7B%5Ccirc%7D%5Cmathrm%7B~and~%7D-180%5E%7B%5Ccirc%7D%3C%5Ctheta_%7B2%7D%3C180%5E%7B%5Ccirc%7D.

  1. t1_degs_row = linspace(0,90,100);
  2. t2_degs_row = linspace(-180,180,100);
  3. [tt1_degs,tt2_degs] = meshgrid(t1_degs_row,t2_degs_row);

将角度单位从度转换为弧度。

  1. tt1_rads = deg2rad(tt1_degs);
  2. tt2_rads = deg2rad(tt2_degs);

分别使用 MATLAB 函数 XE_MLF 和 YE_MLF 计算 X 和 Y 坐标。

  1. X_mat = XE_MLF(L1,L2,tt1_rads,tt2_rads);
  2. Y_mat = YE_MLF(L1,L2,tt1_rads,tt2_rads);

使用辅助函数 plot_XY_given_theta_2dof 可视化 X 和 Y 坐标。

plot_XY_given_theta_2dof(tt1_degs,tt2_degs,X_mat,Y_mat,(L1+L2))

701b9fabe4ed40a69eaab8fc7b7bf5c0.png

四、步骤 4:计算逆运动学

逆运动学将末端执行器的位置转换为关节角度: eq?%28XE%2CYE%29%5Clongrightarrow%20g%28XE%2CYE%29%5Clongrightarrow%28%5Ctheta1%2C%5Ctheta2%29。根据正向运动学方程求出逆向运动学。

定义正向运动学方程。

  1. XE_EQ = XE == XE_RHS;
  2. YE_EQ = YE == YE_RHS;

求解 θ 1 和 θ 2 .

S = solve([XE_EQ YE_EQ], [theta_1 theta_2])
  1. S = struct with fields:
  2. theta_1: [2x1 sym]
  3. theta_2: [2x1 sym]

结构 S 表示 θ1 和 θ2 的多个解。显示 θ1 的一对解。

simplify(S.theta_1)

eq?%5Cbegin%7Baligned%7D%5Ctext%7Bans%7D%26%3D%5Cleft.%5Cleft%28%5Cbegin%7Baligned%7D2%5Carctan%26%5Cleft%28%5Cfrac%7B2L_1%5Cmathrm%7BYE%7D+%5Csigma_1%7D%7BL_1%5E2+2L_1%5Cmathrm%7BXE%7D-L_2%5E2+%5Cmathrm%7BXE%7D%5E2+%5Cmathrm%7BYE%7D%5E2%7D%5Cright%29%5C%5C2%5Carctan%26%5Cleft%28%5Cfrac%7B2L_1%5Cmathrm%7BYE%7D-%5Csigma_1%7D%7BL_1%5E2+2L_1%5Cmathrm%7BXE%7D-L_2%5E2+%5Cmathrm%7BXE%7D%5E2+%5Cmathrm%7BYE%7D%5E2%7D%5Cright%29%5Cend%7Baligned%7D%5Cright.%5Cright%29%5Cend%7Baligned%7D

eq?%5Cbegin%7Baligned%7D%5Cmathrm%7Bwhere%7D%5C%5C%5C%5C%5Csigma_1%26%3D%5Csqrt%7B-%7BL_1%7D%5E4+2%7BL_1%7D%5E2%7BL_2%7D%5E2+2%7BL_1%7D%5E2%7B%5Cmathrm%7BXE%7D%7D%5E2+2%7BL_1%7D%5E2%7B%5Cmathrm%7BYE%7D%7D%5E2-%7BL_2%7D%5E4+2%7BL_2%7D%5E2%7B%5Cmathrm%7BXE%7D%7D%5E2+2%7BL_2%7D%5E2%7B%5Cmathrm%7BYE%7D%7D%5E2-%7B%5Cmathrm%7BXE%7D%7D%5E4-2%7B%5Cmathrm%7BXE%7D%7D%5E2%7B%5Cmathrm%7BYE%7D%7D%5E2-%7B%5Cmathrm%7BYE%7D%7D%5E4%7D%5Cend%7Baligned%7D

显示 θ2 的一对解。 

simplify(S.theta_2)

eq?%5Cbegin%7Barray%7D%7Brl%7D%5Ctext%7Bans%7D%26%3D%5C%5C%26%5Cbinom%7B-%5Csigma_1%7D%7B%5Csigma_1%7D%5Cend%7Barray%7D

eq?%5Cbegin%7Baligned%7D%26%5Ctext%7Bwhere%7D%5C%5C%5C%5C%26%5Csigma_1%3D2%5Carctan%5Cbiggl%28%5Cfrac%7B%5Csqrt%7B%5Cleft%28-L_1%7B%7D%5E2+2L_1L_2-L_2%7B%7D%5E2+X%5Cmathrm%7BE%7D%5E2+%5Cmathrm%7BY%7D%5Cmathrm%7BE%7D%5E2%5Cright%29%5Cleft%28L_1%7B%7D%5E2+2L_1L_2+L_2%7B%7D%5E2-%5Cmathrm%7BX%7D%5Cmathrm%7BE%7D%5E2-%5Cmathrm%7BY%7D%5Cmathrm%7BE%7D%5E2%5Cright%29%7D%7D%7B-L_1%7B%7D%5E2+2L_1L_2-L_2%7B%7D%5E2+%5Cmathrm%7BX%7D%5Cmathrm%7BE%7D%5E2+%5Cmathrm%7BY%7D%5Cmathrm%7BE%7D%5E2%7D%5Cbiggr%29%5Cend%7Baligned%7D

将解法转换为稍后可以使用的 MATLAB 函数。函数 TH1_MLF 和 TH2_MLF 表示逆运动学。 

  1. TH1_MLF{1} = matlabFunction(S.theta_1(1),'Vars',[L_1 L_2 XE YE]);
  2. TH1_MLF{2} = matlabFunction(S.theta_1(2),'Vars',[L_1 L_2 XE YE]);
  3. TH2_MLF{1} = matlabFunction(S.theta_2(1),'Vars',[L_1 L_2 XE YE]);
  4. TH2_MLF{2} = matlabFunction(S.theta_2(2),'Vars',[L_1 L_2 XE YE]);

五、步骤 5:计算并展示逆运动学

使用逆运动学计算 θ1 和 θ2。

定义 X 和 Y 坐标的网格点。

[xmat,ymat] = meshgrid(0:0.01:1.5,0:0.01:1.5);

分别使用 MATLAB 函数 TH1_MLF{1} 和 TH2_MLF{1} 计算角度 θ1 和 θ2。

  1. tmp_th1_mat = TH1_MLF{1}(L1,L2,xmat,ymat);
  2. tmp_th2_mat = TH2_MLF{1}(L1,L2,xmat,ymat);

将角度单位从弧度转换为度。

  1. tmp_th1_mat = rad2deg(tmp_th1_mat);
  2. tmp_th2_mat = rad2deg(tmp_th2_mat);

某些输入坐标,如 (X,Y) = (1.5,1.5),超出了末端效应器的可触及工作空间。逆运动学求解会产生一些需要修正的虚θ 值。修正虚θ 值。

  1. th1_mat = NaN(size(tmp_th1_mat));
  2. th2_mat = NaN(size(tmp_th2_mat));
  3. tf_mat = imag(tmp_th1_mat) == 0;
  4. th1_mat(tf_mat) = real(tmp_th1_mat(tf_mat));
  5. tf_mat = imag(tmp_th2_mat) == 0;
  6. th2_mat(tf_mat) = real(tmp_th2_mat(tf_mat));

使用辅助函数 plot_theta_given_XY_2dof 将角度 θ1 和 θ2 可视化。

plot_theta_given_XY_2dof(xmat,ymat,th1_mat,th2_mat)

26ceefb69dcf4eaba042c89f972b4e37.png

步骤 6:计算系统雅各布
系统雅各布的定义是

eq?J%3D%5Cdfrac%7Bd%28X%2CY%29%7D%7Bd%28%5Ctheta_1%2C%5Ctheta_2%29%7D%3D%5Cbegin%7Bpmatrix%7D%5Cdfrac%7BdX%7D%7Bd%5Ctheta_1%7D%26%5Cdfrac%7BdX%7D%7Bd%5Ctheta_2%7D%5C%5C%5Cdfrac%7BdY%7D%7Bd%5Ctheta_1%7D%26%5Cdfrac%7BdY%7D%7Bd%5Ctheta_2%7D%5Cend%7Bpmatrix%7D 

the_J = jacobian([XE_RHS YE_RHS],[theta_1 theta_2])

eq?%5Cbegin%7Baligned%7D%7Bthe%5C_J%7D%26%3D%5Cbinom%7B-L_2%5Csin%28%5Ctheta_1+%5Ctheta_2%29-L_1%5Csin%28%5Ctheta_1%29%5Cquad-L_2%5Csin%28%5Ctheta_1+%5Ctheta_2%29%7D%7BL_2%5Ccos%28%5Ctheta_1+%5Ctheta_2%29+L_1%5Ccos%28%5Ctheta_1%29%5Cquad%20L_2%5Ccos%28%5Ctheta_1+%5Ctheta_2%29%7D%5Cend%7Baligned%7D

 通过使用系统雅各布 J 及其摩尔-彭罗斯伪逆 J+,可以将关节速度与末端执行器速度联系起来,也可以反过来将末端执行器速度与关节速度联系起来:

eq?%5Cbegin%7Bpmatrix%7D%5Cdfrac%7BdX%7D%7Bdt%7D%5C%5C%5Cdfrac%7BdY%7D%7Bdt%7D%5Cend%7Bpmatrix%7D%3D%5Cbegin%7Bpmatrix%7D%5Cdfrac%7BdX%7D%7Bd%5Ctheta_1%7D%26%5Cdfrac%7BdX%7D%7Bd%5Ctheta_2%7D%5C%5C%5Cdfrac%7BdY%7D%7Bd%5Ctheta_1%7D%26%5Cdfrac%7BdY%7D%7Bd%5Ctheta_2%7D%5Cend%7Bpmatrix%7D.%5Cbegin%7Bpmatrix%7D%5Cdfrac%7Bd%5Ctheta_1%7D%7Bdt%7D%5C%5C%5Cdfrac%7Bd%5Ctheta_2%7D%7Bdt%7D%5Cend%7Bpmatrix%7D

eq?%5Cbegin%7Bpmatrix%7D%5Cdfrac%7BdX%7D%7Bdt%7D%5C%5C%5Cdfrac%7BdY%7D%7Bdt%7D%5Cend%7Bpmatrix%7D%3DJ.%5Cbegin%7Bpmatrix%7D%5Cdfrac%7Bd%5Ctheta_1%7D%7Bdt%7D%5C%5C%5Cdfrac%7Bd%5Ctheta_2%7D%7Bdt%7D%5Cend%7Bpmatrix%7D

eq?%5Cbegin%7Bpmatrix%7D%5Cdfrac%7Bd%5Ctheta_1%7D%7Bdt%7D%5C%5C%5Cdfrac%7Bd%5Ctheta_2%7D%7Bdt%7D%5Cend%7Bpmatrix%7D%3DJ%5E+%5Ccdot%5Cbegin%7Bpmatrix%7D%5Cdfrac%7BdX%7D%7Bdt%7D%5C%5C%5Cdfrac%7BdY%7D%7Bdt%7D%5Cend%7Bpmatrix%7D

您还可以将雅各比的符号表达式转换为 MATLAB 功能块。通过将多个航点定义为 Simulink® 模型的输入,模拟机器人在轨迹上的末端执行器位置。Simulink 模型可根据到达轨迹中每个航点的关节角度值计算运动轮廓。更多详情,请参阅 "2 连杆机械臂的逆运动学 "和 "刚体动力学教学"。 

七、辅助函数 

  1. function plot_theta_given_XY_2dof(X_mat,Y_mat,theta_1_mat_degs,...
  2. theta_2_mat_degs)
  3. xlab_str = 'X (m)';
  4. ylab_str = 'Y (m)';
  5. figure;
  6. hax(1) = subplot(1,2,1);
  7. contourf(X_mat, Y_mat, theta_1_mat_degs);
  8. clim(hax(1), [-180 180]);
  9. colormap(gca,'jet'); colorbar
  10. xlabel(xlab_str, 'Interpreter', 'tex');
  11. ylabel(ylab_str, 'Interpreter', 'tex');
  12. title(hax(1), '\theta_1', 'Interpreter', 'tex')
  13. axis('equal')
  14. hax(2) = subplot(1,2,2);
  15. contourf(X_mat, Y_mat, theta_2_mat_degs);
  16. clim(hax(2), [-180 180]);
  17. colormap(gca,'jet'); colorbar
  18. xlabel(xlab_str, 'Interpreter', 'tex');
  19. ylabel(ylab_str, 'Interpreter', 'tex');
  20. title(hax(2), '\theta_2', 'Interpreter', 'tex')
  21. axis('equal')
  22. end
  23. function plot_XY_given_theta_2dof(theta_1_mat_degs,theta_2_mat_degs,...
  24. X_mat,Y_mat,a_cmax)
  25. xlab_str = '\theta_1 (degs)';
  26. ylab_str = '\theta_2 (degs)';
  27. figure;
  28. hax(1) = subplot(1,2,1);
  29. contourf(theta_1_mat_degs, theta_2_mat_degs, X_mat);
  30. clim(hax(1), [0 a_cmax]);
  31. colormap(gca,'jet'); colorbar
  32. xlabel(xlab_str, 'Interpreter', 'tex');
  33. ylabel(ylab_str, 'Interpreter', 'tex');
  34. title(hax(1), 'X_E', 'Interpreter', 'tex')
  35. hax(2) = subplot(1,2,2);
  36. contourf(theta_1_mat_degs, theta_2_mat_degs, Y_mat);
  37. clim(hax(1), [0 a_cmax]);
  38. colormap(gca,'jet'); colorbar
  39. xlabel(xlab_str, 'Interpreter', 'tex');
  40. ylabel(ylab_str, 'Interpreter', 'tex');
  41. title(hax(2), 'Y_E', 'Interpreter', 'tex')
  42. end

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/560277
推荐阅读
相关标签
  

闽ICP备14008679号