多臂机器人协同控制实战:从零跑通到调稳双臂的完整避坑指南
【免费下载链接】lerobot🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot
两只臂同时夹住同一块板,谁先松手?松手的节奏差半步,板子就掉了。本文以开源项目 LeRobot 为例,带你把多臂机器人协同控制从接线、遥操作、录数据到训练双臂策略一步步跑通,并附上我们实际调试踩过的坑。
一、它到底在解决什么问题
单臂系统里,控制器只回答"我这 6 个关节往哪走";双臂一上,问题性质就变了。第一是时空同步:两条独立总线上各有一串电机,任何一侧慢一拍,末端轨迹就错位。第二是力分配:夹持同一物体时,两边抓力必须匹配,一紧一松物体立刻滑移。第三是碰撞避免:两只臂的工作空间重叠,末端相碰时机械上没有任何保护,全靠上层控制不出"打架"的动作。
打个比方:单臂是独奏,双臂是二重奏——乐谱(任务指令)只有一份,但两个演奏者必须自己踩准节拍。LeRobot 对此的思路不是写一个巨型协调器,而是把每条臂当成独立设备管理(配置、串口、电机 ID 各管各的),再用统一的数据格式把左右臂的状态拼成一个动作向量交给策略模型,让"协同"发生在模型层而不是总线层。
二、系统长什么样
LeRobot 的双臂链路可以拆成三层,数据单向流过:
- 感知融合层:每条臂的相机和关节编码器各自读数,观测字典里用
left_/right_前缀区分左右(顶层共用相机不加前缀)。多视角图像和关节角在这里汇成一张"舞台全景图"。 - 协调决策层:处理器管线做归一化等预处理,然后交给策略——比如 ACT(本身就来自双臂操作论文)或 pi0 这类 VLA 模型。VLA 相当于先"看懂"画面、再"听懂"指令、最后"动手"。对多臂机械臂碰撞避免而言,这层是关键:动作是模型整体生成的,左右臂天然处于同一决策上下文里,而不是两个各自为政的规划器事后拼接。
- 执行分配层:策略输出的动作向量按前缀拆回两条总线,各臂独立下发关节目标。
模块实现可直接看 src/lerobot/robots/bi_so_follower/,左右臂就是两个SOFollower实例的组合,没有魔法。
三、从零跑通:最小可运行路径
以最低成本的开源双臂组合起步:两条 SO-100/SO-101 跟随臂加一条同型号领袖臂做遥操作。LeRobot 内置的双臂硬件都长这个"双实例组合"的形态:
| 平台 | 形态 | 协同支持 | 成本档位 | 适合场景 |
|---|---|---|---|---|
| SO-100/SO-101 ×2(bi_so) | 双臂 + 领袖臂遥操作 | 内置 BiSOFollower/BiSOLeader | 低(开源 3D 打印件) | 入门、演示数据录制 |
| OpenArm Mini ×2 | 双臂跟随 | 内置 bi_openarm_follower | 中 | 抓取类任务 |
| ReBot B601 ×2 | 双臂跟随 | 内置 bi_rebot_b601_follower | 中 | 桌面操作 |
| RoboTwin 2.0 仿真 | 14 自由度双臂(每臂 7 关节) | 50 个双臂任务基准 | 需 GPU | 策略批量验证 |
1. 装环境与硬件
做什么:clone 仓库后安装 Feetech 电机扩展:pip install -e ".[feetech]",然后按 docs/source/so100.mdx 装配两条跟随臂和一条领袖臂。为什么:SO 系列用 Feetech 总线舵机,SDK 不装后续命令全废。怎么验证:python -c "import lerobot"无报错。
2. 给两条臂找各自的串口
做什么:运行lerobot-find-port,依次插拔 USB,记下每条臂对应的串口(如/dev/ttyACM0、/dev/ttyACM1)。为什么:双臂必须走两条独立总线,共用一条会出现 ID 冲突和带宽争抢。怎么验证:输出列表里稳定出现两个端口号,拔线即消失。
3. 逐臂配置电机 ID 与波特率
做什么:
lerobot-setup-motors --robot.type=so100_follower --robot.port=/dev/ttyACM0 lerobot-setup-motors --robot.type=so100_follower --robot.port=/dev/ttyACM1为什么:新电机出厂默认 ID 都是1,同 ID 在总线上是"对空喊话";这一步把唯一 ID 和统一波特率写进电机 EEPROM,只需做一次。怎么验证:终端逐个打印出每个电机的 ID 设置结果,全程无超时报错。
4. 校准并遥操作双臂
做什么:跑一次关节限位检测与校准,然后启动双领袖-双跟随遥操作(bi_so_leader配bi_so_follower)。为什么:限位文件错了,后面录的每一条数据都是脏的;遥操作是验证同步的最快手段。怎么验证:两只领袖臂同时画"∞"字,两条跟随臂轨迹目视同步、夹爪开合一致。
5. 录演示数据并训练双臂策略
做什么:lerobot-record录制演示(比如"手递手交接方块"这种双臂协同任务),再用lerobot-train训练 ACT——它最初就是为低成本双臂精细操作设计的。为什么:交接、抬锅这类任务单臂做不了,是检验协同链路是否真正打通的试金石。怎么验证:episode 数按预期增长,训练 loss 持续下降,回放某条数据左右臂动作曲线不撕裂。
6. 用基准任务验收
做什么:策略训好后用lerobot-eval在 RoboTwin 2.0 的handover_block、lift_pot等双臂任务上跑批,或直接在实机上回放。怎么验证:固定 episode 数下成功率稳定,而不是单次碰巧成功。
下面这段是初始化双臂的最小入口,把两条总线挂上就能读状态:
from lerobot.robots.bi_so_follower import BiSOFollower, BiSOFollowerConfig from lerobot.robots.so_follower import SOFollowerConfig config = BiSOFollowerConfig( id="bi_demo", left_arm_config=SOFollowerConfig(port="/dev/ttyACM0"), right_arm_config=SOFollowerConfig(port="/dev/ttyACM1"), ) robot = BiSOFollower(config) robot.connect() # 两臂电机 + 相机一次连好 obs = robot.get_observation() print(list(obs)) # left_/right_ 前缀的关节角与图像四、踩坑实录:现象→原因→修复
坑 1:接好电,只有一臂有反应现象:遥操作时左臂动、右臂纹丝不动,日志无明确报错。原因:两条臂的电机 ID 撞了——新电机默认 ID 全是1,或者两条臂接在了同一条总线上。修复:回到第 3 步逐臂重跑lerobot-setup-motors,并确认每条臂走独立 USB 总线。双臂同步校准的头一道关卡就在这里,省不得。
坑 2:一只臂"慢半拍",交接动作必掉件现象:两只领袖臂同步挥手,跟随臂有一侧滞后约一个动作周期。原因:两条臂挂在同一个 USB hub 或同一个电源上,供电波动和轮询排队拉低了响应频率。修复:两条臂各插独立 USB 口、独立供电,线缆尽量短;仍偶发丢帧的话,把配置里的num_read_retries(读数重试次数)调大,用少量冗余换稳定。
坑 3:夹爪接近目标就开始抖现象:轨迹末端高频抖动,越接近工件越明显。原因:位置环 PID 的 p 系数给得太高,误差小时控制量反而放大。修复:力控抖动排查就三步——先降到默认值以下逐次减半position_p_coefficient,再在空载下做直线跟踪测试,最后才加载工件。一次只动一个系数,别同时调 p、i、d。
坑 4:给双臂加"头顶相机"直接报 ValueError现象:初始化即崩,报错信息列出了一堆相机名。原因:BiSOFollower会显式检查顶层相机名与左右臂相机名是否重名,重名直接抛错(左右臂相机会自动加前缀,顶层相机不会)。修复:重命名顶层相机,避开任何臂上相机的名字。
坑 5:回放数据时某臂撞到限位卡死现象:lerobot-replay跑到一半,一臂电机堵转发热。原因:校准文件是换过舵机后没重测的旧文件,限位与真实行程对不上。修复:重跑关节限位检测工具重新生成校准,再回放。这条在医疗辅助类场景尤其要守死——限位错误意味着与人体接触时的力边界不可信,任何自动运行前必须先人工回放确认。
五、从 Demo 到能用:性能与扩展
- 通讯优化:两条臂坚持独立 USB 口与独立电源,别图省事合并供电;遥操作链路卡顿优先查 USB 拓扑而不是改代码;需要把策略推理和机器人控制解耦时,项目自带异步推理的 server/client 拆分,可以把推理搬到另一台机器上跑。
- 算法效率:优先选带动作分块的策略(如 ACT),一次推理输出多步动作,天然摊薄推理延迟;新任务先在 RoboTwin 这类仿真基准上批量筛参数,再上实机微调,把昂贵的手臂运行时间花在收敛区。
- 能耗与寿命:空闲臂可断开力矩(配置里有
disable_torque_on_disconnect开关,断电前释放电机);相机按需打开——顶层共用相机不是每个任务都用得上,关掉就是省带宽。
六、下一步往哪走
跑通本文流程后,你手上应该有一个能交接方块的 LeRobot 双臂演示。接下来三件事按顺序做:把handover_block的成功率从单次碰巧刷到百局稳定,这一步决定你的协同链路是否真的可靠;给任务加语言指令,换 VLA 类策略体验"听懂再动手";最后把你自己的臂型按BimanualMixin的组合方式接进来,这套左右前缀的数据格式是跨硬件复用的关键。
【免费下载链接】lerobot🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning项目地址: https://gitcode.com/GitHub_Trending/le/lerobot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考