XLeRobot 双臂 VLA 实战:SmolVLA 与 ACT 训练、三摄像头数据收集及 VR 遥操作完整指南
2026/9/18 4:08:28 网站建设 项目流程

XLeRobot 双臂 VLA 实战:SmolVLA 与 ACT 训练、三摄像头数据收集及 VR 遥操作完整指南

【免费下载链接】XLeRobotXLeRobot: Practical Dual-Arm Mobile Home Robot for $660项目地址: https://gitcode.com/GitHub_Trending/xl/XLeRobot

本指南以 XLeRobot 项目中文文档 VLA_smol.md 为核心骨架,系统讲解如何基于 LeRobot 生态在 XLeRobot 双臂 SO-101 机器人上完成三摄像头演示数据采集、SmolVLA 与 ACT 策略训练、推理评估,以及使用 VR 控制器完成遥操作与数据记录的完整闭环。读完本文,你将掌握从硬件配置、环境搭建、数据记录到策略部署的一整套可复现操作流程,并理解动作维度自动填充、VR 事件处理等底层实现原理。


1) 概述:XLeRobot 在 LeRobot 基础上的扩展

XLeRobot 是一套基于 LeRobot 的机器人软硬件方案,在标准的单臂 follower/leader 结构之上扩展了以下关键能力(见 docs/zh/source/software/getting_started/VLA_smol.md):

  • BiSO101Follower:双臂 follower(执行臂),左右各一条 SO-101 手臂,共 12 个自由度;
  • BiSO101Leader:双臂 leader(遥操作主臂),用于采集演示数据;
  • 独立控制左/右臂 + 同步双臂操作:既可以单独控制某一侧手臂,也可以双臂协同完成复杂任务;
  • 三摄像头记录配置
    • front_cam(正面摄像头)
    • hand_cam(手部/腕部摄像头)
    • side_cam(侧面摄像头)

这一"双臂 + 三摄像头"的配置是 SmolVLA 与 ACT 训练的数据基础:多视角观测能显著降低策略对单视角遮挡的敏感度,而双臂协同则使机器人可以完成拉抽屉、开拉链等单臂难以完成的复合任务。

从仓库源码结构看,XLeRobot 在 software/src 下提供了与 LeRobot 官方目录结构对齐的机器人定义、配置与示例代码,并在 software/src/record.py 中实现了支持 VR 事件监听的双臂记录循环(后文会详细展开)。


2) 演示任务:SmolVLA 用约 20 个 episode 能学到什么

文档给出了两个经过社区验证的演示任务,用于说明数据收集的难易度与策略学习效果:

演示 1 —— 抽屉 + 抓取 + 放置 + 抓握(双臂协同)

在训练约20 个 episode后,XLeRobot 可以完成一个完整的"抽屉任务"链路:

  1. 拉开抽屉
  2. 抓取物体
  3. 将物体放入抽屉
  4. 推入抽屉(关闭)

关键方面(直接决定数据质量与训练成败):

  • 一次性抓取抽屉把手:数据收集期间要避免抖动和反复微调,让策略学到"一步到位"的动作模式;
  • 左臂拉抽屉时,右臂必须精确抓取物体的中心,双臂时序与空间配合要求极高;
  • 准确的一次性放置到抽屉中,并平滑地"推入"关闭,避免犹豫反复。

演示 2 —— 铅笔盒拉链(精细操作)

同样约20 个 episode即可学会:

  1. 抓取拉链拉片
  2. 抓取铅笔盒把手并稳定盒子
  3. 拉动拉链拉片以平滑打开拉链

关键难点:

  • 拉链拉片通常处于自上而下的摄像头盲点中,需要依赖侧面摄像头视角进行一次性抓取(避免重新抓取导致数据噪声);
  • 保持一致的拉动高度,避免上下移动(没有"向上猛拉"或"向下拖拽"),否则策略会把抖动学进去。

这两个示例共同说明了 VLA 数据收集的核心哲学:演示质量 > 演示数量。20 个高质量 episode 的学习效果通常优于 50 个含噪声的 episode。


