这几年做桌面陪伴机器人,最大的体会是:规则写出来的动作永远像木偶,只有把模仿学习(Imitation Learning)和具身策略引进来,机械臂或者机械爪才能有那种自然、泛化的人味。
Hugging Face 开源的 LeRobot 降低了端到端模仿学习的门槛。本篇以目前最普及的开源机械臂平台(以 SO-100 / Koch 双臂系统思路为主)为载体,记录从零装机、数据录制、训练 ACT 策略到实机推理的全流程,尽量把坑踩平。
一、 硬件物料与 BOM 清单
要做遥操作(Teleoperation)采集数据,最推荐也是最成熟的方案是「主从臂模式」(Leader-Follower)。主臂由人手拖动,从臂实时镜像并与环境交互。
以单组主从机械臂(各 6 个自由度)为例:
| 物料名称 | 规格 / 型号 | 数量 | 作用 / 备注 |
|---|---|---|---|
| 从臂舵机 (Follower) | 飞特 (Feetech) STS3215 串行总线舵机 | 6 个 | 扭矩约 19kg.cm,阻尼适中,支持回传 |
| 主臂舵机 (Leader) | 飞特 STS3215 或同尺寸电位器臂 | 6 个 | 主臂不需要高扭矩,但需要读取角度编码 |
| 结构件 | 3D 打印件(PETG / ABS,建议 40% 填充) | 1 套 | 推荐 SO-100 开源模型,比 PLA 耐温 |
| 主控 / 串口板 | 飞特专用驱动板(如 URT-1)或 ESP32 桥接 | 2 块 | 主臂与从臂各占一个独立串口 |
| 电源 | 12V 10A 开关电源 / 航模锂电 | 1 个 | 舵机瞬间堵转电流很大,切忌用板载供电 |
| 相机 | 1080P 免驱 USB 广角摄像头 | 1~2 个 | 一个固定俯视视角,一个手腕相机(可选) |
| 工作台固定件 | 铝型材底座或 G 字夹 | 若干 | 必须刚性固定,晃动会毁掉数据集 |
二、 硬件组装与接线避坑
-
舵机 ID 与波特率配置
总线舵机出厂默认 ID 通常都是 1,波特率通常是 1000000。组装前必须用官方上位机或写脚本单独给每个舵机分配 ID(从底座到末端依次设为 1 至 6)。如果多个舵机 ID 冲突挂在同一条总线上,总线通讯会直接瘫痪。 -
共地与独立供电
PC 端 USB 给驱动板供电仅用于通讯。舵机的 12V VCC 和 GND 必须走独立开关电源,且驱动板的 GND 必须与 12V 电源共地,否则高频通信信号会出现大量误码丢包,导致机械臂抽搐。 -
零位校准
主臂和从臂装配时的机械零位必须尽量一致。LeRobot 自带校准工具,但如果物理初始角度差了 90 度,后期映射容易出现舵机软件限位截断。
三、 环境搭建与通讯检查
建议在 Ubuntu 22.04 下操作,NVIDIA 驱动与 CUDA 提前配好。
# 1. 创建虚拟环境
conda create -y -n lerobot python=3.10
conda activate lerobot
# 2. 安装 PyTorch (根据你的 CUDA 版本调整)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
# 3. 克隆并安装 LeRobot
git clone https://github.com/huggingface/lerobot.git
cd lerobot
pip install -e .
连接主臂、从臂和相机后,检查设备节点:
ls /dev/ttyUSB*
# 正常应该看到两个串口设备,例如 /dev/ttyUSB0 和 /dev/ttyUSB1
给串口权限:
sudo chmod 666 /dev/ttyUSB*
四、 数据集录制(Teleoperation)
LeRobot 封装了标定和遥操作录制流程。录制的目标任务以桌面简单的「抓取方块放入托盘」为例。
1. 运行配置校验
首先确认相机和机械臂是否能被框架正常读取:
python lerobot/scripts/control_robot.py \
--robot-path lerobot/configs/robot/so100.yaml \
--robot-overrides \
leader_arms.main.port=/dev/ttyUSB0 \
follower_arms.main.port=/dev/ttyUSB1 \
--teleoperate
此时转动主臂,从臂应该以约 30Hz~60Hz 的频率实时同步。如果从臂不动,排查波特率配置与舵机回传。
2. 开始录制任务
准备好方块,运行录制脚本,录制 50 次完整操作(Episode):
python lerobot/scripts/record.py \
--robot-path lerobot/configs/robot/so100.yaml \
--fps 30 \
--root data/so100_pick_place \
--repo-id local/so100_pick_cube \
--warmup-time-s 2 \
--episode-time-s 12 \
--num-episodes 50
实操翻车点:
- 每一回合开始时,物体的位置可以有微小随机偏移(±3cm 内),但不要超出相机视野。
- 动作尽量连贯平滑,人在拖动主臂时不要出现过多的犹豫发抖,策略网络会把人类的迟疑也学进去。
- 观察相机画面是否有反光。如果桌面反光严重,模型容易把高光当做特征,导致泛化极差。
五、 策略训练(基于 ACT 算法)
对于桌面接触式任务,Action Chunking with Transformers (ACT) 表现相对平稳,预测动作块能有效缓解累积误差。
启动训练脚本:
python lerobot/scripts/train.py \
--dataset-repo-id local/so100_pick_cube \
--policy.type act \
--output_dir outputs/train_so100_act \
--job-name act_so100_cube \
--device cuda \
--batch_size 16 \
--training_steps 80000 \
--save_freq 10000
配置说明:
batch_size: 显存如果小于 8G(如 RTX 3060/4060 Laptop),降到 8;若显存充足可用 16 或 32。training_steps: 50 个回合的数据量,大约 60000 到 80000 步即可收敛。- 损失函数主要看
action_loss,降到 0.02 以下且不再明显下降时基本成型。
六、 实机闭环评估(Inference)
模型训练完成后,权重会保存在 outputs/train_so100_act/checkpoints 目录下。断开主臂,只保留从臂和相机,进入自主推理运行。
python lerobot/scripts/eval.py \
--robot-path lerobot/configs/robot/so100.yaml \
--robot-overrides follower_arms.main.port=/dev/ttyUSB1 \
--policy.path outputs/train_so100_act/checkpoints/080000/pretrained_model \
--fps 30
推理调试细节:
- 视觉一致性:推理时的光照、桌布颜色、相机机位必须与录数据时保持严格一致。ACT 对视角的微小变动很敏感。
- 抓取打滑:如果末端执行器抓取方块时差一口气闭合,可以检查机械爪的 3D 打印件刚度,或者在爪子内侧贴一小片硅胶防滑垫。
- 安全急停:手边放一个物理断电开关,防止模型输出异常角度导致舵机堵转烧毁。
七、 总结
这套链路打通后,机器臂就不再依赖写死的逆运动学(IK)解算,面对有微小形变或位置偏差的物体也能自主抓取。对于做桌面机器人的朋友来说,先用单臂跑通 ACT,下一步就可以挂载语音模块,把大语言模型的意图解析与 LeRobot 的 Policy 衔接起来,让它真正变成一个能递工具、能互动的桌面实体伙伴。
License: CC BY-NC 4.0
Updated 2 hours ago
Was this article helpful? Give it a like.
0 comments


