文章目录


一、前言


1、描述两个坐标系的变换关系需要6个参数(3个表示位置变换,3个表示姿态变换),为什么DH参数只需4个?
2、利用DH参数建模时,各个连杆坐标系的建立是唯一的吗?
3、DH参数表是唯一的吗?
4、标准DH参数与修正DH参数有何异同?


二、标准DH参数


1、DH四个参数的定义
2、DH连杆坐标系的约定
3、根据DH连杆坐标系约定,建立各个连杆坐标系
4、根据DH四个参数的定义,创建DH参数表


三、六轴机器人实例(standard DH)


1、第一种连杆坐标系建立方法
2、第二种连杆坐标系建立方法


四、MATLAB代码
五、参考资料


一、前言
1、描述两个坐标系的变换关系需要6个参数(3个表示位置变换,3个表示姿态变换),为什么DH参数只需4个?
空间任意两个坐标系的变换关系确实需要6个参数来表示,然而,在建立各个连杆的坐标系时,我们可以拟定一些规则,使得坐标系满足某些约束,从而只需4个参数则可以表示两个坐标系的变换关系。
  若坐标轴 x i 与坐标轴 z i − 1 垂直相交(示例如下图),则只需4个参数(杆件长度 a i ,杆件扭角 α i ,关节距离 d i ,关节转角 θ i )就可以表示两个坐标系的变换关系。下面的证明来于书籍:Robot Modeling and Control(First Edition),by Mark W. Spong, Seth Hutchinson, and M. Vidyasagar.

 综上,坐标系 { x 1 y 1 z 1 } 到坐标系 { x 0 y 0 z 0 } 的齐次变换关系用杆件长度 a ,杆件扭角 α ,关节距离 d ,关节转角 θ 这4个参数就够了。

2、利用DH参数建模时,各个连杆坐标系的建立是唯一的吗?
  利用DH参数建模时,各个连杆坐标系的建立不是唯一的。只要在建立坐标系时,坐标轴 x i 与坐标轴 z i − 1 垂直相交即可。

3、DH参数表是唯一的吗?
  DH参数表不是唯一的。因为各个连杆坐标系的建立不是唯一的,导致DH参数不同,但是最终计算得到末端工具坐标系到机器人基坐标系下的齐次变换矩阵是唯一的。(前提是机器人基坐标系与末端工具坐标系的建立保持不变)

4、标准DH参数与修正DH参数有何异同?
  祥见参考资料2,3。
  (1)标准DH参数坐标系建立在传动轴上,而修正DH参数坐标系建立在驱动轴上。
  (2)由于坐标系建立位置发生了变化,连杆之间的坐标系变换关系自然也发生变化。
  标准DH相邻连杆之间坐标系的变换关系为:

(3)修正DH参数中各个参数的物理意义与标准DH参数是一样的。
  (4)对于传统的串联机器人而言,两者的表现能力是一样的,没有优劣之分,我们可以选择其中一种方法进行建模。然而,由于修正DH参数坐标系建立在驱动轴上,对于树状结构的机器人,其表现能力更强,可以简化问题。
  (5)对于标准DH参数,根据DH参数表,并对式(9) 连乘得到的是末端工具坐标系到机器人基坐标系的齐次变换矩阵;对于修正DH参数,根据DH参数表,并对式(10) 连乘得到的是最后一个驱动关节上的坐标系到机器人基坐标系的齐次变换矩阵,变换到末端工具坐标系还需增加一个变换(通常为平移变换)。

二、标准DH参数
1、DH四个参数的定义

(4) θ i :坐标轴 x i − 1 与坐标轴 x i  的夹角,方向定义如下:

2、DH连杆坐标系的约定
  (1)坐标轴 x i 与坐标轴 z i − 1 垂直。
  (2)坐标轴 x i 与坐标轴 z i − 1 相交。

3、根据DH连杆坐标系约定,建立各个连杆坐标系
4、根据DH四个参数的定义,创建DH参数表
三、六轴机器人实例(standard DH)
  这里以六轴机器人为例,通过建立3种不同的连杆坐标系,创建对应的DH表,比较最终运动学正解最终结果是否一致。其中, d 1 = 0.3991 , a 2 = 0.448 , a 3 = 0.042 , d 4 = 0.451 , d 6 = 0.082 ,以米为单位。两种不同的连杆坐标系的建立方法得到不同的DH参数表,但最终的机器人运动学正解完全一样!

1、第一种连杆坐标系建立方法
  连杆坐标系建立如下:

DH参数表如下:

2、第二种连杆坐标系建立方法

  连杆坐标系建立如下:

DH参数表如下:

四、MATLAB代码

clc;
clear;

syms d1 d2 d3 d4 d5 d6 a1 a2 a3 a4 a5 a6 real
syms alpha1 alpha2 alpha3 alpha4 alpha5 alpha6 real
syms theta1 theta2 theta3 theta4 theta5 theta6 real;

%% (1)
a1 = sym(0);
alpha1 = sym(-pi/2);
A1 = simplify([cos(theta1), -sin(theta1)*cos(alpha1), sin(theta1)*sin(alpha1), a1*cos(theta1)
    sin(theta1), cos(theta1)*cos(alpha1), -cos(theta1)*sin(alpha1), a1*sin(theta1)
    0, sin(alpha1), cos(alpha1), d1
    0, 0, 0, 1]);

