第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的角度 | 关节的旋转量 |
2.2 建立连杆坐标系的“三步法”
很多初学者卡在“坐标系怎么摆”这一步。我总结了一个三步法,你照着做,基本不会错:
- 找Z轴: 每个关节的旋转轴(或移动轴方向)就是该关节坐标系Z轴的方向。Zi轴沿着关节i+1的轴线方向。
- 找X轴: Xi轴是Zi-1和Zi的公垂线方向,从Zi-1指向Zi。如果Zi-1和Zi相交,Xi垂直于它们所在的平面。
- 找Y轴: 右手定则,Yi = Zi × Xi。这一步是自动的,不用纠结。
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参数法知识结构,你可以把它当作本章的“地图”:
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 \]
2.7 避坑指南
最后,分享几个我这些年积累的经验:
- 坐标系方向别搞反: Z轴方向可以任意选,但一旦选了,整个机械臂的Z轴方向要一致。我见过有人把第一个关节的Z轴朝上,第二个关节的Z轴朝下,结果算出来的位姿完全不对。
- 注意零位: DH参数表中的θi是关节在零位时的角度。如果你的机械臂零位定义和DH参数表不一致,记得加一个偏移量。
- 验证方法: 算完变换矩阵后,把关节角都设成0,看看末端位置是不是在机械臂的“伸直”状态。如果不是,大概率是参数填错了。
- 工具推荐: 我习惯用Python的sympy库做符号推导,可以自动化简矩阵乘法,避免手算错误。
嗯,标准DH参数法就讲到这里。你可能会觉得这些内容有点抽象,但相信我,等你真正开始写代码、调机器人时,会发现这套方法就是你的“第二本能”。