3) 硬件与配置说明

3.1 摄像头放置(三个摄像头)

推荐配置:

摄像头数量作用
front_cam1正面全局视角,观察物体与桌面布局
hand_cam1手部/腕部近距视角,捕捉抓取细节
side_cam1侧面视角,弥补正上方与手部视角的盲区

注意:在实践中,一致的摄像头放置稳定的照明对于学习稳定的操作至关重要。记录与推理阶段必须保持摄像头视角完全一致,否则策略性能会显著下降。

3.2 动作维度处理(重要)

双臂 SO-101 机器人共有12 个动作维度

6 个关节 × 2 条手臂 = 12

(每侧手臂的 shoulder_pan、shoulder_lift、elbow_flex、wrist_flex、wrist_roll、gripper 共 6 个关节)

仓库 software/src/record.py 中定义的GLOBAL_BACK_GOALGLOBAL_OPEN_GOAL正是长度为 12 的数组,从源码层面印证了双臂 12-D 的动作空间定义。

SmolVLA 自动检测和处理动作维度,无需手动配置:

  • 训练期间:12-D → 填充到 32-Dmax_action_dim
  • 推理期间:32-D → 裁剪回原始 12-D

概念代码路径:

# 训练: 12D -> 填充到32D actions = pad_vector(batch[ACTION], self.config.max_action_dim) # 推理: 32D -> 裁剪回12D original_action_dim = self.config.action_feature.shape[0] # 自动检测: 12 actions = actions[:, :, :original_action_dim]

与其他可能需要手动action_mode配置的 VLA 模型(例如 xVLA)不同,SmolVLA 通过动态填充机制支持任意 ≤32-D 的动作空间。这意味着用户无需关心动作维度配置,只需保证演示数据维度正确即可。


4) 安装与环境设置(Linux)

以下步骤在 Linux 系统上完成(文档以 Ubuntu 系为例)。

A. 安装 Miniconda(示例)

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh # 重启终端,然后验证 conda --version

B. 创建和激活环境

conda create -n lerobot python=3.10 conda activate lerobot

注意:每次使用 LeRobot/XLeRobot 时都要激活此环境:

conda activate lerobot

C. 安装系统依赖(FFmpeg)

数据集中的摄像头帧以视频形式编码存储,FFmpeg 是必需的系统依赖:

conda install -c conda-forge ffmpeg

D. 克隆仓库并安装依赖

文档使用的 LeRobot 是社区维护的 XLeRobot 兼容 fork(原文档给出的仓库地址为https://github.com/kahowang/lerobot.git,本文仅作文字引用,不提供外部链接):

git clone <xlerobot-compatible-lerobot-fork> cd lerobot # 安装带Feetech电机支持的LeRobot(SO-101需要) pip install -e ".[feetech]" # 安装SmolVLA依赖 pip install -e ".[smolvla]"

要点说明:

  • .[feetech]提供 Feetech 舵机总线支持,SO-101 手臂必须安装;
  • .[smolvla]安装 SmolVLA 策略所需的额外依赖(如对应的视觉骨干与分词器等)。

若需将 XLeRobot 仓库中与 VR 相关的记录代码合入你本地的 LeRobot fork,可参考 VLA_ACT.md 的做法:将 software/src/record.py 与 software/src/teleporators/xlerobot_vr 目录复制到 LeRobot 对应位置。


5) 数据收集:三摄像头、双臂遥操作

数据收集使用lerobot-record命令,以BiSO101Follower(follower)配合BiSO101Leader(leader 遥操作)的方式录制三摄像头双臂演示。

${HF_USER}your_dataset_name替换为你的 Hugging Face 用户名和数据集名称:

