第二章:机器人运动学基础——坐标系与变换、位姿描述、DH参数法
各位同学,大家好。今天咱们来聊聊机器人运动学的基础。说实话,这部分内容看着有点抽象,但它是后续所有编程和调试的根基。我当年刚入行时,也觉得坐标系变换就是一堆数学公式,直到在产线上被一个位姿偏差折腾了整整两天……嗯,从那以后,我再也不敢小看它了。
2.1 坐标系与空间变换
机器人要动,首先得知道“自己在哪”。这就要靠坐标系。
我们常用的坐标系有三种:
- 世界坐标系:固定在机器人基座上的参考系,所有运动都基于它。
- 工具坐标系:固定在机器人末端执行器(比如焊枪、夹爪)上,随它一起动。
- 工件坐标系:固定在被加工工件上,方便编程时直接描述工件上的点。
你想想看,如果焊枪要在一个倾斜的工件上画一条直线,直接在世界坐标系里编程得多麻烦?但如果你把坐标系建在工件上,那就简单了——沿着工件表面走就行。
核心概念:坐标系变换的本质,就是将一个点在一个坐标系下的坐标,换算到另一个坐标系下。说白了,就是“换个角度看问题”。
变换包括平移和旋转。平移好理解,就是沿着X、Y、Z轴移动。旋转呢?绕X轴转叫Roll,绕Y轴转叫Pitch,绕Z轴转叫Yaw。这三个角度合起来,就能描述任意姿态。
我的小习惯:在调试现场,我习惯先用示教器手动把机器人移到目标位置,然后直接读取当前位姿数据。这样比纯计算快得多,也避免了坐标系换算的坑。
2.2 位姿描述:位置 + 姿态
机器人的“位姿”,就是位置和姿态的合称。位置用坐标 (x, y, z) 表示,姿态用欧拉角 (Rx, Ry, Rz) 或四元数表示。
为什么要有两种表示方式?
- 欧拉角:直观,容易理解。但有个大问题——万向锁。当某个轴转到90度时,另外两个轴会失去自由度,导致姿态突变。
- 四元数:数学上更稳定,没有万向锁问题。但看着像四个数字 (w, x, y, z),不太直观。
我个人建议:调试时用欧拉角,方便观察和调整;写程序时用四元数,避免姿态跳变。我在一个焊接项目里就吃过亏——用欧拉角做插补,结果焊枪在某个点突然翻转了180度,差点把工件撞废。
避坑指南:我曾经在调试一个六轴机器人时,发现它走到某个位置后姿态突然“抽风”。查了半天,原来是欧拉角表示时,Rx从179度变到了-179度,看似只变了2度,但实际绕了358度。换成四元数就没事了。
2.3 DH参数法:建立机器人运动学模型
DH参数法,全称Denavit-Hartenberg参数法。它是描述机器人连杆之间相对位置和姿态的标准方法。说白了,就是给每个关节建一个坐标系,然后用四个参数把它们串起来。
四个参数分别是:
| 参数 | 含义 | 影响 |
|---|---|---|
| θ (theta) | 关节角 | 绕Z轴旋转的角度 |
| d | 连杆偏距 | 沿Z轴的平移距离 |
| a | 连杆长度 | 沿X轴的平移距离 |
| α (alpha) | 连杆扭角 | 绕X轴旋转的角度 |
每个关节对应一组DH参数。有了这些参数,就能算出末端执行器相对于基座的位置和姿态。这就是所谓的“正运动学”。
反过来,知道末端位姿,反推每个关节的角度,就是“逆运动学”。逆运动学比正运动学复杂得多,因为同一个末端位姿可能对应多组关节角度解。
实际应用:在机器人编程时,我们通常只关心末端位姿。至于每个关节怎么转,控制器会自动用逆运动学算出来。但如果你要自己写运动控制算法,或者做离线仿真,那DH参数就是绕不开的基础。
2.4 知识体系总览
下面这张图,是我自己整理的本章知识结构。你可以把它当作一个“地图”,学完后再回来看,会更有感觉。
2.5 代码示例:DH参数正运动学计算
下面是一个简单的Python示例,演示如何用DH参数计算末端位姿。实际项目中,你可能会用更成熟的库,但理解原理很重要。
import numpy as np
def dh_transform(theta, d, a, alpha):
"""
根据DH参数计算相邻连杆的变换矩阵
"""
ct = np.cos(theta)
st = np.sin(theta)
ca = np.cos(alpha)
sa = np.sin(alpha)
T = np.array([
[ct, -st*ca, st*sa, a*ct],
[st, ct*ca, -ct*sa, a*st],
[0, sa, ca, d],
[0, 0, 0, 1]
])
return T
# 示例:一个两关节机器人的DH参数
# 关节1:theta=30°, d=0, a=1, alpha=0
# 关节2:theta=45°, d=0, a=0.8, alpha=0
T1 = dh_transform(np.radians(30), 0, 1, 0)
T2 = dh_transform(np.radians(45), 0, 0.8, 0)
# 末端相对于基座的变换矩阵
T_end = T1 @ T2
print("末端位姿矩阵:")
print(T_end)
调试小技巧:如果你在仿真中看到机器人末端位置和预期不符,先别急着改代码。把每个关节的DH参数单独打印出来,检查θ、d、a、α是否和机器人手册一致。我遇到过好几次,问题出在参数符号上——比如a的正负号搞反了。
好了,这一章的内容就到这里。坐标系、位姿描述、DH参数,这三块是机器人运动学的基石。你想想看,没有坐标系,机器人连自己在哪都不知道;没有位姿描述,它不知道怎么抓东西;没有DH参数,它连怎么动都算不出来。所以,别嫌基础,多练练手,后面学轨迹规划和编程时,你会感谢现在的自己。
公众号:蓝海资料掘金营,微信deep3321