CogRobot 论文深度解析:当视频编码的"老朋友"光流,成了机器人双臂操作的"中间表示"

一句话总结:把文生视频模型(CogVideoX)改造成机器人的"大脑皮层想象区"——先让它想象"手该怎么动"(光流),再想象"画面会变成什么样"(视频),最后让一个轻量扩散策略把想象变成可执行的关节角。而全场最妙的一步棋,是把我们视频编码圈玩了三十年的**光流(Optical Flow)**从"编码工具"升格成了"语言→动作的翻译中间件"。


1. 介绍

1.1 问题:双臂操作是机器人界的"立体声"

单臂机器人操作,相当于单声道;双臂操作(bimanual manipulation)是立体声——不是简单多一路,而是两路信号之间还要有相位协调。你想想人拧瓶盖:左手固定瓶身、右手旋转瓶盖,两个末端执行器之间存在动态的力学耦合与角色分工。这种协调性带来两个直接后果:

  1. 动作空间爆炸:两个 7-DoF 机械臂 + 两个夹爪,联合动作维度直接翻倍,而且双臂协作天然是多模态的(同样的任务有一堆合法的协作方式),数据覆盖要求极高;
  2. 数据极度稀缺:互联网上单臂机械臂视频都算稀有,高质量双臂遥操作数据更是凤毛麟角。ALOHA 系统那种专门搭的双臂采集台,成本摆在那里。

现有路线主要靠 VLA(Vision-Language-Action)大模型:把跨本体(cross-embodiment)数据混在一起,学一个统一动作空间(RDT 的物理可解释动作空间、GROOT/GO-1 的隐式动作码本),再大规模预训练。但这条路有两个硬伤:从头训练聚合数据集的算力开销巨大;即便统一了动作空间,双臂操作的多模态特性仍要求海量数据去"铺满"所有动作模式。

1.2 一个反直觉的提问

论文作者问了一个好问题:能不能构建双臂基础策略,但完全不让基础模型直接碰那些异构的动作?

注意他们的观察角度:不管双臂动作空间多复杂、多异构,动作作用在物理世界上的结果——状态轨迹——都可以用视频统一表示。你用 ALOHA 采的数据和我用 Realman 采的数据,动作空间完全不同,但拍出来的视频都是 H×W×3 的 RGB 帧序列。视频是天生的"跨本体统一表示"。

这就像视频编码里的思想:码流格式可以千差万别(H.264/H.265/AV1),但最后都要还原成同一种 YUV 像素。与其在动作空间上做统一(相当于统一码流语法),不如直接在像素域做统一(相当于统一重建信号)。像素域的先验更通用、更便宜。

于是 CogRobot 的框架浮出水面:用最先进的开源文生视频模型 CogVideoX 做底座,微调它根据当前观察 + 语言指令预测未来机器人轨迹视频,再训练一个轻量扩散策略从预测视频里抠出可执行动作。高层规划交给视频生成模型,低层执行交给小策略——这个分层结构和视频编码里"高层码率分配 + 低层运动补偿"的分工颇有神似之处。

1.3 但是,直接微调会翻车

作者先做了组诊断实验:拿 CogVideoX-5B 零样本跑双臂任务,再分别在 RDT + RoboMIND 双臂数据集上微调出 2B/5B 两个 SFT 版本。结果暴露了三大病:

  • 物理幻觉(Physical Hallucination):零样本时模型直接生成一只"鬼手"和凭空出现的玉米来完成指令;微调后鬼手换成了机械臂,但运动依然违反物理合理性——因为 T2V 模型的训练目标一直是"生成语义上贴合文本的视频",它从不保证帧间转移符合物理规律。这不就是生成模型版的"参考帧不匹配"吗?语义对上了,运动矢量全是错的。
  • 任务混淆(Task Confusion):多阶段长程指令里,不同子任务的初始观察很相似(比如"从蒸锅里拿出鸡蛋"和"盖上盖子"开场画面接近),模型分不清当前该执行哪个子任务,会错误触发。
  • 指令模糊(Vague Instructions):语言指令天然高层(“把它放回去”),缺乏"怎么动"的细节,生成的运动计划过于激进,根本落不到未来 N 步可执行的关节位置上。

这三病的共同根源:文本和运动之间存在语义鸿沟。语言说"把玉米放进锅里",但没有说每根手指、每个关节怎么走。

1.4 解法:把光流从"编码工具"提拔为"意图翻译官"

CogRobot 的核心创新就一句话:在文本→视频之间插一个光流中间变量,把一条龙拆成两段——text-to-flow(文生光流)和 flow-to-video(光流生视频)

  • text-to-flow 只管"运动该长什么样":预测从初始帧到未来每帧的光流序列,建模机械臂运动学和机器人-物体接触的动力学,不操心纹理细节;
  • flow-to-video 只管"画面该长什么样":拿光流做运动引导,重建精细的未来视频。

这个分工对视频编码背景的人来说简直亲切得不行:光流就是运动矢量场(MVP),flow-to-video 本质上就是一个学习版的运动补偿预测(MCP)——传统编码器用 MV + 残差编码来压缩帧间差异,CogRobot 用预测光流 + 条件生成来补全未来帧。H.265 里 MV 预测不准就得多花残差码率;CogRobot 里光流预测不准,后续视频生成就会"漂"。连踩的坑都一样。

