当前位置:   article > 正文

基于MATLAB机器人工具箱的KUKA youBot机械臂运动学建模——DH法_matlab机械臂建模

matlab机械臂建模

文章开头有机器人工具箱链接,有需要的同学可以自行下载,robot-9.8_2013_2_12.zip_机械臂DH法建模-数据集文档类资源-CSDN下载。官网:Robotics Toolbox - Peter Corke

以实验室的KUKA youBot五自由度机械臂为切入点,记得当时和实验室的同学在这上面花费了好长时间,最后也没搞定,而这又算是基础中的基础,不能忽视。

DH一般分为标准DH和改进的DH,以John J.Craig的《机器人学导论》来说,它的是Modified DH,另一本孙富春翻译的《机器人学导论——分析、控制及应用》则是用的标准DH。通过Peter Corke的那本《Robotics,Vision and Control》(已有中文版)我才知道有这两个。区别很明显DH参数表的下标如果都是一样的则是标准DH,如果有一半不一样则是Modified DH。

这样的

机械臂的构型可以看做是连杆构成的,两个连杆(Link)之间才有一个关节(Joint),而常常将大地和底座也当做连杆,因此有个最直接的问题的就是:关节坐标系到底是建在前一个连杆上还是后一个连杆上?我想这也就是为什么会有标准DH和改进的DH的原因了。

这条臂比较特别的地方在于关节0和关节1之间有个偏置,特别是在于改进DH中的坐标系0和坐标系1的设置很特殊。

1. 标准DH

        标准DH的介绍我是参考的孙富春老师翻译的《机器人学导论——分析、控制及应用》,后来接触到《Robot Modeling and Control》(中文版名为,机器人建模和控制,机械工业出版社,贾振中译)也是标准DH。

一个刚体的自由度是6,而为什么标准DH只用四个参数呢?这里其实暗含了一个建立坐标系的原则:垂直和相交,刚好六个限制条件。这在《Robot Modeling and Control》这本书中有详细介绍。垂直相交的意思是说,建立坐标系的时候,后一个坐标系的X要与前一个坐标系的Z垂直且相交。如建立X1的时候需要与Z0垂直相交。

在孙老师的那本书的P62页,关于DH参数的解释如下图:

我举个例子,例如:

我记的时候就是前一个Z,和后一个的X。如右边括号里的,而这里正是与后文的改进的DH不一样的地方。

KUKA youBot机械臂的DH

  1. %kuka youBot
  2. clear;
  3. clc;
  4. close all;
  5. d1=0.147;
  6. a1=0.033;
  7. a2=0.155;
  8. a3=0.135;
  9. d5=0.113;
  10. tool = 0.105;
  11. % Joint angle limit.
  12. qlim1=[-169,169]*pi/180;
  13. qlim2=[-65,90]*pi/180;
  14. qlim3=[-151,146]*pi/180;
  15. qlim4=[-102.5,102.5]*pi/180;
  16. qlim5=[-167.5,167.5]*pi/180;
  17. L(1) = Link('d', d1, 'a', a1, 'alpha', pi/2, 'qlim',qlim1);
  18. L(2) = Link('d', 0, 'a', a2, 'alpha', 0, 'qlim', qlim2, 'offset', 1.57);
  19. % L(2) = Link('d', 0, 'a', a2, 'alpha', 0, 'qlim', qlim2);
  20. L(3) = Link('d', 0, 'a', a3, 'alpha', 0,'qlim',qlim3);
  21. L(4) = Link('d', 0, 'a', 0, 'alpha', -pi/2,'qlim',qlim4, 'offset', -1.57);
  22. % L(4) = Link('d', 0, 'a', 0, 'alpha', -pi/2,'qlim',qlim4);
  23. L(5) = Link('d', d5, 'a', 0, 'alpha', 0,'qlim',qlim5);
  24. bot = SerialLink(L,'name','KUKA youBot');
  25. bot.display();
  26. % bot.plot([0 0 0 0 0]);
  27. bot.teach;
  28. bot.tool= transl(0, 0, tool);% EEF
  29. %% forward kinematics(default input is rad)
  30. bot.fkine([0 0 0 0 0]*pi/180);
  31. bot.fkine([0 0 -90 0 0]*pi/180)

这里发现的问题就是,我用铅笔在纸上用DH建立坐标系的时候的初始姿态(左图)与工具箱的初始姿态(右图)不一致,加了offset才相同。

编好以后可以输入一些角度验证一下

