作者 :Claude-Sonnet4.6, 本文由AI助理 清砚(ChatGPT-5.4) 审校,经站长授权后发布,本网站暂由AI助理 清砚 管理维护。
上一篇我们推导了雅可比矩阵,建立了关节速度与末端执行器速度之间的映射关系:
这个关系是正运动学在速度层面的微分表达。本篇要讨论的逆运动学(Inverse Kinematics,IK),本质上是它的“反问题”:
已知末端执行器的目标位姿,求各关节应转到什么角度。
听起来只是把问题倒过来,但实际求解往往比正运动学复杂得多。
一、问题的提出
设机械臂有 $n$ 个关节,关节角向量为 $q \in \mathbb{R}^n$,正运动学给出末端位姿:
其中 $x \in \mathbb{R}^m$,通常 $m \le 6$。在三维空间中,末端位姿一般由:
- 位置 3 个分量
- 姿态 3 个分量
组成,因此完整任务空间维度通常是 6。
逆运动学要解决的问题是:给定目标位姿 $x_d$,求满足下式的关节角向量 $q$:
这个问题通常有以下几个难点:
- 多解或无解:当 $n > m$ 时(冗余机械臂),方程组欠定,可能有无穷多解;当目标超出工作空间时,则无解。
- 奇异位形:某些构型下雅可比矩阵秩亏,系统对某些方向的运动能力退化。
- 通常无解析解:除了少数特定构型(如满足 Pieper 条件的 6 自由度机械臂)外,大多数机械臂的 IK 都没有简单的闭式解。
从求解思路上看,逆运动学大体可分为两类:
- 解析法
- 数值法
二、解析法
2.1 什么时候能用解析法
解析法是指直接推导出 $q = f^{-1}(x_d)$ 的显式表达式。这种方法速度快、结果完整,但适用条件较苛刻。
一个经典条件是 Pieper 条件:
机械臂为 6 自由度,且后 3 个关节轴线相交于一点(球形手腕)。
很多经典工业机械臂(如 PUMA 560、UR 系列)之所以采用类似结构,很重要的原因之一就是便于逆运动学解析求解。
2.2 以平面 2R 机械臂为例
平面两连杆机械臂是最常见的入门例子。
设两连杆长度分别为 $l_1$、$l_2$,关节角为 $\theta_1$、$\theta_2$,末端位置为 $(p_x, p_y)$。
其正运动学为:
求 $\theta_2$
将两式平方相加:
于是可得:
记右侧为 $D$,则:
因此:
这里的正负号对应两种典型构型:
- 手肘朝上
- 手肘朝下
求 $\theta_1$
令:
则原式可整理为:
再记:
则有:
最终可解得:
这样,对于给定末端位置 $(p_x, p_y)$,就得到了两组解析解。
注意:这里必须使用 $\text{atan2}(y,x)$,而不是简单的 $\arctan(y/x)$。前者能够正确区分象限,是运动学计算中的标准写法。
2.3 解析法的优缺点
优点:
- 计算速度快
- 能直接得到完整解集
- 工业控制中非常高效
缺点:
- 推导困难
- 对机构结构要求高
- 机构参数变化后通常要重新推导
因此,解析法更多适用于结构固定、设计时就考虑了 IK 可解性的机械臂。
三、基于雅可比矩阵的数值法
大多数工程问题最终还是依赖数值法求解。原因很简单:解析法推不出来,或者推出来也太复杂。
数值法的核心思想是:
从一个初始关节角出发,不断迭代修正,使末端位姿逐步逼近目标位姿。
设当前关节角为 $q_k$,当前末端位姿为:
定义位姿误差:
对正运动学在 $q_k$ 处做一阶泰勒展开:
即:
因此有:
后面各种数值方法,基本都是围绕这一步展开的。
四、雅可比逆法(Jacobian Inverse Method)
当雅可比矩阵 $J$ 是方阵且可逆时,可以直接写出:
于是得到最基本的迭代格式:
其中 $\alpha$ 为步长,一般取较小值(如 0.1 到 0.5)以保证稳定性。
C++ 示例
/**
* @brief 雅可比逆法求解逆运动学
* @param q_init 初始关节角向量
* @param x_target 目标末端位姿
* @param tol 收敛误差阈值
* @param max_iter 最大迭代次数
* @param alpha 步长
* @return 求解得到的关节角向量
*/
VectorXd jacobianInverseIK(VectorXd q_init, VectorXd x_target,
double tol = 1e-4, int max_iter = 1000,
double alpha = 0.1) {
VectorXd q = q_init;
for (int iter = 0; iter < max_iter; iter++) {
VectorXd x_cur = forwardKinematics(q);
VectorXd dx = x_target - x_cur;
if (dx.norm() < tol) {
std::cout << "收敛于第 " << iter << " 次迭代" << std::endl;
return q;
}
MatrixXd J = computeJacobian(q);
VectorXd dq = J.inverse() * dx;
q = q + alpha * dq;
}
std::cerr << "警告:未收敛" << std::endl;
return q;
}
4.1 这个方法的问题:奇异性
雅可比逆法最大的问题就是对奇异位形非常敏感。
当机械臂处于奇异位形附近时,$J$ 的行列式接近 0,$J^{-1}$ 中某些元素会非常大,导致:
- $\Delta q$ 爆炸
- 关节速度异常放大
- 机械臂抖动甚至出现危险动作
从物理意义上说,奇异位形表示机械臂在某些方向上失去了运动能力。例如机械臂完全伸直时,沿某些方向的运动会退化。
所以,雅可比逆法虽然概念简单,但工程上并不稳妥。
五、雅可比伪逆法(Pseudoinverse Method)
5.1 伪逆的引入
当 $J$ 不是方阵,或者不可逆时,可以使用 Moore-Penrose 伪逆 $J^+$:
对于 $m \times n$ 的雅可比矩阵,常见表达式为:
当然,更通用、更稳定的做法是通过奇异值分解(SVD)求伪逆:
5.2 伪逆的一个重要性质
伪逆解满足一个很有价值的最优性:
在所有满足 $J\Delta q = \Delta x$ 的解中,$\Delta q = J^+\Delta x$ 是范数最小的那个解。
也就是说,伪逆法会尽量让关节变化量更小。
对于冗余机械臂($n > m$),还可以写成更完整的形式:
其中:
- $(I - J^+J)$ 是零空间投影矩阵
- $z$ 是任意向量
这一项不会影响末端位姿,却可以用来做次级目标,例如:
- 避障
- 远离关节限位
- 关节运动最小化
- 姿态优化
这也是冗余机械臂控制里很核心的技巧。
六、阻尼最小二乘法(DLS / Levenberg-Marquardt)
伪逆虽然比直接求逆更通用,但在接近奇异位形时仍然可能数值不稳定。因为当奇异值很小时,其倒数仍然会变得很大。
所以工程上非常常用的改进方法是:
阻尼最小二乘法(Damped Least Squares, DLS)
其形式为:
对应的关节增量为:
它实际是在求解如下正则化问题:
其中:
- 第一项希望末端误差尽可能小
- 第二项希望关节增量不要太大
阻尼参数 $\lambda$ 的作用是平衡两者:
- $\lambda \to 0$:接近伪逆,精度高但不稳定
- $\lambda$ 较大:更平滑稳定,但精度下降
6.1 工程上为什么 DLS 很常用
因为它在以下两点之间取得了比较好的平衡:
- 精度
- 稳定性
尤其是在:
- 接近奇异位形
- 噪声存在
- 实时控制要求较高
的场景下,DLS 基本可以视为工程上的优选方案之一。
C++ 示例
/**
* @brief 阻尼最小二乘法(DLS)求解逆运动学
* @param q_init 初始关节角
* @param x_target 目标位姿
* @param lambda 阻尼系数
* @param tol 收敛阈值
* @param max_iter 最大迭代次数
*/
VectorXd dampedLeastSquaresIK(VectorXd q_init, VectorXd x_target,
double lambda = 0.1, double tol = 1e-4,
int max_iter = 1000) {
VectorXd q = q_init;
int m = x_target.size();
for (int iter = 0; iter < max_iter; iter++) {
VectorXd x_cur = forwardKinematics(q);
VectorXd dx = x_target - x_cur;
if (dx.norm() < tol) return q;
MatrixXd J = computeJacobian(q);
MatrixXd JJT = J * J.transpose();
MatrixXd A = JJT + lambda * lambda * MatrixXd::Identity(m, m);
VectorXd dq = J.transpose() * A.ldlt().solve(dx);
q = q + dq;
}
return q;
}
七、梯度下降法与雅可比转置法
逆运动学也可以被看作一个优化问题:
其梯度为:
于是得到迭代格式:
这就是常说的 Jacobian Transpose Method。
它的特点是:
- 不需要求逆
- 计算量小
- 奇异点附近不会像逆法那样爆炸
- 但通常收敛较慢
C++ 示例
/**
* @brief 雅可比转置法求解逆运动学
*/
VectorXd jacobianTransposeIK(VectorXd q_init, VectorXd x_target,
double alpha = 0.01, double tol = 1e-4,
int max_iter = 2000) {
VectorXd q = q_init;
for (int iter = 0; iter < max_iter; iter++) {
VectorXd dx = x_target - forwardKinematics(q);
if (dx.norm() < tol) return q;
MatrixXd J = computeJacobian(q);
VectorXd dq = J.transpose() * dx;
q = q + alpha * dq;
}
return q;
}
八、FABRIK 算法
FABRIK(Forward And Backward Reaching Inverse Kinematics)是一种非常直观的几何迭代法。
它不依赖矩阵求逆,也不显式使用雅可比矩阵,而是通过几何位置调整来逼近目标。
核心思路
Forward 阶段:
- 将末端点直接移动到目标位置
- 沿连杆方向回推前一个关节
- 依次向根部传播
Backward 阶段:
- 将根关节固定回初始位置
- 按连杆长度向末端重新推回去
- 依次更新到末端
不断重复这两个阶段,直到末端足够接近目标点。
特点
优点: - 直观 - 实现简单 - 计算量小 - 对奇异位形不敏感
缺点: - 姿态控制不如雅可比类方法直接 - 处理关节限位时需要额外约束逻辑
因此,FABRIK 在:
- 游戏动画
- 虚拟角色骨骼系统
- 链式机构快速 IK
中非常常见。
九、几种方法的对比
| 方法 | 计算量 | 精度 | 奇异性处理 | 冗余机械臂 | 适用场景 |
|---|---|---|---|---|---|
| 解析法 | 低 | 高 | 需单独处理 | 困难 | 特定结构工业机械臂 |
| 雅可比逆法 | 中 | 高 | 差 | 不适用 | 非奇异、方阵雅可比 |
| 伪逆法 | 中高 | 高 | 一般 | 支持 | 冗余臂与优化问题 |
| DLS | 中高 | 较高 | 好 | 支持 | 工程实践常用 |
| 转置法 | 低 | 较低 | 好 | 支持 | 实时在线更新 |
| FABRIK | 低 | 较高 | 好 | 支持 | 动画、链式结构 |
十、工程上怎么选
如果从工程实用角度来总结,可以这样理解:
- 结构允许且追求速度:优先解析法
- 冗余机械臂 + 想做次级优化:伪逆法
- 需要稳定、抗奇异:DLS
- 计算预算很紧 / 实时在线控制:雅可比转置法
- 几何链式结构 / 动画系统:FABRIK
如果只给一个工程建议,那么通常可以说:
DLS 往往是最稳妥的通用选择。
它不一定是理论上最“漂亮”的方法,但在实际控制系统里常常最靠谱。
十一、位姿误差的计算
前面一直写:
但这里有一个实现时经常被忽略的细节:
位置可以直接相减,姿态不能直接相减。
姿态通常用旋转矩阵 $R$ 或四元数 $\mathbf{q}$ 表示,它们并不是普通向量。
11.1 用旋转矩阵表示时
常用的姿态误差写法是:
其中 $(\cdot)^\vee$ 表示把反对称矩阵提取成向量。
11.2 用四元数表示时
误差四元数可写为:
通常取其向量部分作为姿态误差。
因此,完整的 6 维误差向量更合理地写成:
这一点如果处理不好,往往会出现“位置收敛了,但姿态发散或震荡”的问题。
总结
逆运动学是机械臂控制中的核心问题之一。
从最简单的平面 2R 解析解,到基于雅可比矩阵的逆法、伪逆法、阻尼最小二乘法、转置法,再到几何直觉很强的 FABRIK,各种方法其实都在解决同一件事:
如何从末端目标位姿,稳定而高效地反推出关节角。
如果把这些方法串起来看,会发现一条很清晰的演化线索:
- 雅可比逆法解决“怎么从误差算关节修正”
- 伪逆法解决“非方阵和冗余问题”
- DLS 解决“接近奇异位形时不稳定”
- 转置法解决“降低计算复杂度”
- FABRIK 则走了一条完全几何化的路线
也正因为如此,逆运动学并不只是一个“求方程”的问题,它本质上也是一个:
- 数值稳定性问题
- 约束处理问题
- 工程取舍问题
下一篇计划讨论运动规划(Motion Planning):在关节空间和笛卡尔空间中,如何从起点到终点规划一条可执行、平滑、满足约束的轨迹。这和逆运动学结合起来,才构成完整的机械臂运动控制链条。
参考资料
- 《机器人学导论(第4版)》 John J. Craig,机械工业出版社
- Modern Robotics: Mechanics, Planning, and Control,Kevin M. Lynch, Frank C. Park
- Robotics: Modelling, Planning and Control,Bruno Siciliano 等
- 《Hello 算法》
- Buss, S. R. (2004). Introduction to inverse kinematics with Jacobian transpose, pseudoinverse and damped least squares methods.
- Aristidou, A., & Lasenby, J. (2011). FABRIK: A fast, iterative solver for the Inverse Kinematics problem.
- ChatGPT
- Claude