这项工作的三个贡献:

  1. 提出了用 T2V 模型训练双臂基础策略的框架(CogRobot);
  2. 提出两阶段范式,用光流作为精简的视频表示,显著降低双臂数据需求(后面会看到,2B 模型 + 光流引导干翻了 5B 直接微调);
  3. 自建双臂平台(Vision Pro 遥操作 + Realman 双臂),仿真和真机都验证了有效性。

2. 原理

整个系统是一个三段式流水线。先把问题形式化,再逐模块拆。

2.1 问题形式化:目标条件 POMDP

双臂任务 T 建模为 目标条件部分可观测马尔可夫决策过程 (S,O,A,P,L)(S, O, A, P, L)(S,O,A,P,L)

  • 观测 ot∈RH×W×3o_t \in \mathbb{R}^{H \times W \times 3}otRH×W×3:单目外部相机(RealSense)拍到的 RGB 图。注意,是单视角,这比 RDT 的三视角(第三人称 + 双腕部相机)难得多——单张图信息量少,全靠先验脑补;
  • 动作 ata_tat:双臂关节角的联合向量,可直接下发控制;
  • 语言指令 lll:任务目标描述;
  • 数据来源:Vision Pro 遥操作采集,记录人手/手腕位姿,经重定向 + 逆运动学转成关节角指令(沿用 Open-Television 思路)。

一条演示数据 = 视频序列 v=[o1,…,oT]∈RT×H×W×3v = [o_1, \ldots, o_T] \in \mathbb{R}^{T \times H \times W \times 3}v=[o1,,oT]RT×H×W×3 + 动作序列 [a1,…,aT−1][a_1, \ldots, a_{T-1}][a1,,aT1] + 语言描述 lll

策略要学的是 π(at:t+N−1∣ot,l)\pi(a_{t:t+N-1} \mid o_t, l)π(at:t+N1ot,l),CogRobot 把它拆成两步:

第一步(想象):o_t, l  ──→  未来观测轨迹 o_{t+1:t+N}     ← 视频生成问题
第二步(执行):o_t, o_{t+N}  ──→  动作 a_{t:t+N-1}        ← 目标到达问题

关键在于第二步:第一步生成的视频里,第 N 帧就是"系统应该到达的目标画面",所以第二步只需要一个目标到达策略(goal-reaching policy) π(a0:n∣o0,on)\pi(a_{0:n} \mid o_0, o_n)π(a0:no0,on)——输入当前画面和目标画面,输出动作序列。这就是为什么底层策略可以做得又小又轻:它不用理解语言、不用规划,只需要"看着目标图抄近路"。

2.2 诊断先行:为什么直接微调 T2V 不行

第 1.3 节的三大病已经摆出来了。这里补充一个作者做的漂亮实验——交叉注意力可视化(论文 Fig. 3):从指令里挑词(比如"take out from"、“cup”),提取模型的 cross-attention map,看模型能不能把词正确地"锚定"到画面区域。

结果:直接 SFT 的 CogVideoX-5B 对运动相关词汇(“take out from”)的注意力撒胡椒面,找不到有意义的区域,运动锚定失败;对物体词汇(“cup”、“steamer”)高亮了一堆错误区域。而引入光流引导后,运动词能激活预期运动和目标物体区域,物体词能精确分割出相关区域并滤掉背景噪声。

这个实验说明了光流的真正作用:它不只是给生成加了个"运动提示",它重塑了语言→视觉的 grounding。有了光流当中间锚点,语言指令里的动作语义被具体化成了像素级的位移场,“place it” 这种模糊指令终于有了明确的落点。

2.3 Stage 1:Text-to-Flow —— 用"流视频"骗过预训练 VAE

第一阶段要学 vF∼pθf(vF∣o0,l)v_F \sim p_{\theta_f}(v_F \mid o_0, l)vFpθf(vFo0,l)——给定初始观察和语言指令,生成光流序列

F0:N=(f0→1,…,f0→N)∈RN×H×W×2F_{0:N} = (f_{0\to 1}, \ldots, f_{0\to N}) \in \mathbb{R}^{N \times H \times W \times 2}F0:N=(f01,,f0N)RN×H×W×2

其中每个 f0→tf_{0\to t}f0t 是从初始观察 o0o_0o0 到未来观察 oto_tot 的位移场,逐像素把 ppp 映射到 p′=p+f0→t(p)p' = p + f_{0\to t}(p)p=p+f0t(p)。注意这里是"首帧到每一帧"的长时程光流,不是相邻帧的短时光流——这样整个预测天然保持了时序一致性(所有流都锚定在 o0o_0o0 上),也和视频编码里 “long-term reference frame” 的思想暗合。

第一个工程难题:模态鸿沟。 光流是 2 通道(u, v),RGB 是 3 通道,CogVideoX 的预训练 VAE 只认 RGB。先前工作(Motion-I2V)的做法是从头训练一个光流 VAE,把模型从 RGB 域迁移到运动矢量域——但这需要网络级数据量去喂,双臂任务根本给不起。

