想象一位阅兵指挥官站在检阅台侧面,手里没有喇叭、没有脚本,却要在同一瞬间管住几百号人:整个方阵必须“对正标齐”——前后左右一条线,这是队形的底线;第一排士兵要举枪敬礼,动作必须整齐划一;第二排的旗帜要在同一高度挥舞。更棘手的是,士兵做这些动作时身体会不由自主地歪斜,一歪就会带乱整个排面。指挥官必须让每个人在完成个人动作的同时,下意识地调整脚步、收腹、挺胸,把队形重新归位。人形机器人面对的局面如出一辙:它要走路,要伸手取物,要弯腰搬东西,但无论做什么,绝不能摔倒。这个“绝对不摔”就是队形的底线,其他动作都得在不破坏底线的前提下去完成。全身运动控制(Whole-Body Control, WBC),就是那个在每一毫秒同时指挥所有“士兵”(关节)的指挥官。这篇文章,我们就用阅兵指挥官的视角,把WBC的核心思想、数学框架、工程难点一次看清楚。

岗位关联

学完WBC,你便握住了人形机器人“走路不摔、同时做事”的核心钥匙。无论做控制算法、任务规划还是具身智能系统设计,这都是绕不开的底层能力。

目录
  1. 可视化演示
  2. 定义与目标
  3. 任务优先级
  4. 优化模型
  5. ZMP方法对比
  6. WBC与MPC
  7. 工程实现难点
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

任务优先级栈与零空间投影 ▶ 执行中 QP二次规划:多约束优化求解 QP标准形式 零空间投影 N(J) = I - J^T(JJ^T)^{-1}J s.t. lb

定义与目标

阅兵指挥官从来不是只喊一句“齐步走”就完事。他同时盯住几十个排面、几百名士兵——谁慢了半步、谁的枪举高了两厘米、谁的脚尖没绷直,全都得管;更关键的是,这些调整必须同时发生,不可能等所有人先站齐、再挨个举枪。人形机器人的处境一模一样:要盯着“重心不能偏出脚掌”这件头等大事,还要让左手去够杯子、右腿往前迈步,所有这些任务都挤在同一个瞬间,由同一组关节去完成。

传统做法是给每个关节单独设计控制器,就像指挥官先把队伍解散,再派几个班长分头去喊口令——结果班长的命令互相打架,队形反而乱了。WBC的思路完全不同:它把所有任务放进一个统一的数学框架,一次性求出一组关节指令,让不同任务在同一个身体上共存。这里的“全身”二字意味着任务定义在躯干、四肢甚至指尖上,最终都映射到所有关节。比如“保持重心”这个任务,不仅用到踝关节,还可能需要髋关节、膝盖甚至手臂去配合。

WBC最朴素的目标函数可以写成加权误差平方和:

回到阅兵台:指挥官不需要挨个士兵去喊“你向左半步、你收腹”,他只需在脑中快速算出“哪个排面误差最大、怎么微调全局最优”,然后一条口令传下去,整支队伍同时做出最协调的反应。WBC正是机器人版的“全局指挥官”。

J(q˙)=∑i=1Nwi∥Jiq˙−x˙i∗∥2\displaystyle J(\dot{\mathbf{q}}) = \sum_{i=1}^{N} w_i \left\| \mathbf{J}_i \dot{\mathbf{q}} - \dot{\mathbf{x}}_i^{*} \right\|^2
雅可比矩阵的每一列代表“某个关节动一下,任务点会移动多少”。全身上下几十个关节的各自贡献,都被这张表记录在案。
  1. 任务数量$N$ 是任务总数,比如平衡任务、手臂任务、步态任务加在一起共有 $N$ 个。WBC把所有任务放在同一个算式里,正是“统一求解”的数学体现。
  2. 任务雅可比矩阵$\mathbf{J}_i$ 是任务 $i$ 的雅可比矩阵,它把关节速度映射到任务空间速度——相当于“翻译官”,把关节转动翻译成重心移动或指尖移动。
  3. 期望任务速度$\dot{\mathbf{x}}_i^{*}$ 是任务 $i$ 的期望速度,即“我们想让手往哪边动、想让重心待在哪”,由上层规划给出。
  4. 权重与前缀$w_i$ 是任务权重,$\left\| \mathbf{J}_i \dot{\mathbf{q}} - \dot{\mathbf{x}}_i^{*} \right\|^2$ 表示实际效果与期望效果的误差平方——WBC要找的,就是让这些误差加权之和最小的 $\dot{\mathbf{q}}$。
    Ji=∂xi∂q∈Rm×n\displaystyle \mathbf{J}_i = \frac{\partial \mathbf{x}_i}{\partial \mathbf{q}} \in \mathbb{R}^{m \times n}

