【unifolm_wla】从动作语言到连续机器人控制

本文目录

  • UnifoLM-WLA-1.0:从动作语言到连续机器人控制
    • 一、先看整体架构
    • 二、为什么要统一动作和状态输入
      • [2.1 统一输入是为了跨机器人共享模型](#2.1 统一输入是为了跨机器人共享模型)
      • [2.2 统一输入不等于自动解决机器人差异](#2.2 统一输入不等于自动解决机器人差异)
      • [2.3 不同部位采用不同的归一化方式](#2.3 不同部位采用不同的归一化方式)
      • [2.4 重力观测:描述倾斜状态,不等于重力补偿](#2.4 重力观测:描述倾斜状态,不等于重力补偿)
    • 三、什么是"相对当前位姿"的动作
      • [3.1 绝对位姿和相对位姿](#3.1 绝对位姿和相对位姿)
      • [3.2 A/B 例子:末端朝向不同,局部动作相同](#3.2 A/B 例子:末端朝向不同,局部动作相同)
      • [3.3 它和 VLA 是什么关系](#3.3 它和 VLA 是什么关系)
    • [四、World Model 体现在哪里](#四、World Model 体现在哪里)
      • [4.1 它不是预测完整未来视频](#4.1 它不是预测完整未来视频)
      • [4.2 为什么这算 World Model](#4.2 为什么这算 World Model)
      • [4.3 WLA 推理时会不会先生成 mask](#4.3 WLA 推理时会不会先生成 mask)
    • [五、RVQ 如何把动作变成"动作语言"](#五、RVQ 如何把动作变成“动作语言”)
      • [5.1 三类动作分别量化](#5.1 三类动作分别量化)
      • [5.2 RVQ 的基本原理](#5.2 RVQ 的基本原理)
      • [5.3 为什么需要 START 和 END token](#5.3 为什么需要 START 和 END token)
    • [六、RVQ 后的动作如何被使用](#六、RVQ 后的动作如何被使用)
      • [6.1 ER-Flow 预训练阶段](#6.1 ER-Flow 预训练阶段)
      • [6.2 WLA 连续动作阶段](#6.2 WLA 连续动作阶段)
    • [七、VLM hidden states 如何传给 MMDiT](#七、VLM hidden states 如何传给 MMDiT)
      • [7.1 VLM 输出不是 Q/K/V](#7.1 VLM 输出不是 Q/K/V)
      • [7.2 先做维度对齐](#7.2 先做维度对齐)
      • [7.3 再用 WQ、WK、WV 生成 Q/K/V](#7.3 再用 WQ、WK、WV 生成 Q/K/V)
      • [7.4 两条流进行联合注意力](#7.4 两条流进行联合注意力)
      • [7.5 RMSNorm 是什么](#7.5 RMSNorm 是什么)
    • [八、Flow Matching:训练时到底对什么加噪](#八、Flow Matching:训练时到底对什么加噪)
    • 十、这个方案的核心创新如何理解
      • [10.1 用未来动态区域学习交互中心的视觉表示](#10.1 用未来动态区域学习交互中心的视觉表示)
      • [10.2 用分组 RVQ 把机器人动作变成动作语言](#10.2 用分组 RVQ 把机器人动作变成动作语言)
      • [10.3 用统一动作空间实现跨本体先验迁移](#10.3 用统一动作空间实现跨本体先验迁移)
      • [10.4 离散语义理解和连续控制分工](#10.4 离散语义理解和连续控制分工)
    • 十一、常见问题
      • [问题 1:统一输入是不是为了适配不同机器人?](#问题 1:统一输入是不是为了适配不同机器人?)
      • [问题 2:相对位姿是不是相邻两帧相减?](#问题 2:相对位姿是不是相邻两帧相减?)
      • [问题 3:VLM hidden states 经过 Linear 后是 W Q W_Q WQ 还是 Q Q Q?](#问题 3:VLM hidden states 经过 Linear 后是 W Q W_Q WQ 还是 Q Q Q?)
      • [问题 4:训练 MMDiT 时会不会把 VLM hidden states 做 VQ?](#问题 4:训练 MMDiT 时会不会把 VLM hidden states 做 VQ?)
      • [问题 5:在线控制时必须先预测 mask token 吗?](#问题 5:在线控制时必须先预测 mask token 吗?)
    • 十二、一条完整的心智模型

UnifoLM-WLA-1.0:从动作语言到连续机器人控制

本文根据 UnifoLM-WLA-1.0 项目主页、仓库文档和公开代码整理。项目主页介绍了 UnifoLM-ER-Flow 的多模态预训练思路,当前仓库主要公开了 WLA 动作专家的训练、微调、评估和服务代码。阅读时需要区分两条路径:ER-Flow 预训练路径 和WLA 连续控制路径。

一、先看整体架构

UnifoLM-WLA 可以理解为两阶段模型:

  1. UnifoLM-ER-Flow 主干预训练:把图像、语言、离散动作 token 和未来动态区域 mask token 放到同一个 VLM 中学习。
  2. WLA 动作专家训练:读取 VLM 的隐藏特征,用 MMDiT flow matching 直接生成连续机器人动作。

#mermaid-svg-3GswzYTpK9bj4UKD{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3GswzYTpK9bj4UKD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3GswzYTpK9bj4UKD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3GswzYTpK9bj4UKD .error-icon{fill:#552222;}#mermaid-svg-3GswzYTpK9bj4UKD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3GswzYTpK9bj4UKD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3GswzYTpK9bj4UKD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3GswzYTpK9bj4UKD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3GswzYTpK9bj4UKD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3GswzYTpK9bj4UKD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3GswzYTpK9bj4UKD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3GswzYTpK9bj4UKD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3GswzYTpK9bj4UKD .marker.cross{stroke:#333333;}#mermaid-svg-3GswzYTpK9bj4UKD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3GswzYTpK9bj4UKD p{margin:0;}#mermaid-svg-3GswzYTpK9bj4UKD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3GswzYTpK9bj4UKD .cluster-label text{fill:#333;}#mermaid-svg-3GswzYTpK9bj4UKD .cluster-label span{color:#333;}#mermaid-svg-3GswzYTpK9bj4UKD .cluster-label span p{background-color:transparent;}#mermaid-svg-3GswzYTpK9bj4UKD .label text,#mermaid-svg-3GswzYTpK9bj4UKD span{fill:#333;color:#333;}#mermaid-svg-3GswzYTpK9bj4UKD .node rect,#mermaid-svg-3GswzYTpK9bj4UKD .node circle,#mermaid-svg-3GswzYTpK9bj4UKD .node ellipse,#mermaid-svg-3GswzYTpK9bj4UKD .node polygon,#mermaid-svg-3GswzYTpK9bj4UKD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3GswzYTpK9bj4UKD .rough-node .label text,#mermaid-svg-3GswzYTpK9bj4UKD .node .label text,#mermaid-svg-3GswzYTpK9bj4UKD .image-shape .label,#mermaid-svg-3GswzYTpK9bj4UKD .icon-shape .label{text-anchor:middle;}#mermaid-svg-3GswzYTpK9bj4UKD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3GswzYTpK9bj4UKD .rough-node .label,#mermaid-svg-3GswzYTpK9bj4UKD .node .label,#mermaid-svg-3GswzYTpK9bj4UKD .image-shape .label,#mermaid-svg-3GswzYTpK9bj4UKD .icon-shape .label{text-align:center;}#mermaid-svg-3GswzYTpK9bj4UKD .node.clickable{cursor:pointer;}#mermaid-svg-3GswzYTpK9bj4UKD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3GswzYTpK9bj4UKD .arrowheadPath{fill:#333333;}#mermaid-svg-3GswzYTpK9bj4UKD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3GswzYTpK9bj4UKD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3GswzYTpK9bj4UKD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3GswzYTpK9bj4UKD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3GswzYTpK9bj4UKD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3GswzYTpK9bj4UKD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3GswzYTpK9bj4UKD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3GswzYTpK9bj4UKD .cluster text{fill:#333;}#mermaid-svg-3GswzYTpK9bj4UKD .cluster span{color:#333;}#mermaid-svg-3GswzYTpK9bj4UKD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3GswzYTpK9bj4UKD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3GswzYTpK9bj4UKD rect.text{fill:none;stroke-width:0;}#mermaid-svg-3GswzYTpK9bj4UKD .icon-shape,#mermaid-svg-3GswzYTpK9bj4UKD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3GswzYTpK9bj4UKD .icon-shape p,#mermaid-svg-3GswzYTpK9bj4UKD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3GswzYTpK9bj4UKD .icon-shape .label rect,#mermaid-svg-3GswzYTpK9bj4UKD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3GswzYTpK9bj4UKD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3GswzYTpK9bj4UKD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3GswzYTpK9bj4UKD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 预训练监督
预训练监督
相机图像
UnifoLM-ER-Flow / Qwen-VL
任务文字
当前机器人状态
VLM hidden states
MMDiT flow action expert
连续动作轨迹
当前帧 image_t0
构造预训练标签
未来帧 image_t1
future mask tokens
连续动作轨迹
三组 RVQ
离散 action tokens

最容易混淆的一点是:

  • RVQ token 是 ER-Flow 主干预训练时使用的"动作语言";
  • MMDiT 是 WLA 阶段把 VLM 表示转换成连续控制轨迹的动作专家;
  • 当前仓库的 QwenMMDiT 路径不会在每次控制时先生成 RVQ token,再把 token 解码成动作,而是直接把 VLM hidden states 交给 MMDiT。

二、为什么要统一动作和状态输入

2.1 统一输入是为了跨机器人共享模型

不同机器人具有不同的执行器和自由度:

  • 单臂机器人可能只有左臂和夹爪;
  • 双臂机器人具有左右末端执行器;
  • 人形机器人还需要腰、腿和底盘动作;
  • 五指灵巧手与二指夹爪的控制维度和语义也不同。

如果每个机器人使用完全不同的输出格式,模型很难复用不同数据集中的经验。项目将它们映射到固定槽位:

  • 每个动作时间步使用 54 维动作向量;
  • 当前机器人状态使用 60 维状态向量;
  • 使用 action_mask 和 state_mask 标记哪些模块真实存在;
  • 使用 robot_type 或 embodiment embedding 告诉动作专家当前机器人本体。

#mermaid-svg-QdgCFu1a2ukal4MJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QdgCFu1a2ukal4MJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QdgCFu1a2ukal4MJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QdgCFu1a2ukal4MJ .error-icon{fill:#552222;}#mermaid-svg-QdgCFu1a2ukal4MJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QdgCFu1a2ukal4MJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QdgCFu1a2ukal4MJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QdgCFu1a2ukal4MJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QdgCFu1a2ukal4MJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QdgCFu1a2ukal4MJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QdgCFu1a2ukal4MJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QdgCFu1a2ukal4MJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QdgCFu1a2ukal4MJ .marker.cross{stroke:#333333;}#mermaid-svg-QdgCFu1a2ukal4MJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QdgCFu1a2ukal4MJ p{margin:0;}#mermaid-svg-QdgCFu1a2ukal4MJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QdgCFu1a2ukal4MJ .cluster-label text{fill:#333;}#mermaid-svg-QdgCFu1a2ukal4MJ .cluster-label span{color:#333;}#mermaid-svg-QdgCFu1a2ukal4MJ .cluster-label span p{background-color:transparent;}#mermaid-svg-QdgCFu1a2ukal4MJ .label text,#mermaid-svg-QdgCFu1a2ukal4MJ span{fill:#333;color:#333;}#mermaid-svg-QdgCFu1a2ukal4MJ .node rect,#mermaid-svg-QdgCFu1a2ukal4MJ .node circle,#mermaid-svg-QdgCFu1a2ukal4MJ .node ellipse,#mermaid-svg-QdgCFu1a2ukal4MJ .node polygon,#mermaid-svg-QdgCFu1a2ukal4MJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QdgCFu1a2ukal4MJ .rough-node .label text,#mermaid-svg-QdgCFu1a2ukal4MJ .node .label text,#mermaid-svg-QdgCFu1a2ukal4MJ .image-shape .label,#mermaid-svg-QdgCFu1a2ukal4MJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-QdgCFu1a2ukal4MJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QdgCFu1a2ukal4MJ .rough-node .label,#mermaid-svg-QdgCFu1a2ukal4MJ .node .label,#mermaid-svg-QdgCFu1a2ukal4MJ .image-shape .label,#mermaid-svg-QdgCFu1a2ukal4MJ .icon-shape .label{text-align:center;}#mermaid-svg-QdgCFu1a2ukal4MJ .node.clickable{cursor:pointer;}#mermaid-svg-QdgCFu1a2ukal4MJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QdgCFu1a2ukal4MJ .arrowheadPath{fill:#333333;}#mermaid-svg-QdgCFu1a2ukal4MJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QdgCFu1a2ukal4MJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QdgCFu1a2ukal4MJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QdgCFu1a2ukal4MJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QdgCFu1a2ukal4MJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QdgCFu1a2ukal4MJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QdgCFu1a2ukal4MJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QdgCFu1a2ukal4MJ .cluster text{fill:#333;}#mermaid-svg-QdgCFu1a2ukal4MJ .cluster span{color:#333;}#mermaid-svg-QdgCFu1a2ukal4MJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QdgCFu1a2ukal4MJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QdgCFu1a2ukal4MJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-QdgCFu1a2ukal4MJ .icon-shape,#mermaid-svg-QdgCFu1a2ukal4MJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QdgCFu1a2ukal4MJ .icon-shape p,#mermaid-svg-QdgCFu1a2ukal4MJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QdgCFu1a2ukal4MJ .icon-shape .label rect,#mermaid-svg-QdgCFu1a2ukal4MJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QdgCFu1a2ukal4MJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QdgCFu1a2ukal4MJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QdgCFu1a2ukal4MJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 单臂数据
格式转换、相对化、归一化
双臂数据
全身数据
统一动作 A: H × 54

统一状态 s: 60
有效性 mask
共享 VLM + MMDiT
robot_type / embodiment

不存在的模块会填成 0,但对应 mask 为 0。训练时,mask 为 0 的维度不会被当作真实动作计算损失。

2.2 统一输入不等于自动解决机器人差异

统一表示解决的是接口和参数共享问题,并不意味着所有机器人可以无条件混合。映射到同一槽位的数据必须具有相同控制语义:

  • 不能把一种数据的绝对关节目标和另一种数据的关节速度放进同一个槽位;
  • 坐标系、单位、关节顺序要先统一;
  • 机器人自身的运动学、动力学和底层控制器仍然存在。

因此,统一动作空间更像一个跨机器人"共同语言",而不是一个万能机器人控制器。

2.3 不同部位采用不同的归一化方式

归一化按模块分别进行,而不是把整个 54 维动作或 60 维状态都套用同一组统计量。位置、角度、关节、速度的尺度不同;状态与动作即使属于同一个部位,也可能使用不同表示和统计量。

统一计算形式为:

x ^ = x − o c , x = x ^ c + o . \hat{x}=\frac{x-o}{c},\qquad x=\hat{x}c+o. x^=cx−o,x=x^c+o.

其中 o o o 是 offset, c c c 是 scale。默认配置的区别如下:

数据模块 默认处理 统计量与说明
末端相对位姿动作、底盘相对位姿动作 Z-score o = μ o=\mu o=μ, c = σ c=\sigma c=σ;使用相对动作的全局统计
夹爪与灵巧手动作 分位数归一化 minmax_q 使用 gripper_norm_type,通常由 q01/q99 决定尺度
腰、躯干、腿关节及底盘速度/高度动作 分位数归一化 minmax_q 使用各模块普通动作统计
当前末端状态的 xyz 分位数归一化 minmax_q 使用当前绝对位置的状态统计
当前末端状态的 rotation-6D 保持原值 不能直接套用原始欧拉角或四元数的统计量
当前夹爪、手部、腰腿关节状态 分位数归一化 minmax_q 使用对应状态统计,不能直接复用动作统计
机体坐标系下的单位重力方向 保持原值 已是单位向量,分量范围为 − 1 , 1 -1,1 −1,1
机体三轴角速度状态 分位数归一化 minmax_q 使用角速度状态统计;已归一化的输入不能重复处理

分位数归一化把 1% 和 99% 分位数作为上下界:

o = q 01 + q 99 2 , c = q 99 − q 01 2 . o=\frac{q_{01}+q_{99}}{2},\qquad c=\frac{q_{99}-q_{01}}{2}. o=2q01+q99,c=2q99−q01.

例如某个当前位置维度的 q 01 = 0.2 q_{01}=0.2 q01=0.2 米、 q 99 = 0.8 q_{99}=0.8 q99=0.8 米,那么 o = 0.5 o=0.5 o=0.5、 c = 0.3 c=0.3 c=0.3,位置 0.5 0.5 0.5 米映射为 0 0 0, 0.8 0.8 0.8 米映射为 1 1 1。代码不对归一化结果裁剪,因此超出统计范围的值可以超过 − 1 , 1 -1,1 −1,1。

相对动作的统计量必须在计算 T t − 1 T t + k T_t^{-1}T_{t+k} Tt−1Tt+k 之后 获得,不能用绝对位置统计代替。例如某个局部平移维度的均值为 0.02 0.02 0.02 米、标准差为 0.04 0.04 0.04 米,预测目标 0.10 0.10 0.10 米的归一化值就是 ( 0.10 − 0.02 ) / 0.04 = 2 (0.10-0.02)/0.04=2 (0.10−0.02)/0.04=2。

2.4 重力观测:描述倾斜状态,不等于重力补偿

状态向量的 [41:47] 存储:

text 复制代码
[gx_body, gy_body, gz_body, normalized_wx, normalized_wy, normalized_wz]

前三维是机体坐标系中的单位重力方向,后三维是归一化后的机体角速度。它们让模型同时观察"身体倾斜到什么程度"和"身体正在如何转动"。这里存储的是惯性状态,不是 base 的绝对位置或完整姿态。

假设世界竖直向下的单位向量是 g W = 0 , 0 , − 1 T g^W=0,0,-1^T gW=0,0,−1T, R W B R_{WB} RWB 将机体坐标转换到世界坐标,则:

g B = R W B T g W . g^B=R_{WB}^Tg^W. gB=RWBTgW.

旋转矩阵乘三维向量,结果仍是三维向量。 这一步只把同一个重力方向换一种坐标表达;三个分量分别是该方向在机体 x、y、z 轴上的投影,没有计算质量、重力力矩或接触力。

例如,机体直立时 R W B = I R_{WB}=I RWB=I:

g B = 0 , 0 , − 1 T . g^B=0,0,-1^T. gB=0,0,−1T.

如果采用右手坐标系、 R W B = R y ( θ ) R_{WB}=R_y(\theta) RWB=Ry(θ),则:

g B = sin ⁡ θ , 0 , − cos ⁡ θ T . g^B=\\sin\\theta,\\ 0,\\ -\\cos\\theta^T. gB=sinθ, 0, −cosθT.

当 θ = 30 ∘ \theta=30^\circ θ=30∘ 时, g B = 0.5 , 0 , − 0.866 T g^B=0.5,0,-0.866^T gB=0.5,0,−0.866T。这个向量向模型提供了倾斜信息。绕世界竖直轴改变 yaw 时,重力方向不变,所以它不能表示完整的旋转矩阵,也不能表示绝对 yaw。
#mermaid-svg-7nGL3NhB35EpukYy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7nGL3NhB35EpukYy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7nGL3NhB35EpukYy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7nGL3NhB35EpukYy .error-icon{fill:#552222;}#mermaid-svg-7nGL3NhB35EpukYy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7nGL3NhB35EpukYy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7nGL3NhB35EpukYy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7nGL3NhB35EpukYy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7nGL3NhB35EpukYy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7nGL3NhB35EpukYy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7nGL3NhB35EpukYy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7nGL3NhB35EpukYy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7nGL3NhB35EpukYy .marker.cross{stroke:#333333;}#mermaid-svg-7nGL3NhB35EpukYy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7nGL3NhB35EpukYy p{margin:0;}#mermaid-svg-7nGL3NhB35EpukYy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-7nGL3NhB35EpukYy .cluster-label text{fill:#333;}#mermaid-svg-7nGL3NhB35EpukYy .cluster-label span{color:#333;}#mermaid-svg-7nGL3NhB35EpukYy .cluster-label span p{background-color:transparent;}#mermaid-svg-7nGL3NhB35EpukYy .label text,#mermaid-svg-7nGL3NhB35EpukYy span{fill:#333;color:#333;}#mermaid-svg-7nGL3NhB35EpukYy .node rect,#mermaid-svg-7nGL3NhB35EpukYy .node circle,#mermaid-svg-7nGL3NhB35EpukYy .node ellipse,#mermaid-svg-7nGL3NhB35EpukYy .node polygon,#mermaid-svg-7nGL3NhB35EpukYy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7nGL3NhB35EpukYy .rough-node .label text,#mermaid-svg-7nGL3NhB35EpukYy .node .label text,#mermaid-svg-7nGL3NhB35EpukYy .image-shape .label,#mermaid-svg-7nGL3NhB35EpukYy .icon-shape .label{text-anchor:middle;}#mermaid-svg-7nGL3NhB35EpukYy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7nGL3NhB35EpukYy .rough-node .label,#mermaid-svg-7nGL3NhB35EpukYy .node .label,#mermaid-svg-7nGL3NhB35EpukYy .image-shape .label,#mermaid-svg-7nGL3NhB35EpukYy .icon-shape .label{text-align:center;}#mermaid-svg-7nGL3NhB35EpukYy .node.clickable{cursor:pointer;}#mermaid-svg-7nGL3NhB35EpukYy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7nGL3NhB35EpukYy .arrowheadPath{fill:#333333;}#mermaid-svg-7nGL3NhB35EpukYy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7nGL3NhB35EpukYy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7nGL3NhB35EpukYy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7nGL3NhB35EpukYy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7nGL3NhB35EpukYy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7nGL3NhB35EpukYy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7nGL3NhB35EpukYy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7nGL3NhB35EpukYy .cluster text{fill:#333;}#mermaid-svg-7nGL3NhB35EpukYy .cluster span{color:#333;}#mermaid-svg-7nGL3NhB35EpukYy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7nGL3NhB35EpukYy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7nGL3NhB35EpukYy rect.text{fill:none;stroke-width:0;}#mermaid-svg-7nGL3NhB35EpukYy .icon-shape,#mermaid-svg-7nGL3NhB35EpukYy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7nGL3NhB35EpukYy .icon-shape p,#mermaid-svg-7nGL3NhB35EpukYy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7nGL3NhB35EpukYy .icon-shape .label rect,#mermaid-svg-7nGL3NhB35EpukYy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7nGL3NhB35EpukYy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7nGL3NhB35EpukYy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7nGL3NhB35EpukYy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 机体朝向 R_WB
重力方向换坐标
世界单位重力方向
机体重力向量 3 维
机体角速度
按状态统计归一化
惯性状态 6 维
状态编码器 / VLM
预测动作
底层控制器执行

如果要计算物理上的重力补偿,对质量为 m m m 的物体,需要先恢复实际重力:

F g B = m   9.81   g B . F_g^B=m\,9.81\,g^B. FgB=m9.81gB.

再结合相对于受力参考点的力臂 r r r,才有重力力矩 τ g = r × F g \tau_g=r\times F_g τg=r×Fg。多关节机器人还需要各连杆质量、质心、关节配置和接触约束等动力学信息。

因此,这里的 gravity observation 提供的是平衡相关的观测条件。模型可以从示范数据中学习倾斜和角速度对应的动作规律;实际平衡与重力补偿还取决于策略和底层控制器。仅加入这个三维向量,不能证明系统已经实现了物理受力分析或稳定性保证。

三、什么是"相对当前位姿"的动作

3.1 绝对位姿和相对位姿

假设当前末端位姿为 T t T_t Tt,未来第 k k k 步的目标位姿为 T t + k T_{t+k} Tt+k。它们都是 SE(3) 变换矩阵:

T = R p 0 1 . T= \begin{bmatrix} R & p \\ 0 & 1 \end{bmatrix}. T=R0p1.

项目使用当前位姿的逆与未来目标相乘:

T t , k r e l = T t − 1 T t + k . T^{rel}{t,k}=T_t^{-1}T{t+k}. Tt,krel=Tt−1Tt+k.

展开以后:

R t , k r e l = R t T R t + k , R^{rel}{t,k}=R_t^T R{t+k}, Rt,krel=RtTRt+k,

p t , k r e l = R t T ( p t + k − p t ) . p^{rel}{t,k}=R_t^T(p{t+k}-p_t). pt,krel=RtT(pt+k−pt).

含义是:

  1. 先计算未来位置与当前位置的差;
  2. 再把这个差值转换到当前末端自己的坐标系;
  3. 把相对旋转矩阵转换成 rotation vector;
  4. 最终得到 6 维的 xyz + rotvec 动作。

渲染错误: Mermaid 渲染失败: Parse error on line 3: ...位姿 T_t+k] --> RELSE(3) 相对变换 INV -- -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

3.2 A/B 例子:末端朝向不同,局部动作相同

这里始终区分两个坐标系: B B B 是机器人 base 坐标系, E t E_t Et 是当前末端坐标系。控制器接收 base 下的目标,模型学习的末端相对位姿则在 E t E_t Et 下表示。

假设 A、B 两种情况下的末端当前位置都是:

p t B = 0.50 , 0.20 , 0.30 T m . p_t^B=0.50,0.20,0.30^T\ \mathrm{m}. ptB=0.50,0.20,0.30T m.

任务都是"沿末端自己的 x 轴移动 10 cm,保持朝向"。

情况 当前末端朝向 base 下的位置增量 当前末端局部坐标下的位置增量 base 下的目标位置
A R t = I R_t=I Rt=I;末端 x 轴与 base x 轴一致 0.10 , 0 , 0 T 0.10,0,0^T 0.10,0,0T 0.10 , 0 , 0 T 0.10,0,0^T 0.10,0,0T 0.60 , 0.20 , 0.30 T 0.60,0.20,0.30^T 0.60,0.20,0.30T
B R t = R z ( 90 ∘ ) R_t=R_z(90^\circ) Rt=Rz(90∘);末端 x 轴指向 base y 轴 0 , 0.10 , 0 T 0,0.10,0^T 0,0.10,0T 0.10 , 0 , 0 T 0.10,0,0^T 0.10,0,0T 0.50 , 0.30 , 0.30 T 0.50,0.30,0.30^T 0.50,0.30,0.30T

情况 B 的转换具体为:

R z ( 90 ∘ ) = 0 − 1 0 1 0 0 0 0 1 , p r e l = R t T Δ p B = 0.10 , 0 , 0 T . R_z(90^\circ)= \begin{bmatrix} 0 & -1 & 0\\ 1 & 0 & 0\\ 0 & 0 & 1 \end{bmatrix}, \qquad p^{rel}=R_t^T\Delta p^B=0.10,0,0^T. Rz(90∘)= 010−100001 ,prel=RtTΔpB=0.10,0,0T.

这样,A/B 的"沿工具前方移动"可以使用相同的局部动作表示。这是一种表示选择,有利于表达工具相关的运动规律;如果任务是"沿 base x 轴移动 10 cm",A/B 的局部增量反而不同,所以局部坐标并不使所有任务都天然具有相同表示。

执行前,先反归一化模型输出,再合成 base 下的目标:

p t a r g e t B = p t B + R t p r e l , R t a r g e t B = R t R r e l . p_{target}^B=p_t^B+R_t p^{rel},\qquad R_{target}^B=R_t R^{rel}. ptargetB=ptB+Rtprel,RtargetB=RtRrel.

因此,base 下的绝对末端状态作为输入,模型输出当前末端局部坐标下的相对位姿,适配器再把它转换成控制器所需的 base 下绝对目标。这与控制器的输入坐标要求一致。

还要注意:一个 action chunk 的所有末端目标,都相对于生成该 chunk 时输入的同一个观测位姿 T t T_t Tt。 chunk 内的后续目标不是相对前一个预测目标计算的。还原整段目标时应使用这个观测 anchor;重新观测并生成新 chunk 时,才更新 anchor。

3.3 它和 VLA 是什么关系

"相对位姿"是动作的表示方式 ;VLA 是模型的任务范式。

text 复制代码
VLA = 视觉 + 语言 → 动作

动作可以是:

  • 世界坐标中的绝对位姿;
  • 相对当前位姿的 SE(3) 变换;
  • 速度命令;
  • 关节角增量。

因此,UnifoLM-WLA 仍然是 VLA,只是末端位姿采用了相对 SE(3) 表示。它不是另一种与 VLA 对立的模型。

四、World Model 体现在哪里

4.1 它不是预测完整未来视频

项目主页所说的 World Model 更接近下面的目标:

当前图像 + 任务或动作,预测未来哪些区域会因为交互而发生变化。

训练时有当前帧 image_t0 和未来帧 image_t1。image_t1 不会作为部署时的输入,而是用来构造训练标签。
#mermaid-svg-mBlP2X3io6PSClrc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mBlP2X3io6PSClrc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mBlP2X3io6PSClrc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mBlP2X3io6PSClrc .error-icon{fill:#552222;}#mermaid-svg-mBlP2X3io6PSClrc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mBlP2X3io6PSClrc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mBlP2X3io6PSClrc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mBlP2X3io6PSClrc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mBlP2X3io6PSClrc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mBlP2X3io6PSClrc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mBlP2X3io6PSClrc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mBlP2X3io6PSClrc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mBlP2X3io6PSClrc .marker.cross{stroke:#333333;}#mermaid-svg-mBlP2X3io6PSClrc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mBlP2X3io6PSClrc p{margin:0;}#mermaid-svg-mBlP2X3io6PSClrc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mBlP2X3io6PSClrc .cluster-label text{fill:#333;}#mermaid-svg-mBlP2X3io6PSClrc .cluster-label span{color:#333;}#mermaid-svg-mBlP2X3io6PSClrc .cluster-label span p{background-color:transparent;}#mermaid-svg-mBlP2X3io6PSClrc .label text,#mermaid-svg-mBlP2X3io6PSClrc span{fill:#333;color:#333;}#mermaid-svg-mBlP2X3io6PSClrc .node rect,#mermaid-svg-mBlP2X3io6PSClrc .node circle,#mermaid-svg-mBlP2X3io6PSClrc .node ellipse,#mermaid-svg-mBlP2X3io6PSClrc .node polygon,#mermaid-svg-mBlP2X3io6PSClrc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mBlP2X3io6PSClrc .rough-node .label text,#mermaid-svg-mBlP2X3io6PSClrc .node .label text,#mermaid-svg-mBlP2X3io6PSClrc .image-shape .label,#mermaid-svg-mBlP2X3io6PSClrc .icon-shape .label{text-anchor:middle;}#mermaid-svg-mBlP2X3io6PSClrc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mBlP2X3io6PSClrc .rough-node .label,#mermaid-svg-mBlP2X3io6PSClrc .node .label,#mermaid-svg-mBlP2X3io6PSClrc .image-shape .label,#mermaid-svg-mBlP2X3io6PSClrc .icon-shape .label{text-align:center;}#mermaid-svg-mBlP2X3io6PSClrc .node.clickable{cursor:pointer;}#mermaid-svg-mBlP2X3io6PSClrc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mBlP2X3io6PSClrc .arrowheadPath{fill:#333333;}#mermaid-svg-mBlP2X3io6PSClrc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mBlP2X3io6PSClrc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mBlP2X3io6PSClrc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mBlP2X3io6PSClrc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mBlP2X3io6PSClrc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mBlP2X3io6PSClrc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mBlP2X3io6PSClrc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mBlP2X3io6PSClrc .cluster text{fill:#333;}#mermaid-svg-mBlP2X3io6PSClrc .cluster span{color:#333;}#mermaid-svg-mBlP2X3io6PSClrc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mBlP2X3io6PSClrc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mBlP2X3io6PSClrc rect.text{fill:none;stroke-width:0;}#mermaid-svg-mBlP2X3io6PSClrc .icon-shape,#mermaid-svg-mBlP2X3io6PSClrc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mBlP2X3io6PSClrc .icon-shape p,#mermaid-svg-mBlP2X3io6PSClrc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mBlP2X3io6PSClrc .icon-shape .label rect,#mermaid-svg-mBlP2X3io6PSClrc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mBlP2X3io6PSClrc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mBlP2X3io6PSClrc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mBlP2X3io6PSClrc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 监督
当前帧 image_t0
光流估计
未来帧 image_t1
dynamic mask

未来变化区域
VQ-VAE
future mask tokens
VLM
任务文字或动作
预测未来 mask tokens

光流可以帮助找到机械臂、杯子等运动区域;VQ-VAE 再把 mask 压缩成固定长度的离散 token。VLM 学的是:看到当前画面和任务后,哪些区域可能在未来发生变化。

4.2 为什么这算 World Model

模型不只回答"画面里有什么",还要学习:

text 复制代码
执行某个任务或动作
        ↓
哪些物体会被影响
        ↓
未来画面哪些区域会变化

例如当前画面中有一个杯子,任务是"把杯子放进盒子"。模型需要建立杯子、机械臂、盒子和未来变化之间的联系。

它关注的是交互主体和交互结果,而不是重建所有静态背景。因此这里的 world modeling 更像交互中心的未来变化预测,而不是完整的视频生成器。

4.3 WLA 推理时会不会先生成 mask

当前仓库公开的 WLA 路径不会显式执行下面这条链:

text 复制代码
先生成 mask token
        ↓
解码成 mask
        ↓
根据 mask 计算动作

实际代码路径更接近:

text 复制代码
图像 + 任务 + 状态
        ↓
VLM hidden states
        ↓
MMDiT
        ↓
连续动作

因此,mask 预训练的作用主要是塑造 VLM 的隐藏表示,让它更关注动作会影响什么;mask token 不是当前 WLA 在线控制接口的必需输入。

五、RVQ 如何把动作变成"动作语言"

5.1 三类动作分别量化

项目把连续动作轨迹分为三类:

  1. EEF pose:末端执行器的位置和姿态;
  2. EEF joints:夹爪或灵巧手关节;
  3. Lower-body joints:腰部、腿部等下半身关节。

因为三类动作的数值范围、变化速度和物理含义不同,所以分别训练 RVQ 模型。
#mermaid-svg-gRjvQ02CLw1XTy9p{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gRjvQ02CLw1XTy9p .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gRjvQ02CLw1XTy9p .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gRjvQ02CLw1XTy9p .error-icon{fill:#552222;}#mermaid-svg-gRjvQ02CLw1XTy9p .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gRjvQ02CLw1XTy9p .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gRjvQ02CLw1XTy9p .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gRjvQ02CLw1XTy9p .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gRjvQ02CLw1XTy9p .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gRjvQ02CLw1XTy9p .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gRjvQ02CLw1XTy9p .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gRjvQ02CLw1XTy9p .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gRjvQ02CLw1XTy9p .marker.cross{stroke:#333333;}#mermaid-svg-gRjvQ02CLw1XTy9p svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gRjvQ02CLw1XTy9p p{margin:0;}#mermaid-svg-gRjvQ02CLw1XTy9p .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gRjvQ02CLw1XTy9p .cluster-label text{fill:#333;}#mermaid-svg-gRjvQ02CLw1XTy9p .cluster-label span{color:#333;}#mermaid-svg-gRjvQ02CLw1XTy9p .cluster-label span p{background-color:transparent;}#mermaid-svg-gRjvQ02CLw1XTy9p .label text,#mermaid-svg-gRjvQ02CLw1XTy9p span{fill:#333;color:#333;}#mermaid-svg-gRjvQ02CLw1XTy9p .node rect,#mermaid-svg-gRjvQ02CLw1XTy9p .node circle,#mermaid-svg-gRjvQ02CLw1XTy9p .node ellipse,#mermaid-svg-gRjvQ02CLw1XTy9p .node polygon,#mermaid-svg-gRjvQ02CLw1XTy9p .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gRjvQ02CLw1XTy9p .rough-node .label text,#mermaid-svg-gRjvQ02CLw1XTy9p .node .label text,#mermaid-svg-gRjvQ02CLw1XTy9p .image-shape .label,#mermaid-svg-gRjvQ02CLw1XTy9p .icon-shape .label{text-anchor:middle;}#mermaid-svg-gRjvQ02CLw1XTy9p .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gRjvQ02CLw1XTy9p .rough-node .label,#mermaid-svg-gRjvQ02CLw1XTy9p .node .label,#mermaid-svg-gRjvQ02CLw1XTy9p .image-shape .label,#mermaid-svg-gRjvQ02CLw1XTy9p .icon-shape .label{text-align:center;}#mermaid-svg-gRjvQ02CLw1XTy9p .node.clickable{cursor:pointer;}#mermaid-svg-gRjvQ02CLw1XTy9p .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gRjvQ02CLw1XTy9p .arrowheadPath{fill:#333333;}#mermaid-svg-gRjvQ02CLw1XTy9p .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gRjvQ02CLw1XTy9p .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gRjvQ02CLw1XTy9p .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gRjvQ02CLw1XTy9p .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gRjvQ02CLw1XTy9p .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gRjvQ02CLw1XTy9p .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gRjvQ02CLw1XTy9p .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gRjvQ02CLw1XTy9p .cluster text{fill:#333;}#mermaid-svg-gRjvQ02CLw1XTy9p .cluster span{color:#333;}#mermaid-svg-gRjvQ02CLw1XTy9p div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gRjvQ02CLw1XTy9p .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gRjvQ02CLw1XTy9p rect.text{fill:none;stroke-width:0;}#mermaid-svg-gRjvQ02CLw1XTy9p .icon-shape,#mermaid-svg-gRjvQ02CLw1XTy9p .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gRjvQ02CLw1XTy9p .icon-shape p,#mermaid-svg-gRjvQ02CLw1XTy9p .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gRjvQ02CLw1XTy9p .icon-shape .label rect,#mermaid-svg-gRjvQ02CLw1XTy9p .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gRjvQ02CLw1XTy9p .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gRjvQ02CLw1XTy9p .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gRjvQ02CLw1XTy9p :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} EEF 连续轨迹
EEF RVQ
夹爪 / 灵巧手轨迹
HAND RVQ
腰腿连续轨迹
LOWER RVQ
18 42 07 ...
04 29 51 ...
27 11 44 ...
VLM 离散 token 序列

5.2 RVQ 的基本原理

RVQ 是 Residual Vector Quantization,中文通常叫残差向量量化。它不是把每个连续数值简单四舍五入,而是用多个码本逐级逼近一个连续 latent:

text 复制代码
连续动作 latent
        ↓
第一个码本:得到粗略近似
        ↓
计算剩余误差
        ↓
第二个码本:量化剩余误差
        ↓
继续量化剩余误差
        ↓
多个 code index

例如一段 EEF 动作可能被编码为:

text 复制代码
18, 42, 07, 31, 56

这些数字是码本索引,不是关节编号。经过 RVQ decoder 后,可以近似恢复原始连续轨迹。

5.3 为什么需要 START 和 END token

不同动作模块使用不同的边界 token:

text 复制代码
<EEF_START>   ...   <EEF_END>
<HAND_START>  ...   <HAND_END>
<LOWER_START> ...   <LOWER_END>

它们告诉 VLM:后面的数字属于哪一类动作。三组 token 描述同一个未来时间窗口,所以图中的 temporal alignment 表示三类动作是同步发生的。

六、RVQ 后的动作如何被使用

6.1 ER-Flow 预训练阶段

离散动作 token 可以像文字 token 一样进入 VLM 的训练序列:

text 复制代码
图像 + 任务
        ↓
VLM 自回归预测动作 token
        ↓
EEF token、HAND token、LOWER token
        ↓
RVQ decoder 还原连续动作

训练目标可以写成:

L a c t i o n − t o k e n = − ∑ t log ⁡ p ( y t ∣ y < t , i m a g e , t a s k ) . \mathcal{L}{action-token} = -\sum_t \log p(y_t \mid y{<t}, image, task). Laction−token=−t∑logp(yt∣y<t,image,task).

这一步让 VLM 学会:

text 复制代码
看到什么场景 + 语言任务
        ↓
应该对应怎样的动作结构

6.2 WLA 连续动作阶段

WLA 的动作专家不要求每次先生成 RVQ token:

text 复制代码
图像 + 任务 + 当前状态
        ↓
预训练好的 VLM hidden states
        ↓
MMDiT flow matching
        ↓
连续动作轨迹

因此可以这样理解:

  • RVQ token 让 VLM 学会"动作语言";
  • MMDiT 把这种语义表示转换成精确的连续控制轨迹。

这是一种"语义主干 + 连续控制头"的分工。

七、VLM hidden states 如何传给 MMDiT

7.1 VLM 输出不是 Q/K/V

Qwen-VL 最后一层输出的是 hidden states:

H v l m ∈ R B × L × H v l m . H_{vlm}\in\mathbb{R}^{B\times L\times H_{vlm}}. Hvlm∈RB×L×Hvlm.

其中:

  • B B B 是 batch size;
  • L L L 是图像、文字和状态 token 的总长度;
  • H v l m H_{vlm} Hvlm 是 VLM 隐藏维度。

它不是 W Q W_Q WQ、 W K W_K WK 或 W V W_V WV。这些是注意力模块中的可学习参数。

7.2 先做维度对齐

MMDiT 先对 VLM hidden states 做 RMSNorm 和线性投影:

H = RMSNorm ⁡ ( H v l m ) W i n T + b i n . H=\operatorname{RMSNorm}(H_{vlm})W_{in}^{T}+b_{in}. H=RMSNorm(Hvlm)WinT+bin.

例如:

text 复制代码
VLM hidden states:  [B, L, 2560]
经过 txt_in 后:    [B, L, 1536]

txt_in 的输出只是 MMDiT 的文本流隐藏表示,还不是 Q/K/V。

7.3 再用 WQ、WK、WV 生成 Q/K/V

MMDiT 对文本流使用三组独立的线性层:

Q t x t = H W Q , t x t T + b Q , Q_{txt}=HW_{Q,txt}^{T}+b_Q, Qtxt=HWQ,txtT+bQ,

K t x t = H W K , t x t T + b K , K_{txt}=HW_{K,txt}^{T}+b_K, Ktxt=HWK,txtT+bK,

V t x t = H W V , t x t T + b V . V_{txt}=HW_{V,txt}^{T}+b_V. Vtxt=HWV,txtT+bV.

代码中的对应关系是:

text 复制代码
add_q_proj 的参数 = W_Q
add_q_proj 的输出 = Q

add_k_proj 的参数 = W_K
add_k_proj 的输出 = K

add_v_proj 的参数 = W_V
add_v_proj 的输出 = V

动作流也用另一套参数:

Q a c t = A W Q , a c t T , K a c t = A W K , a c t T , V a c t = A W V , a c t T . Q_{act}=AW_{Q,act}^{T},\quad K_{act}=AW_{K,act}^{T},\quad V_{act}=AW_{V,act}^{T}. Qact=AWQ,actT,Kact=AWK,actT,Vact=AWV,actT.

7.4 两条流进行联合注意力

两条流的 Q/K/V 沿序列维拼接:

text 复制代码
Q = [Q_act, Q_txt]
K = [K_act, K_txt]
V = [V_act, V_txt]

然后计算:

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d ) V . Attention(Q,K,V) = softmax\left(\frac{QK^T}{\sqrt{d}}\right)V. Attention(Q,K,V)=softmax(d QKT)V.
#mermaid-svg-uaB4UXtJ2lBznLRM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uaB4UXtJ2lBznLRM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uaB4UXtJ2lBznLRM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uaB4UXtJ2lBznLRM .error-icon{fill:#552222;}#mermaid-svg-uaB4UXtJ2lBznLRM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uaB4UXtJ2lBznLRM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uaB4UXtJ2lBznLRM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uaB4UXtJ2lBznLRM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uaB4UXtJ2lBznLRM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uaB4UXtJ2lBznLRM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uaB4UXtJ2lBznLRM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uaB4UXtJ2lBznLRM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uaB4UXtJ2lBznLRM .marker.cross{stroke:#333333;}#mermaid-svg-uaB4UXtJ2lBznLRM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uaB4UXtJ2lBznLRM p{margin:0;}#mermaid-svg-uaB4UXtJ2lBznLRM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uaB4UXtJ2lBznLRM .cluster-label text{fill:#333;}#mermaid-svg-uaB4UXtJ2lBznLRM .cluster-label span{color:#333;}#mermaid-svg-uaB4UXtJ2lBznLRM .cluster-label span p{background-color:transparent;}#mermaid-svg-uaB4UXtJ2lBznLRM .label text,#mermaid-svg-uaB4UXtJ2lBznLRM span{fill:#333;color:#333;}#mermaid-svg-uaB4UXtJ2lBznLRM .node rect,#mermaid-svg-uaB4UXtJ2lBznLRM .node circle,#mermaid-svg-uaB4UXtJ2lBznLRM .node ellipse,#mermaid-svg-uaB4UXtJ2lBznLRM .node polygon,#mermaid-svg-uaB4UXtJ2lBznLRM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uaB4UXtJ2lBznLRM .rough-node .label text,#mermaid-svg-uaB4UXtJ2lBznLRM .node .label text,#mermaid-svg-uaB4UXtJ2lBznLRM .image-shape .label,#mermaid-svg-uaB4UXtJ2lBznLRM .icon-shape .label{text-anchor:middle;}#mermaid-svg-uaB4UXtJ2lBznLRM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uaB4UXtJ2lBznLRM .rough-node .label,#mermaid-svg-uaB4UXtJ2lBznLRM .node .label,#mermaid-svg-uaB4UXtJ2lBznLRM .image-shape .label,#mermaid-svg-uaB4UXtJ2lBznLRM .icon-shape .label{text-align:center;}#mermaid-svg-uaB4UXtJ2lBznLRM .node.clickable{cursor:pointer;}#mermaid-svg-uaB4UXtJ2lBznLRM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uaB4UXtJ2lBznLRM .arrowheadPath{fill:#333333;}#mermaid-svg-uaB4UXtJ2lBznLRM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uaB4UXtJ2lBznLRM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uaB4UXtJ2lBznLRM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uaB4UXtJ2lBznLRM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uaB4UXtJ2lBznLRM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uaB4UXtJ2lBznLRM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uaB4UXtJ2lBznLRM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uaB4UXtJ2lBznLRM .cluster text{fill:#333;}#mermaid-svg-uaB4UXtJ2lBznLRM .cluster span{color:#333;}#mermaid-svg-uaB4UXtJ2lBznLRM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uaB4UXtJ2lBznLRM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uaB4UXtJ2lBznLRM rect.text{fill:none;stroke-width:0;}#mermaid-svg-uaB4UXtJ2lBznLRM .icon-shape,#mermaid-svg-uaB4UXtJ2lBznLRM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uaB4UXtJ2lBznLRM .icon-shape p,#mermaid-svg-uaB4UXtJ2lBznLRM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uaB4UXtJ2lBznLRM .icon-shape .label rect,#mermaid-svg-uaB4UXtJ2lBznLRM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uaB4UXtJ2lBznLRM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uaB4UXtJ2lBznLRM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uaB4UXtJ2lBznLRM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} VLM hidden states

B, L, H_vlm

RMSNorm
txt_in

维度对齐
add_q_proj → Q_txt
add_k_proj → K_txt
add_v_proj → V_txt
带噪动作 token
to_q → Q_act
to_k → K_act
to_v → V_act
Joint Attention
动作流输出

7.5 RMSNorm 是什么

对一个 token 向量 x ∈ R D x\in\mathbb{R}^D x∈RD,RMSNorm 计算均方根:

R M S ( x ) = 1 D ∑ i = 1 D x i 2 + ϵ . RMS(x)=\sqrt{\frac{1}{D}\sum_{i=1}^{D}x_i^2+\epsilon}. RMS(x)=D1i=1∑Dxi2+ϵ .

然后进行缩放:

R M S N o r m ( x ) = x R M S ( x ) ⊙ g . RMSNorm(x)=\frac{x}{RMS(x)}\odot g. RMSNorm(x)=RMS(x)x⊙g.

其中 g g g 是可学习的缩放向量。RMSNorm 不减去均值,只调整向量的尺度,目的是让送入 MMDiT 的 VLM 特征更加稳定。

八、Flow Matching:训练时到底对什么加噪

加噪的是连续动作序列,不是 VLM hidden states,也不是 RVQ token。

设真实连续动作为 a a a,高斯噪声为 ϵ \epsilon ϵ,随机采样时间 t t t,构造:

x t = ( 1 − t ) ϵ + t a . x_t=(1-t)\epsilon+t a. xt=(1−t)ϵ+ta.

目标速度为:

v ∗ = a − ϵ . v^*=a-\epsilon. v∗=a−ϵ.

动作专家接收:
机器人 MMDiT VLM 图像/任务/状态 机器人 MMDiT VLM 图像/任务/状态 #mermaid-svg-EQZDbRbgIQsOamnx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EQZDbRbgIQsOamnx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EQZDbRbgIQsOamnx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EQZDbRbgIQsOamnx .error-icon{fill:#552222;}#mermaid-svg-EQZDbRbgIQsOamnx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EQZDbRbgIQsOamnx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EQZDbRbgIQsOamnx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EQZDbRbgIQsOamnx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EQZDbRbgIQsOamnx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EQZDbRbgIQsOamnx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EQZDbRbgIQsOamnx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EQZDbRbgIQsOamnx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EQZDbRbgIQsOamnx .marker.cross{stroke:#333333;}#mermaid-svg-EQZDbRbgIQsOamnx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EQZDbRbgIQsOamnx p{margin:0;}#mermaid-svg-EQZDbRbgIQsOamnx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-EQZDbRbgIQsOamnx text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-EQZDbRbgIQsOamnx .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-EQZDbRbgIQsOamnx .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-EQZDbRbgIQsOamnx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-EQZDbRbgIQsOamnx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-EQZDbRbgIQsOamnx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-EQZDbRbgIQsOamnx .sequenceNumber{fill:white;}#mermaid-svg-EQZDbRbgIQsOamnx #sequencenumber{fill:#333;}#mermaid-svg-EQZDbRbgIQsOamnx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-EQZDbRbgIQsOamnx .messageText{fill:#333;stroke:none;}#mermaid-svg-EQZDbRbgIQsOamnx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-EQZDbRbgIQsOamnx .labelText,#mermaid-svg-EQZDbRbgIQsOamnx .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-EQZDbRbgIQsOamnx .loopText,#mermaid-svg-EQZDbRbgIQsOamnx .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-EQZDbRbgIQsOamnx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-EQZDbRbgIQsOamnx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-EQZDbRbgIQsOamnx .noteText,#mermaid-svg-EQZDbRbgIQsOamnx .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-EQZDbRbgIQsOamnx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-EQZDbRbgIQsOamnx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-EQZDbRbgIQsOamnx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-EQZDbRbgIQsOamnx .actorPopupMenu{position:absolute;}#mermaid-svg-EQZDbRbgIQsOamnx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-EQZDbRbgIQsOamnx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-EQZDbRbgIQsOamnx .actor-man circle,#mermaid-svg-EQZDbRbgIQsOamnx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-EQZDbRbgIQsOamnx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} loop 多个 flow steps 编码当前观测 H_vlm 条件特征 x0 = 随机动作噪声 编码当前 xi 和时间步 与 H_vlm 做双流联合注意力 预测速度 v_theta xi+1 = xi + dt * v_theta H 步连续动作块

项目配置中的 num_inference_timesteps 通常为 4。得到的动作还要经过:

  1. 反归一化;
  2. 将相对末端位姿与当前位姿合成;
  3. 转换为机器人客户端和底层控制器所需的动作格式。

十、这个方案的核心创新如何理解

10.1 用未来动态区域学习交互中心的视觉表示

普通图像理解可能只关心"画面里有什么"。动态区域目标进一步要求模型理解"执行任务后哪里会变化",让 VLM 更关注机械臂、被操作物体及其交互结果。这是 World Model 思路的主要体现。

10.2 用分组 RVQ 把机器人动作变成动作语言

EEF 位姿、手部关节和下半身关节分别量化,再以离散 token 的形式放入 VLM。这样视觉、语言和动作可以在同一个序列建模,而不是完全割裂的视觉编码器加数值回归头。

10.3 用统一动作空间实现跨本体先验迁移

54 维动作槽位、60 维状态槽位、mask 和 embodiment conditioning 让多个机器人共享主干和动作专家。模型可以复用"抓取、移动、放置"等任务结构,再结合本体信息输出对应机器人的动作。

10.4 离散语义理解和连续控制分工

离散 token 适合让 VLM 学习动作的结构和语义;连续 flow matching 适合生成平滑、精细的控制轨迹。两者组合后:

text 复制代码
VLM:理解图像、语言、动作语义和未来变化
MMDiT:根据这些条件生成连续动作轨迹

十一、常见问题

问题 1:统一输入是不是为了适配不同机器人?

是,但准确地说是为了让不同机器人进入同一套动作和状态接口,共享模型参数。机器人不存在的部件通过 mask 屏蔽;不同本体通过 robot_type 或 embodiment embedding 区分。底层运动学和控制器仍然需要单独适配。

问题 2:相对位姿是不是相邻两帧相减?

不是。项目使用当前位姿的逆与未来目标位姿相乘:

T r e l = T c u r r e n t − 1 T f u t u r e . T_{rel}=T_{current}^{-1}T_{future}. Trel=Tcurrent−1Tfuture.

动作块中的多个未来目标通常都相对于同一个当前状态计算。

问题 3:VLM hidden states 经过 Linear 后是 W Q W_Q WQ 还是 Q Q Q?

Linear 层的参数是 W Q W_Q WQ,Linear 层的输出才是 Q Q Q:

Q = H W Q T + b Q . Q=HW_Q^T+b_Q. Q=HWQT+bQ.

VLM hidden states 先经过 txt_in 做维度对齐,然后分别经过 add_q_proj、add_k_proj、add_v_proj 得到文本流的 Q Q Q、 K K K、 V V V。

问题 4:训练 MMDiT 时会不会把 VLM hidden states 做 VQ?

当前 WLA 动作头不会。加噪和 flow matching 作用于连续动作;VLM hidden states 作为条件流进入 MMDiT。RVQ 属于 ER-Flow 的离散动作预训练路径。

问题 5:在线控制时必须先预测 mask token 吗?

当前仓库没有这样的显式串联。mask token 预训练帮助主干学习未来交互变化,WLA 推理时直接使用 VLM hidden states 生成连续动作。

十二、一条完整的心智模型

text 复制代码
多帧机器人数据
  ├─ 光流 + VQ-VAE  → future mask tokens
  └─ 连续动作 + RVQ → 离散 action tokens
              ↓
     UnifoLM-ER-Flow 主干预训练
     学习图像、语言、动作、未来变化的共同表示
              ↓
当前图像 + 任务 + 当前机器人状态
              ↓
          VLM hidden states
              ↓
MMDiT:带噪连续动作流 + VLM 条件的双流联合注意力
              ↓
       54 维统一连续动作块
              ↓
反归一化、相对位姿合成、机器人底层控制器执行

一句话总结:

World Model 让主干学习"动作会造成什么视觉变化",RVQ 让 VLM 学习"动作如何用离散 token 表达",统一动作空间让不同机器人共享经验,MMDiT flow matching 最终把这些表示转换成连续可执行的机器人轨迹。

相关推荐
CV@CV1 小时前
世界模型环境预测与内在表征基础原理
人工智能·学习·边缘计算·量子计算·具身智能
老余说AI1 小时前
2026 多语言语音克隆 AI 工具推荐:把克隆嵌进视频本地化全流程
人工智能·声音克隆
HAHAXX81 小时前
可以直接部署使用的AI RPA有哪些?全离线内网部署方案实测
人工智能·rpa
前端小菜鸡yy1 小时前
前端 + AI 全链路开发教程:从设计图、需求文档、接口文档到项目管理
人工智能
卿卿的产品经理日记1 小时前
【AI产品经理实战】Day 34|计算机科学速成②:从水流开关到 Unicode,把整个电脑拆成一长串 0 和 1
人工智能·笔记·科技·学习·产品经理
愤怒火龙果1 小时前
AI攻防 AIRT-Foundations of AI Red Teaming
人工智能·网络安全
小蒋观天下1 小时前
安防设备自巡检 AI 落地——镜头遮挡、涂抹、移位、失焦自动检测系统
大数据·人工智能·深度学习·5g·机器学习
代码方舟1 小时前
零信任架构实战:基于天远普通维保查询构建自动化二手车融资租赁资产入库审计网关
人工智能·架构·自动化