第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建了模型,但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 实际项目中的注意事项
最后,分享几个我在实际项目中踩过的坑:
- 零位定义要统一:同一个机器人,机械零位和电气零位可能不一样。我建议在DH参数表里明确标注零位对应的关节角度值。
- 关节限位要检查:正运动学算出来的位置,如果关节角度超出了物理限位,那就是无效解。这个在标定的时候特别容易忽略。
- 符号一致性:关节旋转方向(顺时针还是逆时针为正)必须和DH参数里的θ方向一致。我曾经因为符号搞反,标定结果差了180度。
- 工具坐标系补偿:DH参数只算到法兰盘,末端执行器的偏移量要单独加一个工具坐标系变换。