任务优先级

阅兵场上有一条心照不宣的铁律:队形永远比个人动作重要。哪怕某个士兵的举枪动作再标准,如果他会因此撞到旁边的队友,指挥官也会让他放弃动作、先保队形。WBC同样给任务排了座次,而“保持平衡”永远坐在第一把交椅上——因为它直接决定机器人会不会摔倒。

在多任务框架里,“优先级”可以实现为两种风格。第一种叫“加权式”:给平衡任务一个大权重,给手臂任务一个小权重。这就像指挥官嘴上说“队形更重要”,但两边还是同时喊,谁嗓门大谁占上风——缺点是有时队形仍会被大嗓门之外的声音带偏。第二种叫“分层式”:先用全部“决策资源”满足队形,再在剩余的自由度中做手臂动作。这才是阅兵的真实逻辑——队列是硬约束,动作是软任务。

分层WBC的经典做法是零空间投影。假设已经求出一组满足最高优先级任务(平衡)的关节速度 $\dot{\mathbf{q}}_1$,那么在这基础上还可以叠加一个“不破坏平衡”的修正量 $\mathbf{N}_1 \dot{\mathbf{q}}_2$,其中 $\mathbf{N}_1$ 是平衡任务的零空间投影矩阵:

指挥官心里那张“优先顺序表”大致是:平衡 > 步态支撑 > 躯干姿态 > 手臂操作 > 表情/末端小动作。手部任务再花哨,也只能在平衡这个“硬天花板”之下找空间。走路时想挥手,可以;单脚站立时想大幅摆臂,不行——因为零空间里已经没有富余的自由度了。

q˙=q˙1+N1q˙2,N1=I−J1+J1\displaystyle \dot{\mathbf{q}} = \dot{\mathbf{q}}_1 + \mathbf{N}_1 \dot{\mathbf{q}}_2, \quad \mathbf{N}_1 = \mathbf{I} - \mathbf{J}_1^{+} \mathbf{J}_1
零空间投影就像“在不推开队友的前提下侧身穿过人群”——它把动作限制在不会影响队形的方向里,让低优先级任务“见缝插针”。
  1. 基解$\dot{\mathbf{q}}_1$ 是单独满足平衡任务得到的基础解,它保证机器人的重心不动摇,是“队形底线”的数学化身。
  2. 零空间投影矩阵$\mathbf{N}_1$ 矩阵把任何关节速度投影到“不影响平衡”的子空间里,相当于给低优先级任务划出一条“安全通道”。
  3. 伪逆$\mathbf{J}_1^{+}$ 是平衡任务雅可比矩阵的伪逆($\mathbf{I}$ 是单位矩阵),用它构造出与任务行空间正交的投影方向。
  4. 低优先级修正$\dot{\mathbf{q}}_2$ 是手臂或其他任务的解,但它经过 $\mathbf{N}_1$ 过滤后,无论怎么动都不会干扰平衡——就像士兵侧身穿过人群时推不到人。

优化模型

