2. DH参数法入门:标准DH与改进DH的区别与选择
DH参数法,说白了就是给机器人每个关节和连杆“上户口”。你想想看,一个六轴机器人动起来,每个关节转多少度,末端执行器在哪儿,总得有个统一的描述方法吧?DH参数就是干这个的。
我刚入行那会儿,觉得DH参数就是个坐标变换的套路,套公式就行。后来真上手做项目,才发现标准DH和改进DH这俩兄弟,看着像,用起来坑不少。今天咱们就把它们掰开揉碎了讲清楚。
2.1 什么是DH参数?
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的转角 |
这四个参数,就能唯一确定相邻两个坐标系之间的变换矩阵。嗯,这里要注意:参数的下标写法,标准DH和改进DH是不一样的,这也是很多人搞混的地方。
2.2 标准DH(Classic DH)
标准DH是Denavit和Hartenberg在1955年提出的原始版本。它的核心思想是:把坐标系固定在连杆的末端(远端)。
什么意思呢?对于关节i,它的坐标系{i}是固定在连杆i的末端,也就是靠近关节i+1的那一头。变换顺序是:
- 绕Xi-1轴旋转αi-1
- 沿Xi-1轴平移ai-1
- 绕Zi轴旋转θi
- 沿Zi轴平移di
变换矩阵长这样:
T = RotX(α) * TransX(a) * RotZ(θ) * TransZ(d)
我在项目中遇到过一个问题:用标准DH建模一个六轴工业机器人,前三个关节还好,到了腕部关节,坐标系定义变得特别别扭。因为标准DH的坐标系在连杆末端,腕部关节的Z轴方向经常跟预期的不一样,调试时花了不少时间。
2.3 改进DH(Modified DH)
改进DH是Craig等人在1986年提出的修正版本。它的核心区别是:把坐标系固定在连杆的起始端(近端)。
对于关节i,它的坐标系{i}是固定在连杆i的起始端,也就是靠近关节i的那一头。变换顺序变成了:
- 绕Zi-1轴旋转θi
- 沿Zi-1轴平移di
- 绕Xi轴旋转αi
- 沿Xi轴平移ai
变换矩阵:
T = RotZ(θ) * TransZ(d) * RotX(α) * TransX(a)
我个人习惯用改进DH。为什么?因为它的坐标系定义更直观——每个关节的Z轴就是关节的旋转轴,坐标系原点就在关节轴上。你想想看,这样建模的时候,你一眼就能看出哪个轴对应哪个关节。
2.4 核心区别对比
咱们直接上表格,一目了然:
| 对比项 | 标准DH | 改进DH |
|---|---|---|
| 坐标系位置 | 连杆末端(远端) | 连杆起始端(近端) |
| 变换顺序 | RX → TX → RZ → TZ | RZ → TZ → RX → TX |
| 参数下标 | ai-1, αi-1, di, θi | ai, αi, di, θi |
| Z轴定义 | Zi在关节i+1上 | Zi在关节i上 |
| 树形结构支持 | 弱(分支处理复杂) | 强(天然支持分支) |
| 教材使用率 | 早期教材多 | 现代教材多 |
这里有个关键点:参数下标不同。标准DH的a和α下标是i-1,改进DH的a和α下标是i。如果你在代码里混用了,算出来的位置会差十万八千里。
2.5 如何选择?
这个问题没有标准答案,但我可以给你一些实际建议:
- 串联机器人,特别是六轴工业机器人:我建议用改进DH。坐标系定义更直观,调试时少走弯路。
- 树形结构或并联机器人:必须用改进DH。标准DH处理分支结构非常麻烦,改进DH天然支持。
- 你用的库或框架有要求:比如ROS的
urdf和kdl默认用改进DH,那就别硬改。 - 教学或学习阶段:两种都学,但先掌握改进DH。因为现代教材和开源项目基本都用它。
2.6 两种DH的坐标系建立规则对比
咱们用一张SVG图来直观展示两种DH的坐标系建立差异:
2.7 实战中的选择建议
说了这么多,到底怎么选?我给你三个场景,你自己对号入座:
场景一:你在做ROS机器人开发
用改进DH。ROS的urdf和moveit都默认改进DH,你写robot_state_publisher的时候,参数定义就是改进DH的格式。别想着改标准DH,那是给自己找麻烦。
场景二:你在做运动学算法研究
两种都可以,但我建议统一用改进DH。因为现代和开源代码大部分都用改进DH,你发、复现结果都方便。我审过几篇稿子,作者用标准DH但没说明,结果审稿人按改进DH去验证,对不上,直接拒了。
场景三:你在做教学或写教材
先教改进DH,再提标准DH作为历史背景。学生学改进DH上手快,坐标系直观,不容易出错。等他们理解了,再讲标准DH的区别,这样知识体系更完整。
2.8 一个容易忽略的细节
最后说一个我踩过的坑。两种DH的零位定义可能不同。标准DH的零位通常定义在关节角为0时,相邻连杆平行或垂直;改进DH的零位定义更灵活,取决于你如何建立坐标系。
举个例子:一个简单的二连杆机构,用标准DH建模,零位时两个连杆可能呈L形;用改进DH建模,零位时两个连杆可能呈直线。这不是谁对谁错的问题,而是定义不同。所以你在看别人的代码时,一定要先搞清楚他用的是哪种DH,否则直接套用参数,结果肯定不对。
DH_CONVENTION.md。这样不管谁来接手,都不会搞混。
好了,DH参数法的入门就讲到这里。标准DH和改进DH的区别,说白了就是坐标系放的位置不同。记住一句话:标准DH坐标系在连杆末端,改进DH坐标系在连杆起始端。选哪个不重要,重要的是统一,别混用。