论文: MotionWAM: Towards Foundation World Action Models for Real-Time Humanoid Loco-Manipulation
作者: Jia Zheng, Teli Ma, Yudong Fan, Zifan Wang, Shuo Yang, Junwei Liang
机构: Mondo Robotics / HKUST(GZ) / HKUST
arXiv: 2606.09215v1 cs.RO
一句话总结:把视频生成模型"脑内想象的中间产物"(而不是完整生成的视频)直接喂给动作策略,配合统一全身动作空间,让人形机器人一边走路一边干活还能用脚踢球------而且实时,4.9 Hz。
一、介绍
1.1 问题背景:人形机器人的"上下半身精神分裂"
人形 loco-manipulation(移动操作)要求机器人一边在人尺度环境里移动,一边协调平衡、行走、伸手够物和物体交互。目前几乎所有自主人形系统都采用分层范式(hierarchical paradigm):上层操作策略只控制上半身,输出精细的关节目标;下层控制器只跟踪粗糙的底座指令(速度、躯干高度、朝向)。
这套架构有个致命问题:上下半身活在两个不一致的动作空间里。上半身拿的是关节级的"高清指令",下半身拿的只是底座级的"模糊指令"。腿被降格成"平衡保持器",只能走路,不能干活。你想让机器人踩一下踏板、踢一脚球?对不起,下层的动作词表里根本没有"踢"这个字。
用视频编码的话打个比方:这就像你给上半身分配了 intra 块的精细编码,却给下半身只留了个 skip 模式------腿这块"宏块"永远是"跟上一帧一样",任何需要腿主动参与的内容(任务驱动的足部交互)都编码不出来。
1.2 WAM 的困境:大脑很好,但嘴太快
World Action Model(世界动作模型,WAM)是另一条路线:把视频生成模型(世界模型)的动力学先验耦合进策略,让策略"先想象未来画面,再反推动作"。这比纯图文预训练的 VLA 多了一个内在的时间演化模型和接触物理直觉。
但 WAM 有个工程上的死穴:对高维视频-动作 latent 做迭代去噪太慢了。现有 WAM 连固定基座的桌面机械臂都跑不到实时,更别提闭环平衡都岌岌可危的人形机器人了。
于是论文提出核心问题:能不能把 WAM 的丰富动力学先验,以实时速率、统一 latent 空间的形式,部署到全身人形 loco-manipulation 上?
1.3 MotionWAM 的答案
MotionWAM 给出三个关键设计:
- 不生成完整未来视频,只"偷看"去噪中间特征。Video DiT 在纯噪声端(τf≈1)做一次前向传播,用 forward hook 截获激活值喂给 Motion DiT------一次前向,不迭代去噪,这就是实时的秘密。
- 统一全身运动 latent,替代上下半身解耦。一个动作空间同时覆盖行走、躯干、高度调节、足部交互、手部操作,腿终于有了任务驱动的动作词表。
- 三阶段训练框架:自我中心视频预训练 → 跨本体动作后训练 → 全身遥操作微调,让视频分支和动作分支"轮流专精"而不是从零联合训练。
效果:9 个真实 Unitree G1 任务上整体成功率 76.1%,比同数据微调的最强 VLA 基线 GR00T-N1.7(43.9%)高出 32 个百分点;推理频率 4.9 Hz,是同为世界模型路线的 Cosmos Policy(0.7 Hz)的 7 倍。
二、原理
2.1 范式:predict-video-dynamics-then-invert
传统 VLA 学的是直接映射 πθ(at∣ot,l)\pi_\theta(a_t \mid o_t, l)πθ(at∣ot,l)------看到什么,直接出动作。MotionWAM 走的是"先预测视频动力学,再反演"的两步走:
- 视频世界模型先内部演算"画面接下来会怎么变";
- 动作分支从这个演算过程的中间隐藏状态 里反推出全身运动 latent mtm_tmt。
这里的精髓在于:不是等未来帧完全去噪出来再反推,而是在去噪轨迹的早期就截取特征。
继续用编解码类比:这就像解码器不需要完整重建整帧才能做决策------你只需要码流里早期到达的低频/结构信息(相当于 τf≈1 时的"粗糙走向"),就足以判断"场景大概要往哪去",没必要把每一帧都精细重建完再行动。完整迭代去噪相当于把 GOP 里每一帧都做完全量重建才输出一个动作,延迟直接爆表。
2.2 双 DiT 架构
MotionWAM 由两个 Diffusion Transformer 组成:
Video DiT(世界模型分支) :初始化自 NVIDIA 的 Cosmos-Predict2.5-2B,包含因果时空 VAE + flow-matching DiT,语言条件来自 Cosmos-Reason1 的文本嵌入。自我中心条件帧 oto_tot 和未来帧 ot+1o_{t+1}ot+1 被 VAE 压成 latent zt0,zt+10z^0_t, z^0_{t+1}zt0,zt+10。关键操作:在单个 transformer block 上装 forward hook,在固定 flow 时刻 τf≈1(纯噪声端)截获激活:
htτf=Hvθvideo(zt+1τf,τf∣zt0,l)h^{\tau_f}_t = \mathcal{H}\leftv\^{video}_\\theta\\left(z\^{\\tau_f}_{t+1}, \\tau_f \\mid z\^0_t, l\\right)\\righthtτf=Hvθvideo(zt+1τf,τf∣zt0,l)
τf≈1 意味着未来 latent 基本就是高斯噪声,Video DiT 处于**"one-shot imagination"(单次想象)模式**:给定干净的条件帧 + 纯噪声未来,一次前向就产出编码了"场景即将去向"的激活值,然后直接弃掉,根本不去噪那些帧。这一次前向就是 MotionWAM 能实时闭环的全部代价。
Motion DiT(动作分支) :DiT-B 配置(hidden size 2560),通过交错的 self/cross-attention 消费 htτfh^{\tau_f}_thtτf,同时吃本体感知状态 ptp_tpt 和带噪的全身运动 latent token,输出速度场,积分后得到 mtm_tmt。多本体预训练时用"共享 Motion DiT 主干 + 每本体独立的输入/输出 projector"包裹,部署时复用主干、只挂 G1 的 projector。
2.3 统一全身运动 latent:让腿"会说话"
这是整篇论文最有想法的设计之一。mt=(mtcont,kt)m_t = (m^{cont}_t, k_t)mt=(mtcont,kt) 建立在 SONIC(一个通用全身控制器)之上:
- 离散部分 ktk_tkt :SONIC 的共享运动 latent,用 Finite Scalar Quantization(FSQ)瓶颈化------2 个 token、每个 32 级,所以 kt∈{−1,−1516,...,1}64k_t \in \{-1, -\frac{15}{16}, \ldots, 1\}^{64}kt∈{−1,−1615,...,1}64 是一个 64 维离散化向量,一张"码本"同时编码行走、躯干、高度、足部交互意图。相当于用 2×5 bit = 10 bit 的索引去查一个覆盖全身行为的运动字典。
- 连续部分 mtcontm^{cont}_tmtcont:SONIC 不覆盖的灵巧通道------左右夹爪或灵巧手指令,直接驱动手部。
对比一下:传统分层范式的动作空间是"上半身关节位置 + 下半身底座指令"两套不兼容的码表;MotionWAM 是一张统一码表,腿终于能表达"我要踩那个踏板""我要踢球"这种任务级语义,而不只是"保持平衡往前走"。
离散 token 的连续化处理 很巧妙:Stage 3 里不给离散 token 单独搞分类头,而是让一个标量 k~t∈R\tilde{k}_t \in \mathbb{R}k~t∈R 待在 mtm_tmt 里存 token 索引 kt∈{0,...,K−1}k_t \in \{0, \ldots, K-1\}kt∈{0,...,K−1},整个 latent 在同一个 flow-matching 目标下回归,推理时最近邻取整恢复离散索引,再交给 SONIC 解码成关节指令。整条链路一种损失函数搞定------像把所有语法统一进一个熵编码器,不给离散符号开特例。
2.4 三阶段训练框架:先学看,再学动,最后学干活
三阶段的数据是"越来越窄,但动作接地越来越强":
Stage 1 --- 自我中心视频预训练 。只用 Lvideo\mathcal{L}_{video}Lvideo,在约 2136 小时 自我中心人类视频 + 人形机器人视频上单独训练 Video DiT。关键洞察:这一阶段的瓶颈是自我中心视觉动力学,不是动作多样性。用便宜的无动作标注视频把主干"喂大",让它吸收规模而不被小得多的动作标注数据池卡脖子,产出隐藏状态编码了合理自我中心未来的动力学先验。
Stage 2 --- 跨本体动作后训练 。挂上 Motion DiT,在异构的 Unitree G1 数据(不同末端执行器、不同动作标注格式)上联合训练。异构动作向量右填充到最大动作维度 66 并附带有效性 mask ,让不同动作布局共享同一个 DiT 主干。为了防止动作信号一来就把动力学先验冲掉,保留视频目标作为表示正则化器 :L=Lmotion+Lvideo\mathcal{L} = \mathcal{L}{motion} + \mathcal{L}{video}L=Lmotion+Lvideo。类比:视频损失像"参考帧持续刷新",防止动作微调把世界模型的知识灾难性遗忘掉。
Stage 3 --- 全身遥操作微调。在 9 个真实任务上各采集 200 条遥操作全身演示(PICO VR 三点跟踪 → SMPL 24 关节姿态 → SONIC 重定向到 G1 的 29 自由度,50 Hz 录制),端到端微调整个网络。有了前两阶段的底子,这一步收敛很快。
VAE 和文本编码器全程冻结。
三、公式
3.1 问题形式化(Eq. 1)
ot+1∼pv(⋅∣ot,l),mt∼pa(⋅∣ot,pt,H(ot+1τv)),ot+1τv→τv→0ot+1o_{t+1} \sim p_v(\cdot \mid o_t, l), \quad m_t \sim p_a\left(\cdot \mid o_t, p_t, \mathcal{H}(o^{\tau_v}{t+1})\right), \quad o^{\tau_v}{t+1} \xrightarrow{\tau_v \to 0} o_{t+1}ot+1∼pv(⋅∣ot,l),mt∼pa(⋅∣ot,pt,H(ot+1τv)),ot+1τvτv→0 ot+1
符号逐一拆解:
- oto_tot:自我中心观测(头部相机 RGB);
- lll:语言任务目标;
- ptp_tpt:本体感知状态(关节角等);
- ot+1τvo^{\tau_v}_{t+1}ot+1τv:flow 时刻 τv\tau_vτv 的中间未来帧状态,τv→0\tau_v \to 0τv→0 时收敛到干净的未来帧;
- H(⋅)\mathcal{H}(\cdot)H(⋅):从这个生成过程中提取隐藏状态的算子;
- mtm_tmt:全身运动 latent,联合覆盖行走、躯干、高度、足部交互、手部操作,由低层运动解码器(SONIC)转成关节指令。
训练时联合建模视频-动作分布 pva(ot+1,mt∣ot,pt,l)p_{va}(o_{t+1}, m_t \mid o_t, p_t, l)pva(ot+1,mt∣ot,pt,l)。
3.2 单次前向特征截获(Eq. 2)
htτf=Hvθvideo(zt+1τf,τf∣zt0,l),zt+1τf∣τf→1∼N(0,I)h^{\tau_f}t = \mathcal{H}\leftv\^{video}_\\theta\\left(z\^{\\tau_f}_{t+1}, \\tau_f \\mid z\^0_t, l\\right)\\right, \quad z^{\tau_f}{t+1}\big|_{\tau_f \to 1} \sim \mathcal{N}(0, I)htτf=Hvθvideo(zt+1τf,τf∣zt0,l),zt+1τf τf→1∼N(0,I)
H⋅\mathcal{H}\\cdotH⋅ 在单次前向传播 中读取速度网络 vθvideov^{video}_\thetavθvideo 的隐藏状态。τf 固定在纯噪声端(τf≈1),此时"未来"就是高斯噪声------模型不重建未来,只产出"从条件帧看未来会怎样"的内部表示。这是整篇论文从"慢"到"实时"的胜负手。
3.3 Flow-matching 视频损失(Eq. 3)
设干净条件/未来帧 VAE latent 为 zt0,zt+10z^0_t, z^0_{t+1}zt0,zt+10,噪声 ϵv∼N(0,I)\epsilon_v \sim \mathcal{N}(0, I)ϵv∼N(0,I),噪声扰动后的未来 latent 为:
zt+1τv=(1−τv) zt+10+τv ϵvz^{\tau_v}{t+1} = (1 - \tau_v)\, z^0{t+1} + \tau_v\, \epsilon_vzt+1τv=(1−τv)zt+10+τvϵv
Video DiT 学习速度场逼近 ϵv−zt+10\epsilon_v - z^0_{t+1}ϵv−zt+10:
Lvideo=Eτv,zt+10,ϵv∥vθvideo(zt+1τv,τv∣zt0,l)−(ϵv−zt+10)∥22\mathcal{L}{video} = \mathbb{E}{\tau_v, z^0_{t+1}, \epsilon_v}\left\\left\\\|v\^{video}_\\theta\\left(z\^{\\tau_v}_{t+1}, \\tau_v \\mid z\^0_t, l\\right) - (\\epsilon_v - z\^0_{t+1})\\right\\\|_2\^2\\rightLvideo=Eτv,zt+10,ϵv vθvideo(zt+1τv,τv∣zt0,l)−(ϵv−zt+10) 22
这是标准的 conditional flow matching:插值路径是噪声与干净样本的线性组合,网络学"从噪声指向数据"的速度。对视频编码读者可以这么类比:τv 从 1 到 0 的去噪轨迹,类似渐进细化编码里从粗轮廓到精细纹理的重建过程,速度场就是每一步的"残差修正量"。
3.4 Flow-matching 运动损失(Eq. 4)
对干净运动 latent 块 mt0m^0_tmt0 和噪声 ϵm\epsilon_mϵm:
Lmotion=Eτa,mt0,ϵm∥vϕmotion(mtτa,τa∣htτf,pt,e)−(ϵm−mt0)∥22\mathcal{L}{motion} = \mathbb{E}{\tau_a, m^0_t, \epsilon_m}\left\\left\\\|v\^{motion}_\\phi\\left(m\^{\\tau_a}_t, \\tau_a \\mid h\^{\\tau_f}_t, p_t, e\\right) - (\\epsilon_m - m\^0_t)\\right\\\|_2\^2\\rightLmotion=Eτa,mt0,ϵm vϕmotion(mtτa,τa∣htτf,pt,e)−(ϵm−mt0) 22
条件包含三样东西:Video DiT 的截获特征 htτfh^{\tau_f}_thtτf(视觉动力学先验)、本体感知 ptp_tpt(当前身体状态)、本体索引 eee(路由到对应 projector)。推理时 Motion DiT 只需 4 个去噪步 积分出 mtm_tmt------这也是 4.9 Hz 的重要构成。
3.5 联合损失(Eq. 5)
LStage 2=Lmotion+Lvideo\mathcal{L}{Stage\,2} = \mathcal{L}{motion} + \mathcal{L}_{video}LStage2=Lmotion+Lvideo
Stage 2、Stage 3 都用这个联合目标。视频项在这里的角色是表示正则化器------防止动作梯度把 Stage 1 学到的自我中心动力学先验覆盖掉。
3.6 离散 token 的回归式解码(Eq. 6)
mt=(mtcont,k~t)→Eq.4m^t=(m^tcont,k~^t)→k^t=round(k~^t)(m^tcont,k^t)→SONICatm_t = (m^{cont}_t, \tilde{k}_t) \xrightarrow{\text{Eq.4}} \hat{m}_t = (\hat{m}^{cont}_t, \hat{\tilde{k}}_t) \xrightarrow{\hat{k}_t = \mathrm{round}(\hat{\tilde{k}}_t)} (\hat{m}^{cont}_t, \hat{k}_t) \xrightarrow{\text{SONIC}} a_tmt=(mtcont,k~t)Eq.4 m^t=(m^tcont,k~^t)k^t=round(k~^t) (m^tcont,k^t)SONIC at
离散索引作为连续标量回归,推理时四舍五入取整,SONIC 解码成全身关节指令。一个 flow-matching 目标通吃连续和离散------工程上极简。
四、图示
4.1 整体架构流水线(对应论文 Figure 3)
┌─────────────────────────────────────────────┐
│ MotionWAM 双 DiT 架构 │
└─────────────────────────────────────────────┘
自我中心 RGB o_t ──► [因果时空VAE (冻结)] ──► z0_t (条件latent)
│
语言目标 l ──► [Cosmos-Reason1 (冻结)] ──┤│
▼
┌───────────────────────────────────────┐
噪声 z~N(0,I) ─►│ Video DiT (Cosmos-Predict2.5-2B) │ ← Stage1: 2136h自我中心视频预训练
│ flow-matching, τf≈1, 单次前向 │
└──────────────┬────────────────────────┘
│ forward hook 截获 (不去噪!)
▼
h_t^τf (2048维 "想象特征")
│
│ cross-attention ▼
┌───────────────────────────────────────┐
本体感知 p_t ──►│ Motion DiT (DiT-B, hidden 2560) │ ◄── 带噪全身latent m_t^τa
本体索引 e ──►│ + 每本体输入/输出projector │
└──────────────┬────────────────────────┘
│ 4步去噪积分
▼
m_t = (m_cont, k̃_t) 统一全身latent
│ │
夹爪/灵巧手指令 round(k̃_t) → k_t (FSQ: 2 token × 32级)
│ │
└──────┬───────┘
▼
[SONIC 全身控制器]
▼
29-DoF 关节指令 a_t ──► Unitree G1
(行走+躯干+高度+足部交互+手部操作, 单一动作空间)
4.2 三阶段训练(数据越来越窄,动作接地越来越强)
Stage 1 ──────────► Stage 2 ──────────► Stage 3
视频预训练 跨本体动作后训练 全身遥操作微调
┌─────────────┐ ┌─────────────────┐ ┌──────────────────┐
│ 只训 Video DiT │ │ 挂载 Motion DiT │ │ 全网络端到端微调 │
│ 2136h 自我中心 │ ► │ 视频+动作联合FM │ ► │ 9任务×200条G1遥操作 │
│ 人类/人形视频 │ │ L=Lmotion+Lvideo │ │ L=Lmotion+Lvideo │
│ 无动作标注(便宜) │ │ 异构数据+mask填充 │ │ 统一全身motion token│
│ 128 GPU/100k步 │ │ 32 GPU/50k步 │ │ 8 GPU/15k步 │
└─────────────┘ └─────────────────┘ └──────────────────┘
冻结: VAE + 文本编码器 (全程)
4.3 解耦 vs 统一动作空间(对应论文 Figure 2)
【传统分层范式】 【MotionWAM 统一范式】
┌──────────┐ 上半身: 关节位置 ┌──────────────────────────────┐
│ 上层操作策略 │ ────────────────► │ │
└──────────┘ │ 统一全身 motion token │
┌──────────┐ 下半身: 底座指令 │ 行走|躯干|高度|足交互|手操作 │
│ 低层控制器 │ ────────────────► │ (单一动作空间) │
└──────────┘ └──────────────────────────────┘
两套码表, 空间不一致 一张码表
腿 = 只能保持平衡 腿 = 可踩踏板、可踢球(任务驱动)
4.4 关键超参数表(对应论文 Table 4 节选)
| 参数 | Stage 1 | Stage 2 | Stage 3 |
|---|---|---|---|
| Video DiT 底座 | Cosmos-Predict2.5-2B | 同左 | 同左 |
| Motion DiT | -- | DiT-B (hidden 2560) | 同左 |
| 动作维度 Da | -- | 66 | 66 |
| 状态维度 Ds | -- | 64 | 64 |
| 推理去噪步数 | -- | 4 | 4 |
| GPU 数量 | 128 | 32 | 8 |
| 训练步数 | 100,000 | 50,000 | 15,000 |
| Video DiT LR | 1e-5 | 1e-5 | 1e-5 |
| Motion DiT LR | -- | 1e-4 | 1e-4 |
| 优化器 | AdamW (0.9, 0.95) | 同左 | 同左 |
| 冻结模块 | VAE + 文本编码器 | 同左 | 同左 |
五、踩坑点
5.1 范式级限制
① 单目自我中心相机的视觉锚定脆弱性(论文承认的头号失败模式)。所有观测来自头部一个 RealSense D435i。一旦被操作物体离开视野、或头部相机视角漂移出训练分布,视觉锚定丢失,策略要么僵住要么跑出错误全身轨迹。Appendix F 的失败案例(Lift Basket、Kick Soccer)全是这个原因。这相当于编码端参考帧丢了还硬解------后面全崩。
② 只在 G1 上验证过 Stage 3。三阶段范式能否跨人形硬件迁移,论文没有验证。硬件抽象(每本体 projector + mask 填充)在 Stage 2 的多本体数据上成立,但最终微调只有 G1 一个锚点。
③ 没有严格 OOD 物体泛化实验。训练和测试物体集视觉相似度高,论文自己承认缺少"严格分布外物体"的成功率报告。"泛化到新物体"目前是未经验证的口号。
5.2 工程级陷阱
④ τf 的选择是隐含的超参赌注。τf≈1(纯噪声端)截获特征意味着 Video DiT 永远运行在"one-shot 想象"模式。这个位置的特征编码的是"模糊走向"而非"精细未来"------对全身运动够用,但如果任务需要精细的接触预测(比如插销入孔),纯噪声端的特征可能不够。论文没有消融 τf 的取值。
⑤ 离散 token 连续回归的取整边界 。k^t=round(k~^t)\hat{k}_t = \mathrm{round}(\hat{\tilde{k}}_t)k^t=round(k~^t) 假设流匹配回归出的标量足够贴近整数格点。如果回归值落在两个码字中间,取整会跳到完全不同的运动模式(比如"迈步"跳成"踢腿")。论文没有报告取整错误率。
⑥ 异构动作空间的 mask 填充。Stage 2 把所有本体动作右填充到 66 维 + mask。如果某本体的有效通道语义和 G1 错位(比如通道 0 在 A 机器人是"腰部"在 B 是"左肩"),共享主干需要自己学会语义对齐------没有显式对齐机制,全靠数据量和正则化。
⑦ 遥操作数据的重定向链路误差。Stage 3 数据链路是 PICO VR 追踪 → SMPL-24 → SONIC 重定向 → G1 29-DoF,每一环都有重定向误差。策略学到的是"重定向后的 G1 动力学",人类演示里那些 SMPL 表达不了的动作细节在这一链路中已经丢失。
⑧ Qwen3DiT 崩溃揭示的教训 :把 Video DiT 换成同等容量的 Qwen3-VL(静态图文先验),全身运动任务上成功率几乎归零。语义先验 ≠ 动力学先验------VLM 见过十万张"人踢球"的图,但没在潜空间里演化过"球被踢出去"的物理过程。想抄这条路线的同学,底座必须选视频生成模型,不能选 VLM。
六、源码拆解
论文未开源(截至写作时),以下根据论文正文、Appendix C/E 的超参和公式重构类 Python 伪代码,并标注对应出处。
6.1 核心推理循环(对应 Sec 3.2 + Eq. 2 / Eq. 6)
python
# ============ MotionWAM 推理伪代码 ============
# 对应论文 Sec 3.2 架构描述 + Eq.(2) + Eq.(6)
# 部署: RTX 4090 WebSocket 策略服务器, 闭环 4.9 Hz (A100)
# --- 模型组件 (Appendix C, Table 4) ---
vae = CausalSpatioTemporalVAE(frozen=True) # Cosmos-Predict2.5
text_enc = CosmosReason1TextEncoder(frozen=True) # 语言嵌入
video_dit = FlowMatchingDiT(pretrained="Cosmos-Predict2.5-2B",
attn="flash-attention-2",
feat_dim=2048)
motion_dit = DiT_B(hidden=2560, cross_attn_dim=2048,
norm="AdaLN", dropout=0.2,
action_dim=66, state_dim=64)
g1_proj = EmbodimentProjector(tag="unitree_g1") # 每本体 projector
sonic = SONICWholeBodyController() # 低层解码器
# --- 关键: 在单个 transformer block 上装 forward hook ---
feature_bucket = {}
def hook_fn(module, input, output):
feature_bucket["h"] = output # 只截获, 不干预
video_dit.blocks[K].register_forward_hook(hook_fn)
TAU_F = 1.0 # 固定在纯噪声端 (one-shot imagination)
TAU_F_COND = 1e-4 # 条件帧 timestep (Table 4: 1x10^-4)
N_MOTION_STEPS = 4 # Motion DiT 推理去噪步数
def act(o_t_rgb, p_t, language, proprio_history=None):
# 1. 编码条件 (单次, VAE/文本编码器全程冻结)
z0_t = vae.encode(o_t_rgb) # 条件帧 latent
l_emb = text_enc(language)
# 2. Video DiT 单次前向: "想象"未来 (Eq.2)
# 未来 latent 就是纯噪声, 不做任何去噪迭代!
z_future_noise = torch.randn_like(z0_t)
_ = video_dit(z_future_noise, tau=TAU_F,
cond=z0_t, cond_tau=TAU_F_COND, text=l_emb)
h_tf = feature_bucket["h"] # 2048维想象特征
# 3. Motion DiT flow-matching 积分 (Eq.4, 4步)
m_tau = torch.randn(Da) # Da=66, 含连续通道+离散标量k̃
for tau in linspace(1.0, 0.0, N_MOTION_STEPS):
v = motion_dit(g1_proj.in(m_tau), tau,
cross_attn=h_tf,
state=p_t, emb_idx=G1_ID)
m_tau = m_tau + v * (1.0 / N_MOTION_STEPS) # 欧拉积分
m_hat = g1_proj.out(m_tau)
# 4. 解码 (Eq.6): 连续通道 + 离散索引取整
m_cont, k_tilde = m_hat[:-1], m_hat[-1]
k = round(k_tilde) # 最近邻取整恢复 SONIC token 索引
a_t = sonic.decode(m_cont, k) # → G1 29-DoF 全身关节指令
return a_t # 行走+躯干+高度+足+手, 一锅端
6.2 三阶段训练(对应 Sec 3.3 + Eq. 3/4/5 + Appendix C/E)
python
# ============ 三阶段训练伪代码 ============
def flow_matching_loss(net, x0, cond_args):
"""Eq.(3)/(4) 通用的条件 flow matching"""
tau = torch.rand(())
eps = torch.randn_like(x0)
x_tau = (1 - tau) * x0 + tau * eps # 线性插值路径
v_pred = net(x_tau, tau, *cond_args)
return F.mse_loss(v_pred, eps - x0) # 学习速度场 → eps - x0
# ---------- Stage 1: 自我中心视频预训练 (128 GPU, 100k steps, lr 1e-5) ----------
for o_t, o_future, lang in egocentric_video_loader: # 2136h, 无动作标注
z0_t, z0_f = vae.encode(o_t), vae.encode(o_future) # 动作标签直接忽略
loss = flow_matching_loss(video_dit, z0_f, (z0_t, text_enc(lang)))
loss.backward() # 只更新 Video DiT; VAE/文本编码器冻结
# ---------- Stage 2: 跨本体动作后训练 (32 GPU, 50k steps) ----------
for (o_t, lang, p_t, a_raw, mask, emb_id) in heterogeneous_g1_mixture:
# 异构动作右填充到66维 + 有效性mask (Appendix E)
a_padded = pad_to_66(a_raw, mask)
h_tf = video_forward_hook_once(o_t, lang) # Eq.2 截获
l_motion = flow_matching_loss(motion_dit, a_padded,
(h_tf, p_t, emb_id))
l_video = flow_matching_loss(video_dit, vae.encode(o_t.future),
(vae.encode(o_t), text_enc(lang)))
(l_motion + l_video).backward() # Eq.(5): 视频项 = 表示正则化器
# 共享 Motion DiT 主干 + 每本体输入/输出 projector
# ---------- Stage 3: 全身遥操作微调 (8 GPU, 15k steps) ----------
# 数据: 9任务 × 200条, PICO VR→SMPL-24→SONIC 重定向, 50Hz LeRobot格式
for (o_t, lang, p_t, m_star) in teleop_g1_loader: # m_star 含离散索引k
h_tf = video_forward_hook_once(o_t, lang)
l_motion = flow_matching_loss(motion_dit, m_star, (h_tf, p_t, G1_ID))
l_video = video_loss(o_t, lang) # 联合目标保持不变
(l_motion + l_video).backward() # 全网络端到端
6.3 数据配比细节(Appendix E, Table 5)
Stage 1 的 2136 小时按三大域加权:人类自我中心 30% / G1 级人形 50% / 其他真实机器人 20% ,域内每个数据源按 #episodes\sqrt{\#episodes}#episodes 分配权重(防止单一数据集霸占预算):
| 数据源 | 本体 | 权重 |
|---|---|---|
| EgoDex | 人类(自我中心) | 0.300 |
| GR00T-X-Embodiment-Sim (GR1) | Fourier GR1(仿真) | 0.255 |
| RoboCOIN (G1edu/Galbot/Leju) | 多本体 | 0.080 |
| GR00T-Teleop-GR1-Robot | Fourier GR1(真实) | 0.071 |
| Humanoid-Everyday | Unitree G1 | 0.047 |
| UnifoLM-WBT | Unitree G1 (WBT) | 0.023 |
| PSI-Real / PSI-Simple | Unitree G1 | 0.013 / 0.011 |
| RoboCOIN (R1 Lite + AIDA-L) | 其他机器人 | 0.200 |
注意最大的两个来源:一个纯人类自我中心数据集(EgoDex),一个仿真人形数据(GR1 sim)。便宜的数据占大头,昂贵的真机 G1 数据只做调味------这个配比本身就是对"视觉动力学是瓶颈,动作多样性不是"这一判断的工程注脚。
七、效果对比
7.1 主实验:9 个真实任务成功率(20 trials/任务,Figure 5)
所有方法在相同的 Stage 3 数据上微调、通过相同的 SONIC 接口输出动作,唯一变量是视觉先验来源:
| 任务 | MotionWAM | GR00T-N1.7 | π0.5 | Qwen3DiT | DP / ACT |
|---|---|---|---|---|---|
| PnP Bottle | 95 | 85 | ~65 | 35 | ~10 / 0 |
| Kick Soccer | 60 | 20 | 10 | 0 | 0 / 0 |
| Retrieve Item | 90 | 50 | 25 | 0 | 0 / 0 |
| Load Cart | 75 | 35 | 15 | 0 | 0 / 0 |
| Toss Garbage | 45 | 25 | ~15 | 0 | 0 / 0 |
| Lift Basket | 80 | 55 | 15 | 0 | 0 / 0 |
| Stock Shelves | 70 | 50 | ~5 | 0 | 0 / 0 |
| Wipe Board | 100 | 55 | 20 | 0 | 0 / 0 |
| Do Laundry | 75 | 45 | 20 | 0 | 0 / 0 |
| 平均 | 76.1 | 43.9 | <20 | ≈0(运动任务) | 崩溃 |
(个别基线柱状图数值从 Figure 5 读取,存在 ±5% 读图误差;平均值为论文正文给出的精确数。)
三个关键读数:
- MotionWAM 九个任务全胜,整体从 43.9% → 76.1%,绝对提升 32 个百分点。
- 差距最大的全是"全身协调"任务:Wipe Board +45%、Kick Soccer / Load Cart / Retrieve Item 各 +40%、Do Laundry +30%。统一 motion latent 能表达"用脚""用腰",而解耦范式根本没这些动作------不是学得好不好,是词表里压根没这个词。
- Qwen3DiT 全线崩溃 (运动重任务≈0),π0.5 整体不到 20%:静态图文语义先验在闭环物理人形控制面前基本无效。赢的不是更大的语言模型,是视频动力学先验。
7.2 三阶段消融(Table 1,5 个代表性任务)
| 变体 | Stage 1 | Stage 2 | Lift Basket | Retrieve Item | Load Cart | Toss Garbage | Kick Soccer | 平均 |
|---|---|---|---|---|---|---|---|---|
| w/o Stage 2 | ✓ | -- | 65 | 45 | 30 | 30 | 40 | 42.0 |
| w/o Stage 1 | -- | ✓ | 70 | 75 | 60 | 35 | 55 | 59.0 |
| Full | ✓ | ✓ | 80 | 90 | 75 | 45 | 60 | 70.0 |
去掉 Stage 2 掉 28 个点(42.0),去掉 Stage 1 掉 11 个点(59.0)。跨本体动作接地(Stage 2)比视频预训练(Stage 1)更不可缺------没有动作接地,再好的视觉先验也落不了地;两者互补,缺一不可。这验证了"视频分支和动作分支轮流专精,而不是从零联合优化"的核心设计。
7.3 推理频率(Table 2,单张 A100,chunk 级发射速率)
| 模型 | 可训练参数 | 频率 |
|---|---|---|
| GR00T-N1.7 | 1.6B | 6.5 Hz |
| Qwen3DiT | 2.3B | 9.0 Hz |
| Cosmos Policy | 2.0B | 0.7 Hz |
| MotionWAM | 2.5B | 4.9 Hz |
最惊人的对比是与 Cosmos Policy:同为世界模型路线、参数量相当,MotionWAM 快 7 倍 。原因一句话:Cosmos Policy 要先把未来视频迭代去噪完 才能出动作,MotionWAM 在纯噪声端一次前向就把中间特征读走了。2.5B 参数下还有 4.9 Hz,够闭环人形平衡控制用(在 RTX 4090 工作站上以 WebSocket 策略服务器形式部署)。
最值得记住的一个数字:Wipe Board 100% vs GR00T-N1.7 的 55%------擦白板需要大面积躯干+手臂协同,恰是统一动作空间对解耦范式的"降维打击"。
八、总结
MotionWAM 的核心贡献可以压缩成两句话:
- "偷看"代替"生成" :世界模型的动力学先验不需要靠完整去噪未来视频来兑现------在去噪轨迹的纯噪声端做一次前向、截获中间激活喂给动作分支,就能拿到 80% 的先验收益和 7 倍的推理加速。这本质上是一个"信息压缩"的洞察:策略需要的不是未来画面,而是未来画面的低维摘要。
- 统一动作空间解放下半身 :把全身行为编码进一张 FSQ 量化 + 连续通道的统一 latent 码表,腿从"平衡保持器"升级为"任务执行器",踢球、踩踏板这些解耦范式原理上做不出的行为成为可能。
边界也很清楚:单目自我中心的视觉锚定脆弱、只在 G1 上闭环验证过、OOD 泛化未测、离散 token 取整和 τf 选择这些设计点没有消融。2136 小时视频预训练 + 128 张 GPU 的 Stage 1 也提示这个范式的入场券不便宜。
联系更大的图景:MotionWAM 与 DiT4DiT、Cosmos Policy、WorldVLA 一起,指向"视频基础模型 → 具身策略"这条正在快速收敛的路线。对做视频编码的我们来说,里面值得琢磨的技术迁移点其实不少:VAE latent 空间的时序压缩、flow matching 的渐进式轨迹(本质也是一套"由粗到细"的残差修正框架)、以及"用中间表示而不是终端输出"这个在编解码器设计里再熟悉不过的思想------只不过这次,"解码器"是一台会踢球的人形机器人。
参考:arXiv:2606.09215v1 cs.RO, 2026-06-08。作者equal contribution: Jia Zheng, Teli Ma (Mondo Robotics / HKUST-GZ)。