第3章 改进DH参数法:标准DH与改进DH的全面对比
大家好,欢迎来到第三章。这一章我们聊聊DH参数法——准确地说,是改进DH参数法。
很多初学者学到这里会懵:怎么还有标准DH和改进DH?到底用哪个?我当年刚入行时也踩过这个坑。有一次给一个六轴协作臂建运动学模型,按标准DH算出来的末端位姿死活对不上实际值,折腾了两天才发现是坐标系建反了……嗯,从那以后我就把两种DH的差异刻在脑子里了。
今天咱们就把这事彻底讲透。
为什么会有两种DH?
说白了,DH参数法就是一种给机械臂每个关节建立坐标系的约定规则。既然是约定,就允许有不同的版本。
- 标准DH(Classic DH):由Denavit和Hartenberg在1955年提出。坐标系建在连杆的末端(即连杆的输出端)。
- 改进DH(Modified DH):由Craig等人在1986年改良。坐标系建在连杆的起始端(即连杆的输入端)。
你可能会问:就差这么一点,至于搞出两套体系吗?
至于。因为坐标系的位置变了,参数的定义、变换顺序、甚至正解公式都不一样。我个人的习惯是:工业机器人用标准DH多,教学和科研用改进DH多。但这不是的,关键是你得理解背后的逻辑。
核心区别:坐标系挂在哪?
咱们直接上对比表,一目了然:
| 对比项 | 标准DH(Classic DH) | 改进DH(Modified DH) |
|---|---|---|
| 坐标系{i}的位置 | 固定在连杆i的末端(输出端) | 固定在连杆i的起始端(输入端) |
| 变换顺序 | 绕x轴旋转 → 沿x轴平移 → 绕z轴旋转 → 沿z轴平移 | 沿x轴平移 → 绕x轴旋转 → 沿z轴平移 → 绕z轴旋转 |
| 参数定义 | αi-1, ai-1, di, θi | αi-1, ai-1, di, θi |
| 参数下标 | α和a的下标与当前连杆一致 | α和a的下标与前一连杆一致 |
| 适用场景 | 串联机器人,树形结构 | 串联、并联、树形结构均适用 |
一句话总结:标准DH的坐标系{i}在连杆i的末端,改进DH的坐标系{i}在连杆i的起始端。这个差异导致了变换矩阵的乘法顺序完全不同。
改进DH的坐标系建立规则
我个人更推荐初学者从改进DH入手。为什么?因为它的规则更直观,而且能统一处理串联和并联机构。下面是我总结的五步建系法:
- 找关节轴:画出所有关节的旋转轴或移动轴,用箭头标出正方向。
- 定Z轴:第i个关节的轴线就是Zi-1轴。注意下标!Zi-1对应关节i。
- 定原点Oi-1:Zi-1与Zi的公垂线与Zi-1的交点。
- 定Xi-1轴:沿公垂线方向,从Zi-1指向Zi。
- 定Yi-1轴:右手定则,Yi-1 = Zi-1 × Xi-1。
我的小技巧:每次建系时,我都会在纸上画一个简图,标出Z轴和公垂线。只要公垂线画对了,X轴方向就不会错。这个习惯帮我避免过无数次低级错误。
四个参数的定义
改进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的转角 | 旋转关节为变量 |
注意看下标:a和α的下标是i-1,d和θ的下标是i。这就是改进DH和标准DH最明显的区别——标准DH里a和α的下标是i。
变换矩阵的推导
改进DH的相邻坐标系变换矩阵,是从坐标系{i-1}到坐标系{i}的变换。我习惯把它拆成四个基本变换的乘积:
i-1T_i = RotX(α_{i-1}) · TransX(a_{i-1}) · RotZ(θ_i) · TransZ(d_i)
展开成4×4矩阵就是:
i-1T_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 ]
我曾经踩过的坑:注意变换顺序!改进DH是先绕X轴再绕Z轴,而标准DH是先绕Z轴再绕X轴。如果你把顺序搞反了,算出来的位姿会完全不对。我当年调试一个SCARA机器人时,就是在这里卡了整整一个下午。
改进DH vs 标准DH:实战对比
咱们用一个简单的两连杆平面机械臂来对比。假设两个连杆长度都是L,关节角分别为θ₁和θ₂。
标准DH的参数表:
| 连杆i | ai-1 | αi-1 | di | θi |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | θ₁ |
| 2 | L | 0 | 0 | θ₂ |
改进DH的参数表:
| 连杆i | ai-1 | αi-1 | di | θi |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | θ₁ |
| 2 | L | 0 | 0 | θ₂ |
咦?看起来一样?别急,这是因为平面两连杆太简单了。一旦遇到关节轴线不平行的情况,差异就出来了。比如一个六轴工业机器人,标准DH和改进DH的参数表会有明显不同,尤其是扭角α的取值。
核心结论:对于简单的串联机构,两种DH可能给出相同的参数表。但对于复杂机构(尤其是存在偏置或轴线异面的情况),改进DH的参数定义更自然,不容易出错。
改进DH的完整建系流程(附SVG图)
下面这张图展示了一个三关节机械臂的改进DH坐标系建立过程。我特意把每个步骤都标出来了:
避坑指南:我踩过的那些坑
做运动学建模这么多年,我总结了几条关于改进DH的避坑经验:
- 下标搞混:改进DH里a和α的下标是i-1,不是i。写代码时特别容易搞混,我建议在参数表里把下标写清楚。
- 公垂线方向:当两个Z轴平行时,公垂线不唯一。这时候我习惯取使X轴与前一坐标系X轴同向的那条。
- 扭角正负:α的正负由右手定则决定。大拇指指向X轴正方向,四指从Zi-1弯向Zi,就是正方向。
- 移动关节处理:对于移动关节,di是变量,θi是常数。千万别搞反了。
我曾经犯过的错:有一次给一个六轴机器人建模型,我习惯性地用了标准DH的变换顺序(先绕Z再绕X),但参数表是按改进DH填的。结果算出来的正解和逆解全都不对,调试了整整两天才发现是变换矩阵用错了。从那以后,我每次写代码都会在注释里明确标注"这是改进DH"。
什么时候用改进DH?
我个人建议:
- 教学和入门:用改进DH。规则更统一,不容易出错。
- 工业机器人:看厂家手册。ABB、KUKA等主流厂商通常用标准DH。
- 并联机器人:必须用改进DH。标准DH处理不了并联机构的闭环约束。
- 自己写库:选一种并坚持用下去。混用两种DH是灾难的开始。
好了,这一章的内容就到这里。改进DH的核心就一句话:坐标系建在连杆起始端,变换先绕X再绕Z。把这个记牢了,后面的正解、逆解、动力学都会顺畅很多。