二、机器人运动学基础:刚体变换、齐次坐标、正运动学(DH参数法)、逆运动学求解方法
各位同学,咱们今天聊聊机器人运动学。说实话,这玩意儿是机器人控制的“地基”。你想想看,要让机械臂去抓一个杯子,你总得知道它每个关节转多少度,末端执行器在哪儿吧?这就是运动学要解决的事。
我个人习惯把运动学分成两半:正运动学和逆运动学。正运动学是“已知关节角度,求末端位姿”;逆运动学是“已知末端位姿,求关节角度”。前者是唯一的,后者嘛……嘿嘿,往往有多个解,甚至无解。我在项目里就吃过这个亏,后面会细说。
2.1 刚体变换:位置与姿态的描述
首先,咱们得搞清楚一个概念:刚体。说白了,就是一个不会变形的物体。机械臂的每个连杆,我们都可以看作刚体。描述一个刚体在空间中的状态,需要两个东西:位置和姿态。
- 位置:用三维坐标 (x, y, z) 表示。这个简单,初中就学过。
- 姿态:描述刚体“朝哪边看”。这就有意思了,可以用旋转矩阵、欧拉角、四元数等表示。
我个人最常用的是旋转矩阵。它是一个 3x3 的矩阵,每一列代表刚体坐标系的一个轴在参考坐标系中的投影。嗯,这里要注意:旋转矩阵是正交矩阵,它的逆等于它的转置。这个性质在后续计算中非常有用。
核心公式:刚体变换 = 旋转 + 平移
一个刚体在空间中的完整位姿,可以用一个 4x4 的齐次变换矩阵 T 来表示:
T = [ R p ]
[ 0 1 ]
其中 R 是 3x3 旋转矩阵,p 是 3x1 位置向量。
2.2 齐次坐标:为什么是4x4?
你可能会问:为什么非要用 4x4 矩阵?3x3 加个向量不行吗?
行,但不好用。因为连续的旋转和平移,如果用 3x3 矩阵加向量,写出来是:p' = R * p + t。这玩意儿没法写成简单的矩阵乘法形式。而用齐次坐标,把三维点 (x, y, z) 扩展成 (x, y, z, 1),一切就变得优雅了:
p' = T * p
连续变换就是矩阵连乘:T_total = T1 * T2 * T3 * ...。我在做轨迹规划时,经常需要把工具坐标系、工件坐标系、基坐标系来回变换,齐次坐标让这些操作变得像搭积木一样简单。
小技巧:齐次坐标的最后一个分量 w,通常取 1 表示点,取 0 表示方向向量。方向向量只旋转,不平移。这个细节在计算雅可比矩阵时特别重要。
2.3 正运动学:DH参数法
好了,重头戏来了。DH参数法(Denavit-Hartenberg)是描述机器人连杆之间关系的标准方法。它用四个参数来定义相邻两个连杆的变换:
| 参数 | 符号 | 含义 |
|---|---|---|
| 连杆长度 | ai-1 | 沿 xi-1 轴,从 zi-1 到 zi 的距离 |
| 连杆扭角 | αi-1 | 绕 xi-1 轴,从 zi-1 到 zi 的角度 |
| 连杆偏距 | di | 沿 zi 轴,从 xi-1 到 xi 的距离 |
| 关节角 | θi | 绕 zi 轴,从 xi-1 到 xi 的角度 |
有了这四个参数,相邻连杆的变换矩阵就是:
T_i = Rot_x(α_{i-1}) * Trans_x(a_{i-1}) * Rot_z(θ_i) * Trans_z(d_i)
展开后是一个 4x4 矩阵。把所有连杆的 T_i 乘起来,就得到末端执行器相对于基座的位姿。
避坑指南:我曾经在搭建一个六轴机器人模型时,把 DH 参数的符号搞反了。结果仿真时机械臂像喝醉了酒一样乱晃。后来花了整整一个下午才排查出来——原来是 α 的正负号定义跟标准不一致。所以,一定要先确认你用的是标准 DH 还是改进 DH,两者在坐标系建立上略有差异。
2.4 逆运动学求解方法
正运动学是“给角度求位置”,逆运动学是“给位置求角度”。后者才是真正的难点。
为什么难?因为逆运动学通常有多个解,甚至无解。比如,你让机械臂去抓一个点,它可能“肘部朝上”或“肘部朝下”都能到达。这就是多解问题。
常用的求解方法有:
- 解析法(封闭解):通过代数或几何方法直接求出关节角。速度快,但只适用于特定构型的机器人(如满足 Pieper 准则的机器人)。
- 数值法(迭代法):如牛顿-拉夫森法、雅可比伪逆法。通用性强,但计算慢,且可能陷入局部最优。
我个人偏好解析法。只要机器人构型允许,解析法是最可靠的。我记得有一次做焊接机器人项目,要求实时性很高,数值法根本跑不动。后来改用解析法,计算时间从 5 毫秒降到了 0.1 毫秒。
实用建议:在实际项目中,我通常这样处理逆运动学:
- 先判断目标位姿是否在可达工作空间内。
- 如果在,用解析法求出所有可能解。
- 根据当前关节角度,选择“最近”的解(最小关节位移)。
- 检查是否与障碍物碰撞。
这一套流程下来,基本不会出大问题。
2.5 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的核心逻辑串起来了。你从正运动学和逆运动学两个入口进去,中间经过刚体变换、齐次坐标、DH参数这些工具,最终都服务于轨迹规划。
个人经验:学运动学,千万别死记公式。我建议你找个开源机器人模型(比如 UR5 的 DH 参数表),自己动手推导一遍正运动学,再用 Python 或 MATLAB 验证。踩过坑,才能真正理解。
好了,运动学基础就聊到这儿。记住:正运动学是“已知关节,求位姿”,逆运动学是“已知位姿,求关节”。前者是后者的基础,后者是前者的逆过程。两者缺一不可。