3. 人形机器人建模

逆运动学,说白了就是“我知道手要伸到哪儿,你告诉我每个关节该转多少度”。

人形机器人有几十个自由度,腿要站稳,手要抓东西,头要跟着目标转。正向运动学是从关节角度算末端位姿,这个好办,链式乘一遍就行。但反过来——从末端位姿反推关节角度——就没那么直接了。

我刚开始做双足机器人那会儿,觉得逆运动学不就是解方程嘛。后来发现,人形机器人有冗余自由度,解不唯一,有时候甚至无解。嗯,这里面的坑,咱们一个一个填。

3.1 问题定义:从位姿到角度

先明确一下我们要解决什么问题。

给定:机器人末端(比如右手)的目标位置 p 和姿态 R(合起来叫位姿)。
求解:所有关节角度 q = [q₁, q₂, …, qₙ]ᵀ,使得正向运动学 f(q) 等于目标位姿。

数学上写就是:

f(q) = [R(q), p(q)] = [R_d, p_d]

人形机器人跟工业机械臂最大的区别在于:人形有浮动基座。脚没固定在地上,躯干本身也在动。所以逆运动学不仅要管手臂,还要管腿、腰、甚至头部。我习惯把整个人形拆成几个链来处理:左腿链、右腿链、躯干+头链、左臂链、右臂链。

关键点:人形机器人的逆运动学通常是“多链、多任务、带约束”的优化问题,不是简单的方程求解。

3.2 解析法:快,但有条件

解析法就是直接推导出关节角度的闭式表达式。对于某些特定构型的机器人,可以做到一次计算就出结果,速度极快。

3.2.1 什么时候能用解析法?

解析法要求机器人满足 Pieper准则:相邻三个关节轴交于一点,或者相邻三个关节轴平行。工业上很多6轴机械臂满足这个条件,所以能用解析法。

但人形机器人呢?说实话,大部分商用或开源人形机器人的手臂和腿都不满足Pieper准则。为什么呢?因为人形机器人关节布局模仿人体,肩关节是球副(3个旋转轴交于一点),但肘关节和腕关节往往不共点。腿也一样,髋关节三个轴交于一点,但膝关节和踝关节不交。

我遇到过的情况是:只有肩关节和髋关节可以用解析法快速求解,其他部分得另想办法。

3.2.2 解析法示例:人形机器人手臂

假设我们有一个7自由度手臂(肩3+肘1+腕3),肩关节三个轴交于一点。我们可以把逆运动学拆成两步:

  1. 位置解耦:先根据腕部位置反推肩关节角度(3个自由度,有解析解)。
  2. 姿态解耦:再根据末端姿态反推肘关节和腕关节角度(剩余4个自由度,其中1个是冗余的,可以选一个最优值)。
// 伪代码:解析法求解肩关节
// 已知:肩关节位置S,腕关节目标位置W,上臂长度L1,前臂长度L2
// 求解:肩关节俯仰角q1、偏航角q2、滚转角q3

d = ||W - S||  // 肩到腕的距离
if (d > L1 + L2 || d < |L1 - L2|) {
    // 无解,目标不可达
    return error;
}
// 余弦定理求肘关节角(这里肘关节是第4个关节)
q4 = acos((L1^2 + L2^2 - d^2) / (2 * L1 * L2));
// 然后根据几何关系求q1, q2, q3
// ... 具体公式略,不同构型不一样
我的经验:解析法适合做“粗调”。先用解析法快速得到一个初始解,再用数值法微调,这样既快又准。

3.3 数值法:通用,但需要迭代

数值法不依赖机器人构型,只要正向运动学能算,就能用。核心思想是:迭代优化,让当前位姿一步步逼近目标位姿。

3.3.1 雅可比矩阵法

这是最经典的方法。雅可比矩阵 J 把关节速度映射到末端速度:

ẋ = J(q) · q̇

反过来,给定末端速度误差 Δx,我们可以求关节角度修正量 Δq:

Δq = J⁺ · Δx

其中 J⁺ 是雅可比矩阵的伪逆。

