4. 逆运动学:逆运动学问题描述、解析法与数值法、多解与奇异位形
好,咱们接着聊运动学。上一章我们讲了正运动学,说白了就是给定关节角度,算出末端执行器在哪。那逆运动学呢?正好反过来——我知道末端要去哪,你给我算出每个关节该转多少度。
听起来好像就是解个方程?嗯,没那么简单。我在项目里吃过不少亏,今天就把这些坑一个个给你指出来。
4.1 逆运动学问题描述
先给个正式定义:逆运动学(Inverse Kinematics, IK)就是已知末端执行器在笛卡尔空间的位置和姿态,求解机器人各关节变量的过程。
数学上可以写成:
给定:T = [R p; 0 1] (末端位姿矩阵)
求解:θ₁, θ₂, ..., θₙ (各关节角度)
满足:f(θ₁, θ₂, ..., θₙ) = T
这里 f 就是正运动学函数。说白了,逆运动学就是正运动学的反函数。
但问题来了——这个反函数通常不好求。为什么?
- 非线性:关节角度和末端位置之间是三角函数关系,不是简单的线性映射
- 多解性:同一个末端位置,可能有多种关节角度组合
- 无解:有些位置机器人根本够不着
- 奇异位形:某些位形下,关节速度会变得无穷大
我个人习惯把逆运动学问题分成两类:一类是解析法能解的,一类是只能靠数值法硬算的。下面我们分别来看。
4.2 解析法
解析法,就是通过代数或几何推导,直接写出关节角度的表达式。优点是快、准、稳。缺点是——不是所有机器人都能用。
什么样的机器人能用解析法?满足 Pieper 准则的机器人:三个相邻关节轴交于一点,或者三个相邻关节轴平行。大多数工业六轴机器人(比如 KUKA、ABB)都满足这个条件。
核心思路:把逆运动学问题拆解成多个子问题,每个子问题对应一个或两个关节的求解。
举个例子,一个简单的 2R 平面机械臂:
已知:末端位置 (x, y),杆长 L₁, L₂
求:关节角 θ₁, θ₂
解:
1. 先求 θ₂(肘关节):
cosθ₂ = (x² + y² - L₁² - L₂²) / (2L₁L₂)
θ₂ = ±arccos(cosθ₂) // 注意有正负两个解!
2. 再求 θ₁(肩关节):
β = atan2(y, x)
α = atan2(L₂sinθ₂, L₁ + L₂cosθ₂)
θ₁ = β - α
你看,这里就出现了多解——肘关节可以向上弯,也可以向下弯。这就是所谓的「肘上」和「肘下」构型。
我的经验:在实际项目中,我一般优先用解析法。因为速度快,而且能明确知道有多少组解。我曾经在一个焊接机器人项目里,就因为用了数值法没控制好解的选择,导致机器人走了一条奇怪的路径,差点撞到工件。后来换成解析法,把多解情况全部枚举出来,再根据避障和关节限位筛选,问题就解决了。
4.3 数值法
当机器人不满足 Pieper 准则,或者结构比较复杂时,解析法就不好使了。这时候就得请出数值法。
数值法的核心思想是迭代逼近:先猜一组关节角度,算一下末端位置,看看和目标的差距,然后调整关节角度,再算,再调……直到误差足够小。
最常用的方法是牛顿-拉夫森法和雅可比伪逆法。
算法流程(雅可比伪逆法):
1. 初始化:θ = θ₀(初始猜测)
2. 循环直到收敛:
a. 计算当前末端位姿 T_curr = f(θ)
b. 计算误差 ΔT = T_desired - T_curr
c. 如果 ||ΔT|| < ε,跳出循环
d. 计算雅可比矩阵 J(θ)
e. 计算关节增量 Δθ = J⁺ · ΔT (J⁺ 是 J 的伪逆)
f. 更新 θ = θ + Δθ
3. 返回 θ
注意:数值法有几个坑:
- 初始值敏感:猜得不好可能不收敛
- 局部最优:可能找到的不是你要的那组解
- 奇异位形附近:雅可比矩阵会病态,增量变得很大
我曾经在一个协作机器人项目里,用数值法做逆运动学。有一次机器人突然抖了一下,我一看日志,原来是走到了奇异位形附近,雅可比矩阵的伪逆算出来的关节速度大得离谱。从那以后,我每次用数值法都会加一个阻尼项——这就是阻尼最小二乘法(DLS),也叫 Levenberg-Marquardt 方法。
4.4 多解问题
逆运动学有多解,这是常态。一个六轴机器人,同一个末端位姿,可能有 8 组甚至 16 组解。
常见的多解情况:
- 肘上/肘下:肘关节的两种弯曲方向
- 肩左/肩右:肩关节的两种朝向
- 腕翻转:腕关节的两种姿态
这么多解,选哪个?
我个人习惯按以下优先级筛选:
- 关节限位:先排除超出关节角度范围的解
- 避障:排除会和环境碰撞的解
- 最短路径:选择离当前关节角度最近的解
- 运动平滑性:选择能让运动更平滑的解
避坑指南:我曾经在调试一个喷涂机器人时,发现机器人每次经过同一个点,关节角度都不一样。后来查了半天,发现是逆运动学求解器每次随机选了一组解。解决方案很简单——加入「解连续性」约束,让相邻时刻的解尽量接近。
4.5 奇异位形
奇异位形,说白了就是机器人「卡住」的位置。在这个位置,机器人会失去某个方向的运动能力。
从数学上看,奇异位形就是雅可比矩阵 J 的秩降低的时候。这时候 J 不可逆,关节速度和末端速度的关系变得很奇怪。
常见的奇异位形:
| 类型 | 描述 | 例子 |
|---|---|---|
| 边界奇异 | 机器人完全伸直或完全折叠 | 肘关节 0° 或 180° |
| 内部奇异 | 两个或多个关节轴共线 | 腕关节的 4、6 轴共线 |
| 肩部奇异 | 肩关节和腕关节中心重合 | 六轴机器人肩部奇异 |
奇异位形有什么危害?
- 关节速度会变得非常大(理论上无穷大)
- 机器人可能突然加速,造成危险
- 数值法求解会发散
我的教训:有一次在调试一个码垛机器人,程序里没做奇异位形检测。结果机器人走到某个位置时,第 4 关节突然以 500°/s 的速度猛转,差点把电机烧了。从那以后,我写逆运动学代码一定会加奇异位形检测,并在附近切换成阻尼最小二乘法。
4.6 知识体系总览
下面这张图把逆运动学的核心内容串起来了:
嗯,逆运动学的内容就这些。说白了就是:能解析就解析,不行就数值迭代。多解要会选,奇异要会躲。这些都是我实际项目中踩过的坑,希望能帮你少走弯路。