4、逆运动学求解:解析法与数值法,多解选择与奇异性分析
逆运动学,说白了就是「给出手的位置,算出关节的角度」。
正运动学是确定的——你给一组关节角,末端位姿就唯一确定了。但逆运动学不一样,它是个多解问题。同一个末端位置,可能有几种不同的关节姿态都能到达。甚至有些位置,机器人根本到不了。
我刚开始做机器人控制时,觉得逆运动学不就是解方程嘛。直到第一次在产线上调试,机器人突然「抽风」一样地乱转……嗯,那次就是奇异性搞的鬼。从那以后,我对逆运动学就多了一份敬畏。
4.1 解析法:直接求角,快且准
解析法,也叫封闭解法。就是通过几何关系或代数变换,直接写出关节角的表达式。
它的优点是快——计算量小,适合实时控制。缺点是通用性差——每个机器人结构不同,公式都得重新推导。
4.1.1 几何法:画图求解
对于简单的机器人,比如两连杆平面臂,直接用余弦定理就能搞定。
// 两连杆平面臂逆解(几何法)
// 已知:末端位置 (x, y),杆长 L1, L2
// 求:关节角 θ1, θ2
double cos_theta2 = (x*x + y*y - L1*L1 - L2*L2) / (2*L1*L2);
double theta2 = acos(cos_theta2); // 肘部向上或向下
double theta1 = atan2(y, x) - atan2(L2*sin(theta2), L1 + L2*cos(theta2));
这里有个坑:acos 的输入必须在 [-1, 1] 之间。如果末端位置超出了工作空间,cos_theta2 会超出这个范围,那就无解了。
4.1.2 代数法:用矩阵消元
对于六轴工业机器人,常用的是 Pieper 解法。它要求机器人的后三个关节轴线交于一点(腕部)。
步骤大致是:
- 从末端位姿矩阵中分离出腕部位置
- 用前三个关节求解腕部位置(三个方程,三个未知数)
- 再用后三个关节求解腕部姿态
我在项目中遇到过一台老式六轴机器人,它的腕部不是球腕。那解析法就不好使了,只能上数值法。
4.2 数值法:迭代逼近,通用但慢
数值法不直接求公式,而是通过迭代逐步逼近解。最常用的是牛顿-拉夫森法。
它的核心思想是:
- 猜一组初始关节角
- 计算当前末端位姿与目标位姿的误差
- 用雅可比矩阵的逆,把误差映射回关节空间
- 更新关节角,重复直到误差足够小
// 牛顿-拉夫森法逆解(伪代码)
q = q0; // 初始猜测
while (norm_error > tolerance) {
T_current = forward_kinematics(q);
error = target_pose - T_current; // 位姿误差
J = jacobian(q); // 计算雅可比矩阵
dq = pinv(J) * error; // 用伪逆求解关节增量
q = q + dq; // 更新关节角
}
4.2.1 解析法 vs 数值法
| 对比项 | 解析法 | 数值法 |
|---|---|---|
| 计算速度 | 快(微秒级) | 慢(毫秒级,取决于迭代次数) |
| 通用性 | 差(每台机器人单独推导) | 好(只要正运动学已知即可) |
| 精度 | 理论精确(浮点误差除外) | 取决于迭代终止条件 |
| 多解处理 | 可直接枚举所有解 | 只能得到一个解(依赖初值) |
| 奇异性 | 公式中可提前识别 | 雅可比矩阵奇异时失效 |
我个人习惯是:能解析就解析,解析不了再上数值。如果两者都能用,解析法做初值,数值法做精调,效果最好。
4.3 多解选择:哪个才是对的?
逆运动学有多个解,但机器人只能选一个。怎么选?
常见的策略有:
- 最短路径法: 选择离当前关节角最近的解。这样机器人运动最平滑。
- 避障法: 排除会导致碰撞的解。
- 关节限位法: 排除超出关节物理限位的解。
- 构型偏好法: 比如优先选「肘下」而不是「肘上」。
实际项目中的做法:
我曾经在焊接机器人项目里,遇到过选错解导致焊枪撞工件的事故。后来我加了一个规则:先排除所有碰撞解,再在剩余解里选最短路径。从那以后,再也没出过问题。
4.4 奇异性分析:机器人的「死穴」
奇异性,就是机器人失去某个方向运动能力的位形。说白了,你让机器人往某个方向动,它动不了,或者关节速度会变得极大。
4.4.1 奇异性的本质
从数学上看,奇异性就是雅可比矩阵 J 的秩降低,行列式为零。此时 J 不可逆,数值法会崩溃。
常见的奇异位形有:
- 边界奇异: 手臂完全伸直或完全折叠
- 腕部奇异: 腕部两个关节轴线共线
- 肩部奇异: 肩关节与腕关节中心重合
4.4.2 如何检测奇异性
最简单的方法:计算雅可比矩阵的行列式。如果值接近零,就说明接近奇异。
// 奇异性检测
double det = determinant(J);
if (fabs(det) < singularity_threshold) {
// 进入奇异区域,切换策略
// 比如:用阻尼最小二乘法代替伪逆
dq = J_transpose * inv(J * J_transpose + lambda * I) * error;
}
4.4.3 奇异回避策略
遇到奇异性,硬闯是不行的。常用的方法有:
- 阻尼最小二乘法(DLS): 在雅可比伪逆中加入阻尼项,牺牲精度换取稳定性
- 奇异分离法: 把运动分解为奇异方向和非奇异方向,只处理非奇异方向
- 路径重规划: 绕开奇异区域
我记得有一次调试喷涂机器人,轨迹刚好经过一个奇异点。机器人每到那个位置就剧烈抖动。后来我用 DLS 方法,把阻尼系数设成 0.1,抖动就消失了。虽然末端轨迹有了一点偏差,但喷涂效果完全能接受。
4.5 本章知识体系
下面这张图,把逆运动学的核心脉络梳理了一遍。你可以把它当作一个快速参考。
逆运动学这块,说难不难,说简单也不简单。关键是要理解它的本质——从末端空间映射回关节空间,而这个映射不是一对一的。
多解和奇异性,是实际工程中最容易出问题的地方。我建议你在仿真环境里多跑跑,把各种奇异位形都试一遍。等真到了产线上,心里就有底了。