第2章:标准DH参数法——建立连杆坐标系的“通用语言”

做机器人运动控制,绕不开一个东西——DH参数。说实话,我刚入行那会儿,觉得这玩意儿就是一堆奇怪的符号堆在一起。直到我第一次在产线上调试一台六轴机器人,发现关节角度明明算对了,末端位姿却偏了十几毫米……嗯,从那以后,我才真正理解了DH参数的价值。

标准DH参数法,说白了就是一套给机械臂每个连杆“贴标签”的规则。你想想看,一个机械臂有N个关节、N+1个连杆,每个连杆在空间里都有自己独立的坐标系。如果没有统一规则,你算你的、我算我的,代码根本没法复用。DH参数就是解决这个问题的。

2.1 四个参数,定义一切

标准DH法用四个参数来描述相邻两个连杆之间的相对位置和姿态。我个人习惯把它们记成“两转两移”:

参数 符号 含义 物理直观
连杆长度 ai-1 沿Xi-1轴,从Zi-1到Zi的距离 连杆本身的“臂长”
连杆扭角 αi-1 绕Xi-1轴,从Zi-1转到Zi的角度 两个关节轴之间的“扭转”
连杆偏距 di 沿Zi轴,从Xi-1到Xi的距离 关节沿自身轴的“偏移”
关节角 θi 绕Zi轴,从Xi-1转到Xi的角度 关节的旋转量
我的小技巧: 记这四个参数时,我总在心里默念“先沿X走一段,再绕X转一下;再沿Z走一段,再绕Z转一下”。顺序千万别搞反,搞反了变换矩阵就错了。

2.2 建立连杆坐标系的“三步法”

很多初学者卡在“坐标系怎么摆”这一步。我总结了一个三步法,你照着做,基本不会错:

  1. 找Z轴: 每个关节的旋转轴(或移动轴方向)就是该关节坐标系Z轴的方向。Zi轴沿着关节i+1的轴线方向。
  2. 找X轴: Xi轴是Zi-1和Zi的公垂线方向,从Zi-1指向Zi。如果Zi-1和Zi相交,Xi垂直于它们所在的平面。
  3. 找Y轴: 右手定则,Yi = Zi × Xi。这一步是自动的,不用纠结。
我曾经踩过的坑: 有一次我搞混了“关节i的坐标系”和“连杆i的坐标系”。记住:坐标系{i}是固连在连杆i上的,它的Z轴沿着关节i+1的轴线。这个关系捋顺了,后面所有推导都顺了。

2.3 相邻连杆变换矩阵的推导

有了坐标系,下一步就是推导从坐标系{i-1}到坐标系{i}的变换矩阵。这个矩阵是四个基本变换的复合:

\[ ^{i-1}T_i = Rot_{X}(\alpha_{i-1}) \cdot Trans_{X}(a_{i-1}) \cdot Rot_{Z}(\theta_i) \cdot Trans_{Z}(d_i) \]

展开成4×4齐次矩阵形式:

^{i-1}T_i = 
[  cosθ_i    -sinθ_i    0        a_{i-1}  ]
[  sinθ_i·cosα_{i-1}   cosθ_i·cosα_{i-1}  -sinα_{i-1}  -d_i·sinα_{i-1} ]
[  sinθ_i·sinα_{i-1}   cosθ_i·sinα_{i-1}   cosα_{i-1}   d_i·cosα_{i-1}  ]
[  0          0          0        1        ]

这个矩阵看着复杂,其实结构很清晰:左上角3×3是旋转矩阵,右上角3×1是平移向量。我建议你亲手推导一遍,不要只看书。我在带团队时,要求每个新人都必须手推一次这个矩阵,推完才算入门。

2.4 标准DH vs 改进DH:一个容易混淆的点

这里我必须提醒你:标准DH和改进DH的坐标系定义方式不同。标准DH把坐标系{i}固连在连杆i的末端(靠近关节i+1),而改进DH把坐标系{i}固连在连杆i的起始端(靠近关节i)。