阅兵指挥官要在几秒内完成大量心算:哪个排面歪了 2 厘米、倾斜代价多大、调多少人、用什么节奏去调。这个“心算”在数学上就是求解一个优化问题。WBC 把全身协调写成二次规划(QP):目标函数是二次的(误差平方和),约束是线性的(关节限位、力矩上限),求解器在毫秒级给出最优关节指令。

二次规划的标准形式可以写成:

如果把 WBC 比作指挥官的心算账本,那么每个任务都是一行“账目”,每一项误差都是“亏损”。指挥官的直觉是:先确保大头(平衡)不亏,再在余力范围内把其他账做得漂亮。优化求解器做的就是这件事——在几千毫秒内翻完这本账,找出亏损最小的方案。这也是为什么很多时候 WBC 会被称为“全身优化控制”:它在字面意义上就是一个每周期求解一次的实时优化器。

min⁡x 12xTQx+cTxs.t.Aeqx=beq,xlb≤x≤xub\displaystyle \min_{\mathbf{x}} \ \frac{1}{2} \mathbf{x}^{T} \mathbf{Q} \mathbf{x} + \mathbf{c}^{T} \mathbf{x} \quad \text{s.t.} \quad \mathbf{A}_{eq} \mathbf{x} = \mathbf{b}_{eq}, \quad \mathbf{x}_{lb} \leq \mathbf{x} \leq \mathbf{x}_{ub}
目标函数描述“每个任务的误差代价”,约束描述“关节能转到哪、能出多大力”。求解器在满足物理约束的前提下,找一组让总代价最小的关节指令。
  1. 优化变量$\mathbf{x}$ 是待求解的关节加速度或力矩向量——它是 WBC 最终输出到每个电机上的“行动命令”。
  2. 代价权重矩阵$\mathbf{Q}$ 是半正定矩阵,融合了任务雅可比与权重,放大重要任务的误差代价,缩小次要任务的代价。
  3. 线性项$\mathbf{c}$ 由任务期望值与雅可比乘积构成,它“牵着”优化结果朝期望的任务方向走。
  4. 等式约束$\mathbf{A}_{eq} \mathbf{x} = \mathbf{b}_{eq}$ 用来强制满足动力学的硬关系,比如脚底不打滑、躯干加速度与地面反作用力一致。
  5. 边界约束$\mathbf{x}_{lb}, \mathbf{x}_{ub}$ 是每个关节的位置、速度、力矩安全范围——就像阅兵队列两侧的警戒线,越界即淘汰。

ZMP方法对比

在 WBC 出现之前,人形机器人走路靠的是另一套看家本领——ZMP(零力矩点)方法。它的形象很像“脚印检查员”:检查员只盯住一个关键指标——地面反作用力合力的作用点(ZMP 点)是否落在脚掌支撑多边形内。只要在,就判定安全;不在,就马上报警。这种方法把整个人形压缩成一个“倒立摆”,用几行公式判断稳不稳,简单而高效。

ZMP 的核心计算公式如下,它描述的是地面反作用力水平分量与重力、惯性力的平衡关系:

ZMP 方法几十年来的成功,是因为它在规划层非常高效:预先把落脚点规划到安全区域,机器人照着走基本不会倒。但它的短板也很明显——检查员只有“脚印”这一个指标,无法回答“我能不能一边走路一边伸手够东西”这样的多任务问题。WBC 的优势正在于,它把全身动力学和多个任务都装进同一个优化里,可以从容处理“弯腰捡东西时保持稳定”这类 ZMP 方法难以覆盖的场景。两者不是简单的替代关系,而是各管一段:ZMP 适合做规划层的安全判据,WBC 适合做执行层的全身协调。

