XR-1:首个真正可工作的机器人VLA模型,打通视觉-语言-动作统一表示
1. 项目背景为什么机器人需要一个“通才”大脑如果你最近在关注具身智能或者机器人领域一定被各种“世界模型”、“端到端模型”刷屏了。从DeepMind的RT系列到斯坦福的Mobile ALOHA大家都在试图解决同一个核心问题如何让机器人像人一样通过观察、理解和思考最终执行复杂的物理任务这个链条很长从“看到什么”视觉感知到“理解要做什么”语言指令理解再到“具体怎么动”动作生成每一步都充满了挑战。传统的做法是什么是“拼积木”。视觉模块用一套模型比如YOLO、DETR语言理解用另一套比如BERT、GPT动作规划再用一套比如强化学习策略网络。这种模式的问题显而易见模块之间信息传递有损耗每个模块都需要单独标注海量数据来训练而且一旦环境或任务稍有变化整个系统就可能需要重新调整甚至重新训练。这就像让一个团队里说不同语言、用不同工具的人协作沟通成本高效率低下。所以整个领域都在呼唤一个“通才”模型——一个能打通视觉、语言和动作的单一模型。这就是VLAVision-Language-Action模型。理想中的VLA你给它看一段视频或者一张图片再告诉它“把桌上的红色杯子拿给我”它就能直接输出控制机械臂关节运动的序列。这听起来很美好但实现起来困难重重。最大的难点在于“统一表示”如何将高维、异构的视觉信息、离散的语言符号和连续、低维的动作空间映射到同一个语义空间里之前的很多工作要么只专注于仿真环境要么只能在特定形态的机器人比如单一机械臂上工作离“真正能干活”还有距离。这就是XR-1项目出现的原因。当我第一次在GitHub上看到这个由北京人形机器人创新中心等机构开源的仓库时标题里的“The 1st VLA Model for Robots to Truly WORK”立刻抓住了我。它不是又一个停留在论文和仿真里的玩具而是明确宣称要支持从UR、Franka到TienKung人形机器人的多种实体平台并提供了从数据准备、模型训练到真实机器人部署的完整工具链。这让我决定深入代码和文档看看它到底是如何解决“统一表示”这个核心难题并让模型“真正工作”起来的。2. XR-1的核心架构三阶段训练如何炼成“统一表示”XR-1的整个设计哲学都围绕着“学习统一的视觉-运动表示”展开。它的模型架构和训练流程可以清晰地分为三个阶段像一个精心设计的课程让模型逐步掌握从感知到行动的完整能力。2.1 阶段一视觉-运动对齐Unified Vision-Motion Contrastive Learning这是整个框架的基石。想象一下教一个婴儿认识世界你指着苹果说“苹果”同时让他触摸苹果的质地。视觉、语言声音、触觉动作的前身信息在婴儿大脑中逐渐关联。XR-1的第一阶段做的就是这个“对齐”工作但它对齐的是视觉和运动。具体来说这个阶段采用了一种改进的对比学习框架。模型同时接收两种输入视觉观察序列通常是来自机器人摄像头的一段视频帧。对应的运动序列这段时间内机器人执行的动作如关节角度、末端执行器位姿。模型的核心任务是学习一个共享的嵌入空间。在这个空间里描述同一段“拿起杯子”任务的视频特征和动作特征它们的向量表示应该非常接近正样本对而描述“拿起杯子”的视频和“推开杯子”的动作它们的向量表示应该相距甚远负样本对。注意这里的“运动”是广义的不仅包括低级的关节电机指令在更高级的表示中也可能包括轨迹、技能原型等。XR-1的巧妙之处在于它通过一个可学习的“运动编码器”将不同机器人平台如UR的6轴关节空间和Franka的7轴关节空间产生的异构动作数据投影到同一个标准化的运动表示空间中。这是实现跨平台泛化的关键第一步。这个阶段的输出是一个已经初步理解“什么视觉场景对应什么类型运动”的模型。它虽然还不会根据语言指令生成动作但它已经建立了视觉和运动模态之间的坚实桥梁。2.2 阶段二融入语言指令的预训练Language-Conditioned Pretraining有了视觉-运动对齐的基础第二阶段引入语言指令作为条件。此时模型的输入变成了三元组(视觉观察 语言指令 运动动作)。任务目标变为给定当前的视觉观察和语言指令预测接下来要执行的动作序列。这个阶段通常采用类似“掩码预测”或“扩散模型”的生成式架构。以扩散模型为例过程是这样的模型接收当前图像和指令“打开抽屉”。扩散模型从一个随机噪声开始逐步去噪生成一个未来动作序列的分布。在训练时用真实的“打开抽屉”动作序列作为目标让模型学会在指令条件下生成符合任务目标的合理动作。这里的一个技术细节是如何融合语言信息。XR-1没有简单地将语言指令的文本嵌入直接拼接到视觉特征上而是设计了一个交叉注意力模块。视觉特征作为Query语言特征作为Key和Value让模型动态地根据指令内容去关注图像中相关的区域比如“抽屉把手”从而生成更精准的动作。经过第二阶段训练模型已经具备了初步的“听令行事”能力。但它学到的可能还是一些比较通用、粗糙的策略。2.3 阶段三针对具体任务的微调Task-Specific Fine-Tuning这是让模型“真正工作”的临门一脚。前两个阶段通常在大型、多样的数据集上进行可能包含仿真数据、不同机器人的演示数据等。而第三阶段则使用目标机器人比如你实验室的那台Franka在目标场景比如你的厨房操作台收集的少量高质量演示数据进行微调。为什么这一步不可或缺因为真实世界的物理特性摩擦力、物体重量、相机畸变、灯光条件和机器人本身的动力学特性电机响应、齿轮间隙是极其独特的。大规模预训练模型学到了通用的“抓取”概念但可能不知道你的Franka夹爪的具体夹持力是多少牛顿或者你的摄像头有特定的颜色偏差。第三阶段的微调数据量不需要很大几十到几百条高质量轨迹往往就足够但它能极大地提升模型在特定硬件上的成功率和动作质量。XR-1框架对此提供了极大便利它的统一数据加载器可以无缝接入你收集的新数据并快速启动微调。实操心得在阶段三学习率要设置得非常小通常是预训练的1/10到1/100并且经常需要冻结模型的大部分底层参数只微调最顶层的几个网络层。这既能快速适应新场景又避免了在少量数据上“灾难性遗忘”之前学到的通用知识。XR-1的脚本通常已经内置了这些最佳实践。3. 从零开始手把手部署XR-1到真实机器人理论讲得再多不如实际跑通一次。下面我将以一台Franka Research 3机械臂为例详细拆解从环境搭建到模型部署的完整流程。这个过程同样适用于UR、TienKung等其他平台核心逻辑是相通的。3.1 环境准备与依赖安装第一步是准备好你的开发环境。XR-1基于Python 3.10和PyTorch并深度集成了LeRobot生态。我强烈建议使用Conda来管理环境避免依赖冲突。# 1. 克隆仓库 git clone https://github.com/Open-X-Humanoid/XR-1.git cd XR-1 # 2. 创建并激活Conda环境 conda create -y -n xr1 python3.10 conda activate xr1 # 3. 安装核心依赖 # 这里使用项目提供的安装方式[xr1]会安装额外的机器人相关依赖 pip install -e .[xr1]安装过程可能会持续一段时间因为它会拉取包括PyTorch、Transformers、LeRobot等在内的大量包。如果遇到网络问题可以考虑为pip配置镜像源。常见坑点一CUDA版本与PyTorch匹配。如果你的机器有NVIDIA GPU请确保系统安装的CUDA版本与PyTorch官方提供的预编译版本匹配。例如PyTorch 2.x通常对应CUDA 11.8或12.1。不匹配会导致无法使用GPU。安装后可以在Python中运行import torch; print(torch.cuda.is_available())来验证。常见坑点二LeRobot版本兼容性。XR-1的代码是基于LeRobot dataset v2.1版本开发的。而LeRobot本身迭代很快。虽然项目说保留了原结构以便集成但如果你之前安装过其他版本的LeRobot最好在干净的Conda环境中进行或者仔细查看pyproject.toml文件里锁定的版本。3.2 数据准备理解“统一数据加载器”数据是模型的燃料。XR-1最大的亮点之一是其设计的“统一数据加载器”它能处理来自不同源头EGO4D、UR、Franka等、不同形态视频、关节状态、相机位姿的数据。项目提供了一个异构数据集的样本我们可以先下载它来熟悉格式# 使用Hugging Face Hub下载 bash scripts/hf_xr1_dataset_sample_download.sh下载的数据集结构大致如下XR-1-Dataset-Sample/ ├── franka_demo/ # Franka机器人的演示数据 │ ├── episode_0/ │ │ ├── images/ # 多视角相机图片 │ │ ├── actions.npy # 动作序列 │ │ ├── observations.npy # 状态观测如关节角度 │ │ └── language_instruction.txt # 任务指令 │ └── ... ├── ur5e_demo/ # UR5e机器人的演示数据 └── ego4d_clips/ # EGO4D第一人称视频数据用于预训练关键点在于无论数据来源如何加载器都会通过一个统一的配置字典来读取。你需要创建一个YAML配置文件告诉加载器你的数据在哪、使用哪些传感器、动作的维度是多少。XR-1在examples/xr1_cross_dataset_and_embodiment_dataloader.py中给出了一个强大的示例展示了如何混合加载Franka和UR的数据进行训练。对于你自己的机器人如果你想收集数据核心是生成符合LeRobot v2.1格式的数据集。你需要同步记录图像最好是多视角RGB格式。动作机器人的控制命令。可以是关节角度、关节速度、末端执行器位姿pose或笛卡尔空间速度。必须保持维度一致。指令每个任务片段episode对应的自然语言描述。观测可选但推荐机器人的状态如关节角度、力传感器读数等可用于更复杂的策略。项目提供的any4lerobot工具可以帮助你将其他格式的数据转换过来。3.3 模型下载与快速微调假设我们想用Franka数据快速微调一个模型。我们不需要从零预训练而是下载官方预训练好的基础模型然后在自己的数据上进行“阶段三”的快速微调。# 1. 下载基础视觉和语言模型如SigLIP, PaliGemma bash scripts/hf_download.sh # 2. 下载XR-1的预训练权重Stage1和Stage2 bash scripts/hf_xr1_pretrain_model_download.sh # 3. 进行阶段三的快速微调 # 使用调试模式先跑通流程确保一切配置正确 bash scripts/xr1_stage3_finetune.sh --debug --dataset /path/to/your/franka_data这里有几个参数需要你根据实际情况修改--dataset: 指向你准备好的数据集路径或数据集配置名。在scripts/xr1_stage3_finetune.sh脚本内部你还可以调整train.batch_size: 根据你的GPU内存调整。从1或2开始尝试。train.num_epochs: 微调周期对于快速适应10-20个epoch可能足够。model.policy: 选择策略网络类型如diffusion或transformer。扩散策略通常更平滑、稳定是默认推荐。运行后模型会在outputs/目录下保存检查点。你可以使用TensorBoard来监控训练损失和验证指标。3.4 真实机器人部署与闭环验证模型训练好后就到了最激动人心的环节让真机动起来。XR-1提供了deploy/real_robot/xr1_deploy.py脚本作为部署起点。部署的核心逻辑是一个感知-决策-执行的循环感知通过ROS或机器人SDK实时获取相机图像。决策将当前图像和任务指令可以是硬编码或语音输入输入到训练好的XR-1模型中。执行模型输出未来一段时间如未来2秒每秒10个点的动作序列。通常我们只执行第一个动作即“模型预测的下一步”或者以“重规划”的方式每隔一个时间间隔如0.1秒就用最新的观测重新运行一次模型生成新的动作序列。后者对动态环境更鲁棒。# 部署脚本伪代码逻辑示意 import torch from xr1_policy import XR1Policy # 你训练好的策略模型 from robot_interface import FrankaRobot # 你的机器人控制接口 model XR1Policy.load_from_checkpoint(“your_checkpoint.ckpt”).eval().cuda() robot FrankaRobot() instruction “Pick up the blue block.” while not task_done: # 1. 获取观测 image robot.get_camera_image() # 2. 模型推理 with torch.no_grad(): action model.predict(image, instruction) # 3. 执行动作这里action是第一个步骤 robot.execute_action(action[0]) # 4. 短暂等待进入下一个循环 time.sleep(0.1)部署中的核心挑战与调参观测对齐训练时用的图像预处理裁剪、归一化必须和部署时完全一致。一个像素的偏差都可能导致模型表现异常。控制频率模型训练时有一个固定的“动作预测频率”如10Hz。部署时你的控制循环频率必须与之匹配或者进行适当的插值。安全性这是重中之重。在真实机器人上运行前务必在仿真环境中如PyBullet、Isaac Sim充分测试。在代码中加入动作幅度限制、碰撞检测和急停开关。延迟从图像采集、模型推理到命令下发存在延迟。如果延迟较大100ms需要考虑使用“观测历史”作为模型输入或者使用预测模型来补偿延迟。4. 性能评估与结果分析XR-1到底“多能干活”一个模型好不好不能只看论文里的数字更要看它在真实、复杂场景下的表现。根据项目页面和论文信息XR-1在多种机器人平台和任务上进行了验证。机器人平台典型任务关键挑战XR-1的表现亮点双臂UR-5e双手协作打开药瓶双臂协调、精细操作、力控能理解“打开”指令生成协调的双臂扭动和拉拽动作序列适应不同瓶盖松紧度。TienKung 2.0 (人形)在杂乱桌面找到并拾取指定工具全身运动规划、平衡控制、复杂场景理解结合全身视觉能规划出包含步态移动、躯干弯曲、手臂伸展的连贯动作成功率高。双臂Franka从洗碗机中取出并摆放碗碟复杂几何形状抓取、避障、序列任务模型输出的动作在关节空间平滑避免了剧烈抖动且能根据碗碟大小自适应调整抓取姿态。AgileX Cobot跟随语音指令进行搬运移动底盘与机械臂的协同、动态环境证明了统一表示对“移动操作”任务的有效性模型能同时输出底盘速度和机械臂动作。从这些结果可以看出XR-1的“统一表示”确实带来了显著的泛化优势。它不仅仅是在一个固定场景、固定任务上过拟合而是展现出一定的跨任务、跨平台能力。例如一个在Franka上训练了“抓取”任务的模型经过少量数据微调就能在UR上执行类似的抓取因为底层“抓取”的视觉-运动表示是相通的。与纯仿真模型的区别很多优秀的VLA模型比如在Meta的Habitat或Google的RGB-Stack上训练的在仿真中成绩斐然但一到真机就“见光死”。XR-1从设计之初就考虑了真机部署其训练数据大量包含来自真实机器人的演示并且其动作表示更贴近真实控制器的输入如关节位置/速度这使得它生成的动作品质更高、更可行。5. 深入原理统一视觉-运动表示的技术细节要真正理解XR-1为何有效我们需要再深入一层看看它如何实现“统一表示”。这主要归功于其创新的模型架构设计。5.1 视觉编码器与运动编码器的设计模型的第一关是如何处理高维输入。对于视觉XR-1通常采用强大的预训练视觉编码器如SigLIP或PaliGemma。这些模型已经在海量图像-文本对上训练过具备了强大的视觉特征提取和语义理解能力。关键步骤是适应性微调在机器人数据上对这些视觉编码器的最后几层进行微调使其更关注与物理交互相关的特征如物体的可抓取部位、空间关系而不是语义类别。对于运动动作设计则更为关键。不同的机器人自由度DoF不同控制模式也不同。XR-1采用了一个可学习的运动编码器通常是一个多层感知机。它的作用是将不同维度、不同物理意义的动作向量如[joint1_angle, joint2_angle, ...]映射到一个标准化的、高维的“运动语义空间”。在这个空间里“向上抬起手臂”这个语义无论来自7自由度的Franka还是6自由度的UR其向量表示都应该在几何上接近。5.2 多模态融合与条件生成策略当视觉特征和语言指令特征准备好后如何融合它们并生成动作XR-1主要采用基于Transformer的架构特别是交叉注意力机制。语言作为条件语言指令的嵌入向量不作为直接的输入拼接而是作为Key和Value注入到Transformer的解码器层中。视觉特征作为Query。这样在生成每一个未来时间点的动作时模型都可以动态地“回顾”语言指令确保动作不偏离任务目标。扩散模型作为动作解码器近年来扩散模型在机器人策略学习中表现出色因为它能生成平滑、多样且概率合理的动作序列。XR-1也采用了这一范式。扩散过程在“运动语义空间”中进行。模型学习去噪的过程就是学习在给定视觉和语言条件下如何将一个随机噪声逐步 refine 成合理动作序列的过程。这种方法比直接回归动作更能捕捉动作分布的多模态特性比如抓一个杯子可以从左边抓也可以从右边抓。5.3 处理异构与稀疏数据的技巧真实机器人数据是宝贵且昂贵的通常很稀疏演示次数有限。XR-1框架通过以下方式应对数据增强对图像进行随机裁剪、颜色抖动对动作序列加入轻微的时间抖动和噪声。这能有效增加数据的多样性。课程学习在训练初期使用更容易的任务数据如大幅度的移动动作后期再引入精细操作数据。模型正则化在损失函数中加入对动作序列的平滑性约束如加速度惩罚防止模型输出抖动剧烈、不安全的动作。利用大规模互联网视频第一阶段预训练可以大量使用EGO4D这类第一人称视频数据即使没有精确的动作标签对比学习也能让模型学到丰富的视觉-运动关联先验。6. 实战避坑指南与进阶思考在复现和扩展XR-1项目的过程中我踩过不少坑也总结出一些能让项目跑得更顺的经验。6.1 数据收集与标注的实践建议质量大于数量对于阶段三的微调100条干净、成功的演示轨迹远胜于1000条包含噪声、失败或模糊不清的轨迹。确保每条演示任务定义清晰语言指令准确。机器人动作流畅、准确没有卡顿或抖动。相机视角固定光照条件稳定或多样化以增强鲁棒性。同步是关键图像、关节状态、控制命令的时间戳必须精确同步。哪怕几十毫秒的错位都会让模型学到错误的对应关系。建议使用硬件触发或高精度系统时钟。指令的多样性对于同一个任务“拿起杯子”可以收集多种语言描述的演示如“把那个杯子拿起来”、“请抓取桌上的红色杯子”、“获取杯具”。这能增强模型对语言泛化的理解。6.2 训练过程中的常见问题与调试损失不下降或震荡检查学习率可能是学习率太大。尝试减小学习率或使用学习率预热。检查数据可能是数据中存在异常值或未对齐。可视化一些样本检查图像-动作对是否合理。检查梯度使用torch.nn.utils.clip_grad_norm_对梯度进行裁剪防止爆炸。过拟合在验证集上损失先降后升。增加数据增强的强度。在模型中添加Dropout层。尽早停止训练。显存不足减小batch_size。使用梯度累积假设你想用batch_size8但显存只够2你可以设置batch_size2并设置gradient_accumulation_steps4效果上等同于batch_size8。尝试混合精度训练AMP这通常能节省显存并加速。6.3 从模仿学习到强化学习的结合XR-1目前主要基于模仿学习行为克隆。它的上限受限于演示数据的质量。一个自然的进阶方向是结合强化学习。用XR-1模型初始化策略将训练好的XR-1模型作为强化学习智能体的初始策略这比随机初始化快得多。使用XR-1作为世界模型XR-1本质上学习了一个条件生成模型p(actions | image, instruction)。可以将其扩展为一个预测下一个状态的世界模型p(next_image | image, action)。然后可以在学习到的世界模型中进行“想象”规划或者用于基于模型的强化学习大幅减少真实机器人的试错成本。6.4 对社区开发者的意义XR-1的开源不仅仅是放出了一个模型更是提供了一套完整的、工程化的VLA模型研发范式。它统一的数据加载器、模块化的训练脚本、以及针对真实部署的考虑极大地降低了研究者和小型团队进入具身智能领域的门槛。你可以基于它的框架轻松地替换更强的视觉基础模型如Qwen2-VL。尝试不同的动作表示如笛卡尔空间阻抗控制。集成新的传感器模态如触觉、深度点云。探索更高效的多任务学习算法。这个项目像是一块坚实的跳板让社区能够站在其肩膀上更快地探索VLA模型的边界。我个人的体会是机器人学习的未来必然是朝着这种端到端、多模态统一的方向发展。XR-1让我们看到了这条路在现实世界中走通的切实可能性接下来的挑战将集中在如何用更少的数据、更安全的方式让模型掌握更复杂、更长期的推理和规划能力。