第二章:机器人运动学基础
各位工程师朋友,大家好。今天我们来聊聊机器人运动学。说实话,这章内容是整个轨迹规划的基石。你想想看,要让机器人动起来,首先得知道它现在在哪儿,要去哪儿,怎么去。这就是运动学要解决的问题。
我个人习惯把运动学分成两部分:正运动学和逆运动学。正运动学是已知关节角度,求末端位置;逆运动学正好反过来。听起来简单,但实际项目中坑不少。我曾经在一个焊接项目里,就因为逆运动学求解没处理好,导致机器人差点撞到工件。嗯,咱们慢慢聊。
2.1 空间描述与变换
先说说空间描述。机器人工作在一个三维空间里,我们需要描述物体的位置和姿态。位置好办,三个坐标(x,y,z)就搞定了。但姿态呢?光有位置不够,你还要知道它朝哪个方向。
举个例子。我在调试一个抓取工位时,发现机器人总是抓偏。后来一查,原来是姿态描述出了问题。位置对了,但手爪的方向差了5度,结果就是抓不稳。
空间变换说白了就是坐标系的转换。从一个坐标系到另一个坐标系,需要旋转和平移。旋转可以用旋转矩阵表示,平移就是加个向量。这里我建议你记住一个原则:先旋转,后平移。顺序搞反了,结果就全错了。
核心要点:空间描述 = 位置 + 姿态。位置用向量,姿态用旋转矩阵。变换时注意顺序。
2.2 齐次变换矩阵
齐次变换矩阵是个好东西。它把旋转和平移统一到一个4x4的矩阵里。为什么是4x4?因为3x3的旋转矩阵只能处理旋转,加不上平移。齐次坐标引入了一个额外的维度,让一切变得简单。
齐次变换矩阵的形式是这样的:
| R t |
| 0 1 |
其中R是3x3旋转矩阵,t是3x1平移向量。最后一行是[0 0 0 1]。
我记得第一次用齐次变换矩阵时,总觉得多了一行一列很别扭。但用久了你会发现,它让连续变换变得特别直观。比如你要从基坐标系到工具坐标系,中间经过几个关节,只需要把每个关节的变换矩阵乘起来就行。
小技巧:矩阵乘法不满足交换律。变换顺序不同,结果天差地别。我建议你在代码里明确标注每个变换的物理意义,避免搞混。
2.3 DH参数法
DH参数法是描述机器人连杆和关节的标准方法。它用四个参数来定义相邻两个坐标系的关系:
- 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参数?因为它标准化了。不管你是六轴机器人还是SCARA,都能用同一套方法建模。我在项目中遇到过一个问题:不同厂家的机器人,DH参数定义可能略有差异。有的用标准DH,有的用改进DH。你拿到参数后,一定要先确认是哪种。
注意:标准DH和改进DH的区别在于坐标系附着的位置。标准DH把坐标系放在连杆末端,改进DH放在连杆起始端。搞混了,正运动学算出来就是错的。
下面是一个六轴机器人的DH参数表示例:
| 关节i | ai-1 (mm) | αi-1 (°) | di (mm) | θi (°) |
|---|---|---|---|---|
| 1 | 0 | 0 | 400 | θ1 |
| 2 | 250 | -90 | 0 | θ2 |
| 3 | 200 | 0 | 0 | θ3 |
| 4 | 0 | -90 | 300 | θ4 |
| 5 | 0 | 90 | 0 | θ5 |
| 6 | 0 | -90 | 100 | θ6 |
2.4 正运动学求解
正运动学就是已知关节角度,求末端位姿。说白了,就是把这些DH参数代进去,算出齐次变换矩阵。
具体步骤:
- 根据DH参数,写出每个关节的变换矩阵 i-1Ti
- 把所有变换矩阵乘起来:0T6 = 0T1 · 1T2 · ... · 5T6
- 从结果矩阵中提取位置和姿态
代码实现很简单,就是矩阵乘法。我习惯用Python的numpy库,几行就搞定:
import numpy as np
def dh_transform(a, alpha, d, theta):
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
# 计算正运动学
T = np.eye(4)
for i in range(6):
T = T @ dh_transform(a[i], alpha[i], d[i], theta[i])
正运动学的好处是:结果唯一。给定一组关节角,末端位姿是确定的。这在调试时很有用,你可以手动转动关节,然后验证计算结果。
2.5 逆运动学求解
逆运动学就麻烦多了。已知末端位姿,求关节角度。为什么麻烦?因为解不唯一。同一个末端位置,可能有多种关节角度组合。比如六轴机器人,通常有8组解。
求解方法主要有两种:
- 解析法:通过几何关系推导出封闭解。速度快,但只适用于特定构型。
- 数值法:用迭代逼近,比如牛顿-拉夫森法。通用性强,但可能不收敛。
我在实际项目中,优先用解析法。为什么呢?因为稳定。数值法有时候会跳到奇异点附近,导致关节速度爆炸。我曾经在一个码垛项目里,数值法算出来的关节角突然跳变,机器人差点把箱子甩出去。从那以后,我只要能用解析法,绝不用数值法。
经验之谈:逆运动学求解时,一定要考虑关节限位。有些解虽然在数学上成立,但关节角度超出了机械限位,就不能用。我建议你在求解后加一个关节限位检查。
解析法的核心思路是:把末端位姿方程拆解,逐层求解。比如先求第一个关节角,再求第二个,以此类推。每个关节的求解都依赖于前面的结果。
举个例子,对于六轴机器人,通常先求关节1:
# 伪代码示例
# 已知末端位置 (px, py, pz) 和姿态矩阵 R
theta1 = atan2(py, px) # 关节1的角度
然后根据theta1,再求theta2、theta3。这个过程需要仔细推导,一步错步步错。
注意:逆运动学求解时,要注意奇异位形。比如关节5为0度时,关节4和关节6的轴重合,导致解不唯一。这种情况需要特殊处理。
知识体系总览
下面这张图展示了本章的知识结构,我画了个SVG方便你理解:
好了,这一章的内容就到这里。运动学基础是后续轨迹规划的根基,建议你多动手算几个例子。下一章我们会聊轨迹规划的具体方法,到时候这些知识都会用上。
公众号:蓝海资料掘金营,微信deep3321