px=∑imi(z¨i+g)xi−∑imix¨izi∑imi(z¨i+g)\displaystyle p_x = \frac{\sum_{i} m_i \left( \ddot{z}_i + g \right) x_i - \sum_{i} m_i \ddot{x}_i z_i}{\sum_{i} m_i \left( \ddot{z}_i + g \right)}
公式把身体各部位的质量、加速度、位置加权合计,算出等效的“零力矩点”横坐标。只要 $p_x$ 落在脚掌范围内,机器人就能保持动态平衡。
  1. 质块质量$m_i$ 是把身体拆成若干质块后第 $i$ 块的重量。身体不再是“一根杆”,而是一堆质点的合成。
  2. 高度与加速度$x_i, z_i$ 是第 $i$ 块质心的水平和垂直位置;$\ddot{x}_i, \ddot{z}_i$ 是对应的加速度,表示这个质块在空间中的运动状态。
  3. 重力项$g$ 是重力加速度,公式在竖直方向引入重力,使整条算式反映“力矩平衡”的真实物理含义。
  4. 分母与整体意义分母是所有质块的“等效重量”,分子是这些质块产生的倾倒力矩,二者相除就得到地面反作用力合力的落点——零力矩点。

WBC与MPC

阅兵不是临时起意的即兴表演。真正的大阅兵前,指挥官带着方阵一遍遍演练,提前预测队形会在哪个弯道松散、哪个排面容易抢拍,并在演练中把路线、节奏全部定好。这套“提前演算”在机器人控制里对应MPC(模型预测控制):它用一个简化动力学模型,预测未来几十毫秒到几百毫秒的状态,反复优化输出落脚点与重心轨迹。而到了正式阅兵那一刻,指挥官站上指挥台随机应变,靠的则是另一套临场反应——这就是 WBC,它把 MPC 给出的期望轨迹当作“剧本”,以每秒上千次的频率即时跟踪,同时应对突发的推搡、台阶高低变化。MPC 看长远,WBC 管当下,两者级联配合:MPC 输出期望落脚点与重心轨迹,WBC 负责在全身层面精确实时跟踪。

MPC 的优化目标通常是这样的(它也是一类优化问题,只是预测了未来多个时刻):

在实际系统中,MPC 通常用简化的线性倒立摆或质点模型,跑在 50–200 Hz;WBC 用完整的全身动力学模型,跑在 500–1000 Hz。这正好对应阅兵的“排练”与“现场”:排练时用沙盘推演,现场靠对讲机临场调度。没有 MPC,WBC 会变得短视,每一步都像在走钢丝;没有 WBC,MPC 的精细计划也落不到实处——因为负责执行的身体不听使唤。

J=∑k=0N(∥xk+1−xk+1ref∥Q2+∥uk∥R2)\displaystyle J = \sum_{k=0}^{N} \left( \left\| \mathbf{x}_{k+1} - \mathbf{x}^{\mathrm{ref}}_{k+1} \right\|_{\mathbf{Q}}^2 + \left\| \mathbf{u}_k \right\|_{\mathbf{R}}^2 \right)
MPC 在每一个控制周期内算出一串“未来的动作”,只取第一步执行,然后下个周期重新来一遍——这就是“滚动时域”的意思。
  1. 预测步数$N$ 是 MPC 的预测时域长度,代表向前看多少步。$N$ 越大,看得越远,但计算量也越大。
  2. 状态向量$\mathbf{x}_{k+1}$ 是预测的第 $k+1$ 步系统状态(如重心位置、速度),$\mathbf{x}^{\mathrm{ref}}_{k+1}$ 是对应的参考状态,来自上层任务规划。
  3. 状态权重$\left\| \mathbf{x} \right\|_{\mathbf{Q}}^2 = \mathbf{x}^{T} \mathbf{Q} \mathbf{x}$ 是带权重的平方范数,$\mathbf{Q}$ 惩罚状态偏离参考的程度——偏离越远,代价越高。
  4. 控制量惩罚$\mathbf{u}_k$ 是第 $k$ 步的控制输入(支撑腿的力、落脚点位置),$\mathbf{R}$ 惩罚“每次改动太大”,防止机器人动作过猛。

工程实现难点

指挥官站在检阅台上,真正的麻烦不是战术,而是现实:士兵会疲惫、对讲机会延迟、风声会盖过口令。人形机器人的 WBC 落地同样面对三个拦路虎,每一个都是阻碍工程落地的大山。