CogRobot 的解法堪称"用编码知识反哺 AI"的教科书案例:不训新 VAE,把光流编码成伪彩色图。对每条光流 f=(u,v)f = (u, v)f=(u,v)

  1. 算幅值和角度:∥f∥=u2+v2\|f\| = \sqrt{u^2 + v^2}f=u2+v2θ=atan2⁡(−v,−u)\theta = \operatorname{atan2}(-v, -u)θ=atan2(v,u)
  2. 方向查 RAFT 风格的色轮(color wheel)得到色相,幅值决定饱和度;
  3. 逐帧转换,把 F0:NF_{0:N}F0:N 变成 vF∈RN×H×W×3v_F \in \mathbb{R}^{N \times H \times W \times 3}vFRN×H×W×3 的"流视频"。

这一转换是纯规则的、零参数的、零训练的,计算开销和训练成本相比可以忽略,却完美消除了 2 通道 vs 3 通道的格式鸿沟,让预训练 VAE 原封不动地用。视频编码老炮看到这里应该会心一笑:这不就是 HEVC 里把 MV 语法层信息可视化调试图的做法吗?运动矢量图本身就是调试编码器时最直观的工具,现在它成了生成模型的输入格式。atan2 里那个 −v-vv(y 轴翻转)是图像坐标系 y 向下的锅,写代码时最容易漏。

训练上,完全沿用视频扩散的标准配方:冻结 VAE,把流视频编码成隐变量 zf0z_f^0zf0,加噪到 zfkz_f^kzfk,微调 DiT(扩散 Transformer)预测噪声,损失是标准的去噪 MSE(见公式 2)。真值光流用 FlowFormer++ 从数据集视频里离线提取。

2.4 Stage 2:Flow-to-Video —— 学习版运动补偿

第二阶段学 v∼pθv(⋅∣o0,l,vF)v \sim p_{\theta_v}(\cdot \mid o_0, l, v_F)vpθv(o0,l,vF)——在光流引导下生成双臂轨迹视频。

架构上(论文 Fig. 7)做的是通道维拼接(channel concatenation)

  1. 流视频 vFv_FvF 和真实双臂视频 vvv 分别用同一个冻结的 CogVideoX 3D VAE 编码,得到 zfz_fzfzv0z_v^0zv0
  2. zv0z_v^0zv0 按标准流程加噪得 zvkz_v^kzvk
  3. 拼接 zk=[zvk,zf]z^k = [z_v^k, z_f]zk=[zvk,zf](通道维),连同文本编码一起送入 DiT;
  4. 模型学预测视频隐变量的噪声(见公式 3)。

这里有个值得琢磨的对比:现有的"动作条件世界模型"(IRASim、AVID 等)把低层动作作为独立模态喂进去,需要大量带动作标注的轨迹;而光流是高层语义信息——它不区分"这是左臂第 3 关节还是右臂第 5 关节",只区分"哪个像素往哪动了多少"。恰恰是这种抽象,让模型不需要理解异构动作语法就能抓住运动本质。类比编码:动作输入相当于要求解码器理解完整码流语法,光流输入相当于只给运动信息做预测——后者天然跨标准兼容

2.5 Stage 3:Diffusion Policy —— 从"想到"到"做到"

第三阶段是最轻的:训练目标到达策略 π(a0:n∣o0,on)\pi(a_{0:n} \mid o_0, o_n)π(a0:no0,on),骨干用 Diffusion Policy。训练时随机采样目标步数 n∼U(1,nmax)n \sim \mathcal{U}(1, n_{max})nU(1,nmax),对动作序列 a0:na_{0:n}a0:n 加噪,学去噪(公式 4)。

架构细节(附录 C.1):两个 ResNet-18,一个编码目标图像 ono_non,一个编码历史观测序列,特征拼接后进扩散策略。实现直接用了 RoboTwin 开源代码。

部署闭环:真机上迭代执行"当前观测 → text-to-flow → flow-to-video → 得到未来目标帧 → 目标到达策略输出动作 → 执行 → 新观测",滚动规划。相当于把视频生成模型变成了一个每步都在"预演未来"的高层规划器(high-level planner),底层策略只负责走完每一段路。

2.6 平台工程:Vision Pro 遥操作

数据采集这块论文也下了功夫(附录 A),设计了一套 Vision Pro 遥操作系统:6D 腕部位姿(4×4 齐次变换矩阵 ThandT_{hand}Thand)+ 手指关节位置,经两次坐标变换转成机械臂指令:

Tarm=T1⋅Thand⋅T2T_{arm} = T_1 \cdot T_{hand} \cdot T_2Tarm=T1ThandT2

  • 左乘 T1T_1T1:坐标系对齐——旋转分量对齐 Vision Pro 和机械臂的坐标轴,平移分量对齐原点;
  • 右乘 T2T_2T2:位姿定义对齐——不同坐标系对"初始位姿"的定义不同,同一个旋转在不同约定下数值不同,T2T_2T2 绕末端执行器自身轴做欧拉旋转修正。

做过相机标定、手眼标定的人对这对左右乘的语义一定不陌生——这就是变位姿链的标准写法。捏合手指距离归一化到 [0,1] 映射夹爪开度。控制频率 60 Hz,每帧把目标位姿直接发给控制器做逆运动学,找到合法解且关节角变化不大就直接执行、不做额外轨迹规划——简单粗暴但适合需要高频实时位姿更新的场景。每任务采 100 条人类演示。


3. 公式

论文的核心公式一共 5 个,个个都有值得咂摸的细节。

3.1 光流的幅值与角度(公式 1)