如上图中的这个姿态,第三关节转动90°,X为33 + (655 - 302)= 386mm,Z坐标为底座到第三关节长度为302mm与Figure2中显示的一致,说明DH建立没有问题。接下来求解正运动学矩阵。

  1. % xiaobing http://blog.sina.com.cn/s/blog_a16714bf0102vae4.html
  2. clear;
  3. clc;
  4. syms theta1 alpha1 a1 d1 theta2 alpha2 a2 d2 theta3 alpha3 a3 d3 ...
  5. theta4 alpha4 a4 d4 theta5 alpha5 a5 d5 theta6 alpha6 a6 d6;
  6. A1=[cos(theta1),-sin(theta1)*cos(alpha1),sin(theta1)*sin(alpha1),a1*cos(theta1);...
  7. sin(theta1),cos(theta1)*cos(alpha1),-cos(theta1)*sin(alpha1),a1*sin(theta1);...
  8. 0,sin(alpha1),cos(alpha1),d1;...
  9. 0,0,0,1];
  10. A2=[cos(theta2),-sin(theta2)*cos(alpha2),sin(theta2)*sin(alpha2),a2*cos(theta2);...
  11. sin(theta2),cos(theta2)*cos(alpha2),-cos(theta2)*sin(alpha2),a2*sin(theta2);...
  12. 0,sin(alpha2),cos(alpha2),d2;...
  13. 0,0,0,1];
  14. A3=[cos(theta3),-sin(theta3)*cos(alpha3),sin(theta3)*sin(alpha3),a3*cos(theta3);...
  15. sin(theta3),cos(theta3)*cos(alpha3),-cos(theta3)*sin(alpha3),a3*sin(theta3);...
  16. 0,sin(alpha3),cos(alpha3),d3;...
  17. 0,0,0,1];
  18. A4=[cos(theta4),-sin(theta4)*cos(alpha4),sin(theta4)*sin(alpha4),a4*cos(theta4);...
  19. sin(theta4),cos(theta4)*cos(alpha4),-cos(theta4)*sin(alpha4),a4*sin(theta4);...
  20. 0,sin(alpha4),cos(alpha4),d4;...
  21. 0,0,0,1];
  22. A5=[cos(theta5),-sin(theta5)*cos(alpha5),sin(theta5)*sin(alpha5),a5*cos(theta5);...
  23. sin(theta5),cos(theta5)*cos(alpha5),-cos(theta5)*sin(alpha5),a5*sin(theta5);...
  24. 0,sin(alpha5),cos(alpha5),d5;...
  25. 0,0,0,1];
  26. %+---+-----------+-----------+-----------+-----------+
  27. %| j | theta | d | a | alpha |
  28. %+---+-----------+-----------+-----------+-----------+
  29. %| 1| q1| 0.147| 0.033| 1.571|
  30. %| 2| q2| 0| 0.155| 0|
  31. %| 3| q3| 0| 0.135| 0|
  32. %| 4| q4| 0| 0| -1.571|
  33. %| 5| q5| 0.113| 0| 0|
  34. %+---+-----------+-----------+-----------+-----------+
  35. % 将含有pi/20的项转为符号量sym,避免含有超大值的数据。(感谢文末的网友留言)
  36. alpha1=sym(pi/2);
  37. d2=sym(0);
  38. alpha2=sym(0);
  39. d3=sym(0);
  40. alpha3=sym(0);
  41. d4=sym(0);
  42. a4=sym(0);
  43. alpha4=sym(-pi/2);
  44. a5=sym(0);
  45. alpha5=sym(0);
  46. d1=0.147;
  47. a1=0.033;
  48. a2=0.155;
  49. a3=0.135;
  50. d5=0.113;
  51. T=simplify(eval(A1*A2*A3*A4*A5))
  52. x=T(1,4);
  53. y=T(2,4);
  54. z=T(3,4);
  55. FK =[x; y; z ];
  56. theta1=0;
  57. theta2=0;
  58. theta3=-1.57;
  59. theta4=0;
  60. theta5=0;
  61. x_math= (cos(theta1)*(135*cos(theta2 + theta3) - 113*sin(theta2 + theta3 + theta4) + 155*cos(theta2) + 33))/1000
  62. y_math= (sin(theta1)*(135*cos(theta2 + theta3) - 113*sin(theta2 + theta3 + theta4) + 155*cos(theta2) + 33))/1000
  63. z_math= (113*cos(theta2 + theta3 + theta4))/1000 + (27*sin(theta2 + theta3))/200 + (31*sin(theta2))/200 + 147/1000
  64. % 0.3011 0 0.0121 与上一个建模程序中的最后一行相同(注意切换成Link2和Link4没有offset的那两句)

正运动学矩阵为

T =|m11 m12 m13 m14|

     |m21 m22  m23 m24|

     |m31 m32 m33 m34|

     |m41 m42 m43 m44|

