☰
20维EE6D控制空间全解:读懂X-VLA统一动作接口的隐藏逻辑
2026/10/29 19:48:27 网站建设 项目流程

【免费下载链接】X-VLA

[ICLR 2026] The offical Implementation of "Soft-Prompted Transformer as Scalable Cross-Embodiment Vision-Language-Action Model"

项目地址:https://gitcode.com/gh_mirrors/xv/X-VLA
点击查看免费下载

X-VLA(ICLR 2026 收录的跨本体视觉-语言-动作模型)用一条20 维 EE6D 向量统一了所有机器人的动作接口:无论单臂、双臂、仿真还是真机,模型输入输出的维度恒定不变。本文带你拆解这 20 个数字的排布规则、6D 旋转表示的数学原理,以及从模型输出到机械臂执行的完整转换链路,帮助你快速上手 X-VLA 的部署与二次开发。

为什么 X-VLA 需要一个"统一动作接口"

跨本体(Cross-Embodiment)训练意味着同一个 Transformer 要同时处理 Franka、Agilex、AgiBot、WidowX 等形态各异的机器人。如果每个本体各用一套动作格式,模型就无法共享能力。

X-VLA 的解决方案是:把所有动作都投影到"末端执行器(End-Effector, EE)6D 位姿"空间,并用固定 20 维向量承载。这套约定集中在 models/action_hub.py 的EE6DActionSpace中定义,并在 models/configuration_xvla.py 里由action_mode、max_action_dim等参数控制:

配置项默认值含义
action_modeee6d动作空间类型,可选ee6d/joint/agibot_ee6d/auto
max_action_dim20模型输出维度(padding 上限)
real_action_dim20真实动作维度(auto模式用)
num_actions30每次推理输出的动作块长度

💡 核心思想:手臂数量、夹爪类型、关节自由度的差异全部被"吸收"进这 20 维,下游控制器负责把 20 维还原成自家机器人能懂的指令。

解剖 20D 向量:左右各 10 维的对称排布

20 维向量实际上是两个 10 维子向量的拼接——左臂一条、右臂一条。每条手臂的 10 维内部结构完全一致:

索引0-23-89
语义EE 位置 xyz (3D)6D 旋转表示 (6D)夹爪开合 (1D)
左臂0,1,23,4,5,6,7,89
右臂10,11,1213,14,15,16,17,1819

这些索引在源码中被显式声明,方便训练时按段计算损失:

  • POS_IDX_1 = (0,1,2)、POS_IDX_2 = (10,11,12)
  • ROT_IDX_1 = (3..8)、ROT_IDX_2 = (13..18)
  • gripper_idx = (9, 19)

定义见 models/action_hub.py。

单臂机器人怎么办?零填充

对于 DROID、RoboMind-Franka 这类单臂数据集,右臂 10 维直接全零填充,模型接口维度保持 20 不变。例如 datasets/domain_handler/droid.py 中的处理:

right = np.zeros_like(left) # 单臂 → 右臂填零,凑成 20 维

同理,datasets/domain_handler/robomind.py 对 Franka 单臂也采用right = np.zeros_like(left)的策略。这就是 README 中所说的"Single-arm Case: pad with zeros to maintain 20D"。

上图:Piper 双机械臂在 RViz 中的末端位姿可视化(来自 evaluation/SoftFold-Agilex/ 部署工程),正是 EE6D 空间中 xyz + 旋转在物理世界中的投影。

6D 旋转表示:X-VLA 不学四元数、不学欧拉角的隐藏逻辑

向量中 3-8、13-18 这 6 个数字是旋转矩阵的前两列(6 个数拼成),即经典的 "6D Rotation Representation"。相比常见的表示方式,它有几个关键优势:

  • 连续性:欧拉角有万向节死锁,四元数存在 q 与 -q 等价跳变,而 6D 表示随姿态平滑变化,回归网络学起来更稳;
  • 可恢复性:拿到 6 个数字后,用Gram-Schmidt 正交化就能还原出合法旋转矩阵,进而转成任何下游格式。

训练侧:原始数据怎么变成 6D

不同数据集的原始旋转格式五花八门,X-VLA 在数据加载层(datasets/utils.py)统一转换:

原始格式转换函数典型数据集
四元数 (quat)quat_to_rotate6dAGIBOT、AGIWorld、AIR-AGILEX
欧拉角 (Euler)euler_to_rotate6dDROID、RoboMind

以 AgiWorld 为例,datasets/domain_handler/agiworld.py 中左、右臂各拼出xyz + 6D + gripper再合并为 20 维abs_ee6d;datasets/domain_handler/lerobot_agibot.py 则从 parquet 中读取actions.end.position / orientation / effector.position做同样处理。

推理侧:6D 怎么还原成机械臂指令

部署时反向操作,核心函数是 datasets/utils.py 的rotate6d_to_xyz():

  1. 把 6 个数拆成两个 3 维向量,交替取列:a1 = v6[0,2,4]、a2 = v6[1,3,5];
  2. 归一化a1,再把a2去掉在a1上的投影后归一化(Gram-Schmidt);
  3. 叉乘得到第三轴,拼出旋转矩阵,最后转成欧拉角。

