Grounding Actions in Camera Space: Observation-Centric Vision-Language-Action Policy
ee形式的action从机器人坐标系转移到相机坐标系可以提到对相机的泛化性。
也就是利用“空间对齐”带来泛化提升
代码在OC-VLA,实际是在Dita那个仓库里面
这个论文可以尝试复现一下,感觉挺有意思的。
abstract
VLA模型的观察空间与行动空间之间有gap,模型通常预测机器人基座坐标系内的端效器姿态,导致空间不一致。
所以它针对的模型都是ee作为action的吧,如果是joint那更加难搞
所以作者想出来的是以observation为中心的VKA框架,将action预测从基于robot base变成基于camera observation。就是直接用外参矩阵
轻量的
感觉这个和我的想法有点接近,不过我是反过来,想在训练之前就把observation归一化处理。这个是把输出结果映射到camera上面? 看看我的思路有没有搞头。
introduction
预训练vlm是和相机viewpoint对齐的,但是机器人控制是基于底座(是ee控制啊)
而且数据采集的时候也是异构的
所以提出来的方案是:将末端执行器动作与机器人基坐标系解耦,直接预测第三人称摄像机坐标系中的动作,ObservationCentric VLA(OC-VLA)。
具体来说,鉴于机器人底座与每个摄像头之间的外在变换,我们将机器人空间的终端执行器作用转换为其在摄像头坐标系中的等效表示,并采用这些作为预测目标。通过将动作目标锚定在与观察相同的空间(即图像平面),这种表述缓解了感知与动作模态之间的错位,并减轻了摄像机视角变化带来的歧义。此外,它明确鼓励模型学习机器人与摄像头之间的相对空间关系,从而增强其在不同视角和硬件配置间有效泛化的能力。
那这个外参转换可以用于zero-shot推理吗???? 这个有一个缺点是没有相机就做不了吧(障碍那种就没办法了) 能不能再结合机器人模型做更多? 这个文章我光看摘要就知道咋做了,因为跟我想的比较接近,那这个办法有什么可以改进的地方吗?除了延展到其它机器人上面 既然已经有相机是叫了(类比人眼)那能不能基于视角做出自适应移动? 那用这个办法岂不是能利用网络视频进行学习知识。但是定位还是依靠模型与delta????
related work
尽管VLA模型取得了巨大进展,但大多数模型依赖于特定的观测空间来预测动作。然而,数据收集过程中环境设置的差异使得直接使用大规模网络数据进行训练变得困难,这限制了其性能。与此同时,当前的作数据集涵盖了广泛的摄像头视角,而现有的VLA方法通常侧重于基于机器人基坐标的动作预测。行动预测与观察坐标之间的差异对政策学习构成重大挑战。
method
实现起来简单吗?
使用lightweight 300M的VLA模型来测试(DIta)我怎么找不到300M这个版本的模型 checkpoint 该系统仅用第三人称摄像机的图像和语言指令作为输入,已展现出竞争性能
CLIP作为text encoder DINOv2处理第三视角图片 图像特征还通过配备FiLM[58]调节层的Q-Forform[57]进一步选择和调制。 > 为什么还需要后面这两个
“Current VLA models typically employ one of two types of action spaces for end-effector control: discrete action spaces [2], [1] and continuous action spaces [3], [5]. To thoroughly evaluate the effectiveness of our proposed approach, we conduct experiments on models using both types of action spaces. Based on the baseline architecture, we implement a variant specifically designed for discrete action prediction or continuous action prediction.” (Zhang et al., 2025, p. 3) 这篇文章说vla对ee的控制分成两种,离散和连续,我怎么没概念,速速了解一下 for end-effector control: discrete action spaces [2], [1] and continuous action spaces [3], [5] 离散的是Openvla和Rt-1 连续的是Octo和pi0 这部分看一个综述《面向具身智能的视觉-语言-动作模型动作表征和生成策略综述》
它给的解释是 离散动作 = 把机器人动作“量化成 token”让 Transformer 预测,把控制问题 → 转成序列生成(language modeling)问题。因为 Transformer 和 LLM 最擅长处理 离散 token 序列。缺点是量化损失不可避免。离散方法适合粗粒度动作、多任务通用控制、大规模数据。 连续动作 = 直接在连续空间中建模动作的概率分布并生成连续控制量,直接在连续空间建模真实动作分布,用生成式模型(CVAE / Diffusion / Flow Matching)连续方法适合理想策略生成与精细操作
然后有一个论文FAST,它做的是让自回归 Transformer(离散 token 方式)也能像连续模型一样解决高精度、高频率的灵巧操作任务。它仍然是 离散方法(tokenization) ,但使离散方法能处理 原本只有连续模型能处理的任务
然后问题来了,既然连续动作这么好为什么不用?连续动作生成模型(例如 CVAE、Diffusion、Flow Matching)本质上是 在连续高维动作空间上学习概率分布。不太好泛化。 但是离散+自回归一个优点是很快,第二个是泛化能力更强。
什么是自回归?逐步生成,非自回归(NonAR)就是模型一次性预测整个序列。
所以VLA里面如果是离散的,后面基本都跟着自回归。
这篇文章怎么在这两种动作空间上进行实验的???
批评了以前的数据集,动作都是和机器人结合的,跟观察空间联系不大,so模型很难从图像里面推理出动作,尤其是对新相机视角。“especially for novel camera views with a large variance from the seen camera views in the training set” (Zhang et al., 2025, p. 3)
首先需要将机器人坐标的动作转换到相机坐标系里面。
感觉实现起来很简单啊
特别地,变换矩阵T在不同机器人配置中存在差异。例如,Droid [9] 拥有1417个不同的摄像机视角,需要模型在内部推断每个视角的正确变换T,以准确预测机器人坐标系中的动作。
“UV coordinate” (Zhang et al., 2025, p. 4) UV坐标 +
相机内参的作用是针对只知道水杯在图片上的像素
(u, v),你需要焦距 f 和内参矩阵 K 才能算出相机坐标
(Xcam, Ycam, Zcam)。就是传统方法
experiment
我想知道怎样设计饰演的,zero-shot在其它位置是不是需要calibrate获得相机在世界坐标系下的位置?仿真环境好搞定,那实际呢?对比实验有哪些? 我想了一下,按照刚才method的方法,在一个真实实验里面,需要用到的有:假定就用机械臂的base做世界坐标系的原点,这样可以减去计算ee,所以要记录的是相机捕获的image,state,cad或者urdf文件来做fk,相机在世界坐标系下的转换矩阵,action(关节值或者ee都行)。这样就能训练和推理?
预训练采用Droid数据集,该数据集包含从1417个不同第三人称摄像机视角捕捉的机器人作轨迹及其对应的外部参数,提供广泛的视觉视角和运动
择典型的轻量级VLM结构。 1. 连续,扩散,DiT 2. 离散,填充零向量以对齐处理语言和图像输入后的动作大小。
优化细节 1. 连续:目标是最小化机器人动作(加标准高斯噪声增强)与预测噪声之间的MSE,使用DDPM [59],100个时间步。 2. 离散:最小化预测离散作用量与真实标签之间的交叉熵损失
仿真测试:数据集:ManiSkill2
真机实验: 采集: camera1:固定位置的若干数据 camera2:轻微移动camera2,若干数据
微调:
| 模型 | 使用数据 | 说明 |
|---|---|---|
| 模型1 | Camera 1 数据 + Droid 预训练模型 | 训练在固定视角下,基础模型是预训练好的 |
| 模型2 | Camera 2 数据 + Droid 预训练模型 | 训练数据包含轻微视角扰动,提高对视角变化的鲁棒性 |
测试
| 模型 | 相机 | 说明 |
|---|---|---|
| 模型1 | Camera 1(固定) | 测试在训练相机相同视角下的性能(fixed camera viewpoint) |
| 模型1 | Camera 3(固定,novel) | 测试 zero-shot 新视角的泛化能力(novel camera viewpoint) |
| 模型2 | Camera 2(固定) | 测试在训练中有轻微扰动的相机下的鲁棒性(slight camera perturbations) |
可能存在的问题
- 多视角相机怎么样?
- 极端视角或遮挡场景,不过这个我觉得怪不到这个身上,本来就是个难点,但是可以考虑改进,比如已经换到相机坐标系了,那能不能加上自适应?
- 这个转换重点是描述了机械臂尤其是ee的运动,那物体呢?
实验复现
参考Dita 1. 代码
1
2git clone https://github.com/RoboDita/Dita
cd Dita1
2conda create -n dita python==3.10
conda activate dita1
pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu121
1
2
3import torch
print(torch.__version__) # 2.x.x
print(torch.cuda.is_available()) # True1
pip install tensorflow==2.15.0
1
pip install -r requirements_calvin.txt --no-build-isolation
1
pip install setuptools==57.5.0
ManiSkill2/openx_utils/ 按照task生成数据 1.
~/Dita/ManiSkill2/openx_utils$ sh generate_pickcube.sh 2.
执行的时候遇到报错ModuleNotFoundError: No module named 'petrel_client'
这个完全不重要,直接用None,所以注释掉import,然后把client=Client那个分支去掉,默认client是None
3.
修改.py代码里面的PickCube-v相关的内容,和demos文件夹里面的一样,还有check_ceph_file_exist这个函数直接返回False
4. 数据集比较新,所以要pop掉一些参数 5. 遇到报错说Shader