d2 = sym(0);
alpha2 = sym(0);
A2 = simplify([cos(theta2 - pi/2), -sin(theta2 - pi/2)*cos(alpha2), sin(theta2 - pi/2)*sin(alpha2), a2*cos(theta2 - pi/2)
    sin(theta2 - pi/2), cos(theta2 - pi/2)*cos(alpha2), -cos(theta2 - pi/2)*sin(alpha2), a2*sin(theta2 - pi/2)
    0, sin(alpha2), cos(alpha2), d2
    0, 0, 0, 1]);

d3 = sym(0);
alpha3 = sym(-pi/2);
A3 = simplify([cos(theta3), -sin(theta3)*cos(alpha3), sin(theta3)*sin(alpha3), a3*cos(theta3)
    sin(theta3), cos(theta3)*cos(alpha3), -cos(theta3)*sin(alpha3), a3*sin(theta3)
    0, sin(alpha3), cos(alpha3), d3
    0, 0, 0, 1]);

a4 = sym(0);
alpha4 = sym(pi/2);
A4 = simplify([cos(theta4), -sin(theta4)*cos(alpha4), sin(theta4)*sin(alpha4), a4*cos(theta4)
    sin(theta4), cos(theta4)*cos(alpha4), -cos(theta4)*sin(alpha4), a4*sin(theta4)
    0, sin(alpha4), cos(alpha4), d4
    0, 0, 0, 1]);

a5 = sym(0);
d5 = sym(0);
alpha5 = sym(-pi/2);
A5 = simplify([cos(theta5), -sin(theta5)*cos(alpha5), sin(theta5)*sin(alpha5), a5*cos(theta5)
    sin(theta5), cos(theta5)*cos(alpha5), -cos(theta5)*sin(alpha5), a5*sin(theta5)
    0, sin(alpha5), cos(alpha5), d5
    0, 0, 0, 1]);

a6 = sym(0);
alpha6 = sym(0);
A6 = simplify([cos(theta6+pi), -sin(theta6+pi)*cos(alpha6), sin(theta6+pi)*sin(alpha6), a6*cos(theta6+pi)
    sin(theta6+pi), cos(theta6+pi)*cos(alpha6), -cos(theta6+pi)*sin(alpha6), a6*sin(theta6+pi)
    0, sin(alpha6), cos(alpha6), d6
    0, 0, 0, 1]);

T1 = simplify(A1*A2*A3*A4*A5*A6);

%% (2)
a1 = sym(0);
alpha1 = sym(-pi/2);
A1 = simplify([cos(theta1), -sin(theta1)*cos(alpha1), sin(theta1)*sin(alpha1), a1*cos(theta1)
    sin(theta1), cos(theta1)*cos(alpha1), -cos(theta1)*sin(alpha1), a1*sin(theta1)
    0, sin(alpha1), cos(alpha1), d1
    0, 0, 0, 1]);

d2 = sym(0);
alpha2 = sym(0);
A2 = simplify([cos(theta2 + pi/2), -sin(theta2 + pi/2)*cos(alpha2), sin(theta2 + pi/2)*sin(alpha2), (-a2)*cos(theta2 + pi/2)
    sin(theta2 + pi/2), cos(theta2 + pi/2)*cos(alpha2), -cos(theta2 + pi/2)*sin(alpha2), (-a2)*sin(theta2 + pi/2)
    0, sin(alpha2), cos(alpha2), d2
    0, 0, 0, 1]);

d3 = sym(0);
alpha3 = sym(pi/2);
A3 = simplify([cos(theta3), -sin(theta3)*cos(alpha3), sin(theta3)*sin(alpha3), (-a3)*cos(theta3)
    sin(theta3), cos(theta3)*cos(alpha3), -cos(theta3)*sin(alpha3), (-a3)*sin(theta3)
    0, sin(alpha3), cos(alpha3), d3
    0, 0, 0, 1]);

a4 = sym(0);
alpha4 = sym(-pi/2);
A4 = simplify([cos(theta4), -sin(theta4)*cos(alpha4), sin(theta4)*sin(alpha4), a4*cos(theta4)
    sin(theta4), cos(theta4)*cos(alpha4), -cos(theta4)*sin(alpha4), a4*sin(theta4)
    0, sin(alpha4), cos(alpha4), d4
    0, 0, 0, 1]);

a5 = sym(0);
d5 = sym(0);
alpha5 = sym(pi/2);
A5 = simplify([cos(theta5), -sin(theta5)*cos(alpha5), sin(theta5)*sin(alpha5), a5*cos(theta5)
    sin(theta5), cos(theta5)*cos(alpha5), -cos(theta5)*sin(alpha5), a5*sin(theta5)
    0, sin(alpha5), cos(alpha5), d5
    0, 0, 0, 1]);

a6 = sym(0);
alpha6 = sym(0);
A6 = simplify([cos(theta6), -sin(theta6)*cos(alpha6), sin(theta6)*sin(alpha6), a6*cos(theta6)
    sin(theta6), cos(theta6)*cos(alpha6), -cos(theta6)*sin(alpha6), a6*sin(theta6)
    0, sin(alpha6), cos(alpha6), d6
    0, 0, 0, 1]);
    
T2 = simplify(A1*A2*A3*A4*A5*A6);
err = simplify(T1 - T2)

五、参考资料
1.Robot Modeling and Control(First Edition),by Mark W. Spong, Seth Hutchinson, and M. Vidyasagar
2.https://blog.csdn.net/hitgavin/article/details/105018983
3.https://blog.csdn.net/jldemanman/article/details/80508683