SoftFold 双臂真机部署脚本 evaluation/SoftFold-Agilex/deploy/utils/rotation.py 里的abs_6d_2_abs_euler()就是这套流程的完整实现,把 20 维动作转成机械臂控制器能直接执行的 14 维关节级位姿指令。

⚠️注意方向:喂给模型的 proprio(本体感知)要用"逆变换"——从机器人位姿转成 6D;模型输出则用"正变换"——从 6D 转回 xyz/欧拉角。两端的旋转编码必须严格对齐,否则会出现末端姿态漂移。

四种 action_mode:一套代码适配所有机器人

X-VLA 通过注册表模式管理动作空间(register_action装饰器 +build_action_space工厂函数),内置 4 种模式:

1️⃣ee6d(默认)——标准末端 6D 空间

  • 维度 20,夹爪通道(9, 19)按二分类 logit处理(BCEWithLogitsLoss),推理时过 sigmoid;
  • 损失权重藏了重要信息:XYZ_SCALE=500、ROT_SCALE=10、GRIPPER_SCALE=1,位置精度被放大 500 倍,因为毫米级的落点误差直接决定任务成败,而姿态误差容错空间更大。

2️⃣joint——关节空间

维度 14(双 6 关节臂 + 双夹爪),夹爪通道(6, 13),适合只想微调关节级策略的场景。

3️⃣agibot_ee6d——AgiBot 特化变体

同样是 20 维布局,但所有分量都用 MSE 损失(夹爪权重 10),且不做夹爪通道置零和 sigmoid 后处理。AgiBot 的夹爪开合是连续量而非二值开关,因此单独设了一个变体。

4️⃣auto——自适应兜底模式

模型仍输出max_action_dim=20,但:

  • 损失只在前real_dim维上计算;
  • 输入自动 zero-pad 到 20 维,输出再 trim 回real_dim。

这让同一套预训练权重可以无缝适配任意低维动作空间,是接入新本体时最省事的选择。相关逻辑见 models/modeling_xvla.py。

从模型输出到真机执行:三条必知转换链路

拿到 30 步 × 20 维的预测动作后,部署端通常还要做三步后处理(参考 evaluation/SoftFold-Agilex/deploy/client_eef6d_xvla.py 和各 benchmark 的 reference client):

相对位移 → 绝对位姿(可选)

部分模型(如 x2robot 域)输出的是xyz 相对增量:训练时由 datasets/utils.py 的action_slice()按idx_for_delta减去初始 proprio 得到。部署时客户端把预测增量加回当前末端位置(rel_to_abs),再交给控制器。若你的 checkpoint 已输出绝对位姿(如 LIBERO 系列,见 evaluation/libero/preprocess.md),则跳过此步。

夹爪二值化

夹爪通道过 sigmoid 后落在 0~1 之间,常见做法是0.5 阈值二值化,再映射到物理开合值:

action[9] = -0.0054 if action[9] > 0.5 else 0.0656 # 左臂夹爪 action[19] = -0.0054 if action[19] > 0.5 else 0.0656 # 右臂夹爪

6D → 欧拉角/四元数

按机器人控制器接受的格式调用rotate6d_to_xyz()(欧拉角)或rotate6d_to_quat()(四元数)完成最后一跳。

部署速查:Server–Client 架构下的动作流

X-VLA 采用 Server–Client 分离架构:模型跑在 GPU 服务上(python deploy.py --model_path <模型> --port 8000),客户端 POST/act接口,payload 中包含proprio(20 维 EE6D 当前位姿)、image0/1/2、language_instruction、domain_id(本体标识,映射表见 datasets/domain_config.py)和steps(流匹配去噪步数,默认 10)。

推理本质是流匹配去噪:从随机噪声出发,经steps次迭代逐步去噪出 30 步动作块,最后统一调用action_space.postprocess()(如夹爪 sigmoid)。每个域的具体客户端模板都在 evaluation/ 下按 benchmark 组织,强烈建议直接 fork 对应 client 改造。

关键文件速查清单

主题文件
动作空间定义与损失权重models/action_hub.py
6D 旋转互转工具datasets/utils.py
模型加载与去噪推理models/modeling_xvla.py
配置项(action_mode 等)models/configuration_xvla.py
数据域 → EE6D 转换示例datasets/domain_handler/
双臂真机部署参考客户端evaluation/SoftFold-Agilex/deploy/client_eef6d_xvla.py
LIBERO 动作格式转换指南evaluation/libero/preprocess.md

掌握这套"20 维 = 双臂 × (xyz + 6D + gripper)"的映射规则后,你就能看懂 X-VLA 任何 checkpoint 的输入输出,也能在接入新机器人时只改数据加载与后处理两端,而无需触碰模型本身。

【免费下载链接】X-VLA

[ICLR 2026] The offical Implementation of "Soft-Prompted Transformer as Scalable Cross-Embodiment Vision-Language-Action Model"

项目地址:https://gitcode.com/gh_mirrors/xv/X-VLA
点击查看免费下载
上一篇:wasm-bindgen 微基准测试指南:构建、运行与基准架构深度解析
下一篇:ripwire如何做到58.3%的代码定位准确率:Graph-Ranked Retrieval算法拆解

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询