第一座山是算力。 WBC 要求每个控制周期(通常是 1kHz,即 1 毫秒)内完成一次全身优化求解。机器人几十个关节意味着优化变量可能上百个,二次规划求解器必须在这个毫秒级窗口内算完。于是有了这个硬性不等式:

第二座山是模型误差。 WBC 的优化依赖全身动力学模型,但质心位置、转动惯量、摩擦系数都只是近似值;加上负载变化(手里拿的东西不同)和关节磨损,模型很快“失真”。模型一失真,优化给出的指令就会偏离现实,导致机器人做出别扭甚至危险的补偿动作。

第三座山是传感器噪声。 平衡判断依赖 IMU(惯性测量单元)、关节编码器、足底力传感器。IMU 有漂移,编码器有量化噪声,足底力传感器更是出了名的“爱跳变”。噪声进入优化问题后,关节指令会高频抖动,就像指挥官听到一个总在变形的报告,很难做出稳定决策。工程上常用卡尔曼滤波、状态估计器和鲁棒优化来消化这些问题。

阅兵指挥官的成长,从来不是靠背熟一本战术手册,而是在一次次演练中把误差、噪声、延迟统统纳入直觉。WBC 的工程实现,拼的也正是这种“带着不完美去行动”的能力:算力不够就优化求解器,模型不准就现场标定,传感器吵就上滤波。理解了这三大难点,才算真正理解 WBC 离“实验室爆款”到“工厂量产”之间的距离。

1fc≥Tsolve+Tio\displaystyle \frac{1}{f_c} \geq T_{\mathrm{solve}} + T_{\mathrm{io}}
  1. 控制频率$f_c$ 是控制频率,单位 Hz。1kHz 意味着机器人每 1 毫秒要拿到一组新的关节指令,低于这个频率身体就会“卡顿”。
  2. 求解耗时$T_{\mathrm{solve}}$ 是求解优化问题消耗的时间,包含矩阵组装与 QP 求解,是整条链路里的大头消耗。
  3. 通信耗时$T_{\mathrm{io}}$ 是传感器读取、总线传输、指令下发的总耗时,哪怕只有几十微秒,在 1 毫秒的预算里也相当可观。
  4. 整体含义不等式规定——算得快、传得快,才配得上 1kHz 的控制需求。任何一环超时,控制周期就要放宽,机器人反应就会变迟钝。

AI 应用场景

具身智能仓储搬运

阶段:机器人运动控制与执行

解决的问题:传统机器人抓取重物时必须先停稳、再伸臂,效率低下且在移动中抓取容易摔倒。WBC 让机器人在行走的同时伸出双臂抓取,实时调整腿部与躯干姿态补偿重心偏移。

具体案例:某电商仓储的人形机器人从货架取 2kg 箱子。当它伸出右臂抓箱的瞬间,WBC 检测到重心前移,同步命令左腿后撤半步、躯干微倾,将重心始终锁在脚掌支撑多边形内,整个过程行走不停顿,比传统“停-抓-走”模式效率提升 40%。

人形机器人迎宾与互动

阶段:运动规划与人机交互

解决的问题:迎宾机器人需要一边挥手、一边应对游客的意外触碰。突发外力会导致重心偏移,处理不当就会摔倒。WBC 将“保持平衡”设为最高优先级,在检测到外力瞬间指挥腰部与踝关节反向补偿。

具体案例:商场里的迎宾机器人正在与小朋友互动挥手。一名游客不经意间从侧面轻推它的肩膀,WBC 在 50ms 内感知到重心偏移,迅速命令髋关节内收、踝关节侧倾,机器人像太极大师一样稳住身形,随即若无其事地继续挥手——整个过程自然流畅。

助老外骨骼康复辅助

阶段:人机共生控制

