DH(Denavit–Hartenberg)方法是用来描述串联机器人构型的有力工具,但是由于涉及到的参数比较多,要搞清楚需要下一定功夫。我也算是先后在3门课里学过DH方法了,但直到最近一次德国外教的课上才算对这套体系有了比较直观的理解。

首先,机器人都可以抽象成是由许多的关节和连杆构成的,连杆奇形怪状可长可短,关节也有平动转动。DH方法就是用一套参数化的描述方式来对机器人进行建模,得到基座末端执行机构的齐次变换矩阵。有了这个矩阵就可以做很多事了,比如:

  1. 末端是一个相机,知道一个物体在相机坐标系中的位置,通过变换矩阵我就能直到该物体与基座的相对位置;
  2. 知道各个关节的运动状态(转角、位移等)就能知道末端执行器在空间的位置。 对于一个串联机构,我们可以想象每一级关节连杆是从上一级上长出来的。DH用四个基本的变换(两个平动,两个转动)来描述当前级和上级的关系。最终再把所有的变换合成起来,便得到了从末端到基座的变换。

那么如何来用这套方法描述机器人呢,可以分为以下几个步骤。

1、找坐标系

对于每一级关节连杆,都有其相应的坐标系,关节运动的轴线是最重要的一根轴——z轴。对于平动关节,z轴沿着运动方向;对于转动关节,z轴为其转轴。需要注意的是,每一级只考虑一种运动。例如你有一个球铰关节,那你需要分为三级来分别描述三种旋转。

找到z轴之后就需要找坐标原点和x轴了。对于基座,原点自然是已经确定的,而x轴的选择是任意的。一般基座对应的坐标系用\(O_0\)表示,接着便可以一级一级由\(z_{i-1}\)、\(z_i\)和\(O_{i-1}\)确定\(O_i\)。

对于一般情况,\(x_i\)的方向是直线\(z_{i-1}\)和\(z_i\)最近连线 (common normal) 所在方向。对于两条异面直线,这个方向是唯一的,很好确定。\(x_i\)和\(z_i\)的交点自然也就是\(O_i\)的原点了。但有三种特殊情况

  • \(z_{i-1}\)和\(z_i\)平行,此时有无数多个平行的最近连线。这时通常是令后文提到的d参数为0,即\(x_i\)轴从\(O_{i-1}\)出发。
  • \(z_{i-1}\)和\(z_i\)相交,这时令\(O_i\)为交点,且\(x_i=z_i\times z_{i-1}\)。
  • \(z_{i-1}\)和\(z_i\)相同,\(O_i\)可以任意选择一个位置,且令\(x_i\)方向与\(x_{i-1}\)相同。 有了各个x轴和z轴我们就可以用右手定则确定y轴从而确定每一级坐标系了。

2、获得DH参数

前面说了,DH方法是用四个基本变换来描述串联机构的“生长”,即\(O_i\) 和 \(O_{i-1}\)的关系。这四个基本变换依次为

  1. \(x_{i-1}\) 到 \(x_{i}\)绕 \(z_{i-1}\) 轴旋转的角度,称为关节转角link angle,用\(theta_i\)表示。由于x轴总是同时垂直于两个相关的z轴,所以这个角是很好确定的;
  2. 从\(O_{i-1}\)到最近连线沿\(z_{i-1}\)轴的平移,称为连杆长度link length,用\(d_i\)表示。这个量描述了这级关节沿轴线伸长了多少;
  3. 沿\(x_{i}\)轴平移,就是前面提到的最近距离,称为关节偏置link offset,用\(a_i\)表示。这个量描述了这级关节往侧向平移了多少。
  4. 从\(z_{i-1}\)到\(z_i\)绕\(x_{i}\)轴旋转,称为关节扭角link twist,用\(alpha_i\)表示。这个量描述了“生长方向”的扭曲。 简而言之关节生长就是:先绕当前轴转个角度\(theta_i\),再沿当前轴往前生长\(d_i\),然后往侧向平移一段距离\(a_i\),最后将轴线扭一个角度\(alpha_i\)。下图是一个DH参数的示意图。

特别注意一下,前两个变换是关于\(z_{i-1}\)轴的,而后两个变换是关于\(x_{i}\)轴的。

最后,给大家推荐维基百科DH参数页面里的一个视频,做得很好,不过英文说得比较快。结合这篇文章看应该就很清楚啦~