3. 运动学基础(下):并联机构位置逆解(IK)与正解(FK)问题、数值求解方法(牛顿-拉夫逊法)、雅可比矩阵推导
各位工程师朋友,咱们接着聊运动学。上一节我们把并联机构的位置描述和坐标系变换理清了,这一节要啃硬骨头——位置逆解(IK)和正解(FK)。
说实话,我刚入行那会儿,觉得正解逆解不就是解方程嘛,有啥难的?直到第一次调试六自由度Stewart平台,电机死活走不到目标位姿,我才意识到:并联机构的运动学,远比你想象的更“拧巴”。
3.1 位置逆解(IK):从“想去哪”到“腿多长”
位置逆解,说白了就是:已知动平台的目标位姿,求各驱动支链的长度(或关节角度)。
对于串联机器人,逆解往往很复杂,多解甚至无解。但并联机构恰恰相反——逆解相对简单,正解才是老大难。为什么?因为并联机构的支链是独立的,每条腿的长度只取决于动、静平台两个铰点之间的空间距离。
我习惯把逆解拆成三步走:
- 确定静平台铰点坐标(在基坐标系下固定不变)
- 计算动平台铰点坐标(通过目标位姿的旋转矩阵和平移向量)
- 两点间欧氏距离,就是支链长度
举个6-UPS机构的例子。静平台铰点Ai坐标已知,动平台铰点Bi在动坐标系下的坐标也已知。给定目标位姿(旋转矩阵R,平移向量t),Bi在基坐标系下的位置就是:
B_i_base = R * B_i_local + t
然后第i条腿的长度:
L_i = || B_i_base - A_i ||
就这么简单?对,就是这么简单。但要注意:每条腿的长度必须满足机械限位。我在项目中遇到过,逆解算出来的腿长是负数——显然,机构已经“穿模”了。所以逆解之后一定要做可达性检查。
核心要点:并联机构逆解是解析解,计算效率极高,适合实时控制。但前提是——你得保证目标位姿在机构的工作空间内。
3.2 位置正解(FK):从“腿多长”到“在哪”
正解就麻烦了。已知各支链长度,求动平台的位姿。这本质上是一个非线性方程组求解问题。
你想想看,6条腿的长度,对应6个未知数(3个位置+3个姿态角)。方程组长什么样?每条腿的长度方程都是一个非线性方程:
f_i(x, y, z, α, β, γ) = L_i^2 - || B_i_base - A_i ||^2 = 0
6个方程,6个未知数。理论上可解,但实际中——没有封闭解。这就是为什么并联机构的正解必须依赖数值方法。
我记得第一次手算正解,用了整整一个下午,算到怀疑人生。后来学乖了,直接上牛顿-拉夫逊法。
3.3 牛顿-拉夫逊法:数值求解的“老司机”
牛顿-拉夫逊法,说白了就是用切线逼近根。对于单变量函数,迭代公式是:
x_{k+1} = x_k - f(x_k) / f'(x_k)
对于多变量系统(比如我们的正解问题),就变成了:
X_{k+1} = X_k - J^{-1} * F(X_k)
其中J是雅可比矩阵,F是残差向量。
具体到并联机构正解,算法流程如下:
- 初始化:给一个初始位姿估计X0(通常用上一时刻的位姿)
- 计算残差:根据当前位姿,计算每条腿的理论长度,与实际长度做差
- 计算雅可比矩阵:残差对位姿变量的偏导数
- 求解线性方程组:J * ΔX = -F,得到位姿修正量ΔX
- 更新位姿:X = X + ΔX
- 判断收敛:如果||ΔX||小于阈值,停止;否则回到第2步
实战技巧:我建议用阻尼牛顿法(Levenberg-Marquardt),当雅可比矩阵接近奇异时,加一个阻尼因子防止迭代发散。曾经有一次,我的平台在奇异位形附近,普通牛顿法直接飞了,换成LM法才稳住。
代码实现(Python伪码):
def forward_kinematics(leg_lengths, initial_guess, max_iter=100, tol=1e-6):
X = initial_guess
for i in range(max_iter):
F = compute_residuals(X, leg_lengths)
J = compute_jacobian(X)
delta = np.linalg.solve(J, -F)
X = X + delta
if np.linalg.norm(delta) < tol:
return X
raise Exception("未收敛,请检查初始值或机构参数")
3.4 雅可比矩阵推导:从“腿长变化”到“位姿变化”
雅可比矩阵,是连接关节空间速度和操作空间速度的桥梁。对于并联机构,它描述的是:支链长度变化率与动平台速度之间的关系。
推导思路其实很直接。对每条腿的长度方程求时间导数:
L_i^2 = (B_i - A_i)^T (B_i - A_i)
两边对时间求导:
2 * L_i * dL_i/dt = 2 * (B_i - A_i)^T * dB_i/dt
而dB_i/dt = v + ω × r_i(其中v是线速度,ω是角速度,r_i是B_i相对于动平台质心的位置向量)。整理后得到:
dL_i/dt = u_i^T * v + (r_i × u_i)^T * ω
其中u_i是支链方向的单位向量。把所有6条腿的方程写在一起,就是:
dL/dt = J * [v; ω]
这个J就是运动学雅可比矩阵,维度6×6。
注意:并联机构的雅可比矩阵与串联机构有本质区别。串联机构的雅可比是从关节空间到操作空间,而并联机构正好相反——是从操作空间到关节空间。所以并联机构的奇异性分析,要看雅可比矩阵是否满秩。
我在调试高速并联机器人时,就遇到过雅可比矩阵接近奇异的情况。当时平台在某个位姿突然抖动,电机电流飙升。后来一查,是雅可比矩阵的条件数太大了,导致速度映射失真。解决办法是重新规划轨迹,避开奇异位形。
3.5 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图:
3.6 实战中的避坑指南
最后,分享几个我踩过的坑:
- 初始值敏感:牛顿法对初始值很敏感。我建议用上一控制周期的位姿作为初始值,如果平台运动不快,通常一次迭代就能收敛。
- 奇异位形:当雅可比矩阵接近奇异时,数值解会剧烈震荡。解决办法是在轨迹规划阶段就避开奇异区域,或者在迭代中加入阻尼项。
- 实时性要求:正解计算必须在控制周期内完成(通常1ms以内)。我一般把雅可比矩阵的解析形式提前推导好,避免数值微分带来的计算开销。
个人习惯:我会在代码里加一个“收敛状态”标志位。如果连续3个周期都不收敛,就切换到开环控制模式,同时报警。这样至少保证平台不会乱跑。
好了,运动学基础就讲到这里。记住:逆解是送分题,正解是拉分题,雅可比是核心题。把这些吃透了,后面的动力学和控制学才能站得稳。
公众号:蓝海资料掘金营,微信deep3321