∥f∥=u2+v2,θ=atan2⁡(−v,−u)(1)\|f\| = \sqrt{u^2 + v^2}, \qquad \theta = \operatorname{atan2}(-v, -u) \tag{1}f=u2+v2,θ=atan2(v,u)(1)

符号含义备注
f=(u,v)f = (u, v)f=(u,v)像素级位移场,u 为水平位移、v 为垂直位移由 FlowFormer++ 从真值视频提取
∣f∣|f|f光流幅值决定伪彩色的饱和度,幅值越大颜色越浓
θ\thetaθ光流方向角决定伪彩色的色相,查 RAFT 色轮

三个细节:其一atan2⁡(−v,−u)\operatorname{atan2}(-v, -u)atan2(v,u) 里的负号是把图像坐标系(y 向下)翻转到数学坐标系(y 向上),保证色轮方向和直觉一致——漏了负号,上下方向全反,生成的流视频会"倒着动";其二,角度用 atan2 而不是 atan,才能覆盖完整 [0,2π)[0, 2\pi)[0,2π) 象限;其三,幅值映射饱和度意味着静止像素是白色/灰色——这也是为什么后面真值流视频开头会垫一张纯白图(见 3.6),静止帧在流视频里天然是"白帧"。

3.2 文生光流的去噪目标(公式 2)

Lflow(θf)=Ek,ϵ,zf0,o,l[∥ϵf−ϵθf(zfk,k,o,l)∥2](2)L_{flow}(\theta_f) = \mathbb{E}_{k, \epsilon, z_f^0, o, l} \left[ \left\| \epsilon_f - \epsilon_{\theta_f}(z_f^k, k, o, l) \right\|^2 \right] \tag{2}Lflow(θf)=Ek,ϵ,zf0,o,l[ϵfϵθf(zfk,k,o,l)2](2)

符号含义
zf0z_f^0zf0真值流视频经冻结 VAE 编码的隐变量
{zfk}k=0K\{z_f^k\}_{k=0}^K{zfk}k=0K逐步加噪后的隐变量,kkk 为去噪步
ϵf\epsilon_fϵf加入的真实噪声
ϵθf(⋅)\epsilon_{\theta_f}(\cdot)ϵθf()DiT 网络:输入噪声隐变量 + 时间步 + 观测 + 语言,预测噪声
o,lo, lo,l条件:初始观察 o0o_0o0 和语言指令 lll

标准的 DDPM 噪声预测目标。值得注意的是条件里只有 o0o_0o0lll——没有任何动作输入,这正是"actionless"路线的卖点。

3.3 流引导视频生成的去噪目标(公式 3)

Lvideo(θv)=Ek,ϵv,o,l,(zv0,zf)[∥ϵv−ϵθv(zk,k,o,l)∥2],zk=[zvk,zf](3)L_{video}(\theta_v) = \mathbb{E}_{k, \epsilon_v, o, l, (z_v^0, z_f)} \left[ \left\| \epsilon_v - \epsilon_{\theta_v}(z^k, k, o, l) \right\|^2 \right], \qquad z^k = [z_v^k, z_f] \tag{3}Lvideo(θv)=Ek,ϵv,o,l,(zv0,zf)[ϵvϵθv(zk,k,o,l)2],zk=[zvk,zf](3)

与公式 2 结构完全对称,唯一区别是网络输入 zkz^kzk噪声视频隐变量与流隐变量在通道维的拼接。这个设计的巧妙处在于:流隐变量 zfz_fzf 是干净的(不加噪)——它作为条件恒定存在,相当于给每一步去噪都提供一个稳定的运动"路由表",而不是一个同样在退火的模糊提示。对比编码里的说法:流是边信息(side information),且这条边信息信道是无损的。

3.4 目标到达扩散策略的训练目标(公式 4)

Lpolicy(θπ)=Ek,ϵπ,(s0,a0:n0),n∼U(1,nmax)[∥ϵπ−ϵθπ(a0:nk,s0,sn,k)∥2](4)L_{policy}(\theta_\pi) = \mathbb{E}_{k, \epsilon_\pi, (s_0, a_{0:n}^0), n \sim \mathcal{U}(1, n_{max})} \left[ \left\| \epsilon_\pi - \epsilon_{\theta_\pi}(a_{0:n}^k, s_0, s_n, k) \right\|^2 \right] \tag{4}Lpolicy(θπ)=Ek,ϵπ,(s0,a0:n0),nU(1,nmax)[ϵπϵθπ(a0:nk,s0,sn,k)2](4)

符号含义
nnn目标步数,均匀随机采样 n∼U(1,nmax)n \sim \mathcal{U}(1, n_{max})nU(1,nmax)
a0:n0a_{0:n}^0a0:n0从当前到第 nnn 步的真值动作序列
s0,sns_0, s_ns0,sn当前状态和目标状态(推理时即当前观测与预测视频的目标帧)

训练时随机 nnn 是关键技巧:让同一个策略学会"到达任意中间目标",推理时不管视频模型给出的目标帧落在轨迹的哪一步,策略都能接得住。这也是滚动部署能 work 的前提。

3.5 遥操作坐标变换(公式 5)

Tarm=T1⋅Thand⋅T2(5)T_{arm} = T_1 \cdot T_{hand} \cdot T_2 \tag{5}Tarm=T1ThandT2(5)

T1T_1T1 左乘做坐标系对齐(轴向 + 原点),T2T_2T2 右乘做位姿定义修正(绕末端自身轴的欧拉旋转)。每时间步执行一次,生成连续轨迹。

