先说结论:人形机器人的“全身控制”(Whole-Body Control,WBC)并不是为了让动作看起来更优雅,而是为了让机器人在站立、伸手、搬运、接触、受扰动这些事情同时发生时,整台机器还能像一个整体那样工作,而不是上半身做上半身的、下半身做下半身的,最后互相打架。
如果你在做 humanoid,真正麻烦的通常不是某一个关节跟不上,而是多个目标一起出现时怎么取舍。比如一边保持平衡,一边伸手够物体,一边限制足底接触力,一边避开关节极限,还要在地面不完全平、负载有变化、传感器有噪声的情况下继续稳定。全身控制解决的就是这类“全身耦合”的工程问题。
这篇文章会按实作思路来讲,不把 WBC 说成玄学,也不把它写成只适合论文阅读的抽象概念。重点是:你什么时候真的需要 WBC,它在系统里该怎么放,第一版该做到什么程度,最容易翻车的地方又在哪里。
这篇适合谁
- 你已经有基础关节控制、逆运动学或简单步态控制,想继续往“整机协调”推进。
- 你发现机器人单独做站立、单独做伸手都还行,但一叠加任务就不稳。
- 你在犹豫到底该用任务优先级控制、QP 优化、逆动力学,还是先用更简单的分层方案。
先纠正几个很常见的误区
误区 1:全身控制就是“更高级的动作生成”
不是。动作生成更像是在说“我想让机器人怎么动”,而全身控制更像是在说“在所有约束都存在的情况下,这个身体现在到底还能怎么安全、稳定、可执行地动”。它更接近约束协调器,而不是花哨轨迹播放器。
误区 2:等硬件和状态估计都完全成熟了,再接 WBC
这句话只说对一半。你当然不该在执行器乱跳、IMU 时间不同步、足底接触全靠猜的时候就强行上复杂 WBC。但另一半是,如果你永远用分散的小控制器顶着不做整机协调,那很多问题会被掩盖成“奇怪的调参问题”。一旦任务变成站立 + 接触 + 搬运 + 恢复,WBC 往往迟早要上。
误区 3:有了 WBC,机器人自然会更稳
不一定。WBC 不是稳定性的魔法按钮。它很依赖状态估计、接触建模、动力学模型、执行器带宽和约束设置。如果这些输入本身不可靠,WBC 只会更快、更系统化地把错误分发到全身。
误区 4:第一版就该把所有目标都塞进优化器
这是很常见的坑。理论上你可以把姿态、足底力、手部轨迹、视觉朝向、关节限位、能耗、柔顺性、碰撞约束全部写进去,但工程上第一版这么做通常只会让问题变得不可解释。早期系统更需要的是一个目标集合很小、行为边界很清楚的 WBC。
WBC 真正解决的是什么问题
人形机器人是高度耦合的系统。你让手臂往前够,质心就会变;你让机器人抬一只脚,支撑多边形和地面反力就会变;你在手上加一件负载,躯干姿态、腿部力矩和足底接触力都会一起变。
所以真正的难点不是“能不能控制每个关节”,而是当多个控制目标彼此冲突时,系统如何实时决定谁更重要、谁可以让步、谁必须满足。这就是 WBC 的核心价值。
一个更接地气的理解方式是,WBC 在帮你同时回答下面这些问题:
- 现在最优先的是不摔倒,还是完成手上的操作?
- 接触力是不是已经接近不安全边界?
- 为了维持平衡,我是否应该牺牲一点手部轨迹精度?
- 某个关节快到极限时,其他身体部分能不能一起补?
- 受到外力或模型误差后,整机应该怎么分配修正动作?
一个更现实的判断:什么时候你真的该上 WBC
如果你的机器人还停留在这些阶段:
- 单关节控制还不稳定
- 编码器和 IMU 还常常漂
- 站立都不稳
- 执行器经常饱和却没有日志
那你现在最需要的通常不是 WBC,而是把底层基线先补齐。
但如果你已经遇到这些症状:
- 手一伸出去,身体就明显失稳
- 抓取任务一加负载,腿部姿态就开始乱
- 一旦和外界接触,原来的控制器就互相抢控制权
- 步行、伸手、保持视角这些目标叠加后很难调
那就是很典型的信号,说明你已经需要一个全身级别的协调层,而不是再堆更多局部补丁。
先把 WBC 放对位置,不要一开始就放成“大脑”
在一套更稳妥的机器人架构里,WBC 通常不是最高层,也不是最低层。更常见的结构是:
- 任务层:决定要做什么,比如站起、迈步、伸手、搬运、靠近桌子。
- 规划层:给出期望的身体目标,例如足端轨迹、手部目标位姿、质心参考、接触模式。
- 全身控制层:在当前状态和约束下,把这些目标协调成可执行的全身加速度、力或关节命令。
- 底层执行层:关节伺服、电流/力矩控制、驱动器保护、硬件限位等。
这很重要,因为很多团队会把 WBC 误当成“大脑”来用,什么都往里塞。其实它更像一个实时约束协调器。它的职责不是决定长期任务,而是把当前这一拍身体该怎么动算清楚。
第一版 WBC,最值得先实现哪几类目标
如果你是第一次把 WBC 放进 humanoid,不建议一口气做太多。第一版更值得优先实现下面 4 类目标。
1. 机体姿态稳定
这是最基础的一层。至少要先让躯干姿态、身体高度或质心参考能被可靠维持,否则其他目标都会漂。这里不追求“最优雅”,先追求“重复测试时表现一致”。
2. 支撑接触约束
脚底接触、支撑脚不打滑、期望地面反力不超边界,这些约束非常关键。很多纸面上漂亮的身体动作,一旦不把接触约束认真放进去,落到实机上就是打滑、抖动、脚跟翘起或者整机一软。
3. 手部或足端任务
在保持姿态和接触稳定的前提下,再加上“手到某个位置”“摆脚到某个目标点”这类任务。这样你可以明确观察到任务冲突出现时,系统是不是会优先保住平衡,而不是盲目追手。
4. 关节和执行器约束
关节限位、速度限制、力矩上限、接近热降额时的保守处理,这些都应该尽早加入。因为 WBC 如果不知道身体快碰到硬边界了,它就会继续给出理论上可行、实际上会伤机体的命令。
实作上,第一版通常怎么搭
方案 A:任务优先级 + 逆运动学/逆动力学
这是很多团队入门 WBC 的方式。优点是结构清楚、解释性强,知道哪类任务在上、哪类任务在下。缺点是任务切换或强冲突时可能不够柔顺,约束处理也没有优化框架那么统一。
方案 B:基于 QP 的全身控制
这在 humanoid 里非常常见。做法通常是把多个目标和约束写成一个二次规划问题,每个控制周期求解一次。优点是能统一处理接触、姿态、末端任务和各种边界,扩展性也好。缺点是模型、权重、数值稳定性和调参门槛都更高。
方案 C:分层控制 + 局部优化
如果团队还不想一开始就把所有东西塞进一个大 QP,这其实是很实用的折中路线。比如先用更直观的上层策略生成质心和末端目标,再让一个相对小的优化器只负责接触力和关键约束。这样更容易逐步上线。
如果你问我给第一版 humanoid 的建议,我一般更偏向:先做小而清楚的 QP 或分层 WBC,不要一开始做一个覆盖全世界的超级优化器。
最关键的一步,不是求解器,而是任务优先级怎么定
WBC 里真正最容易被低估的,不是数学形式,而是目标排序。你必须明确,哪些目标是“必须满足”,哪些目标是“尽量满足”。
对一台早期 humanoid,比较合理的顺序通常是:
- 安全相关约束,例如接触稳定、关节限位、力矩上限
- 整机平衡与躯干姿态
- 支撑脚或关键接触约束
- 摆脚或手部主要任务
- 视觉朝向、次要姿态美观、冗余自由度整理
这个排序不酷,但特别重要。因为只要排序反了,系统就可能为了“把手放准一点”去冒平衡风险,或者为了“看起来姿态更自然”去逼近关节边界。这种错在仿真里不一定马上出事,实机上很容易出事。
接触问题,是 WBC 最难也最不能糊弄的一层
只要你的 humanoid 会站、会走、会靠桌面、会推门,接触就不是细节,而是系统中心。这里最容易出问题的通常不是“完全没有接触”,而是这些灰区:
- 脚刚着地,但承重还不稳定
- 脚底一部分接触,一部分悬空
- 地面摩擦变化导致期望切向力不再安全
- 手部碰到物体了,但接触模型和真实力路不一致
所以实作里一定要记住:接触状态不是一个永远准确的真值,而是一个要持续怀疑和更新的估计量。如果你把接触当成绝对可靠输入,WBC 很容易在错误支撑假设上做出一整套错误动作。
状态估计不好,WBC 会怎么坏
这件事值得单独讲,因为很多团队第一次上 WBC 会有一种错觉,觉得“控制更先进了,应该能自动兜底”。现实刚好相反。WBC 往往会更放大状态估计质量的重要性。
常见症状包括:
- IMU 姿态微漂,结果躯干稳定任务一直在追一个假误差
- 足底接触判断错,结果地面反力分配完全失真
- 关节零位偏了,末端任务精度和身体约束一起变差
- 时间戳不同步,导致你以为 WBC 振荡,其实是输入不同拍
所以在工程上,WBC 从来不是脱离感知与估计独立存在的模块。它其实是整个“状态估计 -> 接触判断 -> 任务规划 -> 执行器能力”链路的放大镜。
第一批必须做的验证,不是炫技动作,而是这些组合测试
测试 1:站立 + 小范围手部运动
目标是看手一动时,身体会不会稳定补偿,还是明显开始晃。这个测试最容易暴露任务优先级和姿态约束是否合理。
测试 2:站立 + 轻载搬运
给手上加一点稳定负载,看躯干、腿部和足底力分配是否还能保持在合理范围。很多“空手好好的”系统,一加负载就暴露问题。
测试 3:接触任务 + 姿态保持
例如手轻推墙面、按按钮、拉门把这类动作。重点看机器人是否会因为追求手部轨迹而牺牲整机稳定,或者一接触就抖。
测试 4:扰动恢复 + 任务保留
在机器人执行一个简单上肢任务时给一点外部扰动,观察它是否会优先保命,再决定任务要不要降级,而不是两个目标都抓不住。
测试 5:长时间重复运行
WBC 很多问题不是前 10 秒暴露,而是在温升、负载变化、轻微零漂和接触误差累计后慢慢出现。所以别只看开头几次成功动作,要看第 50 次是不是还像第 5 次那样稳定。
几个特别容易翻车的地方
1. 权重调得像玄学
如果一个 QP 里有十几个任务、二十几个权重,但没人能清楚解释“为什么这样设”,那后面几乎一定会进入调参泥潭。第一版一定要克制,目标少一点,含义清楚一点。
2. 把执行器能力想得太理想
WBC 可能会算出一个很漂亮的关节力矩或加速度解,但执行器真实带宽、摩擦、死区、延迟、温升降额不一定跟得上。算得出来不等于做得出来。
3. 接触模型过于乐观
默认地面永远不滑、接触永远刚性、摩擦锥永远可信,这些假设一落地就会出问题。尤其是 humanoid 做长时间测试时,地面条件和鞋底状态都会变。
4. 试图让 WBC 一步到位解决所有问题
WBC 很重要,但它不是万能补丁。机械结构差、线束拖拽严重、状态估计漂、驱动器限流策略混乱,这些问题不会因为你上了 WBC 就消失。
一个很实用的工程判断
当你在两个 WBC 方案之间犹豫时,先别问哪个更先进,先问:
哪个方案能让我更快知道“机器人为什么失稳、为什么任务失败、为什么这次和上次表现不一样”?
这个问题很关键。因为早期 humanoid 项目最缺的通常不是算法名字,而是可解释的失败路径。一个稍微朴素但很好排障的 WBC,往往比一个能力更强但几乎不可解释的系统更值钱。
下一步怎么做
如果你准备把 WBC 放进你的 humanoid,我建议你接下来就做三件事:
- 先只保留 3 到 4 类核心任务,把优先级写死,不要一上来全都要。
- 把日志补齐,至少能看到姿态误差、接触状态、关节限位、任务误差和求解结果。
- 先做“站立 + 手部运动 + 轻接触”这类低风险组合测试,再往步行、搬运和复杂接触扩展。
对人形机器人来说,全身控制的真正意义,不是让身体看起来更聪明,而是让它在多个任务和多个约束同时存在时,依然像一个协调一致的系统那样工作。只要你把这个定位想清楚,WBC 就会从一个论文词汇,变成真正能提升整机可用性的工程模块。
最小 WBC bring-up 验收清单
如果你准备把 WBC 从“概念上会了”推进到“系统里真的接上了”,我更建议先用下面这 6 条做最小验收,而不是先追更复杂的整机动作。
- 状态层: IMU、关节状态、接触状态至少能稳定对齐,日志里能看出是谁先漂、谁先错拍。
- 优先级层: 任务排序已经写死,团队能清楚说出哪些约束必须满足,哪些任务可以让步。
- 求解层: 求解结果、任务误差、约束活跃状态可记录,不是只有“这次好像算出来了”。
- 执行层: 关节限位、力矩上限、热降额和控制模式切换没有被 WBC 绕过去。
- 测试层: 至少跑通过站立 + 手部运动、轻接触、轻载三类组合测试,而不是只看空载姿态 demo。
- 回归层: 同一套配置能重复复现,不是今天能站、明天又不知道为什么不行。
只要这 6 条里还有 2 条说不清,就先别急着把 WBC 往 walking、搬运或更复杂的接触任务上压。
读完这篇,下一步最该接哪几篇
WBC 本身不是孤立模块。你接下来最该补的,不是再找一篇更抽象的控制综述,而是顺着它最强耦合的几层往下接:
- 先补状态估计: How to Build a Humanoid State Estimator with IMU, Joint Encoders, and Foot Contact
- 再回 walking 排障: 人形机器人双足行走为什么这么难:从接触切换、状态估计到热降额的实作排查指南
- 如果底层还不稳,先补硬件边界: 人形机器人硬件瓶颈怎么定位:从执行器、母线压降到热降额的排查指南
这样接的原因很简单。WBC 真正会坏的地方,通常不在“公式还不够高级”,而在状态估计、接触切换和执行器边界这三层先没站稳。
延伸阅读方向
- 如果你接下来要继续往下拆,最值得单独展开的是接触建模、状态估计、足底力分配和扰动恢复策略。
- 如果你的机器人已经开始做步行任务,可以把 WBC 和 locomotion、state estimation 一起联动考虑,不要各调各的。
- 如果你在做上肢操作,也建议同时回看末端执行器负载、肩腰协同和视觉引导带来的额外约束。