概念
WBC(Whole-Body Control,全身控制)是什么?机器人是由'各关节'组成的,其不是'各关节各玩各的'而是一个耦合的整体。在某个时刻可能要做很多事情,比如保持平衡(重心别出圈)、手/脚要动作到目标位置、躯干姿态不能乱、关节不能超限、脚下不能打滑。这些都是一系列任务的组合。
WBC 的核心就是把这些任务(目标)和约束(物理/安全)写进一个小型优化问题,在每个控制周期(几百 Hz~1kHz)求解,得到**'当下这毫秒,各关节应该怎么动/用多大力'**。
一句话总结就是 WBC 就是用优化的方法求解出要给'关节多少力',以便让机器的各个关节一起配合完成多个目标,且不违反物理与安全约束。
原理
动力学方程
要解释 WBC 的原理,那必须绕不开动力学方程,这里就先对动力学方程做个简单介绍。
$$ M(q)\dot{v} + h(q,v) = S^T \tau + J_c^T \lambda $$
配合接触约束:
$$ J_c v = 0, \quad \lambda \in \text{摩擦锥} $$
通俗理解公式就是:'惯性 × 加速度 + 自然出现的力 = 电机能给的力 + 地面/物体的反力'。
公式左边:机器人自身的自然物理
- $M(q)\dot{v}$:惯性项。$M(q)$ 是质量矩阵,描述机器人在不同姿态下的惯性特性。$\dot{v}$ 是广义加速度(关节加速度或身体的加速度);其意义就像是 F=ma 里面的 ma,表示加速一个有惯性的物体需要的力。
- $h(q,v)$:重力 + 速度相关项(科氏力、离心力)。如果机器人静止,这里主要就是重力。如果在运动,这里就会出现'速度带来的额外力',类似开车转弯时身体被甩出去的感觉。
公式右边:外界能提供的'驱动力'
- $S^T \tau$:电机能施加的关节力矩。$\tau$ 电机产生的力矩(控制器的输出),$S^T$ 选择矩阵,把电机力矩映射到广义坐标系中。
- $J_c^T \lambda$:接触点反力。$\lambda$ 来自地面或物体的力(约束反作用力),$J_c$ 接触点的雅可比,把关节速度映射到接触点速度。$J_c^T \lambda$ 把'地面推脚的力'转换回'关节的力'。
直观记忆就是类比现实生活中的推车子:
- 你推车:电机力矩 $\tau$。
- 地面支撑车子:接触反力 $\lambda$。
- 车子有质量,要加速就得克服惯性:$M(q)\dot{v}$。
- 重力和转弯的惯性:$h(q,v)$。
接触力约束
还要满足接触力约束 $J_c v = 0, \lambda \in \text{摩擦锥}$,其中 $J_c v = 0$ 意义是接触点速度为 0,比如机器人脚贴在地上不滑、不穿透;$\lambda \in \text{摩擦锥}$ 意义是接触力必须满足摩擦模型,脚不会不穷大摩擦,力要在摩擦椎范围内。
什么是雅可比 $J_c$?
假设有一个机械臂:
- 关节角度:就像是控制的'按钮'。
- 手末端的位置:就是最终关心的'结果'。
那么问题就是关节角度动一动,末端的位置会怎么动了?这个'关节空间的微小变化'影响到'末端空间的微小变化'。这样一个映射关系,就是雅可比矩阵 $J$。

图中红色箭头表示关节角度的小变化 $\Delta \theta_1, \Delta \theta_2$。红色箭头的变换导致绿色箭头末端位置的变化:$\Delta x, \Delta y$。雅可比矩阵 $J$ 就是把
$$ \begin{bmatrix}\Delta \theta_1 \ \Delta \theta_2\end{bmatrix} \longrightarrow \begin{bmatrix}\Delta x \ \Delta y\end{bmatrix} $$
因此如果想要末端动多少就用 $J$,想算末端力传回关节多少就用 $J^T$。
总结一下雅可比 $J$ 就是关节空间和任务空间的桥梁,作用就是我们关节动多少,末端/接触点动多少。