3.6 隐式的公式:数据预处理的采样逻辑

附录里还有一段没有编号但同样重要的"公式"——视频切帧策略。所有视频统一到 256×256、固定 17 帧。由于双臂轨迹动作细微,逐帧采样会产生大量几乎无变化的静止帧,所以:训练集用固定采样 stride(RDT/RoboMIND 为 4,RoboTwin/Realman 为 1)定起点 + 降采样间隔(2 或 4)抽帧;验证集用更大 stride(16)降评测成本。光流真值是帧 0 到帧 iiii∈[1,…,16]i \in [1,\ldots,16]i[1,,16])的流序列拼接,前面垫一张纯白图凑满 17 帧(流视频里静止 = 白),并过滤低幅值光流帧。


4. 图示

4.1 整体流水线(对应论文 Fig. 1)

                          ┌─────────────────────────────────────────────────┐
                          │              CogRobot 三段式流水线               │
                          └─────────────────────────────────────────────────┘

   语言指令 l ──┐                    Stage 1: Text-to-Flow
                │   ┌────────────────────────────────────────────┐
   初始观测 o ──┼──►│  CogVideoX-2B DiT (微调) + 冻结 3D VAE      │
                │   │  输入: 噪声流视频隐变量 + o + l              │
                │   │  输出: 未来光流序列 → 伪彩色流视频 v_F        │──┐
                │   └────────────────────────────────────────────┘  │
                │                                                   ▼
                │   ┌────────────────────────────────────────────┐
                └──►│  Stage 2: Flow-to-Video                    │
                    │  z^k = [噪声视频隐变量 z_v^k ‖ 流隐变量 z_f] │
                    │  (通道维拼接, "学习版运动补偿")               │
                    │  输出: 未来双臂轨迹视频, 目标帧 o_N           │──┐
                    └────────────────────────────────────────────┘  │
                                                                    ▼
                    ┌────────────────────────────────────────────┐
                    │  Stage 3: Goal-reaching Diffusion Policy   │
                    │  双 ResNet-18 编码 [o_当前, o_目标] → 动作   │
                    │  π(a_{0:n} | o_0, o_n)                     │
                    └────────────────────────────────────────────┘
                                                                    │
                                                                    ▼
                                                     机械臂执行 → 新观测 → 滚动闭环

4.2 流视频伪彩色的信息结构(对应公式 1)

   光流场 f=(u,v)                      伪彩色流视频 v_F
  ┌──────────────┐                  ┌──────────────────────┐
  │ 每像素 (u,v)  │   幅值→饱和度     │  色相 = 运动方向       │
  │  u: 水平位移  │  ──────────────► │  饱和度 = 运动速度     │
  │  v: 垂直位移  │  方向→色相        │  白色 = 静止区域       │
  └──────────────┘  (RAFT 色轮)      │  (背景/未动区域天然白)  │
      2 通道                         └──────────────────────┘
                                          3 通道 ✓ VAE 直接吃

对比一下两条技术路线:

路线 A:从头训光流 VAE(Motion-I2V)路线 B:伪彩色流视频(CogRobot)
需要新参数是(整个 VAE)否(零参数规则变换)
数据需求网络级与下游微调同量级
预训练先验部分丢失(模态迁移)完整保留
计算开销可忽略

4.3 与视频编码的概念映射表

这篇论文对编解码背景读者最大的红利,是几乎每个组件都能找到编码世界的对应物:

CogRobot视频编码对应物相似点
光流 / 流视频运动矢量场(MVF)+ MV 可视化逐像素位移的稠密表示
flow-to-video运动补偿预测(MCP)用 MV 从参考帧推导未来帧
text-to-flow 的失败模式MV 预测失准 → 残差爆炸运动估计是整条链路的地基
流隐变量作为干净条件无损边信息信道条件不去噪,恒定可靠
视频统一跨本体表示统一像素域 vs 各异码流语法在最通用的表示层做统一
伪彩色流(零参数域适配)MV 图直接可视化调试规则映射,无需学习
滚动"预测→执行"滚动 I 帧 / GOP 刷新周期性重锚定,防误差累积

4.4 双臂平台与数据采集(对应论文 Fig. 1a / Fig. 6)

        ┌─────────────── Vision Pro 遥操作端 ───────────────┐
        │  6D 腕部位姿 T_hand + 手指关节                      │
        └──────────────────────┬───────────────────────────┘
                               │  T_arm = T1 · T_hand · T2
                               │  (左乘: 坐标系对齐 / 右乘: 位姿约定修正)
                               ▼
   ┌────────────────────────────────────────────────────────┐
   │  Realman 7-DoF 左臂          Realman 7-DoF 右臂         │
   │    [夹爪]                      [夹爪]                    │
   │        ╲                        ╱                       │
   │         ╲──────  桌面场景 ──────╱                        │
   │                (柔性物: 绳/袋)                           │
   │                      ▲                                  │
   │                      │ 单视角 RGB                       │
   │              ┌───────┴───────┐                         │
   │              │ RealSense 相机 │ (L515 / D435)          │
   └──────────────┴───────────────┴─────────────────────────┘
        控制频率 60Hz, 捏合距离→夹爪开度, 每任务 100 条演示

5. 踩坑点