lerobot-record \ --robot.type=bi_so101_follower \ --robot.left_arm_port=/dev/ttyACM0 \ --robot.right_arm_port=/dev/ttyACM1 \ --robot.id=bimanual_follower \ --robot.cameras='{ "front_cam": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}, "hand_cam": {"type": "opencv", "index_or_path": 1, "width": 640, "height": 480, "fps": 30}, "side_cam": {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30} }' \ --teleop.type=bi_so101_leader \ --teleop.left_arm_port=/dev/ttyACM2 \ --teleop.right_arm_port=/dev/ttyACM3 \ --teleop.id=bimanual_leader \ --dataset.repo_id=${HF_USER}/your_dataset_name \ --dataset.single_task="Your task description here" \ --dataset.num_episodes=50

参数详解

参数含义建议
--robot.type机器人类型双臂 follower 固定为bi_so101_follower
--robot.left_arm_port/--robot.right_arm_portfollower 左右臂 USB 串口必须匹配实际设备映射
--robot.cameras三摄像头 JSON 配置分辨率 640×480、fps 30;若遇超时可将 fps 降至 20(参考 VLA_ACT.md)
--teleop.type遥操作类型双臂 leader 固定为bi_so101_leader
--teleop.left_arm_port/--teleop.right_arm_portleader 左右臂 USB 串口通常与 follower 使用不同端口
--dataset.repo_id数据集 ID格式${HF_USER}/${dataset_name}
--dataset.single_task任务描述应简洁但具体,提高可重复性
--dataset.num_episodes录制 episode 数快速迭代可从 20 起步,再逐步扩展

参数提示

  1. 端口(/dev/ttyACM*)必须匹配你的实际 USB 设备映射——不同设备的枚举顺序可能不同,建议记录前用ls /dev/ttyACM*确认;
  2. dataset.single_task应该简洁但具体(提高可重复性),它会被写入数据集元数据,供策略在训练时作为语言条件;
  3. 为了快速迭代,从 20 个 episode 开始并逐步扩展,先用少量数据验证任务可行性。

记录循环与双臂复位(源码佐证)

仓库 software/src/record.py 中的记录循环展示了双臂数据收集的实现细节:

  • reset_follower_position()(record.py)会平滑地将双臂从当前位置插值移动到目标姿态,并生成一串可记录的复位动作序列,配合GLOBAL_BACK_GOALGLOBAL_OPEN_GOAL这两个 12 维目标数组实现"回篮 + 复位 + 回零"的自动流程;
  • 每个动作帧包含左右臂各 6 个关节(left_arm_*.pos/right_arm_*.pos)、两个头部舵机(head_motor_1.pos/head_motor_2.pos)以及底盘速度(x.vely.veltheta.vel),与 12-D 动作空间的定义完全对应。

6) 训练策略

6.1 训练 SmolVLA

SmolVLA 是 LeRobot 生态中的轻量级视觉-语言-动作基础模型,支持以少量演示数据微调:

lerobot-train \ --policy.path=lerobot/smolvla_base \ --dataset.repo_id=${HF_USER}/your_dataset_name \ --batch_size=64 \ --steps=20000 \ --output_dir=outputs/train/smolvla_three_cameras \ --job_name=smolvla_training_three_cameras \ --policy.device=cuda \ --wandb.enable=true

说明:

  1. --policy.path=lerobot/smolvla_base指向 SmolVLA 基础策略(Hugging Face 上的预训练权重);
  2. 根据数据集大小和任务复杂度调整--steps——任务越复杂、数据越多,需要的训练步数越多;
  3. 如果没有 GPU,设置--policy.device=cpu可以运行但训练会非常慢,强烈建议使用 NVIDIA GPU。

6.2 训练 ACT(Action Chunking with Transformers)

ACT 是一种模仿学习方法,核心思想是预测短动作块(action chunk)而不是单步动作。它通常在使用遥操作数据时实现高成功率,因为动作块预测天然具备平滑性与时序一致性。

基本训练命令:

python -m lerobot.scripts.train \ --dataset.repo_id=${HF_USER}/your_dataset_name \ --policy.type=act \ --output_dir=outputs/train/act_bimanual_demo \ --job_name=act_training_bimanual \ --policy.device=cuda \ --policy.repo_id=${HF_USER}/act_bimanual_demo \ --wandb.enable=true