迭代步骤:

  1. 计算当前位姿 f(q_current) 与目标位姿的误差 Δx
  2. 如果 ||Δx|| < 阈值,停止
  3. 计算雅可比矩阵 J(q_current)
  4. 计算 Δq = J⁺ · Δx
  5. 更新 q_current = q_current + Δq
  6. 回到步骤1
注意:雅可比矩阵在奇异位形附近会病态,导致Δq过大。我曾经在调试时没处理奇异,结果机器人关节直接飞到了极限位置,差点撞坏自己。一定要加阻尼!

3.3.2 阻尼最小二乘法(DLS)

为了解决奇异问题,我们给伪逆加一个阻尼项:

J⁺ = Jᵀ · (J · Jᵀ + λ² · I)⁻¹

λ 是阻尼系数。λ 越大,解越平滑,但收敛越慢。我一般这样调:

  • 远离奇异时,λ = 0.01 ~ 0.1
  • 接近奇异时,λ = 0.5 ~ 1.0
  • 可以用奇异值分解(SVD)实时检测最小奇异值,动态调整λ

3.3.3 任务优先级法

人形机器人有多个任务同时要做:

  • 首要任务:脚要踩稳(位置和姿态约束)
  • 次要任务:手要跟踪目标
  • 第三任务:躯干要保持水平,或者重心要落在支撑多边形内

用任务优先级法可以优雅地处理:

Δq = J₁⁺ · Δx₁ + (I - J₁⁺ · J₁) · J₂⁺ · Δx₂ + ...

第一个任务占满可用自由度,剩下的自由度给第二个任务,以此类推。这样高优先级任务一定满足,低优先级任务在剩余空间里尽量优化。

实用建议:在人形机器人上,我通常把“脚与地面的接触约束”设为最高优先级,其次是“躯干姿态”,最后才是“手部跟踪”。因为站不稳,什么都白搭。

3.4 解析法 vs 数值法:怎么选?

对比项 解析法 数值法
计算速度 极快(微秒级) 较慢(毫秒级,需迭代)
通用性 仅限特定构型 任意构型
处理约束 困难 容易(加惩罚项或投影)
多解处理 可枚举所有解 只给一个解(依赖初值)
奇异处理 需单独处理 阻尼法可自动处理
适合场景 离线规划、简单构型 实时控制、复杂构型

我个人习惯是:能解析就解析,解析不了就数值,两者结合最好。比如人形机器人的腿,髋关节用解析法快速算,膝关节和踝关节用数值法微调,这样既保证实时性,又保证精度。

3.5 避坑指南:我踩过的几个坑

  • 关节限位没考虑:数值法迭代出来的角度可能超出关节物理限位。一定要在每次迭代后做限位投影。
  • 收敛到局部最优:数值法依赖初值。初值不好,可能收敛到奇怪的姿态。我一般用上一帧的解作为初值,或者用解析法先给一个合理的初值。
  • 计算雅可比矩阵太慢:如果每个关节都用差分法算雅可比,30个自由度就要算30次正向运动学。我建议用解析雅可比,或者用链式法则推导,能快一个数量级。
  • 忽略了浮动基座:人形机器人的基座(躯干)本身也在动。逆运动学求解时,要把基座的位姿也作为变量一起优化,不能假设基座固定。
一个小技巧:调试逆运动学时,先用仿真环境可视化每一步的中间结果。我习惯把当前位姿和目标位姿用不同颜色画出来,一眼就能看出哪里不对。

3.6 本章知识体系

下面这张图总结了逆运动学在人形机器人上的整体思路:

人形机器人逆运动学知识体系 人形机器人逆运动学求解框架 目标位姿 (R_d, p_d) 是否满足Pieper准则? 是 解析法 闭式解,微秒级 否 数值法 迭代求解,毫秒级 核心方法:雅可比伪逆 + 阻尼 任务优先级 脚→躯干→手 关节限位处理 投影 + 惩罚项 奇异规避 动态阻尼 + SVD 输出:关节角度 q

这张图把整个逆运动学求解流程串起来了。从目标位姿出发,先判断能不能用解析法,不能就转数值法。数值法里核心是雅可比伪逆加阻尼,同时要处理好任务优先级、关节限位和奇异规避。最后输出关节角度,交给底层控制器去执行。