第三节:机械臂逆运动学——解析法与数值法、多解问题与奇异位形
逆运动学,说白了就是“反着算”。正运动学给你关节角度,你算出末端位姿。逆运动学反过来:给你末端位姿,你反推关节角度。听起来简单,做起来可没那么轻松。
我刚开始做机械臂控制那会儿,觉得逆运动学不就是解方程嘛。后来在产线上调试一个六轴臂,发现同一个位置,手臂能摆出好几种姿势,有的姿势还会让电机突然“抽风”……嗯,这就是我们今天要聊的核心问题。
3.1 解析法:又快又准,但有条件
解析法,也叫封闭解法。就是通过代数或几何推导,直接写出关节角度的表达式。我个人习惯优先用解析法,只要机械臂结构满足条件,解析法就是最优解。
什么条件? 简单说,就是机械臂的后三个关节轴相交于一点。大部分工业六轴臂都满足这个条件——这叫“Pieper准则”。满足这个准则,逆解就能拆成两部分:先解前三个关节(决定手腕位置),再解后三个关节(决定手腕姿态)。
举个例子,一个典型的六自由度机械臂,逆解公式长这样:
// 伪代码:解析法求第一个关节角
theta1 = atan2(y, x) // 从末端位置直接算
// 第二个关节角,需要结合臂长几何关系
theta2 = atan2(sqrt(r^2 - d^2), d) - atan2(a2 * sin(theta3), a2 * cos(theta3) + a1)
// 第三个关节角,余弦定理搞定
cos_theta3 = (r^2 + d^2 - a1^2 - a2^2) / (2 * a1 * a2)
theta3 = atan2(sqrt(1 - cos_theta3^2), cos_theta3)
你看,每个公式都是显式的,计算量极小。在嵌入式控制器上,一次逆解也就几十微秒。
3.2 数值法:通用但慢,适合离线
如果机械臂结构不满足Pieper准则,或者你用的是七自由度冗余臂,解析法就不好使了。这时候就得请出数值法。
数值法的核心思想很简单:猜一个初始角度,算末端位姿,跟目标位姿对比,然后调整角度,再算,再调……直到误差足够小。
最常用的方法是牛顿-拉夫森法,或者它的变种——雅可比伪逆法。代码大概长这样:
// 数值法逆解(简化版)
function inverseKinematics(targetPose, initialGuess) {
q = initialGuess; // 初始关节角度
for (i = 0; i < maxIterations; i++) {
currentPose = forwardKinematics(q); // 正运动学
error = targetPose - currentPose; // 位姿误差
if (norm(error) < tolerance) break; // 收敛了就退出
J = computeJacobian(q); // 计算雅可比矩阵
delta_q = pinv(J) * error; // 伪逆法求关节增量
q = q + delta_q; // 更新关节角度
}
return q;
}
数值法有个好处:你不需要推导复杂的公式,换一个机械臂结构,只要改DH参数就行。但代价是计算量大,而且可能收敛到错误的解,甚至不收敛。
3.3 多解问题:选哪个?
逆运动学最让人头疼的就是多解。一个末端位姿,对应多个关节角度组合。六轴臂通常有8组解,七自由度臂更是有无穷多组解。
为什么会这样?你想想看,你的手臂够到桌子上的杯子,肘关节可以朝下,也可以朝外翻——这就是两种不同的“构型”。
在实际项目中,我一般按以下优先级选解:
- 关节限位优先:先排除超出电机限位的解
- 避障优先:排除会撞到周围物体的解
- 最小关节运动:选离当前关节角度最近的解
- 奇异回避:排除靠近奇异位形的解
这里有个小技巧:如果你用解析法求出了8组解,可以先把它们全部算出来,然后按上面的规则排序。我习惯用一个“代价函数”来打分:
cost = w1 * joint_limit_penalty + w2 * obstacle_penalty
+ w3 * joint_movement + w4 * singularity_penalty
选代价最小的那个。权重w1到w4根据实际场景调,比如在狭窄空间里,w2(避障)就要设大一些。
3.4 奇异位形:机械臂的“死穴”
奇异位形,就是机械臂失去某个方向运动能力的姿态。说白了,你让手臂往某个方向动,它动不了,或者需要极大的关节速度才能动一点点。
最常见的奇异位形有三种:
| 奇异类型 | 表现 | 常见场景 |
|---|---|---|
| 边界奇异 | 手臂完全伸直或缩回 | 肘关节伸直时 |
| 腕部奇异 | 关节4和关节6的轴线重合 | 手腕“打结”时 |
| 肩部奇异 | 肩关节轴线与腕关节轴线共线 | 手臂垂直向上时 |
奇异位形的数学本质,就是雅可比矩阵的行列式为零,或者条件数变得很大。这时候,你用伪逆法算出来的关节速度会趋于无穷大——电机就会“抽风”。
我记得有一次在调试焊接机器人,焊枪要走一条直线路径。结果路径中间刚好经过一个奇异点,机器人突然“抖”了一下,焊点全偏了。后来我加了一个“奇异回避”模块,在靠近奇异点时自动减速并微调路径。
3.5 知识体系总览
下面这张图,是我自己总结的逆运动学知识框架。你可以把它当作一个“决策树”:
这张图把逆运动学的核心脉络理清楚了。你拿到一个逆解任务,先判断能不能用解析法——能就用,又快又准。不能,就上数值法,但要注意初始值和收敛性。不管用哪种方法,最后都要处理多解和奇异问题。
好了,这一节的内容就到这儿。逆运动学是机械臂控制的核心,也是很多坑的源头。多动手推导,多在实际中调试,慢慢就有感觉了。