解决的问题:老人穿戴外骨骼上楼梯时,腿部发力不均极易侧倾。WBC 思路将“患者微弱发力意图”作为低优先级任务,在“保持整体平衡”的高优先级约束下放大助力,避免代偿动作引发跌倒。

具体案例:助老外骨骼在老人抬腿跨越 15cm 台阶时,WBC 层优先保证身体重心稳定,再在零空间内放大髋关节助力。若老人发力不对称,系统自动削减患侧助力而加大健侧补偿,让每一步都稳稳当当。

Python 演示

python45 行
import numpy as np  class HierarchicalWBC:    """分层全身运动控制示例:平衡任务优先,手部任务在零空间内执行"""     def __init__(self, n_joints=6):        self.n = n_joints        # 平衡任务的雅可比矩阵:关节速度 -> 重心速度        self.J_bal = np.array([            [1.0, 0.5, 0.1, 0.0, 0.0, 0.0],            [0.0, 0.2, 0.8, 0.5, 0.1, 0.0],        ])        # 手部任务的雅可比矩阵:关节速度 -> 手部速度        self.J_hand = np.array([            [0.0, 0.1, 0.3, 0.8, 0.6, 0.2],            [0.0, 0.0, 0.2, 0.4, 0.7, 0.5],        ])     def solve(self, x_bal_des, x_hand_des):        # 第1步:最小二乘满足平衡任务(最高优先级)        q1 = np.linalg.lstsq(self.J_bal, x_bal_des, rcond=None)[0]        # 第2步:构造平衡任务的零空间投影矩阵        J_pinv = np.linalg.pinv(self.J_bal)        N = np.eye(self.n) - J_pinv @ self.J_bal        # 第3步:在零空间内最小化手部任务误差        residual = x_hand_des - self.J_hand @ q1        dq = np.linalg.lstsq(self.J_hand @ N, residual, rcond=None)[0]        return q1 + N @ dq     def run_demo(self):        x_bal_des = np.zeros(2)                # 期望重心速度为零(保持不动)        x_hand_des = np.array([1.5, -1.0])     # 期望手部向右下移动        q = self.solve(x_bal_des, x_hand_des)        bal_err = np.linalg.norm(self.J_bal @ q - x_bal_des)        hand_err = np.linalg.norm(self.J_hand @ q - x_hand_des)        print("=== 分层WBC示例 ===")        print("关节速度指令:", np.round(q, 4))        print("平衡任务误差:", round(bal_err, 6))        print("手部任务误差:", round(hand_err, 6))        print("结论: 平衡误差接近0,手部任务在可用空间内尽量逼近")  if __name__ == "__main__":    HierarchicalWBC().run_demo()
目的:用 6 关节简化模型演示分层 WBC 的核心逻辑——先解平衡任务,再在零空间内执行手部任务,最终关节指令既不破坏平衡又尽量贴合手部目标。
  1. q1 = np.linalg.lstsq(self.J_bal, x_bal_des, rcond=None)[0]先用最小二乘求一组满足平衡任务的关节速度,相当于“指挥官先保队形”。
  2. J_pinv = np.linalg.pinv(self.J_bal)计算平衡任务雅可比矩阵的伪逆,这是构造零空间投影的前提。
  3. N = np.eye(self.n) - J_pinv @ self.J_bal构建零空间投影矩阵,把后续动作限制在“不影响平衡”的子空间内。
  4. residual = x_hand_des - self.J_hand @ q1算出基础解下手部任务还差多少,需要在零空间里补多少。
  5. dq = np.linalg.lstsq(self.J_hand @ N, residual, rcond=None)[0]在零空间内求手部任务的最优修正量,“见缝插针”做动作。
  6. return q1 + N @ dq合成最终关节速度:既满足平衡底线的硬要求,又尽力完成手部软任务。

常见误区

误区我以为 WBC 就是在每个电机上装一个 PID 控制器,各自参数调好,机器人自然就全身协调了。为什么还要搞什么“统一优化”?

