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 可以完成一个完整的"抽屉任务"链路:
- 拉开抽屉
- 抓取物体
- 将物体放入抽屉
- 推入抽屉(关闭)
关键方面(直接决定数据质量与训练成败):
- 一次性抓取抽屉把手:数据收集期间要避免抖动和反复微调,让策略学到"一步到位"的动作模式;
- 当左臂拉抽屉时,右臂必须精确抓取物体的中心,双臂时序与空间配合要求极高;
- 准确的一次性放置到抽屉中,并平滑地"推入"关闭,避免犹豫反复。
演示 2 —— 铅笔盒拉链(精细操作)
同样约20 个 episode即可学会:
- 抓取拉链拉片
- 抓取铅笔盒把手并稳定盒子
- 拉动拉链拉片以平滑打开拉链
关键难点:
- 拉链拉片通常处于自上而下的摄像头盲点中,需要依赖侧面摄像头视角进行一次性抓取(避免重新抓取导致数据噪声);
- 保持一致的拉动高度,避免上下移动(没有"向上猛拉"或"向下拖拽"),否则策略会把抖动学进去。
这两个示例共同说明了 VLA 数据收集的核心哲学:演示质量 > 演示数量。20 个高质量 episode 的学习效果通常优于 50 个含噪声的 episode。
3) 硬件与配置说明
3.1 摄像头放置(三个摄像头)
推荐配置:
| 摄像头 | 数量 | 作用 |
|---|---|---|
front_cam | 1 | 正面全局视角,观察物体与桌面布局 |
hand_cam | 1 | 手部/腕部近距视角,捕捉抓取细节 |
side_cam | 1 | 侧面视角,弥补正上方与手部视角的盲区 |
注意:在实践中,一致的摄像头放置和稳定的照明对于学习稳定的操作至关重要。记录与推理阶段必须保持摄像头视角完全一致,否则策略性能会显著下降。
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_GOAL与GLOBAL_OPEN_GOAL正是长度为 12 的数组,从源码层面印证了双臂 12-D 的动作空间定义。
SmolVLA 自动检测和处理动作维度,无需手动配置:
- 训练期间:12-D → 填充到 32-D(
max_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 --versionB. 创建和激活环境
conda create -n lerobot python=3.10 conda activate lerobot注意:每次使用 LeRobot/XLeRobot 时都要激活此环境:
conda activate lerobot
C. 安装系统依赖(FFmpeg)
数据集中的摄像头帧以视频形式编码存储,FFmpeg 是必需的系统依赖:
conda install -c conda-forge ffmpegD. 克隆仓库并安装依赖
文档使用的 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_port | follower 左右臂 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_port | leader 左右臂 USB 串口 | 通常与 follower 使用不同端口 |
--dataset.repo_id | 数据集 ID | 格式${HF_USER}/${dataset_name} |
--dataset.single_task | 任务描述 | 应简洁但具体,提高可重复性 |
--dataset.num_episodes | 录制 episode 数 | 快速迭代可从 20 起步,再逐步扩展 |
参数提示
- 端口(
/dev/ttyACM*)必须匹配你的实际 USB 设备映射——不同设备的枚举顺序可能不同,建议记录前用ls /dev/ttyACM*确认; dataset.single_task应该简洁但具体(提高可重复性),它会被写入数据集元数据,供策略在训练时作为语言条件;- 为了快速迭代,从 20 个 episode 开始并逐步扩展,先用少量数据验证任务可行性。
记录循环与双臂复位(源码佐证)
仓库 software/src/record.py 中的记录循环展示了双臂数据收集的实现细节:
reset_follower_position()(record.py)会平滑地将双臂从当前位置插值移动到目标姿态,并生成一串可记录的复位动作序列,配合GLOBAL_BACK_GOAL、GLOBAL_OPEN_GOAL这两个 12 维目标数组实现"回篮 + 复位 + 回零"的自动流程;- 每个动作帧包含左右臂各 6 个关节(
left_arm_*.pos/right_arm_*.pos)、两个头部舵机(head_motor_1.pos/head_motor_2.pos)以及底盘速度(x.vel、y.vel、theta.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说明:
--policy.path=lerobot/smolvla_base指向 SmolVLA 基础策略(Hugging Face 上的预训练权重);- 根据数据集大小和任务复杂度调整
--steps——任务越复杂、数据越多,需要的训练步数越多; - 如果没有 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说明:
--policy.path应该指向你训练的策略检查点或已上传到 Hugging Face 的策略仓库;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 相关仓库
文档列出的配套仓库包括(此处仅作文字说明,不提供外部链接):
- VR 控制器仓库:负责 VR 设备数据接入与控制目标生成;
- LeRobot 仓库(fork):集成 VR 遥操作器的 LeRobot 分支。
8.3 功能
- VR → 机器人手臂映射:将 VR 手柄的位姿映射为机器人手臂的目标位姿;
- 支持:
- 逆运动学(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_deg、wrist_flex_deg、gripper_closed与metadata原始数据),并提供线程安全的get_left_goal_nowait()/get_right_goal_nowait()等访问接口。VR 事件处理:
VREventHandler将左手柄输入映射为记录控制事件(阈值 0.7):- 摇杆右推:提前退出当前 episode;
- 摇杆左推:重新记录当前 episode(删除已录数据);
- 摇杆上推:停止整个记录会话;
- 摇杆下推:将机器人复位到零位置。
记录循环中(record.py)通过
teleop.get_vr_events()轮询这些事件并驱动exit_early、rerecord_episode、stop_recording、reset_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) 实用技巧 / 常见陷阱
数据质量
- 在演示期间争取一次性抓取(避免微调):反复的抓取-松开动作会被策略学成"犹豫"模式,严重降低成功率;
- 在记录和推理之间保持摄像头视角一致:哪怕是几度的视角偏移,都会破坏 VLA 策略的泛化;
- 保持稳定的照明并避免运动模糊:光照突变和运动模糊会污染视觉特征,降低策略对场景的理解能力。
双臂协调
对于抽屉等需要双臂协同的任务:
- 左臂:执行稳定的拉动轨迹,避免中途停顿或方向抖动;
- 右臂:精确的抓取/放置,最小犹豫——一次到位是数据质量的关键。
设备端口
如果端口在重启后更改(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),仅供参考