Ctrl-World: A Controllable Generative World Model for Robot Manipulation
Paper: arXiv:2510.10125 Code: Robert-gyj/Ctrl-World Code reference:
main@99fb206(2026-04-08)
1. Motivation (研究动机)
这篇论文要解决的核心问题不是“再做一个机器人视频预测模型”,而是让世界模型真正进入通用机器人策略的闭环:给定当前多视角观测和语言指令,VLA policy 输出一段动作;世界模型需要把这些动作在想象空间里执行出来,再把生成的未来观测反馈给 policy,形成多轮 rollout。作者的判断是,当前通用 VLA policy 已经能在许多操控任务上表现出泛化能力,但评估和改进仍然高度依赖真实机器人:评估要在多个任务、多个场景、多个随机种子下反复 rollout;改进则通常需要专家采集新的纠错数据。这两个过程慢、贵、难并行,也很难快速定位 policy 到底在“听不懂指令”“选错对象”“接触失败”“物理交互失败”中的哪一环出错。
现有 action-conditioned world model 对这个目标还不够。论文明确指出三个瓶颈:第一,许多方法只预测单个 third-person view,无法覆盖现代 VLA policy 需要的多相机输入,尤其缺少 wrist camera 时,模型在接触阶段容易 hallucinate,例如物体还没有被夹爪碰到就突然移动;第二,已有模型的动作控制通常比较粗,难以对高频、厘米级动作差异给出因果一致的视觉变化;第三,长 horizon 自回归生成会累积误差,尤其 wrist camera 的视野变化剧烈,遮挡和重入视野会导致漂移。
Ctrl-World 的研究价值在于把世界模型从“离线预测器”推进到“policy-compatible interactive simulator”。如果它能做到闭环,就有两个直接用途:其一,在真实机器人外并行评估多个 policy 的 instruction-following 能力,减少低效真实 rollout;其二,在想象空间中搜索成功轨迹,把这些轨迹作为 synthetic post-training data,用监督微调改善 policy 对新物体、新空间关系、新指令的响应。论文声称在 DROID 上训练后,模型可以在新场景、新相机位置下生成超过 20 秒的时空一致轨迹,并且合成数据能把 -DROID 在下游新指令/新物体任务上的平均成功率从 38.7% 提升到 83.4%,绝对提升 44.7%。
Figure 1 解读:这张图把论文的两层贡献放在一起:底层是 controllable multi-view world model,输入 policy 产生的 action chunk,输出多视角未来;上层是两个应用闭环,即用 world model 评估真实 policy 的排序,以及从 imagined rollout 中筛选成功轨迹做 SFT。最重要的信息是,Ctrl-World 不只是生成一段视频,而是要保留 VLA policy 需要的输入接口:third-view + wrist-view + robot pose/action 的时间对齐。
2. Idea (核心思想)
核心思想可以概括为:把预训练的被动视频扩散模型改造成一个能被机器人策略“调用”的多视角神经模拟器。被动视频模型已经学到外观、纹理和一般时序先验,但它默认只根据图像/文本生成未来,并不知道机器人动作的含义。Ctrl-World 通过三处结构改造让这个 backbone 变成可控世界模型:联合多视角预测保证空间一致性,pose-conditioned memory retrieval 把长程历史重新接入当前预测,frame-level action conditioning 让每一帧视觉 token 都能看到对应的机器人位姿/动作嵌入。
这与 WPE、IRASim 等 prior action-conditioned world model 的根本差异在于接口和用途。WPE/IRASim 更像单视角评估器或离线视频预测器,而 Ctrl-World 要服务现代 VLA policy 的闭环输入输出:policy 读取多视角图像和本体状态,输出 joint velocity/action chunk;world model 则把动作转成 Cartesian end-effector pose 条件,预测下一段多视角视频,再让 policy 继续决策。换句话说,论文不是单纯追求 FVD 更低,而是追求“可控 + 多视角 + 长时一致 + 可用于 policy evaluation/improvement”的组合能力。
直观上,三项设计分别对应三个失败模式。多视角联合预测解决 partial observability:third-view 有全局对象布局,wrist-view 有接触细节;两者一起生成时,模型更不容易凭空移动物体。memory retrieval 解决长程漂移:自回归 rollout 到后面时,当前帧可能看不到完整上下文,但历史帧中存在类似位姿或可见对象状态;把稀疏历史帧和对应 pose 一起加入条件,可以把未来预测锚回相关过去状态。frame-level action conditioning 解决控制精度:不是把整段动作压成一个全局向量,而是让每个未来时间步的视觉 token cross-attend 到对应动作/pose embedding,从而让“向上 6 cm”和“向左 3 cm”这样的微小动作差异反映到生成轨迹中。
Figure 2 解读:方法图展示了 SVD backbone 如何被改造成 Ctrl-World。输入端把多相机 latent 在 token 维度拼接,历史帧与未来噪声帧共同送入 spatio-temporal UNet;条件端把历史 robot pose 和未来 action-derived pose 投影成 1024 维 embedding,并在 spatial transformer 中做 frame-level cross-attention。这里的“memory”不是外部数据库检索,而是把稀疏历史帧放入上下文,让网络在注意力里选择与当前预测最相关的过去状态。
3. Method (方法)
3.1 问题形式化与闭环 rollout
论文把机器人观测写作 ,其中 是多视角图像, 是机器人 pose/proprioception。通用策略 根据当前观测和语言指令 输出长度为 的动作块: 世界模型 的目标不是只预测最终状态,而是给出每个未来 step 的多视角观测: 闭环使用时, 生成的 会被送回 policy,policy 再输出下一段 。这使 evaluation 和 data generation 可以在 imagined trajectory 中连续运行,而不是只生成一个固定长度视频片段。
# Policy-in-the-loop rollout in Ctrl-World style.
def rollout(policy, world_model, obs, instruction, steps, horizon, memory):
trajectory = [obs]
for j in range(steps):
current_obs = trajectory[-1]
action_chunk = policy.infer(current_obs, instruction) # H-step VLA action chunk
pose_chunk = convert_policy_action_to_cartesian(action_chunk) # adapter + FK if needed
history = memory.sample_sparse_history(current_obs)
future_obs = world_model.predict(history, current_obs, pose_chunk)
trajectory.extend(future_obs[:horizon])
memory.update(future_obs, pose_chunk)
return trajectory3.2 Multi-view joint prediction
Ctrl-World 直接联合预测所有视角,而不是分别训练每个相机或只生成 third-view。论文中 DROID setup 包含一个 wrist camera 和两个随机放置的 third-view camera;训练时模型同时预测三路相机,每路分辨率为 。实现上,图像经 VAE 下采样 8 倍,单帧单视角 latent 空间为 ;三视角在 token 维拼接,所以每一帧包含 个视觉 token。Appendix 给出的总输入 token 形状是 :历史帧与未来帧共同进入 spatio-temporal transformer。
这种设计的关键不是“多生成几个 view”,而是让 cross-view information 在同一个 transformer 内交互。third-view 能看到物体整体位置和桌面布局,wrist-view 能看到夹爪附近的接触细节;如果只预测 third-view,模型可能不知道夹爪是否真的接触到了毛巾或碗,从而在长程 rollout 中产生物体瞬移。实验中 full Ctrl-World 在 third-view 上达到 PSNR 23.56、SSIM 0.828、LPIPS 0.091、FVD 97.4,优于 single-view 版本的 FVD 127.5;wrist-view ablation 中去掉 joint prediction 后 FVD 从 127.1 恶化到 158.1,说明多视角联合预测对 wrist-view 一致性尤其重要。
# Multi-view latent packing used conceptually by Ctrl-World.
def pack_multiview_latents(view_latents):
# view_latents: list of [B, T, C, H, W], e.g. third-1, third-2, wrist
# Concatenate camera views along spatial/token width before the SVD-style UNet.
return torch.cat(view_latents, dim=-1) # [B, T, C, H, V*W]3.3 Pose-conditioned memory retrieval
长时生成的核心困难是误差积累。Ctrl-World 不是无限增加连续上下文,而是采样 个历史帧,间隔为 stride ,让模型从 中预测未来 。论文文本描述为把对应 robot arm pose 嵌入到历史帧中,并通过 spatial transformer 内的 frame-wise cross-attention 让视觉 token 读取对应 pose embedding。直观上,当 wrist camera 在第 4 秒回到和第 0 秒类似的位姿时,模型可以从历史中找回当时看到的局部对象状态,避免后续生成变糊或漂移。
released code 的 rollout 默认更具体:config.py 中 history_idx=[0,0,-12,-9,-6,-3],num_history=6,num_frames=5;scripts/rollout_interact_pi.py 每轮把这些历史 latent 拼成 his_latent,把相同索引的历史 end-effector pose 与未来 cartesian_pose 拼成 action_cond,再传入 Agent.forward_wm(...)。这说明论文中的 memory retrieval 在实现里表现为“稀疏历史 latent + 历史/未来 pose 条件”的同步输入,而不是显式最近邻检索。
# Sparse pose-conditioned memory used during rollout.
def build_world_model_condition(history_latents, history_eef, future_eef, history_idx):
selected_latents = torch.cat([history_latents[i] for i in history_idx], dim=0)
selected_poses = np.concatenate([history_eef[i] for i in history_idx], axis=0)
action_condition = np.concatenate([selected_poses, future_eef], axis=0)
return selected_latents.unsqueeze(0), action_condition3.4 Frame-level action conditioning 与 diffusion objective
Ctrl-World 初始化自 1.5B Stable Video Diffusion。论文说只有 action-projection MLP 是新初始化的;released code 中 models/ctrl_world.py 的 Action_encoder2 是三层 MLP:Linear(action_dim,1024) -> SiLU -> Linear(1024,1024) -> SiLU -> Linear(1024,1024),并可把 CLIP text embedding 加到动作 hidden state 上。CrtlWorld.__init__ 先加载 SVD pipeline,再用自定义 UNetSpatioTemporalConditionModel 替换原 UNet,使其支持 action condition 和 frame-level pose;VAE、image encoder、text encoder 冻结,UNet 和 action encoder 参与训练。
训练时,future target latent 被加噪成 。模型输入是 noisy history、noisy future 和重复的 current image condition latent;条件 包含历史 pose、未来 action-derived pose 和历史观测。论文目标写作:
实现上 models/ctrl_world.py 第 180–209 行使用 EDM/SVD 风格的 参数化:生成 noisy_latents,把 history 和 future 拼为 input_latents,再把 current image condition 沿 channel 维拼入;UNet 输出 model_pred 后通过 predict_x0 = c_out * model_pred + c_skip * noisy_latents 还原 ,loss 只计算 future frames,即 predict_x0[:, num_history:] 与 latents[:, num_history:] 的加权 MSE。
# Training step distilled from models/ctrl_world.py and scripts/train_wm.py.
def train_step(model, batch, optimizer):
latents = batch["latent"] # [B, history + future, C, H, W]
action_hidden = model.action_encoder(batch["action"], batch["text"])
current = latents[:, model.args.num_history]
condition_latent = repeat_current_latent(current, frames=latents.shape[1])
noisy_history, noisy_future, sigma = add_noise(latents, model.args.num_history)
input_latents = torch.cat([noisy_history, noisy_future], dim=1)
input_latents = torch.cat([input_latents, condition_latent / model.vae.config.scaling_factor], dim=2)
model_pred = model.unet(input_latents, sigma_to_timestep(sigma), encoder_hidden_states=action_hidden).sample
pred_x0 = denoise_prediction(model_pred, latents, sigma)
loss = future_only_weighted_mse(pred_x0, latents, sigma, start=model.args.num_history)
loss.backward()
optimizer.step()3.5 Policy evaluation 与 policy improvement pipeline
用于 evaluation 时,作者从验证集或真实 setup snapshot 取初始观测和语言指令,让 policy 与 world model 自回归交互,得到 synthetic trajectory。论文当前用 human preference 判断 trajectory 是 success/failure;作者也提到未来可替换为 VLM/reward model。用于 improvement 时,作者观察到固定初始观测和指令会让 VLA policy 行为高度确定,例如总是抓同一个对象,因此加入结构化扰动扩大搜索空间:一是用 LLM paraphrase 指令,例如把“place glove in box”改写为“pick up the cloth and put it inside the box”;二是在 world model 中把机器人 reset 到随机初始状态,再开始 policy interaction。每个任务生成 400 条 imagined trajectories,人工保留 25–50 条成功轨迹,再对 -DROID 做 2k steps SFT。
released code 中 scripts/rollout_interact_pi.py 对官方 openpi policy 做了接口桥接:policy_config.create_trained_policy 载入 pi05_droid、pi0fast_droid 或 pi0_droid;policy 输出 joint velocity 与 gripper position;由于 Ctrl-World 在 Cartesian pose 空间训练,代码通过 models/action_adapter/train2.py 的 Dynamics(action_dim=7, action_num=15, hidden_size=512) 把当前 joint 和 15 步 joint velocity 预测成未来 joint positions,再用 get_fk_solution 做 Franka Panda forward kinematics,得到每步 end-effector xyz、Euler rotation 和 gripper pose,最后按 policy_skip_step 下采样成 world model 的 5 步 future pose 条件。
# Policy-output adapter used before world-model prediction.
def adapt_openpi_actions(policy, obs, joints, text, dynamics_model, skip=2, pred_step=5):
action_chunk = policy.infer(obs, text)["actions"] # [15, 8], joint velocity + gripper
joint_vel = action_chunk[:15, :7]
gripper = np.clip(action_chunk[:15, 7:], 0, max_gripper(obs))
future_joint = dynamics_model(joints[None, :7], joint_vel, training=False)
future_joint = np.concatenate([joints[None, :7], future_joint], axis=0)[:15]
future_cartesian = [franka_fk(q) for q in future_joint]
return np.asarray(future_cartesian)[::skip][:pred_step], future_joint[::skip][:pred_step]论文公式与 released code 实现差异:论文 Appendix 写作中说使用 history frames、15 个 action steps 并下采样到 5 步;released config.py 默认 num_history=6、num_frames=5、history_idx=[0,0,-12,-9,-6,-3],训练默认 max_train_steps=500000,而论文报告训练 100k steps。这里我按论文数字解释实验设置,同时在代码映射中把 released default 标出,避免把 repo 示例配置误读成论文最终训练配置。
Code reference:
main@99fb206(2026-04-08) — pseudocode and mapping based on this commit.
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| SVD 初始化并替换为可接收 frame-level pose/action condition 的 UNet | models/ctrl_world.py | CrtlWorld.__init__, UNetSpatioTemporalConditionModel |
| 三层 action-projection MLP,把 7D Cartesian pose/action 投影到 1024 维条件 | models/ctrl_world.py | Action_encoder2.forward |
| 训练时的 noisy history + noisy future + current image condition latent 拼接,以及 future-only MSE | models/ctrl_world.py, scripts/train_wm.py | CrtlWorld.forward, main training loop |
| 自回归 replay/keyboard/policy interaction rollout | scripts/rollout_replay_traj.py, scripts/rollout_key_board.py, scripts/rollout_interact_pi.py | agent.forward_wm, main rollout loop |
| openpi joint velocity 到 Ctrl-World Cartesian pose 条件的桥接 | scripts/rollout_interact_pi.py, models/action_adapter/train2.py | agent.forward_policy, Dynamics |
| 训练/rollout 默认超参数与任务初始条件 | config.py, config_eval.py | wm_args, __post_init__ |
4. Experimental Setup (实验设置)
数据与平台:实验使用 DROID platform,Panda robot arm + Robotiq Gripper,传感器包含一个 wrist-view camera 和两个随机 third-view cameras。DROID 数据集包含 95,599 条轨迹,来自 564 个 scenes,其中约 76k success trajectories、约 19k failed trajectories。失败轨迹在这里很重要,因为 controllable world model 不只要模拟成功演示,也要覆盖 policy 可能产生的失败动作和状态。
训练设置:论文报告模型同时预测三路 camera outputs;输入 7 个 history frames,history frame 间隔 1–2 秒;条件包含接下来 15 个 future actions,对应 DROID 中 1 秒 action chunk,并在模型输入前下采样到 5 个 action/pose steps。模型初始化自 SVD,action-projection MLP 新初始化;训练用 H100 GPUs,总 batch size 64,learning rate ,训练 100k steps,约 2–3 天。released config.py 示例默认 train_batch_size=4、learning_rate=1e-5、mixed_precision=fp16、max_train_steps=500000、num_frames=5、num_history=6,因此 note 中把论文主实验设置与公开代码默认配置分开。
世界模型质量评估:作者 hold out 2% trajectories 作为 validation set,随机采样 256 个 10 秒 clips。rollout 时世界模型每轮接收 15-step action chunk(1 秒),自回归生成 10 轮,得到 10 秒 trajectory。指标分两类:PSNR/SSIM 是 computation-based image similarity;LPIPS/FID/FVD 是 model-based perceptual/video distribution metrics。基线包括 WPE、IRASim,以及公平比较用的 Ctrl-World single-view 版本。
policy evaluation 设置:作者在新的 DROID setup 上随机放置两个 third-person cameras,测试三个公开 policy:-DROID、-FAST-DROID、-DROID。任务包括 Pick-and-Place、Towel-Folding、Drawer、Wipe-Table、Close-Laptop、Pull-tissue、Stack。每个 real-world rollout 和 world-model rollout 使用相同 initial observation,并报告 instruction following rate 和 success rate。评价标准分两层:instruction following 指 policy 是否尝试执行正确语义,例如接近正确对象;success 要求物理任务完成,例如物体进入目标容器、毛巾面积减半、笔记本完全关闭、纸巾被抽出。
policy improvement 设置:base policy 是 -DROID。下游任务聚焦 pretrained policy 较弱的新物体/新指令:Spatial Understanding(从指定空间位置取物体放入盒子)、Shape Understanding(区分大小形状属性)、Towel-Folding with Directions(按指定方向折毛巾)、Novel Objects(手套、订书机等未见物体)。每个任务在 world model 中生成 400 条轨迹,人工保留 25–50 条成功轨迹;最后在官方 openpi codebase 上用 4 H100 GPUs 对 -DROID SFT 2k steps。
Figure 5 解读:定性比较显示,单视角模型在接触事件上容易失败,例如绿色毛巾或红碗没有正确移动;Ctrl-World 的 wrist-view + third-view 联合预测能更好对齐真实未来。这一图支撑论文的核心假设:机器人操控中的物体状态变化往往发生在夹爪附近,wrist camera 是降低 hallucination 的关键观测。
Figure 4 解读:可控性实验用非常接近的 action sequence 产生不同 rollout,并展示 t=4s 时对 t=0s 相似 pose 的 attention。去掉 memory 会让图像更模糊,去掉 frame-level pose conditioning 会降低控制精度,说明长程一致性和精细动作控制不是同一个问题,需要分别处理。
Figure 3 解读:这张图重点展示 wrist camera consistency。绿色框表示信息来自其他 camera view 的推断,红色框表示从 memory 中恢复的历史信息。因为 wrist view 在运动中视野变化最大,能否在遮挡和重入视野后恢复正确物体状态,是世界模型能否闭环使用的关键。
5. Experimental Results (实验结果)
主表结果表明 Ctrl-World 在 10 秒 interactive long-trajectory generation 上优于 prior action-conditioned world model。third-view camera 结果中,WPE-Single-View 为 PSNR 20.33、SSIM 0.772、LPIPS 0.131、FID 25.50、FVD 156.4;IRASim-Single-View 为 PSNR 21.36、SSIM 0.774、LPIPS 0.117、FID 26.46、FVD 138.1;Ctrl-World-Single-View 为 PSNR 21.27、SSIM 0.793、LPIPS 0.110、FID 23.47、FVD 127.5;完整 Ctrl-World 达到 PSNR 23.56、SSIM 0.828、LPIPS 0.091、FID 25.00、FVD 97.4。FID 上 single-view Ctrl-World 的 23.47 略低于 full model 的 25.00,但 full model 在 PSNR、SSIM、LPIPS、FVD 上最优,尤其 FVD 大幅改善,说明多视角联合预测更利于视频动态一致性。
消融实验进一步说明三个组件都必要。third-view 上,full model 是 PSNR 23.56、SSIM 0.828、LPIPS 0.091、FID 25.00、FVD 97.4;去掉 memory 后变为 23.06、0.812、0.099、26.14、105.5;去掉 frame-level conditioning 后变为 21.20、0.789、0.109、27.52、122.7。wrist-view 上,full model 是 PSNR 19.18、SSIM 0.665、LPIPS 0.252、FID 25.78、FVD 127.1;去掉 memory 后 FVD 133.1,去掉 frame-level cond 后 FVD 179.1,去掉 joint prediction 后 FVD 158.1。这个趋势说明 action conditioning 对 wrist-view 控制尤为关键,而 memory 和多视角联合预测主要帮助长程一致性与遮挡恢复。
Figure 6 解读:真实世界与 world model rollout 的定性对比显示, 与 Ctrl-World 都能 zero-shot transfer 到新的 DROID setup。每条轨迹包含 20 次 policy-world-model interactions,强调的不是单步预测,而是多轮闭环后是否仍维持合理视觉状态。图中也暴露出 limitation:某些需要精确接触、碰撞或旋转的任务,world model 对低层物理执行的还原仍不够准确。
Figure 9 解读:quantitative correlation 显示 world model 对 instruction-following behavior 的排序更可靠,但对 low-level execution success rate 有低估倾向。这个结果很重要,因为它限定了 Ctrl-World 的适用边界:它适合用来判断 policy 是否理解和尝试执行指令、比较不同 VLA policy 的高层行为;但如果任务成败强依赖复杂碰撞、滑动、旋转或非常长程物理推理,world model 仍可能偏悲观或不准。
Appendix 的任务分解可以更细地看出这种边界。在 Pick-Place 上, 的 real/world-model instruction following 是 0.75/0.60,success 是 0.70/0.55;-fast 是 0.90/0.75 和 0.85/0.70; 是 0.90/0.80 和 0.85/0.70。Fold-Towel 上, 的 real/world-model instruction following 为 0.80/0.75,success 为 0.75/0.65。Drawer 上, 的 instruction following 为 0.80/0.65,但 success 从 real 0.80 降到 world-model 0.30,说明抽屉/接触类任务的低层物理更难模拟。Close-laptop 更明显: instruction following 是 0.80/0.70,但 success 是 0.70/0.05,论文也在结论中承认精确 interaction、长程 reasoning、initial observation sensitivity 仍是挑战。
Figure 7 解读:policy improvement 流程不是直接相信所有 imagined data,而是先生成成功和失败混合 rollout,再只保留人工偏好判断为成功的轨迹。这样做的逻辑类似离线 RL / rejection sampling:世界模型负责扩大搜索空间,人类偏好负责过滤,最终 SFT 只学习成功行为。
Figure 8 解读:post-training 的总体结果是平均 success rate 从 38.7% 到 83.4%,绝对提升 44.7%。Appendix 给出分类明细:Spatial Understanding 平均从 0.2875 到 0.875;Shape Understanding 从 0.4374 到 0.9125;Towel folding with direction 从 0.575 到 0.80;Novel object 从 0.25 到 0.75。提升最大的是空间关系和形状/大小理解,说明 synthetic successful trajectories 对 instruction grounding 很有效;但这并不等价于低层操控能力全面提升,因为论文的 improvement 实验主要针对 instruction following,而不是所有物理成功模式。
整体看,Ctrl-World 的贡献在于证明了一个“可被 VLA policy 调用”的生成式世界模型可以同时服务 evaluation 和 improvement。它的实验证据最强的部分是:多视角/动作/memory 组件都有定量消融支撑;world model 对 instruction-following 排序有现实相关性;筛选 imagined successful trajectories 后可显著改善新指令和新物体任务。它的限制也清楚:低层物理精度、复杂接触、长程 reasoning、对初始观测敏感,以及人工偏好筛选成本。对后续工作来说,最自然的方向是把 Ctrl-World 与自动 reward model/VLM judge、iterative policy-world-model co-training、以及更强物理一致的视频 backbone 结合,使 imagined rollout 不只改善“听懂指令”,也能可靠改善真实执行成功率。