这一节按"范式级 / 工程级"分类,把论文承认的坑和论文没明说但藏在细节里的坑一起挖出来。

5.1 范式级(方法本身的边界)

坑 1:每个任务仍需单独训练底层策略。 这是论文结论里亲口承认的最大限制——视频预测模型是通用的高层规划器,但"从目标帧抠动作"的目标到达策略是 per-task 训练的(每个任务 100 条演示 + 单独训一个扩散策略)。也就是说 CogRobot 目前是"通用大脑 + 专用小脑",离真正的通用策略还差一个统一的 action decoder。类比编码:高层语法统一了,但每个" profile"还得单独适配。

坑 2:Block Handover 和 Pick Apple Messy 上翻车。 看 Table 1(下一节详述),CogRobot 在 Block Handover 只有 36.0%,被 DP3 的 86.0% 和 RDT 的 70.0% 大幅超越;Pick Apple Messy 也只有 15.0%,输给 DP3(68.7% 带颜色)。这不是偶然——这两个任务要么需要精细的双臂交接(遮挡频繁),要么是"messy"场景下的单物体抓取(物体外观变化大)。视频生成路线在遮挡严重、目标外观非刚性的场景里,预测的目标帧本身就不可靠,底层策略再准也没用。生成模型"脑补"的目标帧要是脑补错了,策略就是精确地走向错误。

坑 3:语言指令的模糊性只被缓解、未被消除。 光流中间变量缓解了"place it"级别的模糊,但 text-to-flow 模型自己也要从模糊指令里猜运动——任务混淆问题(相似初始观察触发错误子任务)在流预测阶段同样存在,只是被注意力可视化证明"缓解了"而非"解决了"。

坑 4:真值光流来自 FlowFormer++, inheriting 其误差。 训练阶段的 GT 光流本身是另一个网络估的,FlowFormer++ 在机械臂精细运动、反光表面、纹理缺失区域的光流估计误差会直接进入训练目标。这是"用模型 A 的输出训模型 B"的经典链式误差问题。

5.2 工程级(实现细节里的雷)

坑 5:光流伪彩色的 y 轴翻转。 公式 1 的 atan2⁡(−v,−u)\operatorname{atan2}(-v, -u)atan2(v,u),两个负号都不能丢。图像 y 轴向下,不翻转的话上下运动方向在色轮上是反的——流视频会教模型"倒着动"。这类 bug 在训练时不会报错,只会让模型学出扭曲的运动先验,非常隐蔽。

坑 6:静止帧污染。 双臂操作动作细微,逐帧切出来大量几乎不动的片段。论文的对策是三件套:训练集采样 stride 4 + 降采样间隔 2(RoboTwin/Realman 是 stride 1 + 间隔 4)、过滤低幅值光流帧、流视频开头垫纯白帧。少做任何一件,模型都会学到大量"什么都不发生"的先验,预测出的视频缺乏运动。这和编码里处理静止宏块跳过(skip)的逻辑同源——静止信息没有价值,应该被机制性地剔除而非稀释。

坑 7:官方 CogVideoX-2B 不支持图像条件。 论文用的其实是社区版(alibaba-pai 的 CogVideoX-Fun-V1.1-2b-InP),因为官方 2B 版无法输入初始观察。复现时如果拿官方权重硬训,会发现模型根本"看不见"当前画面——生成的视频和初始观测完全脱钩。

坑 8:验证集 stride 放大。 验证集用 stride 16(训练集是 4),目的是降评测成本,但这意味着验证分布和训练分布有系统性偏移。复现 Table 3 数字时如果对不上,先检查这个。

坑 9:真机部署的滚动规划开销。 部署时每步都要跑两个扩散模型的完整去噪链(text-to-flow + flow-to-video)来生成新目标,论文没报告单步延迟,但 2B DiT 的多步去噪在真机控制环里绝不是小开销——滚动规划的"规划频率"受限于视频生成速度,这是所有"生成模型当规划器"路线的通病。


6. 源码拆解

论文未开源官方实现(截至写作时),以下伪代码严格按论文正文 + 附录 C 的描述重建,标注了对应出处。可以当作复现的施工图。

6.1 数据预处理流水线(对应附录 C.2 + Table 5)

# 伪代码:对应论文附录 C.2 数据预处理描述
DATASETS = {
    #          采样stride  降采样间隔    样本数
    "RDT":      {"stride": 4, "skip": 2, "n": 157_912, "val_stride": 16},
    "RoboMIND": {"stride": 4, "skip": 2, "n": 198_789, "val_stride": 16},
    "RoboTwin": {"stride": 1, "skip": 4, "n": 106_771},
    "Realman":  {"stride": 1, "skip": 4, "n": 12_866},
}
CLIP_LEN, RES = 17, (256, 256)

def build_clip(video, stride, skip):
    # 固定 stride 定起点,skip 间隔抽帧 —— 对抗双臂轨迹的"静止帧污染"(坑 6)
    starts = range(0, len(video), stride)
    clips = [video[s : s + CLIP_LEN * skip : skip] for s in starts]
    return [resize(c, RES) for c in clips if len(c) == CLIP_LEN]

