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的那一头。变换顺序是:

  1. 绕Xi-1轴旋转αi-1
  2. 沿Xi-1轴平移ai-1
  3. 绕Zi轴旋转θi
  4. 沿Zi轴平移di

变换矩阵长这样:

T = RotX(α) * TransX(a) * RotZ(θ) * TransZ(d)

我在项目中遇到过一个问题:用标准DH建模一个六轴工业机器人,前三个关节还好,到了腕部关节,坐标系定义变得特别别扭。因为标准DH的坐标系在连杆末端,腕部关节的Z轴方向经常跟预期的不一样,调试时花了不少时间。

2.3 改进DH(Modified DH)

改进DH是Craig等人在1986年提出的修正版本。它的核心区别是:把坐标系固定在连杆的起始端(近端)。

对于关节i,它的坐标系{i}是固定在连杆i的起始端,也就是靠近关节i的那一头。变换顺序变成了:

  1. 绕Zi-1轴旋转θi
  2. 沿Zi-1轴平移di
  3. 绕Xi轴旋转αi
  4. 沿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。如果你在代码里混用了,算出来的位置会差十万八千里。

避坑指南: 我曾经在同一个项目里,两个工程师分别用了标准DH和改进DH建模同一台机器人,结果末端位置差了20多厘米。查了两天才发现是参数下标搞混了。所以团队协作时,一定要统一约定用哪种DH。

2.5 如何选择?

这个问题没有标准答案,但我可以给你一些实际建议:

  • 串联机器人,特别是六轴工业机器人:我建议用改进DH。坐标系定义更直观,调试时少走弯路。
  • 树形结构或并联机器人:必须用改进DH。标准DH处理分支结构非常麻烦,改进DH天然支持。
  • 你用的库或框架有要求:比如ROS的urdf和kdl默认用改进DH,那就别硬改。
  • 教学或学习阶段:两种都学,但先掌握改进DH。因为现代教材和开源项目基本都用它。
小技巧: 如果你不确定自己用的是哪种DH,看一个地方就行——检查你的变换矩阵里,是先绕X轴转还是先绕Z轴转。先绕X轴的是标准DH,先绕Z轴的是改进DH。

2.6 两种DH的坐标系建立规则对比

咱们用一张SVG图来直观展示两种DH的坐标系建立差异:

标准DH vs 改进DH 坐标系建立对比 标准DH 坐标系{i}在连杆i末端 Zᵢ 轴在关节 i+1 上 变换: RX → TX → RZ → TZ 参数: aᵢ₋₁, αᵢ₋₁, dᵢ, θᵢ 适合:早期教材、部分学术 改进DH 坐标系{i}在连杆i起始端 Zᵢ 轴在关节 i 上 变换: RZ → TZ → RX → TX 参数: aᵢ, αᵢ, dᵢ, θᵢ 适合:现代教材、ROS、工业项目 核心差异:坐标系固定在连杆的哪一端? 标准DH在末端,改进DH在起始端 标准DH关节定义 关节i → 坐标系{i-1}在连杆i-1末端 关节i+1 → 坐标系{i}在连杆i末端 Zᵢ 轴穿过关节 i+1 改进DH关节定义 关节i → 坐标系{i}在连杆i起始端 关节i+1 → 坐标系{i+1}在连杆i+1起始端 Zᵢ 轴穿过关节 i

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参数法”。然后把这个文档放在代码仓库的根目录,命名成DH_CONVENTION.md。这样不管谁来接手,都不会搞混。

好了,DH参数法的入门就讲到这里。标准DH和改进DH的区别,说白了就是坐标系放的位置不同。记住一句话:标准DH坐标系在连杆末端,改进DH坐标系在连杆起始端。选哪个不重要,重要的是统一,别混用。