转载自公众号:敢敢AUTOHUB
0. 简介
机器人世界模型这两年的热度很高,但真正难的问题一直没有变:语言模型可以从网页里学语言,图像模型可以从图片里学视觉,机器人却不能只靠互联网学会执行动作。机器人需要同步拿到图像、关节状态、末端位姿、夹爪状态、控制指令,甚至接触和失败过程;这些数据必须在真实物理交互里采集。
τ0-WM 的意义就在这里:它不是又做了一个"看图输出动作"的策略模型,而是把约 27.3K 小时异构交互数据放进同一个视频-动作世界模型里,让机器人在执行前先生成候选动作、推演未来、评估任务进度,再决定是否修正动作。
上图展示了 τ0-WM 的核心路径:数据端有真实机器人遥操作、UMI 风格演示和第一视角人类视频;模型端有 视频-动作模型(Video Action Model, VAM) 和 动作条件视频模拟器(Action-Conditioned Video Simulator, ACVS);部署端则通过 测试时计算(Test-Time Computation, TTC) 在候选动作之间做选择。换句话说,τ0-WM 关心的不是单次动作预测有多快,而是在可接受的延迟内,让机器人把"动作会造成什么后果"也纳入决策。
1. 背景与动机
1.1 反应式策略的局限
过去很多机器人策略可以概括为一条短路径:当前图像、语言指令和机器人状态输入网络,网络直接输出动作。这种 反应式策略(Reactive Policy) 在抓取、放置、推拉等短程任务上已经很有效,但它的弱点也很明显:它对未来后果的建模通常藏在隐式特征里,模型并不显式回答"如果我这样推,物体会不会碰到旁边的东西""如果夹爪现在闭合,目标是否已经到位""如果软管角度偏了一点,后面是否还能接上水龙头"。在接触密集、几何约束强、遮挡严重的任务里,一步动作错了,后续修正空间会迅速缩小。
τ0-WM 的基本判断是,机器人操纵不是单纯的动作回归,而是带物理后果的不确定决策。一个真正有用的世界模型,需要同时连接三个量:当前观测、候选动作、未来结果。VAM 负责从当前观测中提出动作,ACVS 负责估计这个动作会把世界带到哪里,TTC 负责在部署时把算力花在动作选择上。这个思路和早期模型预测控制有相似之处,但 τ0-WM 的载体已经换成了大规模视频扩散骨干和连续动作 chunk。
1.2 行业路线对比
从行业路线看,τ0-WM 给出的答案更像是一道配比题。DreamDojo 这类路线强调海量第一视角人类视频,试图从观看中学到物理先验;HumanEgo 这类路线强调表征对齐,用较少的人类第一视角视频把人手-物体关系转成机器人可利用的表达;τ0-WM 则把真机数据放回预训练中心,同时引入 UMI 和 Ego 数据补齐多样性。它并没有否定人类视频的价值,而是把人类视频放在视觉动力学分支里,而不是拿它直接污染动作分支。
2. 数据配方:三类数据分别教什么
τ0-WM 的数据策略是整个系统里最值得拆开看的部分。它并不是简单地把三类数据混在一起训练,而是明确区分了每类数据能教什么、不能教什么,然后用监督掩码确保每类数据只监督它真的能负责的损失。
2.1 真实机器人遥操作数据
第一类是真实机器人遥操作数据。论文披露的数据量是 17.8K 小时,平台包括 AGIBOT-G01、ARX 机械臂和双臂 Franka,场景覆盖家庭、零售和工业任务,采集时通常有头部视角和手腕相机。它最贵,也最关键,因为动作标签来自真实机器人本体,和控制器、运动学、传感栈、部署条件直接对齐。机器人最终要执行的是末端位姿和夹爪开合,不是人手视频里的抽象意图;所以真机数据负责把世界模型学到的视觉动力学锚定到可执行控制上。
2.2 UMI 风格演示数据
第二类是 UMI 风格演示数据,论文里是 6.5K 小时经过筛选的开源 UMI-style 数据,使用类似 Gen-DAS Gripper 的手持夹爪设备采集。UMI 的价值在于采集成本低、环境更开放、物体和任务更多样,它可以让模型看到更宽的操作分布。但它的动作信号不是目标机器人真正要执行的动作,采集设备的运动学、驱动方式和控制接口都不同,因此它只能提供较弱的动作监督。把它当成真机动作标签会过度乐观,把它完全丢掉又会浪费大量行为多样性。
2.3 第一视角人类视频
第三类是第一视角人类视频,论文里是 3.0K 小时开源 egocentric human interaction videos。这类数据没有机器人动作标签,却最接近日常世界的长尾交互:桌面杂乱、物体遮挡、人手改变物体状态、容器开合、软物体形变、工具接触表面。它能教模型"世界如何演化",但不能直接教机器人"电机应该怎么动"。这也是 τ0-WM 很清醒的地方:人类视频只进入视频预测损失,不进入动作损失。直观理解是,看 100 小时篮球比赛能增强你对球路的判断,但不会自动形成投篮肌肉记忆。
2.4 模态特定监督掩码
把这三类数据放进同一个模型,需要解决标签空间冲突。真实机器人数据有视频、状态和动作;UMI 有视觉和弱动作信号;Ego 视频只有视觉。如果对所有样本都强行计算动作 loss,Ego 视频会产生错误梯度;如果只训练有动作标签的数据,第一视角视频中的物理先验又会被浪费。τ0-WM 的 模态特定监督掩码(Modality-specific Supervision Masks) 本质上就是一个工程化的防错机制:缺什么,就别让它监督什么。
# 基于论文描述的概念性表达。官方仓库仅开源推理代码,训练侧实现未公开。
def train_step(batch, model):
video_pred, action_pred, reward_pred = model(batch.context)
loss = 0.0
if batch.mask.video:
loss += flow_matching_loss(video_pred, batch.future_video_latents)
if batch.mask.action:
loss += flow_matching_loss(action_pred, batch.action_chunk)
if batch.mask.reward:
loss += flow_matching_loss(reward_pred, batch.progress_reward)
return loss
这段伪代码说明了 τ0-WM 训练设计里最朴素也最重要的原则:不要让数据做它做不了的监督。真实机器人数据可以同时监督视频和动作;UMI 数据可以贡献视觉和弱动作信号;第一视角人类视频只训练视觉动力学;失败与恢复轨迹可以训练进度和低质量结果判断。共享视频骨干让这些信号最终汇入同一个表征空间,但损失函数的开关必须按数据类型分开。
3. VAM:让动作生成"看着未来"动
视频-动作模型(Video Action Model, VAM) 是 τ0-WM 面向策略的接口。给定当前多视角观测 、语言指令 和机器人状态 ,它同时预测未来视觉 latent 和连续动作 chunk,形式化写作 。直观理解就是:模型不仅说"手往哪里动",还要在 latent 空间里预测"接下来画面会变成什么样",动作分支不是孤立做回归,而是在视频分支提供的未来动态特征上生成动作。
3.1 架构:Wan2.2 骨干与多视角 latent canvas
VAM 基于 Wan2.2-TI2V-5B 实例化。Wan VAE 先把每个相机视角编码成 latent,多视角 latent 沿空间宽度方向拼接成一个时间对齐的 latent canvas;当前观测 latent 保持干净作为视觉上下文,未来 latent 槽位加噪后由视频 DiT 主干去噪。动作分支是一个 DiT 风格动作解码器,动作 token 在动作窗口内建模时序依赖,并通过 cross-attention 持续读取中间视频特征。这里的关键是:视频分支不是给动作分支提供一个静态 embedding,而是把"未来会如何变化"的动态信息持续喂给动作分支。
3.2 为什么把视频预测和动作生成绑在一起
传统策略可能只学到"看到杯子就伸手"的模式,VAM 则多了一层未来语境:如果这个角度伸过去会撞到旁边的盒子,或者夹爪闭合后目标还没进入稳定位置,动作分支有机会从视频预测特征里读到这种风险。论文在 Toolbox 任务中观察到,基线模型有时把工具插进去一点就停止,而 τ0-WM 会继续推或压让最终状态更完整;这类行为符合"优化未来场景质量"的模型直觉,而不只是单步动作回归的结果。
4. ACVS:动作条件的想象力引擎
动作条件视频模拟器(Action-Conditioned Video Simulator, ACVS) 是 τ0-WM 面向评估的接口。VAM 提出"我要这样做",ACVS 回答"这样做之后可能会怎样"。它接收记忆观测序列、语言指令和候选动作 chunk,预测未来多视角视频 latent 以及密集任务进度 reward。它不是策略模型,不生成动作;它把候选动作当作条件输入,专门评估这个动作会诱发什么未来。
4.1 架构:复用骨干,移除动作分支
ACVS 复用 Wan VAE 和视频 Transformer 主干,但移除 Action DiT 策略分支。候选动作被分块并通过轻量 MLP 投影到扩散时间嵌入和 AdaLN 调制嵌入中,从而影响未来 latent 槽位的去噪过程。这样,同一个当前场景和指令下,不同候选动作会生成不同的想象未来,ACVS 不只生成画面,还预测逐帧或逐段的 progress reward,可以区分"画面看起来动了"和"任务真的前进了"。
4.2 失败数据的价值
这里最有工程价值的部分,是失败数据也参与训练。很多机器人数据集天然偏向成功演示,因为成功轨迹更适合做行为克隆;但对模拟器而言,失败轨迹很有价值。错误接触、物体运动方向不对、任务进度倒退、夹取后掉落,这些都是 ACVS 需要识别的坏未来。τ0-WM 把失败子任务片段的 reward 设为负值,让模拟器学会判断哪些动作虽然在视觉上合理,却会把任务带向失败。
5. TTC:测试时计算与动作选择
τ0-WM 的 测试时计算(Test-Time Computation, TTC) 分成三层:先采样多个动作候选,再用 RCS 做轻量排序,最后在低质量情况下调用 ACVS 和 LAR 做更精细的修正。设计并不是无脑增加 rollout,而是由粗到细——RCS 成本低,适合先过滤明显不可靠的动作;只有当最优候选仍低于阈值时,才进入 ACVS 推演和 LAR 修正。
5.1 重去噪一致性得分(RCS)
重去噪一致性得分(Re-denoising Consistency Score, RCS) 的想法很直接:如果一个候选动作真的位于模型学到的高质量动作流形上,那么把它重新加噪,再让模型去噪回来,重建误差应该比较小。论文把 RCS 定义为负的重去噪误差,分数越高表示候选动作越自洽。它不是在判断动作最终一定成功,而是在判断这个动作是否像模型训练分布里可靠的动作。
5.2 低质量动作纠正(LAR)
当 RCS 最优候选仍低于阈值时,进入 低质量动作纠正(Low-quality Action Rectification, LAR)。LAR 不会直接执行 ACVS 选中的动作,而是把最高价值 rollout 的未来 latent 转成额外条件,再重新查询 VAM 生成一个被"好未来"引导的动作。最终动作仍然由 VAM 生成,保证动作接口与部署控制保持一致,ACVS 的作用是评估未来,不是替代策略。
# τ0-WM 测试时计算的简化伪代码,用于解释流程。
def select_action(context, vam, acvs, n=4, gamma=0.0):
candidates = vam.sample_actions(context, n=n)
rcs_scores = [re_denoising_consistency(vam, context, a) for a in candidates]
best_id = max(range(n), key=lambda i: rcs_scores[i])
if rcs_scores[best_id] >= gamma:
return candidates[best_id]
rollouts = [acvs.rollout(context, a) for a in candidates]
values = [max(r.progress_reward) for r in rollouts]
future = rollouts[max(range(n), key=lambda i: values[i])].future_latent
return vam.sample_action(context, future_condition=future)
gamma 是 RCS 阈值,高于它直接返回最优候选,低于它才触发 ACVS+LAR 路径。这使 TTC 的额外算力只在真正需要修正的状态下消耗,而不是每步都跑完整 rollout。
6. 部署实践
6.1 开源状态与边界
官方仓库 tau-0-wm 的开源状态在 README 里写得很明确:VAM 的预训练权重已在 Hugging Face 上发布;Simulator 权重后续发布;Test-Time Computation 代码随 Simulator 权重一起发布。截至本文写作时间,读者可以运行 VAM 的服务端推理接口,但完整的 RCS+LAR 全链路还需等待 ACVS 权重和 TTC 代码开放。
启动服务端非常简单,仓库里提供了完整脚本:
pip install -r requirements.txt
# 启动策略服务端,指定 HOST 和 PORT
bash run_infer_server.sh 127.0.0.1 8001
# 发送随机观测的简单客户端(用于验证服务是否正常)
python web_infer_utils/simple_client.py
6.2 输入输出接口
服务端接口由 web_infer_utils/server.py 实现,底层基于 openpi 的 WebSocket 协议。simple_client.py 给出了标准 payload 格式:
# 来自 web_infer_utils/simple_client.py
payload = {
"obs": np.random.rand(3, 3, 192, 256), # 范围 -1 到 1,shape: {views, C, H, W}
"prompt": "task or step caption",
"state": np.random.rand(14), # 双臂末端绝对位姿:xyz + quaternion(xyzw) × 2
"gripper_states": np.random.rand(2) * 120, # 两个夹爪,范围 0(开)到 120(闭)
"num_inference_steps": 5,
"execution_step": 30,
"sample_solver": "euler",
"shift": 1.0,
}
action = policy.infer(obs=payload)["actions"] # 返回 shape {T, 16}
输出动作的 {T, 16} 布局是:左末端 xyz + quaternion(xyzw)(7 维)+ 左夹爪开合(1 维)+ 右末端(7 维)+ 右夹爪开合(1 维)。
6.3 TauPolicy 内部的状态转换
web_infer_utils/TauPolicy.py 里的 play() 方法揭示了从外部接口到模型内部的完整转换链。模型预训练阶段用的是相对末端位姿(action_type: "relative")和 6D rotation 表示(action_space: "eef6d"),但外部接口收发的是绝对末端位姿和四元数,中间有两层转换:
# TauPolicy.play() 中的状态预处理(来自 web_infer_utils/TauPolicy.py)
# 1. 四元数 → 6D rotation(模型内部表示)
state_rot_l_6d = quaternion_to_rotation_6d(state[:, 3:7]) # 左臂姿态
state_rot_r_6d = quaternion_to_rotation_6d(state[:, 10:14]) # 右臂姿态
# 2. 拼接成 eef6d 格式:left(xyz+rot6d+gripper) + right(xyz+rot6d+gripper)
state = torch.cat((
state[:, :3], state_rot_l_6d,
gripper_states[:, :1],
state[:, 7:10], state_rot_r_6d,
gripper_states[:, 1:],
), dim=-1)
# 3. meanstd 归一化(统计量来自 configs/deployment/statistics.json)
normed_state = (state - sta_mean) / sta_std
反向转换在后处理阶段:utils/action_space_utils.py 中的 rela_eef_to_abs() 把模型输出的相对末端位姿(action_type: "relative",D=18,6D rotation 格式)转换回绝对末端位姿。位置分量的还原是 ,旋转分量的还原是 ,最后再由调用方把 6D rotation 转回四元数输出给控制系统。
6.4 部署配置
configs/deployment/wan_pretrain_rela_eef6d.yaml 包含两部分:推理参数和模型路径。推理参数不需要改动,需要替换的只有三处模型路径(VAE、文本编码器、τ0-WM 权重):
# 推理参数(不需要修改)
action_dim: 20 # 模型内部动作维度:双臂各 xyz(3) + rot6d(6) + gripper(1)
gripper_dim: 1
chunk: 9 # 历史帧数
action_chunk: 33 # 预测未来动作步数
img_size: [192, 256]
action_type: "relative"
action_space: "eef6d"
norm_type: "meanstd"
# 需要替换为本地路径
vae_path: /path/to/Wan2.2-TI2V-5B/Wan2.2_VAE.pth
text_encoder:
checkpoint_path: /path/to/Wan2.2-TI2V-5B/models_t5_umt5-xxl-enc-bf16.pth
tokenizer_path: /path/to/Wan2.2-TI2V-5B/google/umt5-xxl
diffusion_model:
model_path: /path/to/pretrained/tau0-wm-weight
注意 action_dim: 20 是模型内部维度(双臂各 xyz(3) + rot6d(6) + gripper(1) = 10,合计 20),而外部接口输出的 {T, 16} 是四元数格式(双臂各 xyz(3) + quat(4) + gripper(1) = 8,合计 16)。两者之间的转换由 TauPolicy 自动处理。
6.5 推理加速选项
TauPolicy.__init__() 提供了多个加速开关,对应论文附录里的延迟数据:
| 选项 | 参数 | 延迟(RTX 5090) |
|---|---|---|
| 标准配置 | 默认 | ~220 ms/query |
| 文本缓存 | enable_context_null_cache=True(默认开) |
~180 ms/query |
| fused QKV | enable_self_attn_fused_qkv=True(默认开) |
进一步降低 |
| KV cache | enable_action_cross_attn_kv_cache=True |
进一步降低 |
| per-block compile | compile_model=True, compile_target="full" |
~140 ms/query |
torch.compile 默认关闭(compile_model=False),论文主文实验也不启用,原因是扩散模型里的小数值差异可能沿采样过程放大,影响结果一致性。如果只关注推理速度而不需要精确复现论文数字,可以安全开启。
7. 结论
τ0-WM 的核心不是"又一个更大的机器人策略",而是把视频预测、动作生成和动作评估放进同一个未来预测框架。VAM 提出动作,ACVS 推演后果,TTC 在部署时把候选动作排序和修正,未来预测因此成为决策过程的一部分,而不是训练阶段的装饰性辅助任务。
τ0-WM 的真正启发是,机器人世界模型不能只会看,也不能只会动;它必须知道每种数据能教什么,并在行动前把未来后果算进决策。
参考资料
- 1. τ0-WM 官方项目页:https://finch.agibot.com/research/tau0-wm2. τ0-WM 论文 PDF:https://finch-static.agibot.com/VAM/blog/tau_0_wm.pdf3. τ0-WM GitHub 仓库:https://github.com/sii-research/tau-0-wm4. τ0-WM Hugging Face 模型页:https://huggingface.co/sii-research/tau-0-wm5. τ0-WM Hugging Face Paper 页面:https://huggingface.co/papers/2606.010276. Wan2.2 官方仓库:https://github.com/Wan-Video/Wan2.27. Universal Manipulation Interface 项目页:https://umi-gripper.github.io/8. DreamDojo 论文条目:https://arxiv.org/abs/2602.069499. HumanEgo 论文条目:https://arxiv.org/abs/2605.2493410. 用户提供的中文参考材料:包含量子位报道摘录、τ0-WM 论文内容整理,以及 DreamDojo、EgoScale、HumanEgo 路线对比说明。
291