
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 遥操作控制。阅读完本文后你将掌握一条从录数据 → 训练 → 部署的可复现技术路径并理解双机械臂 12 维动作空间在 VLA 模型中的处理原理。1) 方案概述XLeRobot 上的双机械臂 VLA 体系XLeRobot 是一个基于 LeRobot 框架搭建的双臂移动机器人平台在原有单臂方案上引入了以下关键能力见 VLA_smol.mdBiSO101Follower双臂跟随机械臂执行端BiSO101Leader双臂主从遥操作机械臂遥操作端左/右臂独立控制同时支持同步双臂协同操作三相机录制配置包含三个视角front_cam前视相机hand_cam手部相机side_cam侧视相机这套配置对应仓库中的双臂实现位于 software/src/robots/xlerobotxlerobot 主机/客户端实现以及 software/src/robots/xlerobot_2wheels两轮底盘版本。在文档描述的流程中策略训练使用的是 kahowang/lerobot 这一 LeRobot fork并额外安装smolvla扩展依赖本文全部命令均以该文档给出的实践为准。参考文档仓库内本文档在仓库中的相关配套说明还包括 VLA_ACT.md单臂 ACT 流程与 VR 数据集录制示例、VLA_pi05.md 与 VLA_smol.md 同目录下的其他 VLA 方案文档可一并阅读。2) Demo 任务约 20 条轨迹即可学会的典型操作文档给出了两个经过验证的双臂演示任务均可通过约20 episodes的训练数据习得可作为评估自身数据集质量与训练效果的对标基准。Demo 1 - 抽屉开合 抓取 放置双臂协同训练约 20 episodes 后XLeRobot 可以完成拉开抽屉抓取物体将物体放入抽屉推回抽屉关键要点抽屉把手需要一次抓取成功数据采集阶段避免反复抖动修正左臂拉动抽屉期间右臂必须精确抓取物体中心放入抽屉要求一次放置到位并平滑地推入关闭Demo 2 - 笔袋拉链精细操作训练约 20 episodes 后XLeRobot 可以抓住拉链头抓住笔袋提手并稳定笔袋拉动拉链头平滑地打开拉链关键难点拉链头经常处于俯视相机盲区要求一次抓取成功避免反复重抓保持一致的拉动高度避免上提或下压造成拉链卡顿这两个任务体现了双臂 VLA 数据采集的核心质量要求一次到位的动作轨迹比大量微调修正更有助于模型收敛。3) 硬件与配置要点3.1 三相机摆放推荐配置为各 1 个front_cam× 1hand_cam× 1side_cam× 1注意实际使用中相机位置的一致性和稳定的光照是学习稳定操作的关键。录制与推理时相机角度不一致会显著降低策略成功率此点与 VLA_ACT.md 中数据采集和推理时需保持头部舵机角度一致的建议一致。3.2 动作维度处理重点双机械臂 SO-101 共有12 个动作维度6 关节 × 2 臂 12SmolVLA 自动检测并处理动作维度无需手动配置action_mode训练阶段12-D → 填充pad到 32-Dmax_action_dim推理阶段32-D → 裁剪crop回原始 12-D概念性代码路径文档示意# Training: 12D - pad to 32D actions pad_vector(batch[ACTION], self.config.max_action_dim) # Inference: 32D - crop back to 12D original_action_dim self.config.action_feature.shape[0] # auto-detected: 12 actions actions[:, :, :original_action_dim]与其他需要手动配置action_mode的 VLA 模型例如 xVLA不同SmolVLA 的动态填充机制支持任意 ≤ 32D 的动作空间。这意味着双臂 12 维动作可以直接训练无需额外适配。仓库中双臂数据集的 12 维动作空间定义可在 8_vr_teleop_with_dataset_recording.py 的init_dataset()中看到其action与observation.state均定义为 shape(12,)名称依次为left_arm_shoulder_pan/left_arm_shoulder_lift/left_arm_elbow_flex/left_arm_wrist_flex/left_arm_wrist_roll/left_arm_gripper加right_arm_*六项当只启用单臂时则退化为 shape(6,)。这与文档所述的 12 维动作空间完全对应。4) 安装与环境配置LinuxA. 安装 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 python3.10 conda activate lerobot注意每次使用 LeRobot/XLeRobot 前都需要激活该环境conda activate lerobotC. 安装系统依赖FFmpegconda install -c conda-forge ffmpegD. 克隆仓库并安装依赖git clone https://github.com/kahowang/lerobot.git cd lerobot # 安装带 Feetech 电机支持的 LeRobotSO-101 必需 pip install -e .[feetech] # 安装 SmolVLA 依赖 pip install -e .[smolvla]说明feetech扩展为 SO-101 所用的 Feetech 总线舵机提供驱动支持smolvla扩展则安装 SmolVLA 策略所需的模型与推理依赖。若在 XLeRobot 本地运行 VR 遥操作还需保证XLeVR目录仓库根目录下的 XLeVR及其依赖websockets、scipy 等见 XLeVR/requirements.txt可用。5) 三相机双臂遥操作数据采集使用lerobot-record录制三相机双臂演示数据。将${HF_USER}替换为你的 Hugging Face 用户名your_dataset_name替换为数据集名lerobot-record \ --robot.typebi_so101_follower \ --robot.left_arm_port/dev/ttyACM0 \ --robot.right_arm_port/dev/ttyACM1 \ --robot.idbimanual_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.typebi_so101_leader \ --teleop.left_arm_port/dev/ttyACM2 \ --teleop.right_arm_port/dev/ttyACM3 \ --teleop.idbimanual_leader \ --dataset.repo_id${HF_USER}/your_dataset_name \ --dataset.single_taskYour task description here \ --dataset.num_episodes50参数提示端口/dev/ttyACM*必须与实际的 USB 设备映射一致dataset.single_task应简洁但具体提高可复现性快速迭代时可先录 20 episodes 起步再逐步扩容关于端口稳定性如果重启后端口发生变化文档建议使用udev 持久化规则固定设备命名。仓库 XLeVR/config.yaml 中即使用了类似命名约定/dev/ttySO100red、/dev/ttySO100blue可作为设置持久化符号链接的参考。5.1 仓库中的 VR 录制替代方案若你使用 VR 进行双臂数据录制仓库提供了可直接运行的示例脚本 8_vr_teleop_with_dataset_recording.py。该脚本展示了一条完整的 VR 录制流水线使用VRMonitor见 XLeVR/vr_monitor.py获取双控制器目标SimpleTeleopArm将 VR 位置增量映射到机械臂关节handle_vr_input实现 delta 控制通过LeRobotDataset.create构建 12 维或 6 维动作空间的数据集init_dataset后台线程saving_dataset_worker将帧写入数据集并按EPISODE_LEN切分 episode最后push_to_hub上传脚本顶部可通过ENABLE_LEFT_HAND、ENABLE_HEAD开关禁用单侧手臂与头部遥操作便于聚焦单臂数据录制。6) 训练策略6.1 训练 SmolVLAlerobot-train \ --policy.pathlerobot/smolvla_base \ --dataset.repo_id${HF_USER}/your_dataset_name \ --batch_size64 \ --steps20000 \ --output_diroutputs/train/smolvla_three_cameras \ --job_namesmolvla_training_three_cameras \ --policy.devicecuda \ --wandb.enabletrue说明--policy.pathlerobot/smolvla_base指向 SmolVLA 基础策略权重根据数据集规模与任务复杂度调整--steps无 GPU 时设置--policy.devicecpu训练会非常慢6.2 训练 ACTAction Chunking with TransformersACT 是一种模仿学习方法一次预测一段短动作块action chunk而非单步动作在遥操作数据上通常能取得较高成功率。基础训练命令python -m lerobot.scripts.train \ --dataset.repo_id${HF_USER}/your_dataset_name \ --policy.typeact \ --output_diroutputs/train/act_bimanual_demo \ --job_nameact_training_bimanual \ --policy.devicecuda \ --policy.repo_id${HF_USER}/act_bimanual_demo \ --wandb.enabletrue使用lerobot-train的等价命令lerobot-train \ --policy.typeact \ --dataset.repo_id${HF_USER}/your_dataset_name \ --output_diroutputs/train/act_bimanual_demo \ --job_nameact_training_bimanual \ --policy.devicecuda \ --wandb.enabletrue训练注意事项检查点写入outputs/train/job_name/checkpoints/ACT 通常可在单张 GPU 上几小时内完成训练模型约 80M 参数文档给出的参考在 Nvidia A100 上 80k steps 的检查点约需 1h45Apple Silicon 用户使用--policy.devicemps从检查点恢复训练python -m lerobot.scripts.train \ --config_pathoutputs/train/act_bimanual_demo/checkpoints/last/pretrained_model/train_config.json \ --resumetrue7) 推理与评估7.1 SmolVLA 推理运行策略推理并记录评估 episodes 的典型模式lerobot-record \ --robot.typebi_so101_follower \ --robot.left_arm_port/dev/ttyACM0 \ --robot.right_arm_port/dev/ttyACM1 \ --robot.idbimanual_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_taskYour task description here \ --dataset.repo_id${HF_USER}/eval_results \ --dataset.num_episodes10 \ --policy.path${HF_USER}/smolvla_three_cameras说明--policy.path指向训练好的策略检查点或已上传的策略eval_results是独立的评估数据集仓库推荐与训练数据分离7.2 ACT 推理使用lerobot-recordlerobot-record \ --robot.typebi_so101_follower \ --robot.left_arm_port/dev/ttyACM0 \ --robot.right_arm_port/dev/ttyACM1 \ --robot.idbimanual_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_taskYour task description here \ --dataset.repo_id${HF_USER}/eval_act_results \ --dataset.num_episodes10 \ --policy.path${HF_USER}/act_bimanual_demo使用python -m lerobot.recordpython -m lerobot.record \ --robot.typebi_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 \ --episodes10说明策略将在机器人上自主执行评估结果保存到指定的数据集仓库将评估 episodes 与训练演示对比以评估性能性能提示来自 VLA_ACT.mdACT 等轻量策略可在机器人本地如树莓派运行而 SmolVLA、Pi0.5 等资源密集型策略需要带 GPU 的外部计算机可采用 LeRobot 的 async inference 方案在 PC 上启动策略服务端--host0.0.0.0在 XLeRobot 上运行客户端。8) XLeRobot 的 VR 控制VR 控制是文档所述双臂数据采集与策略执行的重要辅助手段。本节结合仓库源码说明其工作原理与实现。8.1 整体架构VR 控制由仓库的 XLeVR 目录实现核心链路为VR 头显浏览器加载 XLeVR/web-ui/index.html基于 A-Frame 的 WebXR 页面见vr_app.js/interface.js采集手柄位置、旋转、扳机与摇杆数据HTTPS WebSocket 双服务SimpleHTTPSServervr_monitor.py托管 Web 页面默认端口 8443VRWebSocketServerXLeVR/xlevr/inputs/vr_ws_server.py接收手柄数据默认端口 8442两者均使用cert.pem/key.pem建立 TLSVRMonitor持续消费控制目标ControlGoal按left/right/headset分类缓存最新目标供控制循环以无阻塞方式读取get_latest_goal_nowait控制循环将 VR 目标映射为机器人关节动作并下发。网络与端口等参数在 XLeVR/config.yaml 中配置默认https_port: 8443、websocket_port: 8442、host_ip: 0.0.0.0并由 XLeVR/xlevr/config.py 加载vr_to_robot_scale控制 VR 空间到机器人空间的比例缩放。8.2 遥操作实现源码级遥操作核心代码位于 software/src/teleporators/xlerobot_vr/xlerobot_vr.py其中XLerobotVRTeleop继承自Teleoperatorname xlerobot_vr实现了与键盘遥操作一致的接口可接入record.py录制流程SimpleTeleopArm实现基于delta 增量控制的双臂映射读取 VR 手柄target_position的帧间差值乘以位置缩放系数后累加到current_x/current_y再调用SO101Kinematics.inverse_kinematics()求解肩/肘关节目标wrist_flex通过(-shoulder_lift - elbow_flex pitch)维持末端姿态wrist_roll与shoulder_pan同样采用带限幅的增量更新P 控制平滑p_control_action按control kp * error生成比例控制动作kp可由配置类 configuration_xlerobot_vr.py 中的kp字段设置默认 1.0关节校准系数JOINT_CALIBRATION提供每个关节的零位偏移与比例因子可手动微调VREventHandler将左手柄摇杆映射为录制控制事件左推重新录制当前 episode、右推提前退出当前循环、上推停止录制、下推复位机器人位置底座控制get_vr_base_action将右手柄摇杆输入转换为键盘等效键u/i/k/o复用robot._from_keyboard_to_base_action生成底盘运动指令get_vr_speed_control提供线性加速/减速的速度倍率相关参数BASE_ACCELERATION_RATE/BASE_DECELERATION_RATE/BASE_MAX_SPEED见 8_xlerobot_teleop_vr.py。可运行的完整示例见 8_xlerobot_teleop_vr.py初始化XLerobotConfig/XLerobot连接、VRMonitor后台线程、双臂与头部控制器随后进入主循环合并左右臂、头部与底座动作并send_action按 ESC 退出。8.3 关于 ROS 2 集成与 Rumi 机器人文档提到 XLeRobot 的 VR 控制可集成ROS 2按对应仓库 README 配置 VR 设备、ROS 2 节点与机器人驱动。同时文档以Rumi新一代可升降底盘双臂机器人为例介绍了 VR 控制的另一种载体其能力包括VR → 机械臂映射支持逆运动学IK求解关节空间 → 电机指令转换仓库内对应实现SO101 运动学求解可参考 SO101Robot.py 中的SO101Kinematics。9) 实战技巧与常见陷阱数据质量演示过程中力求一次抓取避免微小修正录制与推理时保持相机视角一致保持稳定光照避免运动模糊双臂协调以抽屉任务为例左臂稳定的拉动轨迹右臂精确的抓取/放置尽量减少犹豫设备端口如果重启后端口变化考虑使用持久化 udev 规则稳定设备命名可参考 XLeVR/config.yaml 中的/dev/ttySO100red、/dev/ttySO100blue命名方式。10) 快速检查清单开始录制或推理前逐项确认conda activate lerobot三台相机已连接且索引正确0/1/2跟随臂端口正确/dev/ttyACM0、/dev/ttyACM1主从臂端口正确/dev/ttyACM2、/dev/ttyACM3数据集 repo ID 与任务描述已设置训练运行在正确的设备上cuda vs cpu推理使用正确的训练策略路径11) 仓库配套资源索引文档原文docs/en/source/software/getting_started/VLA_smol.md配套 VLA 方案VLA_ACT.md、VLA_pi05.mdVR 遥操作示例8_xlerobot_teleop_vr.py、8_vr_teleop_with_dataset_recording.pyVR 遥操作器实现software/src/teleporators/xlerobot_vr/xlerobot_vr.py、configuration_xlerobot_vr.pyXLeVR 运行时vr_monitor.py、vr_ws_server.py、config.py、config.yamlWebXR 控制界面XLeVR/web-ui/index.html双臂机器人实现software/src/robots/xlerobot【免费下载链接】XLeRobotXLeRobot: Practical Dual-Arm Mobile Home Robot for $660项目地址: https://gitcode.com/GitHub_Trending/xl/XLeRobot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考