正解PID 是关节级别的局部反馈,它只管“这个关节转到位没有”,完全不知道“重心在哪、会不会倒”。WBC 是任务级别的全局优化,任务定义在重心、手部、躯干等任务空间,再通过雅可比矩阵映射到所有关节。就像阅兵指挥官看的是整个方阵的整齐度,而不是某个士兵的膝盖弯曲角度。

为何常见:经典控制课最先教的都是 PID,容易先入为主地把所有控制问题都往 PID 上套。

误区我以为 WBC 的优先级就是把平衡任务的权重设成 100,手部任务设成 1,权重大的自然优先满足。这难道不是最简单有效的办法?

正解加权 WBC 是“软约束”——大权重只是让平衡任务在总代价里占比更重,但极端情况下手部任务仍可能把平衡“拉偏”。分层 WBC 用零空间投影实现“硬优先级”,高优先级任务被精确满足,低优先级任务只能在零空间里执行,两种方式使用场景不同。

为何常见:加权最小二乘是入门最常见的写法,看着“差不多”,但语义上差了一个量级。

误区现在都在讲 WBC,ZMP 是不是过时了?人形机器人公司估计早就不用它了。

正解ZMP 仍然是步态规划层最主流的稳定性判据之一。MPC 在规划落脚点时大量使用凸的 ZMP 约束来判断“这个步子能不能迈”。WBC 解决的是“执行层怎么协调全身”的问题,两者分工不同,不是替代关系。

为何常见:论文里常拿 WBC 与 ZMP 做对比实验,容易让人误以为是新旧替代。

误区把 WBC 代码写出来,机器人应该就能走出漂亮稳定的步伐,毕竟全身都协调好了。

正解WBC 是“执行器官”,它本身不告诉机器人“下一步落脚点在哪、迈多大步”。这些由步态规划器或 MPC 生成参考轨迹(期望重心、落脚点),WBC 只负责跟踪参考同时又保持平衡。没有上层规划,WBC 连往哪走都不知道。

为何常见:演示视频只展示 WBC 的执行效果,看不到背后的规划模块,容易高估单一模块的能力。

误区控制频率拉到 10kHz,WBC 肯定比 1kHz 更稳更灵敏,什么时候都不会摔。

正解频率受两个因素制约:一是求解算力,频率翻倍需要同等的算力提升;二是传感器噪声,高频下数值微分会被噪声放大,关节指令剧烈抖动。工程上 1kHz 是常见取舍,模型精度与频率匹配比单纯冲高更重要。

为何常见:直觉上“更快等于更好”,但在数字控制系统中,噪声、延迟、离散化误差让“更高频率”未必“更稳”。

面试题

Q1. WBC的核心目标是什么?

单选题 · easy

  • A.让机器人走得最快
  • B.多任务统一协调全身控制← 正确答案
  • C.让机器人跳得最高
  • D.只控制单条机械臂

答案:B。WBC 的核心是把平衡、移动、操作等多个任务放进同一个优化框架统一求解,而不是追求单一指标(速度、高度)。B 准确概括了“全身”与“统一”两个关键词,A/C 都是单目标指标,D 只涉及局部,均不是 WBC 的本质。

Q2. WBC中优先级最高的任务通常是?

单选题 · easy

  • A.手臂抓取任务
  • B.头部追踪任务
  • C.保持身体平衡← 正确答案
  • D.语音交互命令

答案:C。在阅兵方阵里,队形永远比个人动作重要。WBC 中“保持平衡”是决定机器人会不会摔倒的底线任务,优先级永远排在手臂抓取、头部动作、语音交互之前,因为它们都以不摔为前提。

Q3. WBC最终输出给关节的指令通常是?

单选题 · mid

  • A.目标温度设定值
  • B.关节加速度或力矩← 正确答案
  • C.关节阻尼系数
  • D.电机额定功率

答案:B。WBC 的优化变量是关节加速度或力矩,经过逆动力学映射后下发到各关节电机执行。PID 控制输出角度误差修正量,而 WBC 输出的是动力学层面的力/加速度指令——就像指挥官下达的是“用力迈步”而不是“腿抬到 30 度”。

