站立是一个静态/准静态问题:质心(CoM)的水平投影落在支撑多边形(两脚掌围成的凸包)内部,重力与地面反作用力大致共线,机器人就不倒。行走则完全不同——迈步时质心会周期性地"跑出"支撑多边形,机器人利用重力自然前倒,再用下一步的落点"接住"自己。也就是说,步行本质上是受控的不稳定:每一步都是一次"即将摔倒"被成功救回的过程。
而全身动作(挥手、抓取、弯腰、转身)会让问题进一步复杂化:手臂挥动时,根据牛顿第三定律,手臂对躯干产生反作用力矩,躯干必须用髋关节、脊柱甚至对侧腿来平衡;弯腰时质心位置改变,支撑脚的受力重新分配。关节之间不是独立的,而是通过连杆动力学强耦合在一起。这就是为什么说人形机器人控制是一个"全身(whole-body)"问题,而不是 40 个独立关节 PID 的简单叠加。
| 难点 | 含义 | 后果 |
|---|---|---|
| ① 欠驱动 (Underactuation) | 人形机器人是"漂浮基座"系统:基座(躯干)的 6 个自由度(3 平动 + 3 转动)没有执行器直接驱动,只能通过足底与地面的接触力间接控制 | 不能像机械臂那样"跟踪关节轨迹就完事";质心与姿态是不稳定的内部动力学,必须靠接触力主动平衡 |
| ② 多接触与接触切换 | 行走中脚掌支撑→摆动→落地,支撑脚数量在 1~2 之间切换;接触是单边约束(只能推、不能拉),受摩擦锥限制,还可能打滑 | 系统在"单支撑/双支撑"之间切换,是混合系统;接触力未知,需要与关节力矩一起求解;接触点不准确模型就失效 |
| ③ 高维动力学耦合 | 全身 20~40+ 个自由度,质量分布随姿态大幅变化(腿部摆动会明显改变质心与惯量);方程强非线性、耦合项多 | 全模型实时求解代价高,必须做模型简化(后文 SRBM 就是为此而生);控制器要同时满足平衡、任务、约束 |
线性倒立摆(LIPM, Linear Inverted Pendulum Model)是步态规划最经典、最重要的简化:把机器人看成一根"长度不变"的腿顶着一个质点(质心),质点高度恒定为 h,绕脚踝铰接点摆动。它的水平动力学极其简洁:
注意这个方程右边没有负号——说明它天然是不稳定的(特征根 ±√(g/h),一个正根):质心一旦偏离支撑点,就会越偏越快。这正是"走路"的动力学本质:不是把摆"稳住",而是利用它的发散趋势,每一步提前"换一个支撑点"。
ZMP(零力矩点, Zero Moment Point)由 Vukobratović 于 1968 年提出,是步态判稳的核心概念:它是地面反作用力合力(含摩擦力)的作用点。直觉上可以这样理解——足底受到的压力分布可以等效为一个合力,这个合力在地面上的作用点就是 ZMP。判稳条件:只要 ZMP 落在支撑多边形内部(两脚时的凸包、单脚时的脚掌),机器人就不会绕支撑边缘翻转。ZMP 与质心的关系(水平方向)为:
静止时 ẍ=0,ZMP 就是质心投影;加速/减速时 ZMP 会"躲开"质心投影——这正是动态行走区别于静态行走的地方。ZMP 越靠近支撑区中心,稳定性裕度越大;越靠近边缘,一个扰动就可能让 ZMP 越界导致倾倒。
基于 ZMP 的经典规划是 Kajita 的预览控制(Preview Control):不只盯着当前时刻,而是把未来约 1.6 秒的 ZMP 参考轨迹"预览"进来,反解出一条平滑、可执行的质心轨迹。早期人形机器人(如本田 ASIMO)就是这类离线预览轨迹 + 在线反馈修正的代表。
捕获点(Capture Point, Pratt 等 2006)回答"被推了一下怎么办":地面上存在这样一点,只要把支撑点(落脚点)移到那里,机器人就能完全停下来(捕获自身动量)。对 LIPM 而言它有一个漂亮公式:
直觉:质心位置 x 加上"速度导致的偏移量 ẋ/ω"。静止时 CP = 质心投影;速度越大,CP 越靠前。CP 在 LIPM 中就是那个"发散分量"(数学上称 Divergent Component of Motion, DCM)——它不稳定、会发散,但正因为如此,它把复杂的平衡问题变成了简单的"跟踪 CP"问题。
于是抗扰动策略就变得很直观:被推一下后,先算出新的 CP——
步态相位(gait phase)指一个步态周期内的阶段划分:双腿支撑(起步、终止)→ 单腿支撑(另一腿摆动:抬脚→摆腿→落地缓冲)→ 再次双腿支撑。步行速度 = 步长 × 步频;要快跑就加大步长、提高步频、缩短甚至消除双支撑相。
给定:质心高度 h = 0.8 m,当前质心 x = 0.02 m、速度 ẋ = 0.45 m/s(被向右推了一下);支撑脚踩在原点,单脚支撑区前向半径约 0.12 m(足长 ~0.24 m 的一半)。
第 1 步:算 LIPM 自然频率。ω = √(g/h) = √(9.81/0.8) = √12.26 ≈ 3.50 rad/s。
第 2 步:算捕获点。CP = x + ẋ/ω = 0.02 + 0.45/3.50 = 0.02 + 0.129 ≈ 0.149 m。
第 3 步:判断——CP 0.149 m 已超出支撑区半径 0.12 m 达 0.029 m,踝策略(靠脚踝力矩把 ZMP 挪到边缘)已无法把发散分量拉回来 → 触发迈步策略。不干预会多快倒?支撑点在原点时 CP 满足 ξ̇ = ω·ξ,即 ξ(t) = 0.149·e^(3.50t) 指数发散,约 0.20 s 后翻倍到 0.30 m(ln(0.30/0.149)/3.50 ≈ 0.20)——这就是"迈步决策窗口只有 ~0.2 s"的定量出处,也解释了为什么步态控制器要跑在 100~500 Hz 这一层。
第 4 步:选落点并复核新 CP。落点取 CP 投影略前方 0.16 m(比 CP 多迈 1 cm,留一点向前的调整预算)。落步瞬间 CP 不突变(它由质心位置和速度决定,不会因为脚落地就跳变),新支撑中心在 0.16 m,CP 相对新支撑中心的偏移 = 0.149 − 0.16 = −0.011 m,即 CP 落在新支撑中心后方 1.1 cm 处——回到 0.12 m 半径以内,稳定裕度从 −0.029 m 恢复到 0.12 − 0.011 = 0.109 m,机器人被"接住"。此后质心在 0.16 m 支撑点下做新的 LIPM 摆动,控制器继续监视 CP 等待下一步。
| 对比项 | 离线步态(经典) | 在线调整(现代) |
|---|---|---|
| 生成时机 | 事先一次性算好整段轨迹 | 运行中每周期重规划 |
| 对扰动 | 无感知,靠底层反馈硬扛 | 实时修正落脚点/步频/相位 |
| 对地形 | 只适合平坦地面 | 可结合感知适应台阶、斜坡 |
| 代表 | 预览控制 + 轨迹跟随 | MPC 滚动优化、CP/DCM 反馈迈步 |
| 代价 | 实现简单、实时性压力小 | 需要实时求解器 + 状态估计 |
双足直立(正面视角):拖动"侧移摆幅"与"摆动频率",看 CoM(重心)与 ZMP(零力矩点)如何联动。核心关系(线性倒立摆 LIPM):
摆得越快,惯性项越大,ZMP 摆幅超过 CoM;一旦 ZMP 跑出脚掌支撑范围(红色区域),机器人就倾覆——这正是步态规划要"压住 ZMP"的原因。
WBC(Whole-Body Control)的基本思路是:不把每个关节当作独立的 PID 回路,而是把机器人当作一个整体,把"想让机器人做什么"表达成一系列任务(task)——质心加速度、身体姿态、手的位置、脚的落点、角动量……然后在一个统一的优化问题里,同时解出所有关节力矩和接触力。任务按优先级分层:
| 优先级 | 任务层 | 内容 |
|---|---|---|
| 最高 | 接触与动力学约束 | 支撑脚不滑动、不穿透地面、接触力落在摩擦锥内;动力学方程必须严格满足 |
| 高 | 平衡任务 | 质心加速度、姿态角、角动量跟踪——保证不倒 |
| 中 | 末端任务 | 摆动脚轨迹、手的位置/朝向、躯干高度等(用户真正想做的事) |
| 低 | 零空间/正则项 | 关节角速度最小化、避奇异、避免无效内部运动 |
分层实现的两种方式:硬优先级(严格分层,高优先级任务在低优先级任务的零空间中执行,即任务空间分层 WBC,Sentis & Khatib 经典框架)与软优先级(把所有任务加权放进一个 QP,权重越大越优先)。工程上常用软优先级,因为实现简单、数值稳定、可以通过权重连续调节"平衡 vs 任务"的取舍。
WBC 的核心是全身逆动力学:已知期望的任务加速度,反解所需的关节力矩。刚体动力学方程:
其中 M 为惯量矩阵,C 为科氏/离心项,G 为重力项,τ 为关节力矩,Jᵢᵀfᵢ 为第 i 个接触点的接触力(通过雅可比映射到关节空间)。注意 τ 和 fᵢ 都是未知数——所以 WBC 把"力矩"和"接触力"放在同一个优化里解,保证解出来的力矩真的能把脚"压"在地面上且不打滑。
于是每个控制周期(典型 500~1000Hz)求解一个二次规划(QP):
QP 是凸优化,有成熟的高速求解器(如 OSQP、qpOASES、HPIPM),在毫秒甚至亚毫秒级可解——这就是为什么 WBC 能跑到 1kHz 的实时率。解出的 τ 直接下发给关节,接触力 f 用于校核和状态估计。
| 对比项 | 每关节独立 PID | 全身控制 WBC |
|---|---|---|
| 控制对象 | 各关节角度/速度 | 全身任务:质心、姿态、角动量、末端 |
| 耦合处理 | 不建模,靠高增益硬扛(增益大了互相打架) | 统一动力学建模,显式解耦 |
| 接触力 | 不显式考虑 | 与力矩联合优化,保证接触可行 |
| 扰动响应 | 被扰动后才反应(反馈) | 模型预测 + 任务重分配(前馈+反馈) |
| 调参 | 每个关节一组增益,几十个参数 | 少量任务权重,物理意义明确 |
| 算力 | 关节 MCU 即可 | 需要躯干级高性能控制器(工控机/SoC) |
步态是一个"规划 + 控制"耦合的问题:落点选在哪、步频多快、质心怎么走,本身就是决策。PID/单步反馈只能"事后反应",而 MPC(模型预测控制)让控制器"向前看":每一周期用一个模型预测未来 1~2 秒的系统演化,在当前时刻解出一个最优控制序列,只执行第一步,然后滚动重解。预测 + 滚动 = 既有前瞻性,又能持续用最新状态修正,天然对扰动和模型误差鲁棒。
全动力学模型(几十个自由度)做滚动优化太慢。工程界的经典妥协是 单刚体模型(Single Rigid Body Model, SRBM):把整个机器人看成一块具有质量 m、惯量 I 的刚体,几十个关节全被"折叠"掉,只保留质心的平动和本体姿态的转动,并假设"关节执行足够快、内部动量足够小、关节质量可忽略"。动力学只剩两条:
状态只有十几维(位置、姿态、线速度、角速度、接触状态),却抓住了人形平衡最本质的东西:接触力怎么分配。SRBM 最早在 MIT 四足(Cheetah)上大放异彩,后来被广泛移植到人形机器人(H1、Talos、Atlas 研究平台等)的步态 MPC 中。
MPC 每周期(典型 30~100Hz)求解一个时域最优控制问题:状态 xk+1 = f(xk, uk),决策变量包括质心轨迹、身体姿态、未来每一步的落脚点和步态时序。解出来后只执行第一个控制量,下一周期用最新的状态估计重新求解。正因为落点本身是决策变量,MPC 具备"推一下自动迈一步"的能力——这就是它比固定步态规划鲁棒的根本原因。
| 层级 | 典型频率 | 模型 | 输出 | 运行位置 |
|---|---|---|---|---|
| MPC 步态层 | 30~100Hz | SRBM 简化模型 | 期望质心/姿态/落点轨迹 | 躯干控制器 |
| WBC 全身层 | 500~1000Hz | 全身动力学 + QP | 各关节期望力矩 τ | 躯干控制器 |
| 关节执行层 | 1~10kHz | 单关节(电流/速度/位置环) | 逆变器 PWM | 关节 MCU(你的 Hdrive) |
强化学习(RL)路线不手工建模、不手工调 PID:定义好奖励函数(速度、姿态、能耗、平滑性、不摔倒……),在仿真里让一个策略网络(通常是 PPO 训练的 MLP)通过试错学会"给每个关节多大的目标位置/力矩"。由于在真实机器人上试错太危险、太慢,工程核心是 sim-to-real:在大规模并行仿真(Isaac Gym / MuJoCo)里训练数千个并行环境,再用领域随机化(随机化质量、摩擦、延迟、噪声)让策略在真实世界也稳健。
| 对比项 | 基于模型(MPC / WBC) | 强化学习(RL) |
|---|---|---|
| 动力学知识 | 显式建模,可解释、可分析 | 隐式从数据中学,黑盒 |
| 接触/复杂地形 | 需要显式建模与调参,困难 | 自动隐式学习,擅长复杂接触 |
| 开发成本 | 动力学建模 + 求解器 + 调权重 | 奖励设计 + 大规模并行仿真训练 |
| 运行时算力 | 每周期解优化,算力高 | 部署是神经网络前向,非常轻(50~100Hz) |
| 可解释/安全性 | 约束可审计,便于保证安全 | 难审计,需大量域随机化与测试 |
| 当前主力场景 | 实验室与高端平台(研究、验证) | 产业落地(宇树、Figure 等商业产品) |
| 层级 | 频率 | 说明 |
|---|---|---|
| 任务规划 / 感知 | 10~50Hz | 视觉、导航、任务决策,慢而粗 |
| 步态 / RL 策略 | 50~100Hz | 落点、步频、质心目标(RL 前向推理) |
| MPC | 30~100Hz | 滚动优化,时域 1~2s |
| WBC | 500~1000Hz | 全身 QP 逆动力学 |
| 关节环(速度/位置) | 1~5kHz | 关节控制器(位置/力矩环) |
| 电流环(FOC) | 10~40kHz | 电机电流闭环,由关节 MCU 承担 |
这个"金字塔"决定了通信总线的选型:WBC 每毫秒要给 30+ 个关节发一次力矩指令——这正是上一页(EtherCAT 125μs~1ms 周期、SPE 高带宽)存在的根本原因。你的 RS485 轮询架构在单关节调试时够用,一旦接入全身系统,总线延迟和抖动会直接成为上层算法的瓶颈。
MPC 和 WBC 都需要"全身状态":浮动基座的位置/姿态/速度、各关节角、接触力。工程上这些都无法直接测到——用 IMU(角速度/加速度)+ 关节编码器 + 足底力传感器 做融合估计(扩展卡尔曼滤波 EKF、互补滤波、滑动窗口估计)。其中"浮动基座位姿"尤其难:没有固定参考系,全靠积分+观测校正。状态估计误差是全身控制工程的第一大坑——模型再准、QP 解得再快,状态估错 1 厘米、1 度,平衡任务都会失真。
再好的算法也会遇到极端扰动,所以量产人形机器人必须有完整的摔倒保护链条:
| 项目 | 出身/定位 | 技术栈 | 难度 | 适合用途 |
|---|---|---|---|---|
| OCS2 (github.com/leggedrobotics-usp/ocs2) |
苏黎世联邦理工 RSL + 马普所,"Optimal Control for Switched Systems" | C++/ROS2,MPC + HPIPM 求解器,切换系统(接触模式)最优控制 | ★★★★ 高 | 研究人形/四足 MPC 步态、接触切换;四足 ANYmal 与多个人形示例 |
| Crocoddyl (github.com/loco-3d/crocoddyl) |
法国 LAAS-CNRS,"接触-丰富轨迹优化" | Python/C++,差分动态规划(DDP/FDDP) | ★★★★ 高 | 全身运动规划、多接触动作(人形 Talos、四足 Solo);论文复现首选 |
| Drake (github.com/RobotLocomotion/drake) |
MIT/CMU/丰田研究院联合,"基于模型的机器人设计验证" | Python/MATLAB/C++,自带 ZMP 规划器与 Atlas 平衡/步行示例 | ★★★ 中 | 学 ZMP 预览控制与全身控制的教科书级代码;文档最全、最友好 |
| unitree_rl_gym (github.com/unitreerobotics/unitree_rl_gym) |
宇树官方,"RL 训练-仿真-真机部署"全家桶 | Isaac Gym + MuJoCo,PPO/legged_gym 架构,支持 H1/G1/Go2 | ★★★ 中 | 入门 RL sim-to-real 全流程;配真机教程,产业路线首选 |
| OpenLoong-Dyn-Control (github.com/loongOpen/OpenLoong-Dyn-Control) |
国产开源人形机器人"青龙"的全身动力学控制软件包 | Python/C++,全身动力学控制(动力学建模、控制与仿真) | ★★★★ 高 | 国产全链路参考:从 URDF/动力学到全身控制 |
| tosr_ts | 社区盘点中与 OCS2/Crocoddyl 并列出现的人形控制 MPC 相关仓库(见参考来源的视频盘点) | — | ★ 待核实 | 该名称在主流代码平台检索结果极少、公开资料不足,建议以官方仓库为准,谨慎参考 |