3. 运动学基础(上):机械臂正运动学——DH参数法、标准DH与改进DH的区别、建立连杆坐标系
各位同学,欢迎来到《轨迹规划实战》的第三讲。今天咱们聊聊机械臂运动学里最基础、也最绕不开的一个话题——DH参数法。
说实话,我刚入行那会儿,第一次看到DH参数表,脑子里全是问号。四个参数就能描述一个六轴机械臂?这玩意儿靠谱吗?后来亲手搭过几次模型,踩过几次坑,才真正体会到它的精妙之处。
好,咱们不废话,直接开干。
3.1 为什么要学正运动学?
正运动学,说白了就是:你给我每个关节的角度,我告诉你末端在哪儿、朝哪个方向。
你想想看,如果连末端位置都算不出来,后面的轨迹规划、避障、力控,全都是空中楼阁。我在做第一个焊接机器人项目时,就是因为正运动学模型建错了,焊枪偏了5毫米,结果一整批工件全废了。嗯,从那以后,我每次建完模型都会先用几个已知姿态做验证。
核心公式:
T = T1 · T2 · T3 · … · Tn
其中 Ti 是相邻连杆间的齐次变换矩阵。
3.2 DH参数法——四个参数搞定一切
DH参数法由Denavit和Hartenberg在1955年提出。它的核心思想是:用四个参数来描述两个相邻关节坐标系之间的变换关系。
这四个参数分别是:
| 参数 | 符号 | 物理含义 |
|---|---|---|
| 连杆长度 | 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参数想象成「搭积木」:先沿着X轴平移+旋转,再沿着Z轴平移+旋转。四个步骤,不多不少。
3.3 标准DH vs 改进DH——到底差在哪儿?
这个问题,我当年面试的时候被问过。很多教材里只讲一种,导致初学者以为DH只有一种。其实不然。
标准DH(Classic DH / Standard DH):
- 坐标系i固定在连杆i的末端
- 变换顺序:绕Zi-1旋转θi → 沿Zi-1平移di → 沿Xi平移ai → 绕Xi旋转αi
- 变换矩阵:Ti = RotZ(θi) · TransZ(di) · TransX(ai) · RotX(αi)
改进DH(Modified DH):
- 坐标系i固定在连杆i的起始端
- 变换顺序:绕Xi-1旋转αi-1 → 沿Xi-1平移ai-1 → 绕Zi旋转θi → 沿Zi平移di
- 变换矩阵:Ti = RotX(αi-1) · TransX(ai-1) · RotZ(θi) · TransZ(di)
注意:标准DH和改进DH的坐标系定义方式不同,导致参数下标也不同。我曾经在项目中混用过两种,结果算出来的末端位置差了十万八千里。所以,选一种,从头到尾用到底。
我个人更偏爱改进DH。为什么?因为它的坐标系定义更符合直觉——每个坐标系都固定在连杆的根部,调试时更容易理解。当然,这只是个人习惯,标准DH也有它的拥趸。
3.4 建立连杆坐标系——手把手教你
好,理论说完了,咱们来点实操。建立连杆坐标系,我总结了一个「三步法」:
- 找关节轴:画出所有关节的旋转轴(Z轴)
- 定公垂线:相邻Z轴之间的公垂线方向就是X轴
- 右手定则:Y轴由右手定则确定
举个例子,一个简单的两连杆机械臂:
// 两连杆机械臂的DH参数(改进DH)
// 连杆1:a0=0, α0=0, d1=0, θ1=变量
// 连杆2:a1=L1, α1=0, d2=0, θ2=变量
// 齐次变换矩阵(Python伪代码)
import numpy as np
def dh_transform(a, alpha, d, theta):
T = np.array([
[np.cos(theta), -np.sin(theta)*np.cos(alpha), np.sin(theta)*np.sin(alpha), a*np.cos(theta)],
[np.sin(theta), np.cos(theta)*np.cos(alpha), -np.cos(theta)*np.sin(alpha), a*np.sin(theta)],
[0, np.sin(alpha), np.cos(alpha), d],
[0, 0, 0, 1]
])
return T
# 计算末端位姿
T1 = dh_transform(0, 0, 0, q1)
T2 = dh_transform(L1, 0, 0, q2)
T_end = T1 @ T2
小技巧:写代码时,先把DH参数表列出来,再写变换函数。参数表就是你的「设计图纸」,图纸错了,代码写得再漂亮也没用。
3.5 知识体系总览
下面这张图,是我自己总结的本章知识结构。你把它存下来,以后每次建模前看一眼,思路会清晰很多。
3.6 避坑指南
最后,分享几个我踩过的坑:
- 坐标系方向搞反:我曾经在建立坐标系时,把Z轴方向搞反了,结果算出来的末端位置镜像对称。检查了三天才发现问题。所以,每次建完坐标系,先用一个已知关节角度验证一下。
- 参数符号混淆:标准DH和改进DH的参数定义不同,千万别混用。我建议你选一种,然后一直用下去。
- 忽略奇异位形:当两个关节轴平行时,公垂线不唯一,需要特殊处理。嗯,这个后面讲逆运动学时还会细说。
一句话总结:正运动学不难,难的是细心。DH参数表就是你的「地图」,地图画对了,路就好走了。
好了,这一讲就到这里。记住,多动手、多验证,正运动学就是一层窗户纸,捅破了就通了。