Q4. 关于ZMP与WBC的比较,下列说法正确的有?

多选题 · mid

  • A.ZMP采用倒立摆简化模型← 正确答案
  • B.WBC考虑全身动力学模型← 正确答案
  • C.ZMP完全不关心平衡问题
  • D.WBC可同时处理多个任务← 正确答案

答案:ABD。ZMP 把机器人简化为倒立摆,通过判断零力矩点是否落在支撑多边形内来保证平衡,A 正确,C 错误(ZMP 恰恰是最经典的平衡判据)。WBC 使用全身动力学模型并在统一优化中处理多任务,B、D 正确。

Q5. 零空间投影在WBC中的作用是什么?

单选题 · mid

  • A.增大关节力矩输出上限
  • B.在保持高优先级任务的同时执行低优先级任务← 正确答案
  • C.让所有任务优先级相同
  • D.降低优化问题的维数

答案:B。零空间投影矩阵把低优先级任务的修正量“滤”到不影响高优先级任务的子空间内。这样手部动作可以在不破坏平衡的前提下执行,B 准确。A 是力矩限制问题,C 与分层 WBC 思想相悖,D 是数值计算层面的效果而非核心作用。

Q6. WBC工程实现的主要难点包括?

多选题 · hard

  • A.优化求解耗时超过控制周期← 正确答案
  • B.动力学模型参数不准确← 正确答案
  • C.传感器噪声干扰状态估计← 正确答案
  • D.机器人外壳颜色设计

答案:ABC。WBC 要满足 1kHz 实时性,求解器必须在 1ms 内算完,A 是典型算力瓶颈。模型参数(质量、惯量、摩擦力)不准确会直接导致优化输出偏差,B 正确。IMU 漂移、编码器噪声等传感器问题会恶化状态估计,C 正确。外壳颜色属于工业设计,与运动控制无关。

Q7. MPC与WBC在机器人控制中的典型分工是?

单选题 · mid

  • A.MPC做高频执行,WBC做低频规划
  • B.MPC规划落脚点,WBC跟踪执行← 正确答案
  • C.两者各自独立,互不相干
  • D.WBC预测未来,MPC处理当前

答案:B。MPC 用简化模型在 50–200Hz 预测未来状态并规划落脚点与重心轨迹;WBC 用全身动力学在 500–1000Hz 实时跟踪这些轨迹并保持平衡。B 准确描述了“MPC 规划、WBC 执行”的级联架构。

Q8. 加权WBC与分层WBC的主要区别是什么?

单选题 · easy

  • A.加权是软约束,分层是硬优先级
  • B.加权不需要优化求解← 正确答案
  • C.分层完全没有任务权重
  • D.两者在数学上完全等价
  • E.低优先级任务被完全忽略
  • F.低优先级任务在零空间内被部分执行
  • G.高优先级任务自动降级
  • H.优化因此直接求解失败

答案:B。严格分层 WBC 中,高优先级任务被精确满足(不发生降级,C 错误)。低优先级任务在零空间内尽量逼近自身目标,如果零空间中没有足够自由度,残差无法归零,但不是“完全忽略”(A 错在绝对化),也不会导致求解器崩溃(D 错)。B 准确描述了“见缝插针”的本质。

Q9. 人形机器人要弯腰搬重物时,WBC如何处理?

单选题 · mid

  • A.忽略平衡只专注抓取
  • B.腿部弯曲并调整重心以补偿← 正确答案
  • C.直接关闭除手臂外的关节
  • D.保持直立僵硬地伸手去够

答案:B。WBC 会把“保持重心在支撑面内”设为高优先级任务,抓取重物扰动重心时,通过腿部弯曲、髋部屈伸等动作补偿,确保整体稳定。A 违背了平衡底线,C 是不必要的关节截断,D 不构成协调动作,只有 B 体现了全身协调的思想。