从单臂到双臂:用 LeRobot 让两条 SO-100 机械臂一起干活的最小上手指南
【免费下载链接】lerobot🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot
LeRobot 是 HuggingFace 的机器人学习框架:你用一条机械臂(leader)"示范"动作,另一条(follower)跟着学,几轮录制加训练后,机器人就能自主复现抓取、放置这类任务。它帮你把"买机械臂→写控制代码→录数据→训练策略"这条完整链路压缩成十几条标准命令,覆盖 SO-100/SO-101、Koch、OpenArm 等开源硬件,也内置 ACT、pi0 等现成策略。
先跑起来:从装包到双臂跟随只需要 3 条命令
假设你已经按 SO-100 文档 把两条 SO-100(一条 leader 臂、一条 follower 臂)装好、配好电机,那"看到效果"就是三条命令的事。
# 1. 装 LeRobot 及 Feetech 舵机驱动 pip install -e ".[feetech]" # 2. 找到两条臂各自的 USB 串口(拔掉再插上,程序会锁定对应口) lerobot-find-port # 3. 启动主从遥操作:动 leader,follower 实时跟随 lerobot-teleoperate \ --robot.type=bi_so_follower \ --robot.left_arm_config.port=/dev/ttyACM1 \ --robot.right_arm_config.port=/dev/ttyACM0 \ --robot.id=my_bi_arm \ --teleop.type=bi_so_leader \ --teleop.left_arm_config.port=/dev/ttyACM3 \ --teleop.right_arm_config.port=/dev/ttyACM2 \ --teleop.id=my_bi_leader如果你只想先试单臂,把bi_so_*换成so100_follower/so100_leader,各配一个--robot.port/--teleop.port即可。命令能直接跑通,说明串口、舵机 ID、波特率、校准这几环都通了——后面所有数据录制和训练命令都复用同一套参数。想省事的话,仓库里的 quickstart 笔记本 能替你填好这些配置、直接生成可粘贴的命令。
拆透一个机制:leader-follower 主从映射到底怎么把动作传过去
遥操作时你可能注意到一个现象:leader 臂明明是"哑"的——它只报位置、不受力控制,但 follower 跟得又快又稳,两条臂还不会打架。这背后是一个被刻意设计得"薄"的映射层。
打开 遥操作示例 里的 API 写法,核心循环只有两行:
while True: action = teleop_device.get_action() # 读 leader 各关节的"目标位置" robot.send_action(action) # 原样发给 follower 舵机leader 的每个舵机被拆掉了减速齿轮、只保留位置编码器,你手推它,它只是"报坐标"。这些坐标被当作动作(action)直接写进 follower 的舵机目标寄存器——舵机驱动芯片自己完成平滑运动。所以两条臂之间没有运动学解算、没有轨迹规划器,映射函数就是一个字典拷贝。
这个机制值得你利用两次。第一,它是天然的"数据格式预览":get_action()输出的键,就是录制数据集里的 action 字段,也是训练时策略要预测的东西,三者键名一致,不会出现"录的和学的对不上"。第二,双臂扩展时它是自动的:BiSOFollower 源码 里,get_observation()给左臂所有键加left_前缀、右臂加right_,send_action()再按前缀拆开分别下发。12 个关节就这样被一个前缀规则分清楚,你在写代码或配策略时,只需要记住"带left_/right_前缀的键各归各臂"这一条。
完整实战案例:录 30 次"拿起积木放进盒子",训练出自主策略
场景:桌面上放一盒乐高积木和一个收纳盒,任务是把积木从盒子左边抓起来放到右边。下面用单臂 SO-101 走完整闭环(双臂把类型参数换成bi_*即可,流程相同)。
第 1 步:录制演示。复用遥操作命令再套一层lerobot-record,它会按--dataset.fps(默认 20)节拍采集每帧的图像和关节状态:
lerobot-record \ --robot.type=so101_follower \ --robot.port=/dev/tty.usbmodem58760431541 \ --robot.id=my_follower_arm \ --teleop.type=so101_leader \ --teleop.port=/dev/tty.usbmodem58760431551 \ --teleop.id=my_leader_arm \ --dataset.root=~/data/lerobot \ --dataset.repo_id=my-pick-and-place录制时用方向键或n/r切换:n保存当前 episode 并开始下一轮,r丢弃重录,q退出。建议每次抓取前把 leader 摆回同一个起始姿态,30 条 episode 通常够 ACT 这类策略学到七八成成功率。
第 2 步:训练策略。数据落盘后直接训:
lerobot-train \ --dataset.repo_id=my-pick-and-place \ --policy.type=act \ --batch_size=8第 3 步:验证结果,分两层。先在数据层:用lerobot-dataset-viz --dataset.repo_id=my-pick-and-place播放录制的轨迹,检查有没有录进空帧或中途停顿;再在真机层:用lerobot-replay或 rollout 脚本加载训练好的模型,让它自主执行 10 次,数一下成功率。低于预期时优先检查录制质量(起始位姿一致性、抓取是否成功),再考虑加数据量——顺序反了会浪费很多训练时间。
单臂 SO-100、SO-101 还是双臂配置,怎么选
| 维度 | 单臂 SO-100 | 单臂 SO-101 | 双臂 bi_so_follower |
|---|---|---|---|
| 自由度 | 6(含夹爪) | 6(含夹爪) | 12(两臂各 6) |
| 电机配置 | 6 个舵机逐个设 ID | 6 个(连接器更易触达) | 12 个,两条臂各配一遍 |
| 动作键名 | 无前缀 | 无前缀 | 自动带left_/right_前缀 |
| 适合任务 | 单点抓取、放置 | 同 SO-100,装配更省事 | 双手协同:一手固定、一手操作 |
| 上手成本 | 低 | 低 | 中(多一套串口和校准) |
选择逻辑:先用单臂把一个任务跑通,确认"录制→训练→复现"闭环没坑,再上双臂。双臂不是单臂的简单翻倍——两条臂共享同一张操作台后,工作空间重叠区就是碰撞高发区,这也是为什么官方文档建议从 2 臂最小系统起步。
避坑问答:这几处几乎人人踩过
问:lerobot-find-port找到了串口,但lerobot-teleoperate连不上舵机?
答:Linux 下先给串口开权限(sudo chmod 666 /dev/ttyACM*),然后逐个检查三条线:电源、USB 线、控制器到舵机的 3 针线。SO-100 还有一个高频坑:电机配置必须在装臂前做,因为装好后电机接口就摸不到了(见 so100.mdx 的 Note)。
问:leader 动了,follower 跟着抖或偏转方向不对?
答:十有八九是校准没做或没对齐。lerobot-calibrate要求先让臂摆到每个关节行程的中间点按回车,再逐个关节走完整个行程。leader 和 follower 要分别校准,且全程用同一个id参数——校准文件按id存取,ID 一变等于重新来过。
问:双臂录制时,动作键里的left_/right_前缀是我自己加的吗?
答:不用加也不用减。BiSOFollower在观测端自动加前缀、在下发端自动剥离前缀(见 源码 的get_observation/send_action)。你唯一要做的是确认数据集里确实出现left_*和right_*两组键。
问:录制时帧率达不到设定的 20fps 怎么办?
答:lerobot-record结束时会打印每轮实际达成的帧率摘要,先对照它定位是相机拖后腿还是串口超时。相机端把分辨率降下来(如 640x480→320x240)通常立刻见效;串口端检查波特率是否全链一致。
问:单臂训好的模型能直接用到双臂上吗?
答:不能直接加载,因为动作维度从 6 变成 12,键名也不同。正确做法是用双臂重新录数据、以bi_*配置重新训练;单臂阶段的价值在于验证流程,不在于模型直接迁移。
往前走:从行为克隆走向视觉语言策略
单臂闭环跑通后,官方文档里有三条明确的进阶路径:在 il_robots.mdx 继续深化多任务录制与评估,在 async.mdx 把策略推理搬到独立机器上降低真机延迟,在 pi0.mdx 换用带语言指令的 VLA 策略——到那一步,你的双臂系统就不只是"复现轨迹",而是能听懂"把红色积木放进左边的盒子"这类指令。仓库的 docs 目录 和examples/下各硬件的配套脚本(record.py/evaluate.py/rollout.py)都是现成的参考实现。
主从映射 + 前缀分发,是 LeRobot 把"两条臂当一个机器人管"这件事做得轻量的全部秘密——看懂这两个点,后面加相机、换策略、上语言指令都只是配置层面的事。现在就克隆仓库(git clone https://gitcode.com/GitHub_Trending/le/lerobot),从lerobot-find-port开始跑通第一条命令。
【免费下载链接】lerobot🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考