第三章 逆运动学求解:解析法与数值法、雅可比矩阵、奇异性分析
各位同学,欢迎来到第三章。这一章可以说是人形机器人轨迹规划里最“硬核”的部分之一。逆运动学,说白了就是:我知道手要伸到那个位置,但关节该怎么转?
这个问题,我当年刚入行时觉得很简单——不就是解方程嘛。直到我在项目里第一次遇到机器人“抽风”,明明目标点就在眼前,机械臂却突然绕了个大圈,还差点打到旁边的设备。嗯,从那以后,我才真正开始重视逆运动学的求解方法。
3.1 解析法与数值法:两条路,各有千秋
逆运动学求解,主流方法就两种:解析法和数值法。我个人习惯先看能不能用解析法,不行再上数值法。
3.4.1 解析法
解析法,就是通过代数或几何方法,直接推导出关节角度的闭式表达式。它的优点是快、准、稳。只要机器人构型满足一定条件(比如相邻三轴交于一点),就能得到所有解。
我记得在做一个六轴协作臂项目时,用的就是解析法。因为它的腕部三个关节轴线交于一点,满足Pieper准则。推导出来的公式,在嵌入式控制器上跑,一个周期不到0.1毫秒。
- 机器人构型满足Pieper准则(相邻三轴交于一点或平行)
- 自由度不超过6
- 需要显式表达所有可能解
但解析法也有局限。一旦机器人构型复杂,或者自由度冗余,解析解就不存在了。这时候,就得请数值法出场。
3.4.2 数值法
数值法,本质上是迭代优化。给定一个初始猜测,不断调整关节角度,让末端位姿误差逐渐收敛到零。最经典的就是牛顿-拉夫森法,以及它的变种——阻尼最小二乘法(Levenberg-Marquardt)。
我曾经在一个七自由度冗余臂项目里,被迫用了数值法。因为解析解虽然存在,但需要分很多种情况讨论,代码写出来比《红楼梦》还厚。数值法虽然慢一点,但通用性强,换构型也不用重写求解器。
3.2 雅可比矩阵:速度与力的桥梁
雅可比矩阵,是逆运动学里绕不开的概念。它描述了关节速度与末端速度之间的线性映射关系。
公式很简单:v = J(q) * q_dot
其中v是末端速度(包括线速度和角速度),q_dot是关节速度,J就是雅可比矩阵。
但你别小看这个矩阵。它不仅是速度映射的工具,更是分析机器人运动性能的核心。我当年做力控时,就是靠雅可比矩阵把末端的力映射到关节力矩上:tau = J^T * F。
3.2.1 雅可比矩阵的计算
计算雅可比矩阵,有两种常用方法:
- 微分法:对正运动学方程求偏导。适合解析表达式已知的情况。
- 矢量积法:利用运动学链的几何关系,逐关节计算。更通用,适合编程实现。
我建议在实际工程中,用矢量积法。因为它的计算过程是结构化的,不容易出错。下面给一个简单的Python示例:
import numpy as np
def compute_jacobian(joint_angles, joint_axes, joint_positions):
"""
矢量积法计算雅可比矩阵
joint_angles: 当前关节角度
joint_axes: 各关节旋转轴(在世界坐标系下)
joint_positions: 各关节原点位置(在世界坐标系下)
"""
n = len(joint_angles)
J = np.zeros((6, n))
end_effector_pos = joint_positions[-1]
for i in range(n):
# 旋转关节
z_i = joint_axes[i]
p_i = joint_positions[i]
# 线速度部分
J[:3, i] = np.cross(z_i, end_effector_pos - p_i)
# 角速度部分
J[3:, i] = z_i
return J
3.3 奇异性分析:机器人的“死穴”
奇异性,是逆运动学里最让人头疼的问题。当机器人处于奇异位形时,雅可比矩阵会降秩,导致逆运动学无解或解不唯一。
为什么会这样?你想想看,当两个关节的旋转轴共线时,它们产生的末端运动其实是重复的。这时候,你让末端沿某个方向运动,关节可能根本动不了,或者需要无限大的速度。
3.3.1 奇异性的分类
| 类型 | 原因 | 典型场景 |
|---|---|---|
| 边界奇异 | 关节达到物理限位 | 手臂完全伸直时 |
| 内部奇异 | 关节轴线共线或共面 | 腕部三个轴共面时 |
| 冗余奇异 | 冗余自由度导致零空间变化 | 7自由度臂的肘部奇异 |
我曾经在一个焊接机器人项目里,遇到过边界奇异。当时机器人要焊一个很深的箱体内部,手臂几乎完全伸直。结果在接近奇异位形时,末端速度突然变得极快,差点把焊枪甩出去。从那以后,我每次做轨迹规划都会加一个奇异检测。
3.3.2 如何检测和处理奇异
检测奇异最直接的方法,就是计算雅可比矩阵的条件数,或者可操作度(manipulability)。可操作度的定义是:
w = sqrt(det(J * J^T))
当w接近0时,就说明机器人接近奇异位形。
处理奇异的方法,我常用的有三种:
- 阻尼最小二乘法:在求逆时加一个阻尼项,避免解过大。公式是
J^+ = J^T * (J*J^T + lambda*I)^(-1)。 - 奇异值分解(SVD):直接分析雅可比矩阵的奇异值,剔除接近0的奇异值对应的运动方向。
- 路径重规划:如果检测到奇异,就绕开那个区域。这个方法最稳妥,但需要实时调整轨迹。
我个人最推荐SVD方法。虽然计算量稍大,但信息最完整。你可以知道哪个方向“不好使”,然后有针对性地处理。
3.4 本章知识体系
下面这张图,是我自己总结的逆运动学求解知识体系。你可以把它当作一个思维导图来用:
这张图把本章的核心内容串起来了。你可以看到,解析法和数值法是求解手段,雅可比矩阵是中间桥梁,奇异性分析是必须关注的陷阱。三者缺一不可。
好了,这一章的内容就到这里。逆运动学求解,说白了就是“给结果找原因”。方法很多,但核心思路不变:理解你的机器人构型,选对方法,时刻警惕奇异。我在项目里踩过的坑,希望你们能避开。
- 解析法适合满足Pieper准则的构型,速度快但通用性差
- 数值法通用性强,但需要好的初值和收敛策略
- 雅可比矩阵是速度、力映射的核心工具
- 奇异性是逆运动学的“死穴”,必须检测并妥善处理