3、运动学基础(下):逆运动学求解,奇异位形与多解选择策略
上一讲我们把正运动学聊透了——给定关节角度,算出末端位姿。但实际干活时,我们面临的是反过来的问题:已知末端要走到哪儿,反推每个关节该转多少度。这就是逆运动学。
说实话,逆运动学比正运动学麻烦得多。正解是唯一的,逆解却可能没有解、有唯一解、或者有多个解。更头疼的是,有些位置会让机器人“抽筋”——这就是奇异位形。我刚开始调机械臂时,就被奇异点坑过好几次。
3.1 逆运动学求解方法
逆运动学求解,说白了就是解一组非线性方程。常用的方法分两类:解析法和数值法。
3.1.1 解析法(封闭解)
解析法就是通过代数或几何推导,直接写出关节角度的表达式。速度快、精度高,是工业界的首选。但前提是机械臂结构满足Pieper准则——相邻三个关节轴交于一点,或者三个关节轴平行。
我个人习惯优先用解析法。为什么呢?因为它的解是确定的,不会像数值法那样迭代半天还不收敛。我做过一个6轴协作臂项目,末端执行器是焊接枪,要求轨迹重复精度±0.1mm。用解析法,单次逆解耗时不到0.1ms,稳得很。
解析法的典型步骤:
- 腕部位置分离:把末端位姿拆成位置和姿态两部分。先解前三个关节(定位),再解后三个关节(定向)。
- 几何投影:把机械臂投影到平面,用三角关系求关节角。
- 代数消元:利用正运动学方程,通过代入、消元得到单变量方程。
- 反三角函数求解:得到角度值,注意atan2比arccos更稳定。
3.1.2 数值法(迭代求解)
当机械臂结构不满足Pieper准则,或者你懒得推导解析式时,数值法就派上用场了。最常用的是牛顿-拉夫森法和雅可比伪逆法。
数值法的本质是:从一个初始猜测出发,不断迭代,让末端误差逐渐减小到容忍范围内。
// 伪代码:牛顿-拉夫森法求解逆运动学
function inverseKinematicsNumerical(targetPose, initialAngles, maxIter=100, tol=1e-6):
q = initialAngles
for i in range(maxIter):
currentPose = forwardKinematics(q)
error = targetPose - currentPose
if norm(error) < tol:
return q
J = computeJacobian(q) // 计算雅可比矩阵
delta_q = pinv(J) * error // 伪逆求解关节增量
q = q + delta_q
return None // 未收敛
数值法有个坑:对初始值敏感。初始值选不好,可能收敛到错误的解,甚至发散。我建议的做法是:先用解析法(如果可能)算一个近似解作为初值,再用数值法精调。
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 解析法 | 速度快、精度高、解确定 | 推导复杂、依赖结构 | 满足Pieper准则的工业臂 |
| 数值法 | 通用性强、无需推导 | 迭代慢、依赖初值、可能发散 | 非标准构型、冗余自由度臂 |
3.2 奇异位形:机械臂的“死穴”
奇异位形,就是机械臂在某些位姿下失去某个方向运动能力的现象。你想想看,明明末端想往x方向走,但所有关节都动不了——这就是奇异。
为什么会这样?因为雅可比矩阵的秩降低了。雅可比矩阵描述了关节速度到末端速度的映射关系。当矩阵不满秩时,某些方向的速度无法实现。
3.2.1 常见的奇异类型
- 边界奇异:机械臂完全伸直或完全折叠时。比如6轴臂的大臂和小臂成一条直线。
- 内部奇异:腕部奇异,即腕关节的三个轴共面。这在球腕结构中很常见。
- 肩部奇异:肩关节的轴线与腕部位置矢量共线。
我记得有一次调试喷涂机器人,末端在走一个圆弧轨迹时突然卡住,然后关节速度瞬间飙升。我一看日志,发现正好经过了肩部奇异点。雅可比矩阵的条件数从几十跳到了几万,伪逆计算出的关节速度直接爆表。
3.2.2 奇异检测与处理
检测奇异最直接的方法是计算雅可比矩阵的条件数。条件数越大,离奇异越近。一般设定一个阈值,比如条件数大于1000就认为进入奇异区域。
处理策略有三种:
- 阻尼最小二乘法(DLS):在伪逆中加入阻尼项,牺牲精度换取稳定性。
- 奇异值分解(SVD)截断:把太小的奇异值直接置零,避免放大噪声。
- 路径重规划:绕开奇异区域,从路径层面规避。
// 阻尼最小二乘法示例
function dampedPseudoInverse(J, lambda=0.01):
// J: 6xN 雅可比矩阵
// lambda: 阻尼系数
return J.T * inv(J * J.T + lambda^2 * I)
我曾经在项目中用过DLS,效果不错。但要注意阻尼系数不能太大,否则末端跟踪误差会变大。我一般把lambda设成0.01~0.1,然后根据条件数动态调整。
3.3 多解选择策略
逆运动学通常有多个解。比如一个6轴臂,最多可以有8组逆解。选哪个?这不是随便挑一个就行的。
3.3.1 多解的产生原因
多解来源于反三角函数的多值性,以及机械臂构型的对称性。比如“肘部在上”和“肘部在下”就是两种不同的构型。
3.3.2 选择策略
我个人常用的选择策略,按优先级排序:
- 最短关节行程:选择离当前关节角度最近的解。这是最常用的策略,能减少运动时间。
- 避障约束:排除会导致碰撞的解。比如肘部不能撞到工作台。
- 关节限位约束:排除超出关节限位的解。
- 运动平滑性:选择能让关节速度、加速度变化最小的解。
3.3.3 构型标志位
工业机器人通常用构型标志位来区分不同解。比如:
- ARM:左/右臂构型
- ELBOW:肘上/肘下
- WRIST:腕部翻转/非翻转
在示教编程时,操作员可以指定构型标志位,机器人就会在对应的解空间里选择。
3.4 知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以看到逆运动学从求解到奇异处理再到多解选择,是一条完整的技术链路。
3.5 实战建议
最后,给几个我在项目中沉淀下来的建议:
- 优先用解析法:只要机械臂结构允许,就别偷懒。推导一次解析解,后面一劳永逸。
- 奇异区域要留安全余量:别等到条件数爆表了才处理。我一般设两个阈值——预警阈值和干预阈值。
- 多解选择要结合任务:焊接、喷涂、搬运,不同任务对构型的要求不同。别一套策略打天下。
- 仿真验证不可少:任何逆解算法,先在仿真环境里跑一遍。我见过太多代码在仿真里就暴露了问题。