第2章 运动学模型:DH参数法详解

各位工程师,欢迎来到关节标定课程的第二讲。今天我们要啃的这块硬骨头,是机器人运动学里最经典的建模方法——DH参数法。

说实话,我刚入行那会儿,觉得DH参数就是个查表填数的活儿。直到有一次给一个六轴协作臂做标定,怎么调参数都对不上实际位姿,折腾了两天才发现是标准DH和改进DH混用了。从那以后,我再也不敢小看这四行参数了。

2.1 为什么需要DH参数?

你想想看,一个六轴机器人,六个关节,每个关节都在旋转或平移。要描述末端执行器在空间里的位置和姿态,最直接的办法就是给每个关节建一个坐标系,然后一级一级往下算。

DH参数法干的事,就是用四个参数来定义相邻两个坐标系之间的变换关系。这四个参数分别是:

  • θ (关节角):绕Z轴的旋转角
  • d (连杆偏距):沿Z轴的平移距离
  • a (连杆长度):沿X轴的平移距离
  • α (连杆扭角):绕X轴的旋转角

只要把每个关节的这四个参数填好,整个机器人的运动学模型就搭起来了。说白了,这就是一套标准化的坐标系变换流程。

核心思想:DH参数法把复杂的空间变换拆解成四个简单的平移+旋转操作,让机器人运动学建模变得可重复、可编程。

2.2 标准DH vs 改进DH

这里有个坑,很多新手都会踩。DH参数其实有两个版本:标准DH(Standard DH)和改进DH(Modified DH)。

它们的区别在哪?我直接说结论:坐标系附着的位置不同。

  • 标准DH:坐标系{i}附着在连杆i的末端(即关节i+1处)。变换顺序是:绕Z轴转θ → 沿Z轴移d → 沿X轴移a → 绕X轴转α。
  • 改进DH:坐标系{i}附着在连杆i的起始端(即关节i处)。变换顺序是:沿X轴移a → 绕X轴转α → 绕Z轴转θ → 沿Z轴移d。

听起来有点绕?我画个图你就明白了。

标准DH vs 改进DH 坐标系附着对比 标准DH 坐标系{i}在连杆i末端 变换顺序:θ → d → a → α 适用场景:串联机器人、树形结构 常见库:MATLAB Robotics Toolbox 注意:关节变量在变换矩阵最左侧 改进DH 坐标系{i}在连杆i起始端 变换顺序:a → α → θ → d 适用场景:树形/闭链机构 常见库:ROS / URDF 注意:关节变量在变换矩阵最右侧 区别 关键差异对比 对比项 标准DH 改进DH 坐标系位置 连杆末端 连杆起始端 变换顺序 θ → d → a → α a → α → θ → d 关节变量位置 矩阵最左侧 矩阵最右侧 典型应用 串联机器人 树形/闭链机构 常见工具 MATLAB工具箱 ROS/URDF

避坑指南:我曾经在一个项目里,用标准DH建了模型,但ROS的URDF默认用的是改进DH。结果正运动学算出来末端位置差了十几厘米。后来花了整整一天排查,才发现是DH版本不匹配。所以,开始建模前,先确认你的工具链用哪个版本。

2.3 正运动学推导

有了DH参数,正运动学推导就变成了一道填空题。每个相邻关节的变换矩阵长这样:

标准DH变换矩阵:
T(i-1→i) = Rot(z, θi) * Trans(z, di) * Trans(x, ai) * Rot(x, αi)

展开成4×4矩阵:
| cosθi   -sinθi·cosαi    sinθi·sinαi    ai·cosθi |
| sinθi    cosθi·cosαi    -cosθi·sinαi   ai·sinθi |
| 0        sinαi           cosαi          di       |
| 0        0               0              1        |

嗯,这个矩阵看着有点吓人,但你仔细看,其实就四个部分:左上角3×3是旋转矩阵,右上角3×1是平移向量,左下角1×3是透视变换(机器人里永远是0),右下角是缩放因子(永远是1)。

正运动学的计算流程,说白了就是把这些矩阵一个一个乘起来:

T(0→n) = T(0→1) · T(1→2) · T(2→3) · ... · T(n-1→n)

最后得到的4×4矩阵,左上角3×3就是末端姿态,右上角3×1就是末端位置。

我的习惯:在实际项目中,我不会手算这些矩阵。我会用Python的sympy库做符号推导,或者用MATLAB的Robotics Toolbox直接算。但理解推导过程很重要——至少你知道计算机在背后干了什么。

2.4 一个完整的例子

拿一个两轴平面机器人来演示。假设两个关节都是旋转关节,连杆长度分别是a1和a2。

先填DH参数表:

关节i θi di ai αi
1 θ1 0 a1 0
2 θ2 0 a2 0

然后代入变换矩阵公式:

T(0→1) = 
| cosθ1  -sinθ1  0  a1·cosθ1 |
| sinθ1   cosθ1  0  a1·sinθ1 |
| 0       0      1  0        |
| 0       0      0  1        |

T(1→2) = 
| cosθ2  -sinθ2  0  a2·cosθ2 |
| sinθ2   cosθ2  0  a2·sinθ2 |
| 0       0      1  0        |
| 0       0      0  1        |

乘起来得到末端位姿:

T(0→2) = T(0→1) · T(1→2)

末端位置:
x = a1·cosθ1 + a2·cos(θ1+θ2)
y = a1·sinθ1 + a2·sin(θ1+θ2)

末端姿态(绕Z轴转角):
φ = θ1 + θ2

这个结果你看着眼熟吗?没错,就是平面二连杆的正运动学公式。DH参数法只是把这个过程标准化了。

关键点:正运动学推导的核心就是矩阵乘法。只要DH参数表填对了,剩下的就是计算机的活。但填表的时候,坐标系的方向、零位的位置,这些细节一个都不能错。

2.5 实际项目中的注意事项

最后,分享几个我在实际项目中踩过的坑:

  1. 零位定义要统一:同一个机器人,机械零位和电气零位可能不一样。我建议在DH参数表里明确标注零位对应的关节角度值。
  2. 关节限位要检查:正运动学算出来的位置,如果关节角度超出了物理限位,那就是无效解。这个在标定的时候特别容易忽略。
  3. 符号一致性:关节旋转方向(顺时针还是逆时针为正)必须和DH参数里的θ方向一致。我曾经因为符号搞反,标定结果差了180度。
  4. 工具坐标系补偿:DH参数只算到法兰盘,末端执行器的偏移量要单独加一个工具坐标系变换。