3. 连杆参数与DH模型:Denavit-Hartenberg参数定义、标准DH与改进DH的区别、建立连杆坐标系的步骤
大家好,我是你们的老朋友。今天我们来聊聊机器人运动学里最基础、也最绕不开的一个话题——DH模型。
说实话,我刚入行那会儿,第一次看到DH参数表,脑子里全是问号。四个参数就能描述一个连杆?凭什么?后来在项目里调了两年机械臂,才真正体会到这四个参数的精妙之处。说白了,DH参数就是给每个关节和连杆发了一张「身份证」,让计算机能精确知道它们之间的位置关系。
3.1 什么是Denavit-Hartenberg参数?
DH参数,全称Denavit-Hartenberg参数。它用四个值来描述相邻两个连杆之间的相对位置和姿态。你想想看,一个机械臂少说也有四五个关节,每个关节都在动,怎么统一描述?DH参数就是干这个的。
这四个参数分别是:
- 连杆长度 ai:沿Xi轴方向,从Zi-1轴到Zi轴的距离。说白了就是两个关节轴之间的最短距离。
- 连杆扭角 αi:绕Xi轴,从Zi-1轴旋转到Zi轴的角度。描述两个关节轴之间的扭转。
- 关节距离 di:沿Zi-1轴方向,从Xi-1轴到Xi轴的距离。对于移动关节,这个值是变量。
- 关节转角 θi:绕Zi-1轴,从Xi-1轴旋转到Xi轴的角度。对于旋转关节,这个值是变量。
核心记忆点:a和α描述的是连杆本身的几何特性,d和θ描述的是关节的运动特性。记住这个,你就能分清哪个参数是固定的,哪个是变量了。
3.2 标准DH与改进DH的区别
这个问题,我在面试新人时经常问。很多人背得滚瓜烂熟,但一问到「为什么要有两种」,就卡住了。
其实很简单。标准DH(Classic DH)把坐标系建在连杆的末端,而改进DH(Modified DH)把坐标系建在连杆的起始端。就这点区别。
具体来说:
- 标准DH(Craig版):坐标系{i}固定在连杆i的末端。变换顺序是:先绕Zi-1转θ,再沿Zi-1移d,然后沿Xi移a,最后绕Xi转α。
- 改进DH(Khalil & Kleinfinger版):坐标系{i}固定在连杆i的起始端。变换顺序是:先绕Xi-1转α,再沿Xi-1移a,然后绕Zi转θ,最后沿Zi移d。
我个人习惯用改进DH。为什么?因为它在处理树形结构或闭链机构时更直观。我记得有一次做并联机器人项目,用标准DH死活对不上参数,换成改进DH一下子就通了。
我的建议:如果你刚开始学,先用标准DH,因为教材和开源代码(比如MoveIt里的URDF解析)大多用这个。等熟练了,再尝试改进DH。
3.3 建立连杆坐标系的步骤
好,理论说完了,我们来点实际的。怎么给一个机械臂建立连杆坐标系?我总结了五步法:
- 确定关节轴:画出所有关节的旋转轴或移动轴方向。记住,Z轴永远沿着关节轴方向。
- 确定基坐标系:{0}坐标系可以任意放置,但通常让Z0沿关节1的轴方向,且尽量让X0指向下一个关节。
- 确定连杆坐标系{i}:对于i从1到n-1:
- Zi轴沿关节i+1的轴方向
- Xi轴沿Zi-1和Zi的公垂线方向,从Zi-1指向Zi
- Yi轴由右手定则确定
- 确定末端坐标系{n}:通常放在末端执行器的中心,Zn轴沿接近方向。
- 填写DH参数表:根据坐标系的位置,读出a、α、d、θ四个值。
注意:当两个相邻关节轴平行时,公垂线不唯一。这时候我一般选择让Xi轴沿前一个X轴的方向,或者让di=0来简化计算。曾经有个项目,我忘了处理平行轴的情况,结果仿真出来的轨迹全是乱的,排查了两天才发现是坐标系建歪了。
3.4 DH参数与变换矩阵
有了DH参数,我们就可以写出相邻连杆之间的变换矩阵了。标准DH的变换矩阵长这样:
T = Rot(z, θ) * Trans(z, d) * Trans(x, a) * Rot(x, α)
[cosθ -sinθcosα sinθsinα a·cosθ]
[sinθ cosθcosα -cosθsinα a·sinθ]
[0 sinα cosα d ]
[0 0 0 1 ]
你想想看,一个4x4矩阵,四个参数,就能描述任意两个连杆之间的位姿关系。这就是DH模型的魅力所在。
3.5 知识体系总览
下面这张图,是我用SVG画的DH模型核心逻辑图。它把参数定义、坐标系建立、变换矩阵串成了一个整体。建议你保存下来,以后写代码时对照着看。
3.6 一个简单的例子
假设我们有一个两连杆机械臂,两个关节都是旋转关节。按照上面的步骤,我们可以建立坐标系并填写DH参数表:
| 连杆 i | ai | αi | di | θi |
|---|---|---|---|---|
| 1 | L1 | 0 | 0 | θ1 (变量) |
| 2 | L2 | 0 | 0 | θ2 (变量) |
把这两个变换矩阵乘起来,就能得到末端相对于基座的位置和姿态。嗯,这就是正运动学的核心。
避坑指南:我曾经在写MoveIt的URDF文件时,把DH参数里的a和d搞反了。结果机械臂在仿真里直接「飞」出去了。后来我养成了一个习惯:每次填完DH参数表,先手动算一个简单位姿验证一下,比如让所有关节角为0,看看末端位置对不对。
好了,DH模型就讲到这里。记住,这四个参数不是死记硬背的,而是要在实际项目中反复用、反复调,才能真正理解。下一章我们会聊MoveIt里怎么用这些参数来规划运动轨迹,到时候你会看到,今天学的这些全是基础中的基础。