def build_flow_video(clip):
    # 真值光流:FlowFormer++ 提取帧0→帧i 的长时程光流(i = 1..16)
    flows = [flowformer_plus_plus(clip[0], clip[i]) for i in range(1, 17)]
    flows = [f for f in flows if magnitude(f).mean() > TAU]   # 过滤低幅值流
    flow_frames = [flow_to_colorwheel(f) for f in flows]       # 公式 1
    return concat([WHITE_FRAME] + flow_frames)[:CLIP_LEN]      # 垫白帧凑 17 帧

6.2 光流转伪彩色(对应公式 1,RAFT 色轮)

# 伪代码:对应公式 1 与文献[21] (RAFT) 的色轮映射
def flow_to_colorwheel(f):
    u, v = f[..., 0], f[..., 1]
    mag = np.sqrt(u**2 + v**2)                 # 幅值 → 饱和度
    theta = np.arctan2(-v, -u)                 # 注意负号:图像 y 轴翻转(坑 5)
    hue = colorwheel_lookup(theta)             # 方向 → 色相(RAFT 色轮查表)
    sat = np.clip(mag / MAG_MAX, 0, 1)         # 幅值归一化
    return hsv_to_rgb(hue, sat, np.ones_like(sat))  # 2ch → 3ch, 零参数

6.3 两阶段扩散模型训练(对应公式 2 / 3,附录 C.1 & C.3)

# 伪代码:对应论文 Fig. 7 架构与公式 2/3
# 底座: alibaba-pai/CogVideoX-Fun-V1.1-2b-InP (社区版, 支持图像条件, 坑 7)
# 超参: AdamW, lr=2e-5, warmup 100 步; 4×H100-80G, batch 128/GPU
# 步数: text-to-flow 20k, flow-to-video 30k (RDT+RoboMIND);
#       RoboTwin 各 15k; Realman 各 5k (下游二段微调)

vae = freeze(CogVideoX_3D_VAE())          # VAE 全程冻结
dit_flow  = load_pretrained_CogVideoX_2B()  # Stage 1 网络
dit_video = load_pretrained_CogVideoX_2B()  # Stage 2 网络

def train_text_to_flow(batch):                     # 公式 2
    z0 = vae.encode(batch.flow_video)              # 冻结 VAE 编码流视频
    k, eps = sample_timestep_and_noise(z0)         # 加噪
    pred = dit_flow(z0 + eps, k, cond=batch.obs0_text)
    loss = mse(eps, pred)                          # 预测噪声的 MSE
    loss.backward()

def train_flow_to_video(batch):                    # 公式 3
    zf  = vae.encode(batch.flow_video)             # 流隐变量: 干净, 不加噪!
    zv0 = vae.encode(batch.bimanual_video)         # 视频隐变量: 加噪
    k, eps = sample_timestep_and_noise(zv0)
    zk = channel_concat(zv0 + eps, zf)             # 通道维拼接 [z_v^k ‖ z_f]
    pred = dit_video(zk, k, cond=batch.obs0_text)
    loss = mse(eps, pred)
    loss.backward()

# 两段式微调: 先在 RDT+RoboMIND 混合集上各训 20k/30k 步,
# 再以微调后的模型为底座, 在 RoboTwin (15k) 或 Realman (5k) 上二段微调

6.4 底层目标到达策略(对应公式 4,附录 C.1)

# 伪代码:对应 Diffusion Policy [22] + RoboTwin 官方实现
enc_goal = ResNet18()   # 编码目标图像 o_n
enc_obs  = ResNet18()   # 编码历史观测序列

def train_goal_reaching_policy(batch):             # 公式 4
    n = randint(1, N_MAX)                          # n ~ U(1, n_max): 关键技巧
    a = batch.actions[:n]                          # 真值动作序列 a_0:n
    k, eps = sample_timestep_and_noise(a)
    feat = concat([enc_goal(batch.obs[n]), enc_obs(batch.obs_history)])
    pred = policy_head(a + eps, feat, k)
    loss = mse(eps, pred)
    loss.backward()

6.5 真机滚动部署闭环(对应论文 5.3 节部署描述)

# 伪代码:对应论文 5.3 节 "iteratively generate new goals" 的部署流程
obs = camera.capture()                       # 单视角 RGB (L515)
while not task_done:
    flow_video = sample(dit_flow,  obs, instruction)   # Stage 1: 想象运动
    future     = sample(dit_video, obs, instruction, flow_video)  # Stage 2: 想象画面
    goal_frame = future[-1]                            # 目标帧 o_N
    action_seq = policy(obs, goal_frame)               # Stage 3: 抠动作
    robot.execute(action_seq)                          # 执行一段
    obs = camera.capture()                             # 重锚定, 滚动闭环

7. 效果对比

7.1 视频生成质量(论文 Table 3,最重要的表)

在 RDT / RoboMIND 验证集上,同底座、同分辨率(256×256)、同帧长(17 帧)对比:

RDT 验证集(1,757 样本)

方法PSNR ↑SSIM ↑LPIPS ↓FVD ↓
CogVideoX-2B-SFT19.6770.7840.1511222
CogVideoX-5B-SFT20.5020.8060.1321064
CogVideoX-2B-Flow (CogRobot)22.6630.8360.097760

RoboMIND 验证集(5,346 样本)

方法PSNR ↑SSIM ↑LPIPS ↓FVD ↓
CogVideoX-2B-SFT18.9280.8210.136848
CogVideoX-5B-SFT19.4180.8370.123740
CogVideoX-2B-Flow (CogRobot)21.9770.8640.085576