使用lerobot-train的替代方法:

lerobot-train \ --policy.type=act \ --dataset.repo_id=${HF_USER}/your_dataset_name \ --output_dir=outputs/train/act_bimanual_demo \ --job_name=act_training_bimanual \ --policy.device=cuda \ --wandb.enable=true

训练说明:

  • 检查点写入outputs/train/<job_name>/checkpoints/
  • ACT 参数量约~80M,通常在单个 GPU 上训练几个小时即可;
  • 在 NVIDIA A100 上,80k 步的检查点大约需要1 小时 45 分钟(此为文档给出的社区实测参考值);
  • 对于 Apple Silicon:使用--policy.device=mps

从检查点恢复训练:

python -m lerobot.scripts.train \ --config_path=outputs/train/act_bimanual_demo/checkpoints/last/pretrained_model/train_config.json \ --resume=true

恢复训练会从last检查点继续,适用于训练中断或需要增加步数的场景。


7) 推理 / 评估

推理阶段的核心模式是:加载训练好的策略,让机器人自主执行任务,同时把评估 episode 记录到独立的评估数据集中,以便与训练演示进行对比。

7.1 SmolVLA 推理

lerobot-record \ --robot.type=bi_so101_follower \ --robot.left_arm_port=/dev/ttyACM0 \ --robot.right_arm_port=/dev/ttyACM1 \ --robot.id=bimanual_follower \ --robot.cameras='{ "front_cam": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}, "hand_cam": {"type": "opencv", "index_or_path": 1, "width": 640, "height": 480, "fps": 30}, "side_cam": {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30} }' \ --dataset.single_task="Your task description here" \ --dataset.repo_id=${HF_USER}/eval_results \ --dataset.num_episodes=10 \ --policy.path=${HF_USER}/smolvla_three_cameras

说明:

  1. --policy.path应该指向你训练的策略检查点或已上传到 Hugging Face 的策略仓库;
  2. eval_results是用于评估日志的独立数据集仓库(推荐与训练数据集分开),方便后续对比分析。

7.2 ACT 推理

使用lerobot-record

lerobot-record \ --robot.type=bi_so101_follower \ --robot.left_arm_port=/dev/ttyACM0 \ --robot.right_arm_port=/dev/ttyACM1 \ --robot.id=bimanual_follower \ --robot.cameras='{ "front_cam": {"type": "opencv", "index_or_path": 0, "width": 640, "height": 480, "fps": 30}, "hand_cam": {"type": "opencv", "index_or_path": 1, "width": 640, "height": 480, "fps": 30}, "side_cam": {"type": "opencv", "index_or_path": 2, "width": 640, "height": 480, "fps": 30} }' \ --dataset.single_task="Your task description here" \ --dataset.repo_id=${HF_USER}/eval_act_results \ --dataset.num_episodes=10 \ --policy.path=${HF_USER}/act_bimanual_demo

使用python -m lerobot.record

python -m lerobot.record \ --robot.type=bi_so101_follower \ --robot.left_arm_port=/dev/ttyACM0 \ --robot.right_arm_port=/dev/ttyACM1 \ --dataset.repo_id=${HF_USER}/eval_act_results \ --policy.path=${HF_USER}/act_bimanual_demo \ --episodes=10

说明:

  • 策略将在机器人上自主执行,无需遥操作输入;
  • 评估结果保存到指定的数据集仓库;
  • 将评估 episode 与训练演示进行对比以评估性能(动作轨迹、成功率、流畅度)。

8) XLeRobot 的 VR 控制

除了双臂 leader 遥操作,XLeRobot 还支持VR 控制器遥操作,可用于数据收集和机器人直接操控。

8.1 机器人平台:Rumi

文档中的 VR 演示基于Rumi——一款具有可升降底盘的新一代双臂机器人。XLeRobot 社区提供了对应的改进与适配仓库(MakerModsRobotics系列仓库),用于将 VR 控制能力集成到 XLeRobot/LeRobot 体系中。

