3. 运动学基础(上):机械臂正运动学——DH参数法、标准DH与改进DH的区别、建立连杆坐标系

各位同学,欢迎来到《轨迹规划实战》的第三讲。今天咱们聊聊机械臂运动学里最基础、也最绕不开的一个话题——DH参数法。

说实话,我刚入行那会儿,第一次看到DH参数表,脑子里全是问号。四个参数就能描述一个六轴机械臂?这玩意儿靠谱吗?后来亲手搭过几次模型,踩过几次坑,才真正体会到它的精妙之处。

好,咱们不废话,直接开干。

3.1 为什么要学正运动学?

正运动学,说白了就是:你给我每个关节的角度,我告诉你末端在哪儿、朝哪个方向。

你想想看,如果连末端位置都算不出来,后面的轨迹规划、避障、力控,全都是空中楼阁。我在做第一个焊接机器人项目时,就是因为正运动学模型建错了,焊枪偏了5毫米,结果一整批工件全废了。嗯,从那以后,我每次建完模型都会先用几个已知姿态做验证。

核心公式:

T = T1 · T2 · T3 · … · Tn

其中 Ti 是相邻连杆间的齐次变换矩阵。

3.2 DH参数法——四个参数搞定一切

DH参数法由Denavit和Hartenberg在1955年提出。它的核心思想是:用四个参数来描述两个相邻关节坐标系之间的变换关系。

这四个参数分别是:

参数 符号 物理含义
连杆长度 ai-1 沿Xi-1轴,从Zi-1到Zi的距离
连杆扭角 αi-1 绕Xi-1轴,从Zi-1到Zi的转角
连杆偏距 di 沿Zi轴,从Xi-1到Xi的距离
关节角 θi 绕Zi轴,从Xi-1到Xi的转角

我个人习惯把DH参数想象成「搭积木」:先沿着X轴平移+旋转,再沿着Z轴平移+旋转。四个步骤,不多不少。

3.3 标准DH vs 改进DH——到底差在哪儿?

这个问题,我当年面试的时候被问过。很多教材里只讲一种,导致初学者以为DH只有一种。其实不然。

标准DH(Classic DH / Standard DH):

  • 坐标系i固定在连杆i的末端
  • 变换顺序:绕Zi-1旋转θi → 沿Zi-1平移di → 沿Xi平移ai → 绕Xi旋转αi
  • 变换矩阵:Ti = RotZ(θi) · TransZ(di) · TransX(ai) · RotX(αi)

改进DH(Modified DH):

  • 坐标系i固定在连杆i的起始端
  • 变换顺序:绕Xi-1旋转αi-1 → 沿Xi-1平移ai-1 → 绕Zi旋转θi → 沿Zi平移di
  • 变换矩阵:Ti = RotX(αi-1) · TransX(ai-1) · RotZ(θi) · TransZ(di)

注意:标准DH和改进DH的坐标系定义方式不同,导致参数下标也不同。我曾经在项目中混用过两种,结果算出来的末端位置差了十万八千里。所以,选一种,从头到尾用到底。

我个人更偏爱改进DH。为什么?因为它的坐标系定义更符合直觉——每个坐标系都固定在连杆的根部,调试时更容易理解。当然,这只是个人习惯,标准DH也有它的拥趸。

3.4 建立连杆坐标系——手把手教你

好,理论说完了,咱们来点实操。建立连杆坐标系,我总结了一个「三步法」:

  1. 找关节轴:画出所有关节的旋转轴(Z轴)
  2. 定公垂线:相邻Z轴之间的公垂线方向就是X轴
  3. 右手定则:Y轴由右手定则确定

举个例子,一个简单的两连杆机械臂:

// 两连杆机械臂的DH参数(改进DH)
// 连杆1:a0=0, α0=0, d1=0, θ1=变量
// 连杆2:a1=L1, α1=0, d2=0, θ2=变量

// 齐次变换矩阵(Python伪代码)
import numpy as np

def dh_transform(a, alpha, d, theta):
    T = np.array([
        [np.cos(theta), -np.sin(theta)*np.cos(alpha),  np.sin(theta)*np.sin(alpha), a*np.cos(theta)],
        [np.sin(theta),  np.cos(theta)*np.cos(alpha), -np.cos(theta)*np.sin(alpha), a*np.sin(theta)],
        [0,              np.sin(alpha),                np.cos(alpha),               d],
        [0,              0,                            0,                           1]
    ])
    return T

# 计算末端位姿
T1 = dh_transform(0, 0, 0, q1)
T2 = dh_transform(L1, 0, 0, q2)
T_end = T1 @ T2

小技巧:写代码时,先把DH参数表列出来,再写变换函数。参数表就是你的「设计图纸」,图纸错了,代码写得再漂亮也没用。

3.5 知识体系总览

下面这张图,是我自己总结的本章知识结构。你把它存下来,以后每次建模前看一眼,思路会清晰很多。

机械臂正运动学——知识体系 正运动学 DH参数法 建立连杆坐标系 齐次变换矩阵 标准DH 改进DH 找关节轴(Z) 定公垂线(X) 旋转矩阵 平移向量 a α d θ T = T₁ · T₂ · T₃ · … · Tₙ

3.6 避坑指南

最后,分享几个我踩过的坑:

  • 坐标系方向搞反:我曾经在建立坐标系时,把Z轴方向搞反了,结果算出来的末端位置镜像对称。检查了三天才发现问题。所以,每次建完坐标系,先用一个已知关节角度验证一下。
  • 参数符号混淆:标准DH和改进DH的参数定义不同,千万别混用。我建议你选一种,然后一直用下去。
  • 忽略奇异位形:当两个关节轴平行时,公垂线不唯一,需要特殊处理。嗯,这个后面讲逆运动学时还会细说。

一句话总结:正运动学不难,难的是细心。DH参数表就是你的「地图」,地图画对了,路就好走了。

好了,这一讲就到这里。记住,多动手、多验证,正运动学就是一层窗户纸,捅破了就通了。

可可精品资料库