从“看懂三维场景”到“想象目标并执行动作”
- 先用一分钟抓住核心
3D-VLA 想解决的问题是:机器人不应只学习一条“当前画面直接映射到动作”的捷径,而应先理解三维环境,再想象任务完成后的目标状态,最后依据“现在在哪里”和“应该变成什么样”生成动作。
可以把它记成四步:
看懂现在:把 RGB-D / 多视角图像变成带空间位置的 3D 场景特征。
用语言思考:3D 大语言模型理解场景、指令、物体和空间位置。
想象未来:条件扩散模型生成任务完成后的 RGB、深度图或点云。
规划动作:把当前状态和目标状态交给 3D-VLA,输出离散化的 7-DoF 机器人动作序列。
当前 RGB-D / 多视角图像
带坐标的 3D 场景特征
语言指令
3D-VLA 语言主干
目标模态与目标物体描述
目标生成器
目标 RGB-D 或目标点云
动作生成
7-DoF 动作 token 序列
一句话概括其创新:
3D-VLA 用特殊 token 把场景、物体、三维框、目标模态和机器人动作统一成一门“语言”,再用扩散模型为这门语言补上生成图像和点云的能力。
- 为什么需要 3D-VLA
1.1 传统 VLA 的两个缺口
很多 Vision-Language-Action 模型采用:
当前图像语言指令机器人动作
这条路线能工作,但有两个明显问题。
第一,只看 2D 容易丢失真实几何关系。
“最远的杯子”“中间的抽屉”“从瓶子后面抓取”等指令,都依赖深度、距离、遮挡和三维位置。单张 RGB 图像中的像素接近,并不等于物理空间中接近。
第二,直接预测动作没有显式建模任务完成后的世界。
人执行“打开抽屉”时,脑中通常有一个目标:抽屉应从关闭变为打开,其他背景尽量不变。这个目标状态给规划提供了稳定的中间参照。3D-VLA 把这种能力称为 goal imagination(目标想象)。
1.2 3D-VLA 实际学习的三个映射
令当前三维状态为
,语言指令为
,目标状态为
,动作序列为
。完整系统可以拆成:
理解、定位与生成意图
目标状态生成
动作规划
其中
是 3D-VLA 语言主干生成的中间语义,例如:
open the bottom drawer <loc…>
它同时告诉后续模块:
要生成哪一种模态;
操作意图是什么;
操作对象是什么;
物体位于哪里。
这也是定位能力为什么会帮助目标生成:扩散模型不再只得到一句含糊的“打开抽屉”,还可以得到“打开这个位置的底层抽屉”。
- 全局架构:它不是一个单体网络
论文中的完整系统由四类组件组成。
组件 作用 直观类比
3D 场景特征提取 把多视角视觉信息和三维坐标绑定 眼睛与空间感
BLIP-2 Flan-T5 XL + Q-Former 理解场景和指令,生成文本、位置、模态或动作 token 语言化的思考中枢
RGB/RGB-D 条件扩散模型 根据当前图像和指令生成目标图像/深度 在脑中想象完成画面
Point-E 风格点云扩散模型 根据当前点云和指令生成目标点云 在脑中想象完成后的三维形状
连接这些组件的关键不是共享原始输入,而是两种接口:
特殊 token 接口:让 LLM 知道某段内容代表场景、物体、位置、图像、点云或动作。
Projector 接口:把 LLM 的隐藏特征映射到扩散模型所需的条件特征空间。
控制
目标想象
语言化推理
三维感知
多视角 RGB / RGB-D
多视角视觉特征
点云坐标
Q-Former: 每个场景压缩为 32 个 token
Flan-T5 XL
语言指令
交互 token 词表
Transformer Projector
RGB / RGB-D 扩散模型
点云扩散模型
目标状态
3D-VLA 动作生成
离散 7-DoF 动作
这里有一个容易误解的点:“生成式世界模型”不等于模型学会了完整、连续、可反复滚动的物理仿真器。 3D-VLA 主要生成任务完成时的目标状态,而不是逐帧预测所有中间状态。因此它更接近“目标条件世界模型”。
- 数据:怎样把普通机器人视频变成 3D 指令数据
模型能力的上限首先由数据决定。原始机器人数据通常只有视频、语言指令和部分动作记录,3D-VLA 需要把它们加工成:
场景语言框目标状态动作
3.1 数据来源和规模
论文汇总了真实机器人、仿真机器人和人类-物体交互数据:
Open-X 中的多种机器人数据,如 BC-Z、Bridge、Fractal/RT-1、Jaco Play、Language Table、Mutex、Roboturk、Taco Play 等;
带较好深度信息的 Dobb-E、RH20T;
仿真环境 RLBench、CALVIN;
人类-物体交互数据 Epic-Kitchens、HOI4D。
论文统计共使用约 316K episodes,加工后得到约 2M 条 3D-language-action 指令样本。一个 episode 可以派生多种任务,所以指令对数量远大于 episode 数量。
3.2 数据加工流水线
有
没有
机器人/HOI 视频与指令
原数据有深度吗?
统一深度表示
ZoeDepth 逐帧估深
RAFT 光流找静止背景
用静止背景校准跨帧深度尺度
结合相机内参与位姿反投影为点云
spaCy 提取指令中的名词短语
Grounded-SAM 得到对象 2D mask
mask 随深度提升到 3D
得到对象 3D AABB
取未来/末帧作为目标 RGB、深度、点云
读取原数据的 7-DoF 动作
模板 + GPT-3.5 改写
多任务 3D 指令微调数据
下面逐步解释。
第一步:补深度并保持视频内尺度一致
超过 95% 的来源视频没有原生 3D 信息。论文使用 ZoeDepth 为每帧估计深度。
单目深度的难点是每帧尺度可能漂移:同一张桌子在相邻帧里可能被预测成不同距离。为此,方法使用 RAFT 光流找出相机不动时的静止背景,再对每帧深度乘一个校准系数,使这些背景区域在时间上尽量一致。
第二步:RGB-D 反投影为点云
对像素
、深度
和相机内参
,相机坐标系中的三维点为:
若已知相机外参,再把
变换到统一世界坐标系。这样每个点既有位置
,又继承对应像素的颜色或视觉特征。
第三步:产生 3D 物体框
用 spaCy 从指令中抽取名词短语,例如 bottom drawer、red cup。
用 Grounded-SAM 在图像上得到这些物体的 2D mask。
把 mask 覆盖的像素借助深度提升成局部点云。
对局部点云求轴对齐包围盒 AABB:
若同名候选很多,论文会结合显著光流区域和 grounding 置信度,优先选出真正被操作的物体。
第四步:构造目标状态
视频后续帧天然描述“执行动作后世界变成什么样”。因此可把未来帧,通常是任务完成附近的末帧,作为:
目标 RGB 图;
目标深度图;
目标点云。
这一步把昂贵的人工目标标注转化为从机器人演示中自动取监督信号。
第五步:把结构化标注写成“特殊语言”
论文先用模板生成问题和答案,再用 GPT-3.5-turbo-0125 配合 2~3 个手写示例做语言多样化。GPT 只负责改写/组织语言,核心 3D 框、动作和状态仍来自前面的结构化处理。
3.3 数据覆盖哪些任务
能力 输入 期望输出
Embodied QA 当前场景 + 问题 自然语言答案
What-if QA 场景 + 假设动作 动作可能造成的结果
Task Caption 初始场景 + 最终场景 执行了什么任务
Verification 初始场景 + 当前场景 + 指令 是否已完成
Localization 场景 + 物体名称 6 个 3D 位置 token
Dense Caption 场景 + 3D 框 框内物体描述
Goal Generation 初始场景 + 指令 图像/深度/点云生成意图及目标模态
Action Prediction 当前场景,可选目标场景 + 指令 7-DoF 动作 token 序列
同一个底层模型通过问题模板区分任务。例如:
定位:
The scene is . Locate: bottom drawer.
Answer: <loc…><loc…><loc…><loc…><loc…><loc…>
目标生成:
The initial scene is . Instruction: close the bottom drawer.
Answer: close the bottom drawer <loc…>…
动作预测:
. Close the bottom drawer. Predict key actions.
Answer: <aloc…>…<arot…>…<gripper…><ACT_SEP>…
3.4 公开代码实际读取的数据形态
3D 语言主干样本
一个样本的核心字段是:
字段 形状/类型 含义
pc_feat
每个 3D 点的多视角视觉特征
pc
已离散到 0~255 的三维坐标
question 字符串 含 占位符的输入
answers 字符串列表 自然语言、位置、模态或动作答案
path 最多 2 个特征路径 初始/当前或初始/最终场景
公开训练配置令
,数据类最多载入
个场景。点太多时随机下采样,太少时重复采样。
注意:仓库直接读取预计算好的 1408 维特征和点坐标;从原始 RGB-D 生成这些特征的完整预处理脚本没有随当前代码一起发布。
目标图像扩散样本
每条 JSON 标注至少包含:
dataset, base_image_path, final_image_path, instruction
若训练 RGB-D 模型,代码约定深度文件与 RGB 同名,并添加 _depth.png 后缀。缺失深度会用全零图替代。
为了避免大数据集完全淹没小数据集,公开实现先按数据集采样,数据集
的权重为:
这比按样本数线性采样更平衡,同时仍让大数据集获得较高概率。
目标点云扩散样本
公开实现使用 RLBench:
episode 第一帧点云作为 start_pc;
最后一帧点云作为 end_pc;
每个点是 6 维
;
训练默认采样 2048 个对应点;
起点和终点使用共同中心与共同半径归一化到单位球附近。
共同归一化很重要:如果起点和终点分别归一化,它们之间真实的位移会被部分抹掉。
- 统一接口:交互 token 是整套方法的“插座”
普通 LLM 只会输出词。3D-VLA 扩充词表,让连续物理世界也能以 token 形式进入自回归建模。
4.1 token 总表
token 含义 示例
… 中间插入一个静态 3D 场景的特征 初始状态、当前状态或目标状态
… 明确标出被提及/操作的物体 bottom drawer
~ 离散三维位置 6 个 token 表示 AABB
… 请求/表示目标图像或 RGB-D 图像生成意图
… 请求/表示目标点云 点云生成意图
~ 机械臂绝对位置的离散分量 x、y、z 各一个
~ 机械臂旋转的离散分量 3 个旋转分量
<gripper0/1> 二值夹爪状态 闭合/打开,具体编码约定依数据处理
<ACT_SEP> 分隔连续两个动作 action 1 与 action 2 之间
4.2 三维框怎样变成 6 个 token
设某坐标分量
的有效范围为
,常见的 256 桶均匀量化是:
于是:
例如,一个量化后的框为
,答案就是:
重要边界:论文和当前公开代码确认了 256 个桶以及 AABB 的 6-token 表示,但没有公开原始数据到各桶的确切坐标范围和反量化规则。因此上式用于解释通用原理,不能当作该仓库未发布预处理器的精确复现参数。
4.3 7-DoF 动作怎样变成 token
一个动作通常可写为:
其中前三维是机械臂末端绝对位置,接着三维描述旋转,
是夹爪开合。连续六个值各量化为 256 桶,夹爪保持二值:
<aloc_qx><aloc_qy><aloc_qz>
<arot_q1><arot_q2><arot_q3>
<gripper_g><ACT_SEP>
这样,动作预测就变成普通的下一 token 预测。优点是语言、空间框和控制命令可以由同一个 T5 解码器生成;代价是量化会引入精度损失,而且离散 token 本身不保证运动学可达或无碰撞。
- 3D 语言主干:场景如何进入 Flan-T5
论文说模型“建立在 3D-LLM 之上”,但初始化时并没有加载 3D-LLM 在室内场景/物体上的权重,而是从 BLIP-2 Flan-T5 XL 开始训练,因为其原训练域与机器人操作域差异较大。
5.1 输入不是原始点云,而是“点特征 + 点坐标”
对每个场景,公开代码接收:
:每个 3D 点的多视角视觉特征;
:每个点离散后的
坐标。
位置编码为三个一维位置编码的拼接。代码为每个坐标轴生成 469 维编码,三轴共 1407 维,再补到 1408 维并以 0.1 的比例加到视觉特征:
它的直觉是:相同外观的两个抽屉不能只有相同的视觉表示,还必须携带“一个在上、一个在下”的位置差异。
5.2 Q-Former 把几千个点压缩成 32 个 token
把 6400 个点直接作为 T5 token 成本很高。模型使用 32 个可学习 query,通过 Q-Former 对点特征做交叉注意力:
再经线性层投影到 Flan-T5 XL 的隐藏维度 2048:
所以无论原场景采样 6400 还是更多点,进入 T5 的每个场景始终是 32 个紧凑 token。
5.3 是真正插入特征的位置
输入文本先正常分词。例如:
The initial scene is . Close the bottom drawer.
代码找到 的位置,把对应场景的 32 个 Q-Former 输出紧接在它后面:
The initial scene is
[3D_1] [3D_2] … [3D_32] .
Close the bottom drawer.
如果输入包含两个 ,就可以插入初始/最终、初始/当前等两个静态场景,从而表达动态变化。这里的“动态”并不是视频 Transformer,而是把多个静态 3D 快照按文本顺序交错输入。
5.4 T5 生成所有类型的答案
T5 的训练目标统一为 teacher-forcing 交叉熵:
padding token 被设为
,不参与损失。无论答案是自然语言、6 个位置 token、一段 …,还是动作 token 序列,都使用同一个损失。
公开实现允许一条问题有多个去重答案,collate 时会把同一输入复制到各答案上分别训练。数据中虽然计算了答案频率权重,但当前 forward 没有把该权重乘入 loss。
5.5 哪些参数训练,哪些冻结
模块 公开实现状态
Flan-T5 主体 Transformer 冻结
T5 输入 embedding 训练
T5 输出 embedding / LM head 训练
Q-Former 训练
32 个 query token 训练
Q-Former 到 T5 的线性投影 训练
这样既保留 Flan-T5 的语言能力,又让新增 token 和 3D 表示学会进入其语义空间。
5.6 语言主干前向伪代码
def forward_3d_vla(sample):
# sample.pc_feat: [B, T, N, 1408],点的多视角视觉特征
# sample.pc: [B, T, N, 3],离散到 0~255 的点坐标
# sample.question: 含 T 个 占位符
point_feature = sample.pc_feat + 0.1 * position_encode_xyz(sample.pc)
# 每个场景用 32 个 query 汇聚 N 个点
scene_tokens = q_former(
queries=learnable_queries_32,
key_value=point_feature
)
scene_tokens = linear_to_t5_dim(scene_tokens) # 768 -> 2048
text_tokens = t5_tokenize(sample.question)
# 把每组 32 个场景 token 插到对应 <scene> 后
encoder_input = insert_after_scene_tokens(text_tokens, scene_tokens)
target = t5_tokenize(sample.answer)
target[target == PAD] = -100 # padding 不计入损失
logits = flan_t5(encoder_input, labels=target)
return cross_entropy(logits, target)
- 目标图像 / RGB-D 扩散模型
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)