引用网路上的一张图,这张图描述的便是改进D-H参数。
与标准D—H参数法做出比较,我个人举得这种方法比标准D-H参数法在变换过程中,更为直观,思考过程仿佛合理一点(大家一起讨论)。
蔡自兴教授编写的机器人基础 里面介绍的就是这种方法,我想以后就在这个基础上学习。
变换过程是按照X——Z的变换顺序进行的,根据链式法则,也是使用矩阵右乘,来求出末端执行器的[x,y,z,1]T。
书上的介绍我个人的理解是这样,
依据上图,假设有两个坐标系i和j,先绕坐标系i的X轴旋转αi度,机械臂一般都是90度,使得Zi与Zj轴平行。
沿着Xi轴或者Xj轴(一些机械臂六个自由度的原点都是在同一条直线上的话,画图时一般都是重合的,放心地画),将Zi平移ai的距离,使得两个坐标系的Z轴平行。
第三点:
绕着Zj轴,将Xi旋转θ角,使得Xi和Xj平行(对应第二点),其实这个θ j我认为大小不大,因为这是一个变量(就是通过设置这个角度的大小来改变机械臂末端执行器相对于基坐标系的位姿)。
第三点的时候,可能两个坐标系的X轴还没有重合,
那么就沿着Zj轴,将Xi移动到Xj轴,距离为Dj
关于这个下标问题,
两种方法都是,在哪个坐标系发生转动,下标就是对应哪个坐标系,就如上面的四个步骤。
接下来是 Matlab 的程序,我是这样来验证上面的是否正确的。
关于matlab的改进法,如何是六轴机械臂的话,末端执行器的工具坐标系是与第六个关节的坐标重合的,所以教材书上使用的,会不考虑末端末端执行器与第六个关节坐标系之间的距离。(这里我也有疑问,一起讨论一下吧)。
而标准DH参数是可以将其考虑进去的,在程序来说。
L1=Link([0 384.5 0 0 0],‘modified’);
L2=Link([0 0 0 pi/2 0],‘modified’);
L3=Link([0 0 284.5 0 0],‘modified’);
L4=Link([0 286.5 30 pi/2 0],‘modified’);
L5=Link([0 0 0 -pi/2 0],‘modified’);
L6=Link([0 0 0 pi/2 0],‘modified’);
robot1=SerialLink([L1 L2 L3 L4 L5 L6],‘name’,‘robot1’); theta1=0;%
theta2=0;%
theta3=0;
theta4=0;
theta5=0;
theta6=0;
q=[theta1 theta2 theta3 theta4 theta5 theta6];
teach(robot1);
T=robot1.fkine(q);
robot1.plot(q);
a2= L3.a;
a3= L4.a;
d1= L1.d;%书上的d2是关节坐标系1,2之间x轴的距离
d4= L4.d;
d6= L6.d;
s1=sin(0);
c1=cos(0);
s2=sin(0);
c2=cos(0);
s3=sin(0);
c3=cos(0);
s4=sin(0);
c4=cos(0);
s5=sin(0);
c5=cos(0);
s6=sin(0);
c6=cos(0);
T1=[c1 -s1 0 0; s1 c1 0 0; 0 0 1 d1; 0 0 0 1;]
T2=[c2 -s2 0 0; 0 0 1 0; -s2 -c2 0 0; 0 0 0 1;]
T3=[c3 -s3 0 a2; s3 c3 0 0; 0 0 1 0; 0 0 0 1;]
T4=[c4 -s4 0 a3; 0 0 1 d4; -s4 -c4 0 0; 0 0 0 1;]
T5=[c5 -s5 0 0; 0 0 -1 0; s5 c5 0 0; 0 0 0 1;]
T6=[c6 -s6 0 0; 0 0 1 0; -s6 -c6 0 0; 0 0 0 1;]
Tz=T1T2T3T4T5*T6