最惊人的数字:2B 参数 + 光流引导,在两个验证集上全面碾压 5B 参数直接微调——RDT 上 PSNR 领先 2.16 dB,FVD 从 1064 降到 760(降 28.6%);RoboMIND 上 FVD 从 740 降到 576(降 22.2%)。参数量砍掉 60%,效果反而更好。这就是光流中间表示的价值:它把"模型要学什么"从"运动 + 外观 + 语义"三合一压缩成了各自的专精任务。对编解码读者的直觉翻译:与其让一个 5B 的大编码器硬扛全部信息,不如先做一次高效的运动估计/运动补偿,让每层码流只承载自己该承载的信息——分层编码(scalable coding)的老智慧。

7.2 RoboTwin 仿真任务(论文 Table 1)

每个任务 10 随机种子 × 每种子 10 次评测,每任务 100 条训练演示:

任务DP3(点云)DP3(点云+色)RDT(多视角 RGB)DP(单视角 RGB)CogRobot(单视角 RGB)
Put Apple Cabinet74.7 ± 42.297.0 ± 2.622.0 ± 0.1082.0 ± 0.09100.0 ± 0.0
Block Handover67.3 ± 7.086.0 ± 15.170.0 ± 0.082.0 ± 0.0436.0 ± 0.11
Pick Apple Messy11.7 ± 5.568.7 ± 6.831.2 ± 0.083.0 ± 0.0715.0 ± 0.07
Container Place89.0 ± 7.573.3 ± 6.534.4 ± 0.0951.0 ± 0.1455.0 ± 0.07

读表要点:

  • Put Apple Cabinet 满分 100.0:长程多阶段任务(抓苹果 + 开柜 + 放入 + 关柜),视频模型的高层规划价值拉满——底层策略每步都有清晰的目标帧可抄;
  • 单视角是硬约束:同样是 DP 骨干,RDT 用三视角也只有 22.0,CogRobot 用单视角靠"预知未来"补回了信息差,这是"预测即增益"的直接证据;
  • 输的两场也别回避:Block Handover(双臂交接,遮挡重)和 Pick Apple Messy(杂乱场景抓取),生成式目标帧在这两类场景下不可靠,直接拖垮下限——这正是 5.1 节坑 2 的数据侧印证。

7.3 真机实验(论文 Table 2)

真实 Realman 双臂平台,每任务 100 条 Vision Pro 遥操作演示,20 次试验平均成功率:

方法Lift Bag(提袋)Pull Box(拉绳拉箱)
DP(单视角 RGB)0.500.05
CogRobot0.700.75

Pull Box 是全场最能说明问题的任务:多阶段(找绳 → 绕到箱后 → 双臂协同拉),柔性物体动力学完全超出传统策略的建模能力,DP 只有 5% 成功率近乎报废,CogRobot 干到 75%。任务越复杂、越需要长程协调,视频规划的增益越大——Lift Bag 从 0.50 → 0.70,Pull Box 从 0.05 → 0.75,增益幅度与任务复杂度正相关。

7.4 消融的本质

论文的消融(Table 3)实际上控制了两个变量之外的第三个:模型能力来源。2B-SFT、5B-SFT、2B-Flow 三者用同样的数据、同样的分辨率帧长,唯一区别是有没有光流中间表示。结论非常干净:光流引导带来的提升不是"更多参数"或"更多数据"能替代的,它改变的是信息在模型内的组织方式。


8. 总结

CogRobot 做的事情,本质上是在"语言"和"动作"之间插入了一个物理接地层(physically grounded intermediate)

   语言指令 ──► [光流: 运动的具体化] ──► [视频: 画面的具体化] ──► [动作: 意图的可执行化]
                 (text-to-flow)           (flow-to-video)           (diffusion policy)

它的核心洞察有三条,值得单独记住:

  1. 视频是跨本体的统一表示——不管动作空间多异构,动作的结果都可以统一成像素。与其统一动作语法,不如在像素域统一;
  2. 光流是运动的最小充分表示——它剥离外观、保留运动,恰好补上了语言指令最缺的信息。而且用零参数的伪彩色映射就能桥接 RGB 预训练先验,规避了从头训光流 VAE 的数据深渊;
  3. 分层"想象-执行"解耦——通用的大模型负责想象(规划),专用的小策略负责执行(每个任务 100 条演示即可),把数据需求压到最低。

它的边界同样清晰:per-task 底层策略、遮挡/杂乱场景的生成不可靠、滚动规划的推理开销、光流真值依赖另一个网络。这些坑每个都是后续工作的切入方向——尤其是"统一 action decoder"和"加速视频规划推理",是这条路线走向实用绕不开的两座山。

对视频编码背景的读者,最后留一个开放问题:CogRobot 用光流做条件,用的是双向光流的伪彩色表示;而现代编码器里的运动信息早就不止 MV——还有 AMVP 候选、merge 模式、仿射运动、SMVD。如果把这些结构化的运动语法(而不是裸光流场)作为生成模型的条件,会不会让运动表示更紧凑、更可解释?编码界三十年沉淀的运动估计智慧,在具身智能的世界模型里,恐怕还大有可挖的矿。


参考:arXiv:2505.24156v1 [cs.CV], 2025-05-30。本文所有数字均出自论文正文及附录 Table 1-5;伪代码为按论文描述重建的复现施工图,非官方源码。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