= [ cos(theta2 + theta3 + theta4)*cos(theta1)*cos(theta5) - sin(theta1)*sin(theta5), - cos(theta5)*sin(theta1) - cos(theta2 + theta3 + theta4)*cos(theta1)*sin(theta5), -sin(theta2 + theta3 + theta4)*cos(theta1),   (cos(theta1)*(135*cos(theta2 + theta3) - 113*sin(theta2 + theta3 + theta4) + 155*cos(theta2) + 33))/1000]

[ cos(theta1)*sin(theta5) + cos(theta2 + theta3 + theta4)*cos(theta5)*sin(theta1),   cos(theta1)*cos(theta5) - cos(theta2 + theta3 + theta4)*sin(theta1)*sin(theta5), -sin(theta2 + theta3 + theta4)*sin(theta1),   (sin(theta1)*(135*cos(theta2 + theta3) - 113*sin(theta2 + theta3 + theta4) + 155*cos(theta2) + 33))/1000]

[                                       sin(theta2 + theta3 + theta4)*cos(theta5),                                        -sin(theta2 + theta3 + theta4)*sin(theta5),              cos(theta2 + theta3 + theta4), (113*cos(theta2 + theta3 + theta4))/1000 + (27*sin(theta2 + theta3))/200 + (31*sin(theta2))/200 + 147/1000]

[                                                                               0,                                                                                 0,                                          0,                                                                                                          1]

m11 = cos(theta2 + theta3 + theta4)*cos(theta1)*cos(theta5) - sin(theta1)*sin(theta5)

m12 = - cos(theta5)*sin(theta1) - cos(theta2 + theta3 + theta4)*cos(theta1)*sin(theta5)

m13= -sin(theta2 + theta3 + theta4)*cos(theta1)

m14 = (cos(theta1)*(135*cos(theta2 + theta3) - 113*sin(theta2 + theta3 + theta4) + 155*cos(theta2) + 33))/1000

m21= cos(theta1)*sin(theta5) + cos(theta2 + theta3 + theta4)*cos(theta5)*sin(theta1)

m22= cos(theta1)*cos(theta5) - cos(theta2 + theta3 + theta4)*sin(theta1)*sin(theta5)

m23 = -sin(theta2 + theta3 + theta4)*sin(theta1)

m24 = (sin(theta1)*(135*cos(theta2 + theta3) - 113*sin(theta2 + theta3 + theta4) + 155*cos(theta2) + 33))/1000

m31 = sin(theta2 + theta3 + theta4)*cos(theta5)

m32 = -sin(theta2 + theta3 + theta4)*sin(theta5)

m33 =  cos(theta2 + theta3 + theta4)

m34 = (113*cos(theta2 + theta3 + theta4))/1000 + (27*sin(theta2 + theta3))/200 + (31*sin(theta2))/200 + 147/1000

最后一行为齐次矩阵的0,0,0,1

2. Modified DH

        改进的DH那就是如John J.Craig的《机器人学导论》上的,它与标准DH的区别在于:标准DH的Link0(大地)和Link1之间为J0。而Modified DH则是Link0上有J0,Link1上有J1,基座为坐标系{0},一般让{0}和{1}重合。标准DH和改进DH的差别,通俗点就是说坐标系到底是建在前一个关节上还是后一个关节上。

Craig的书中文版P52页

P54页建立坐标系的步骤:

举个例子:

通常都是下标有一半是i -1,类似这样

这条臂比较特别的地方在于关节0和关节1之间有个偏置,特别是在于改进DH中的坐标系0和坐标系1的设置很特殊。 

clc;
clear;
close all;
L(1) = Link([ 0  0.147  0  0 ],  'modified' );
L(2) = Link([ 0  0  0.033 pi/2  ],  'modified'); 
L(3) = Link([ 0 0 0.155  0  ],  'modified');
L(4) = Link([ 0  0 0.135 0],  'modified'); 
L(5) = Link([ 0  0.218 0 -pi/2],  'modified') ;


youbot = SerialLink(L, 'name', 'youbot');
youbot.display()
youbot.plot([0 0 0 0 0]);

youbot.teach;

% Forward kinematics matrix
syms theta1 theta2 theta3 theta4 theta5;
forward_kinematics=simplify(youbot.fkine([theta1 theta2 theta3 theta4 theta5]))

 % Set all q to zero, where the end-effector is.
 youbot.fkine([0 0 0 0 0]*pi/180)

相关链接:

Modeling, Design, and Control of Robotic Mechanisms Courseware - MATLAB & Simulink

二自由度,三自由度和并联机械臂的运动学和动力学分析及m文件

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号