CogRobot 论文深度解析:当视频编码的“老朋友“光流,成了机器人双臂操作的“中间表示“
CogRobot 论文深度解析:当视频编码的"老朋友"光流,成了机器人双臂操作的"中间表示"
一句话总结:把文生视频模型(CogVideoX)改造成机器人的"大脑皮层想象区"——先让它想象"手该怎么动"(光流),再想象"画面会变成什么样"(视频),最后让一个轻量扩散策略把想象变成可执行的关节角。而全场最妙的一步棋,是把我们视频编码圈玩了三十年的**光流(Optical Flow)**从"编码工具"升格成了"语言→动作的翻译中间件"。
1. 介绍
1.1 问题:双臂操作是机器人界的"立体声"
单臂机器人操作,相当于单声道;双臂操作(bimanual manipulation)是立体声——不是简单多一路,而是两路信号之间还要有相位协调。你想想人拧瓶盖:左手固定瓶身、右手旋转瓶盖,两个末端执行器之间存在动态的力学耦合与角色分工。这种协调性带来两个直接后果:
- 动作空间爆炸:两个 7-DoF 机械臂 + 两个夹爪,联合动作维度直接翻倍,而且双臂协作天然是多模态的(同样的任务有一堆合法的协作方式),数据覆盖要求极高;
- 数据极度稀缺:互联网上单臂机械臂视频都算稀有,高质量双臂遥操作数据更是凤毛麟角。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 里光流预测不准,后续视频生成就会"漂"。连踩的坑都一样。
这项工作的三个贡献:
- 提出了用 T2V 模型训练双臂基础策略的框架(CogRobot);
- 提出两阶段范式,用光流作为精简的视频表示,显著降低双臂数据需求(后面会看到,2B 模型 + 光流引导干翻了 5B 直接微调);
- 自建双臂平台(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}ot∈RH×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,…,aT−1] + 语言描述 lll。
策略要学的是 π(at:t+N−1∣ot,l)\pi(a_{t:t+N-1} \mid o_t, l)π(at:t+N−1∣ot,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:n∣o0,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)vF∼pθf(vF∣o0,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=(f0→1,…,f0→N)∈RN×H×W×2
其中每个 f0→tf_{0\to t}f0→t 是从初始观察 o0o_0o0 到未来观察 oto_tot 的位移场,逐像素把 ppp 映射到 p′=p+f0→t(p)p' = p + f_{0\to t}(p)p′=p+f0→t(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):
- 算幅值和角度:∥f∥=u2+v2\|f\| = \sqrt{u^2 + v^2}∥f∥=u2+v2,θ=atan2(−v,−u)\theta = \operatorname{atan2}(-v, -u)θ=atan2(−v,−u);
- 方向查 RAFT 风格的色轮(color wheel)得到色相,幅值决定饱和度;
- 逐帧转换,把 F0:NF_{0:N}F0:N 变成 vF∈RN×H×W×3v_F \in \mathbb{R}^{N \times H \times W \times 3}vF∈RN×H×W×3 的"流视频"。
这一转换是纯规则的、零参数的、零训练的,计算开销和训练成本相比可以忽略,却完美消除了 2 通道 vs 3 通道的格式鸿沟,让预训练 VAE 原封不动地用。视频编码老炮看到这里应该会心一笑:这不就是 HEVC 里把 MV 语法层信息可视化调试图的做法吗?运动矢量图本身就是调试编码器时最直观的工具,现在它成了生成模型的输入格式。atan2 里那个 −v-v−v(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)v∼pθv(⋅∣o0,l,vF)——在光流引导下生成双臂轨迹视频。
架构上(论文 Fig. 7)做的是通道维拼接(channel concatenation):
- 流视频 vFv_FvF 和真实双臂视频 vvv 分别用同一个冻结的 CogVideoX 3D VAE 编码,得到 zfz_fzf 和 zv0z_v^0zv0;
- 对 zv0z_v^0zv0 按标准流程加噪得 zvkz_v^kzvk;
- 拼接 zk=[zvk,zf]z^k = [z_v^k, z_f]zk=[zvk,zf](通道维),连同文本编码一起送入 DiT;
- 模型学预测视频隐变量的噪声(见公式 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:n∣o0,on),骨干用 Diffusion Policy。训练时随机采样目标步数 n∼U(1,nmax)n \sim \mathcal{U}(1, n_{max})n∼U(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=T1⋅Thand⋅T2
- 左乘 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_0o0 和 lll——没有任何动作输入,这正是"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),n∼U(1,nmax)[ϵπ−ϵθπ(a0:nk,s0,sn,k)2](4)
| 符号 | 含义 |
|---|---|
| nnn | 目标步数,均匀随机采样 n∼U(1,nmax)n \sim \mathcal{U}(1, n_{max})n∼U(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=T1⋅Thand⋅T2(5)
T1T_1T1 左乘做坐标系对齐(轴向 + 原点),T2T_2T2 右乘做位姿定义修正(绕末端自身轴的欧拉旋转)。每时间步执行一次,生成连续轨迹。
3.6 隐式的公式:数据预处理的采样逻辑
附录里还有一段没有编号但同样重要的"公式"——视频切帧策略。所有视频统一到 256×256、固定 17 帧。由于双臂轨迹动作细微,逐帧采样会产生大量几乎无变化的静止帧,所以:训练集用固定采样 stride(RDT/RoboMIND 为 4,RoboTwin/Realman 为 1)定起点 + 降采样间隔(2 或 4)抽帧;验证集用更大 stride(16)降评测成本。光流真值是帧 0 到帧 iii(i∈[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-SFT | 19.677 | 0.784 | 0.151 | 1222 |
| CogVideoX-5B-SFT | 20.502 | 0.806 | 0.132 | 1064 |
| CogVideoX-2B-Flow (CogRobot) | 22.663 | 0.836 | 0.097 | 760 |
RoboMIND 验证集(5,346 样本)
| 方法 | PSNR ↑ | SSIM ↑ | LPIPS ↓ | FVD ↓ |
|---|---|---|---|---|
| CogVideoX-2B-SFT | 18.928 | 0.821 | 0.136 | 848 |
| CogVideoX-5B-SFT | 19.418 | 0.837 | 0.123 | 740 |
| CogVideoX-2B-Flow (CogRobot) | 21.977 | 0.864 | 0.085 | 576 |
最惊人的数字: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 Cabinet | 74.7 ± 42.2 | 97.0 ± 2.6 | 22.0 ± 0.10 | 82.0 ± 0.09 | 100.0 ± 0.0 |
| Block Handover | 67.3 ± 7.0 | 86.0 ± 15.1 | 70.0 ± 0.08 | 2.0 ± 0.04 | 36.0 ± 0.11 |
| Pick Apple Messy | 11.7 ± 5.5 | 68.7 ± 6.8 | 31.2 ± 0.08 | 3.0 ± 0.07 | 15.0 ± 0.07 |
| Container Place | 89.0 ± 7.5 | 73.3 ± 6.5 | 34.4 ± 0.09 | 51.0 ± 0.14 | 55.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.50 | 0.05 |
| CogRobot | 0.70 | 0.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)
它的核心洞察有三条,值得单独记住:
- 视频是跨本体的统一表示——不管动作空间多异构,动作的结果都可以统一成像素。与其统一动作语法,不如在像素域统一;
- 光流是运动的最小充分表示——它剥离外观、保留运动,恰好补上了语言指令最缺的信息。而且用零参数的伪彩色映射就能桥接 RGB 预训练先验,规避了从头训光流 VAE 的数据深渊;
- 分层"想象-执行"解耦——通用的大模型负责想象(规划),专用的小策略负责执行(每个任务 100 条演示即可),把数据需求压到最低。
它的边界同样清晰:per-task 底层策略、遮挡/杂乱场景的生成不可靠、滚动规划的推理开销、光流真值依赖另一个网络。这些坑每个都是后续工作的切入方向——尤其是"统一 action decoder"和"加速视频规划推理",是这条路线走向实用绕不开的两座山。
对视频编码背景的读者,最后留一个开放问题:CogRobot 用光流做条件,用的是双向光流的伪彩色表示;而现代编码器里的运动信息早就不止 MV——还有 AMVP 候选、merge 模式、仿射运动、SMVD。如果把这些结构化的运动语法(而不是裸光流场)作为生成模型的条件,会不会让运动表示更紧凑、更可解释?编码界三十年沉淀的运动估计智慧,在具身智能的世界模型里,恐怕还大有可挖的矿。
参考:arXiv:2505.24156v1 [cs.CV], 2025-05-30。本文所有数字均出自论文正文及附录 Table 1-5;伪代码为按论文描述重建的复现施工图,非官方源码。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)