8.2 相关仓库

文档列出的配套仓库包括(此处仅作文字说明,不提供外部链接):

  1. VR 控制器仓库:负责 VR 设备数据接入与控制目标生成;
  2. LeRobot 仓库(fork):集成 VR 遥操作器的 LeRobot 分支。

8.3 功能

  1. VR → 机器人手臂映射:将 VR 手柄的位姿映射为机器人手臂的目标位姿;
  2. 支持:
    • 逆运动学(IK)求解:由末端位姿反解关节角;
    • 关节空间 → 电机命令转换:将关节目标转换为机器人可执行的电机位置命令。

8.4 仓库内的 VR 实现(源码级解读)

XLeRobot 仓库在 software/src/teleporators/xlerobot_vr 目录下提供了完整的 VR 遥操作实现,可以直接并入 LeRobot fork 使用:

  • 配置类configuration_xlerobot_vr.py:注册为xlerobot_vr遥操作类型,关键配置项包括:

    • vr_enabled(默认 True):是否启用 VR;
    • vr_connection_timeout(默认 10.0 秒)、vr_data_timeout(默认 5.0 秒):VR 连接与数据超时;
    • kp(默认 1.0):比例控制增益,控制手臂跟随速度;
    • xlevr_path:指向 XLeRobot 仓库中 XLeVR 目录的绝对路径,需要按实际环境修改
  • 遥操作器xlerobot_vr.py:

    • LEFT_JOINT_MAP/RIGHT_JOINT_MAP:将通用关节名(如shoulder_pan)映射为双臂带前缀的观测键(如left_arm_shoulder_pan);
    • JOINT_CALIBRATION:各关节的偏移与比例标定系数(如 wrist_roll 比例 0.5);
    • SimpleTeleopArm:基于SO101Kinematics的逆运动学控制,采用增量(delta)控制——对 VR 手柄位置变化做缩放、死区过滤和限幅后更新目标位置,并施加 0.1 的平滑系数,避免机械臂抖动;
    • SimpleHeadControl:通过左手柄摇杆控制头部两个舵机(每步 2 度);
    • get_vr_base_action:将手柄摇杆映射为底盘运动(前进/后退/左转/右转),实现"手臂 + 底盘"全向操控。
  • 运动学实现software/src/model/SO101Robot.py:SO101Kinematics类实现了二连杆解析逆运动学inverse_kinematics()与正运动学forward_kinematics(),包含关节偏移补偿、工作空间边界钳制(超出最大/最小可达距离时自动缩放)以及 URDF 关节限位约束,是 VR 末端控制的核心。

  • VR 监控器software/src/teleporators/xlerobot_vr/vr_monitor.py:VRMonitor类通过 WebSocket 接收 VR 数据,按left/right/headset分类缓存最新的ControlGoal(包含target_position三维位置、wrist_roll_degwrist_flex_deggripper_closedmetadata原始数据),并提供线程安全的get_left_goal_nowait()/get_right_goal_nowait()等访问接口。

  • VR 事件处理VREventHandler将左手柄输入映射为记录控制事件(阈值 0.7):

    • 摇杆右推:提前退出当前 episode;
    • 摇杆左推:重新记录当前 episode(删除已录数据);
    • 摇杆上推:停止整个记录会话;
    • 摇杆下推:将机器人复位到零位置。

    记录循环中(record.py)通过teleop.get_vr_events()轮询这些事件并驱动exit_earlyrerecord_episodestop_recordingreset_position等控制流,init_vr_listener()则提供了与键盘监听器完全兼容的接口,替换成本极低。

8.5 XLeRobot 集成 ROS 2

对于使用 ROS 2 的部署场景,文档指出需要按照对应 VR 仓库的 README 配置 VR 设备、ROS 2 节点和机器人驱动程序,将 VR 数据流转发到 ROS 2 的话题/服务体系中。XLeRobot 仓库内的 XLeVR 模块(含 vr_monitor.py、config.yaml 及 Web UI)可作为独立的轻量 VR 数据服务使用:运行python vr_monitor.py后,VR 头显浏览器访问终端打印的https://<your-ip>:8443即可建立连接,详见 XLeVR/README.md。