对比项 标准DH 改进DH
坐标系位置 连杆末端 连杆起始端
变换顺序 先绕X,再绕Z 先绕Z,再绕X
常用场景 串联机器人、工业机械臂 树形结构、并联机器人
参数定义 ai-1, αi-1, di, θi ai, αi, di, θi

我个人习惯用标准DH,因为工业机器人(KUKA、ABB、发那科)的说明书里基本都是标准DH参数。但如果你做的是移动机器人或者人形机器人,改进DH可能更顺手。选哪个不重要,从头到尾保持一致才重要。

2.5 知识体系总览

下面这张图是我自己整理的DH参数法知识结构,你可以把它当作本章的“地图”:

标准DH参数法知识体系 标准DH参数法知识体系 四个DH参数 a (连杆长度) α (连杆扭角) d (连杆偏距) θ (关节角) 建立连杆坐标系 ① 确定Z轴方向 ② 确定X轴方向 ③ 右手定则得Y轴 推导变换矩阵 核心公式:^{i-1}T_i = Rot_X(α_{i-1}) · Trans_X(a_{i-1}) · Rot_Z(θ_i) · Trans_Z(d_i) 顺序:先绕X再沿X,再绕Z再沿Z —— 这个顺序是标准DH的“灵魂”

2.6 一个完整的例子:两连杆机械臂

光说不练假把式。我们拿一个最简单的两连杆平面机械臂来走一遍流程。

场景: 两个旋转关节,都在同一平面内转动。连杆1长度L1,连杆2长度L2。

第一步:建立坐标系

  • 坐标系{0}:基座坐标系,Z0垂直于纸面(旋转轴),X0水平向右。
  • 坐标系{1}:固连在连杆1末端,Z1同样垂直于纸面,X1沿连杆1方向。
  • 坐标系{2}:固连在连杆2末端,Z2垂直于纸面,X2沿连杆2方向。

第二步:填写DH参数表

i ai-1 αi-1 di θi
1 0 0 0 θ1
2 L1 0 0 θ2

第三步:计算变换矩阵

代入公式,得到:

^{0}T_1 = 
[  cosθ₁  -sinθ₁  0  0 ]
[  sinθ₁   cosθ₁  0  0 ]
[  0       0      1  0 ]
[  0       0      0  1 ]

^{1}T_2 = 
[  cosθ₂  -sinθ₂  0  L1 ]
[  sinθ₂   cosθ₂  0  0  ]
[  0       0      1  0  ]
[  0       0      0  1  ]

最终从基座到末端执行器的变换矩阵:

\[ ^{0}T_2 = ^{0}T_1 \cdot ^{1}T_2 \]

关键点: 注意看,^{1}T_2矩阵的右上角出现了L1。这就是为什么DH参数能“自动”处理连杆长度的影响。你只需要填参数,矩阵乘法会帮你搞定一切。

2.7 避坑指南

最后,分享几个我这些年积累的经验:

  • 坐标系方向别搞反: Z轴方向可以任意选,但一旦选了,整个机械臂的Z轴方向要一致。我见过有人把第一个关节的Z轴朝上,第二个关节的Z轴朝下,结果算出来的位姿完全不对。
  • 注意零位: DH参数表中的θi是关节在零位时的角度。如果你的机械臂零位定义和DH参数表不一致,记得加一个偏移量。
  • 验证方法: 算完变换矩阵后,把关节角都设成0,看看末端位置是不是在机械臂的“伸直”状态。如果不是,大概率是参数填错了。
  • 工具推荐: 我习惯用Python的sympy库做符号推导,可以自动化简矩阵乘法,避免手算错误。

嗯,标准DH参数法就讲到这里。你可能会觉得这些内容有点抽象,但相信我,等你真正开始写代码、调机器人时,会发现这套方法就是你的“第二本能”。