9) 实用技巧 / 常见陷阱

数据质量

  1. 在演示期间争取一次性抓取(避免微调):反复的抓取-松开动作会被策略学成"犹豫"模式,严重降低成功率;
  2. 在记录和推理之间保持摄像头视角一致:哪怕是几度的视角偏移,都会破坏 VLA 策略的泛化;
  3. 保持稳定的照明并避免运动模糊:光照突变和运动模糊会污染视觉特征,降低策略对场景的理解能力。

双臂协调

对于抽屉等需要双臂协同的任务:

  • 左臂:执行稳定的拉动轨迹,避免中途停顿或方向抖动;
  • 右臂:精确的抓取/放置,最小犹豫——一次到位是数据质量的关键。

设备端口

如果端口在重启后更改(USB 枚举顺序不稳定),考虑使用持久的 udev 规则来稳定设备命名,例如将左右臂固定映射为/dev/ttyACM0/dev/ttyACM1(follower)与/dev/ttyACM2/dev/ttyACM3(leader)。XLeRobot 的 config.yaml 中也使用了具名端口(如/dev/ttySO100red/dev/ttySO100blue)来规避枚举顺序问题。


10) 快速检查清单

在开始记录或推理前,逐项确认以下内容:

  • conda activate lerobot(环境已激活)
  • 三个摄像头已连接且索引正确(0/1/2)
  • Follower 端口正确(/dev/ttyACM0/dev/ttyACM1
  • Leader 端口正确(/dev/ttyACM2/dev/ttyACM3
  • 数据集仓库 ID 和任务描述已设置(--dataset.repo_id--dataset.single_task
  • 训练在正确的设备上运行(cudavscpuvsmps
  • 推理使用正确的训练策略路径(--policy.path

附录:延伸阅读与资源指引

官方文档类

  • LeRobot 文档:涉及策略训练、数据集格式与摄像头的官方说明(本文涉及的操作命令均以 LeRobot CLI 为基础);
  • ACT 文档:Action Chunking with Transformers 的原理与训练细节;
  • 真实世界机器人的模仿学习:follower/leader 机器人遥操作与记录流程;
  • 真实世界机器人入门:从零开始搭建真实机器人记录环境的教程。

模型与仓库类

  • SmolVLA 基础:Hugging Face 上的lerobot/smolvla_base预训练权重,即本文--policy.path=lerobot/smolvla_base的来源;
  • ACT 示例模型:LeRobot 官方示例策略(单臂搬立方体任务),可用于快速验证训练-推理链路;
  • XLeRobot / LeRobot fork 使用:社区维护的、支持 Feetech 电机(SO-101)与 SmolVLA 依赖的 LeRobot 分支;
  • Rumi 机器人:具有可升降底盘的新一代双臂机器人平台,VR 演示的主要载体;
  • VR 控制器仓库与 LeRobot fork:VR 遥操作集成方案的两部分(控制器数据服务 + 遥操作器逻辑)。

仓库内配套文档

  • 单臂 ACT 的完整教程(含 leader arm 记录、VR 记录、异步推理部署)见 VLA_ACT.md;
  • 更轻量的 SmolVLA 方案(pi0.5)见 VLA_pi05.md;
  • 遥操作与数据记录的通用说明见 XLeRobot_teleop.md;
  • 双臂 SO-101 键盘遥操作示例见 2_dual_so100_keyboard_ee_control.py,VR 遥操作独立脚本见 8_xlerobot_teleop_vr.py 与 8_vr_teleop_with_dataset_recording.py。

【免费下载链接】XLeRobotXLeRobot: Practical Dual-Arm Mobile Home Robot for $660项目地址: https://gitcode.com/GitHub_Trending/xl/XLeRobot

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

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

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

立即咨询