我最早接触Lerobot,是冲着Hugging Face团队在开源机器人领域搞的那套东西去的。当时第一反应是:一个搞大模型的开源社区,怎么跑来折腾机械臂了?结果细看之后发现,Lerobot这个项目比我想象中务实得多——它把数据采集、模型训练、真机部署整条链路全打通了,而且底层驱动默认就支持国产飞特舵机,对我这种一直想从零搓一台智能机械臂、又不想被商业方案绑死的人来说,几乎是现成的答案。
这套组合拳打下来,整台机械臂的成本能控制在两千块上下,但能实现的操作逻辑和商业教育机械臂差不了太多,甚至因为有了模仿学习这块,上限反而更高。这篇文章我尽量不写废话,把Lerobot加飞特舵机从组装、配环境、调参,到数据采集和模型部署的完整过程捋一遍,顺便把我踩过的坑和排障经验也交代清楚,照着抄就行。
1. 项目整体设计与核心思路
1.1 为什么是Lerobot加飞特舵机
先解决一个观念问题:Lerobot并不是一个硬件产品,而是一套完整的机器人学习框架,准确说是Hugging Face开源的一套用于构建、训练和部署真实机器人的工具链。它最大的价值在于把“遥操作采集数据—训练模仿学习模型—策略部署到真机”这条路径标准化了。你可以在一个小时内用它教会机械臂完成推棋子、开门、叠衣服这类任务,而不是像传统方式那样,每个动作都靠手写轨迹规划去硬编码。
飞特舵机则是这里的执行层,也是性价比的关键。市面上支持Lerobot的机械臂方案不少,但官方文档和社区案例里,飞特(Feetech)的SCS系列串行总线舵机出场率极高。原因其实很直白:
- 飞特舵机是国产供应链,价格便宜,SCS0009这种级别的舵机几十块一个,一套六自由度的臂体加夹爪,舵机成本控制在一千以内。
- 它走的是半双工串行总线通信,一根线就能把多个舵机串起来,不用每个舵机单独接PWM线,理线难度下降一个档次。
- Lerobot的源码里已经内置了飞特舵机驱动模块,不用自己撸底层协议,开箱即用。
这套组合的核心逻辑就是:Lerobot负责“大脑”,飞特舵机负责“肌肉”,中间用串口转TTL模块连接。你不需要懂机器人运动学,也不需要自己写舵机控制协议,框架把中间层都封装好了。
1.2 核心需求拆解与技术路线
在动手之前,我先定了几个目标,也建议你照着这个思路来,不然很容易做着做着就跑偏:
- 能通过手柄或者直接拖动舵机的方式,采集机械臂的运动轨迹数据。
- 用采集到的数据训练一个简单的模仿学习模型,让机械臂能复现之前的动作。
- 全程不写运动学正逆解代码,依赖Lerobot自带的模型和工具链。
技术路线我最终定成:飞特SCS系列舵机 + 3D打印结构件 + Ubuntu + Lerobot框架 + ACT策略模型。这套路线最大的优势是每个环节都有现成轮子,不用重复造。比如Lerobot官方支持的臂型列表里就有基于飞特舵机的方案,配置文件直接套用官方模板改参数就行。
1.3 认识Lerobot的整体架构
Lerobot的架构其实不复杂,核心就三层,你理解了这三层后面就顺了:
- 硬件抽象层:封装了舵机控制、相机采集、传感器读取这些动作,对外提供统一接口,不管你是飞特舵机还是达妙电机,对上层来说都是“关节”。
- 数据管道层:负责把遥操作时记录的关节角度、时间戳、图像帧打包成数据集,存成Hugging Face标准的datasets格式,方便后续训练。
- 模型层:内置了ACT、Diffusion Policy这些主流的模仿学习算法,训练完直接导出模型权重,部署时加载即可推理。
我第一次看代码的时候觉得挺绕,但实际跑通一遍之后发现,它就是把原本机器人领域分散的工具链整合成了一个闭环。你可以把它理解成一个“机器人版的PyTorch Lightning”,不关心底层细节,专注于采集数据、跑训练、看效果。
2. 硬件准备、组装与舵机配置
2.1 硬件清单与选购避坑
先过一遍我用的物料清单,成本都标出来了,供参考:
| 物料 | 型号/规格 | 数量 | 参考单价 | 备注 |
|---|---|---|---|---|
| 舵机 | 飞特SCS0009 | 6 | 约120元 | 关节用,15kg.cm扭矩够用 |
| 舵机 | 飞特SCS0015 | 1 | 约150元 | 夹爪用,扭矩大点才夹得稳 |
| 结构件 | 3D打印PLA/ABS | 1套 | 约100元 | 网上有开源图纸 |
| 控制板 | ESP32 / Arduino Due | 1 | 约50元 | Lerobot支持这两种控制板 |
| 串口模块 | USB转TTL(支持半双工) | 1 | 约20元 | 必须支持方向控制 |
| 电源 | 12V 5A直流电源 | 1 | 约60元 | 舵机供电,别用USB供电 |
| 相机 | USB摄像头,640x480以上 | 1 | 约80元 | 选支持UVC协议的 |
| 夹爪 | 3D打印指夹结构 | 1套 | 含在上述结构件中 | 兼容SCS0015 |
选购的时候有几个坑我替你先踩了:
- 不要买不带串行总线接口的飞特舵机,比如模拟舵机或者PWM舵机,Lerobot驱动不了。认准SCS系列或者STS系列,这两个系列走的是串行总线协议。
- 电源是关键。飞特舵机启动瞬间电流很大,六个舵机同时上电,瞬间电流能到5A以上。我用过一个12V 3A的电源,一动起来直接电压跌落重启。直接上12V 5A,稳得很。
- 控制板我推荐ESP32,便宜且Lerobot官方支持完善。但注意买那种引出足够多GPIO的版本,最好是ESP32 DevKitC,接线方便。
2.2 机械臂结构组装要点
结构件我用的是开源的SO-101臂型图纸,网上搜一下就能找到。这套图纸是专为串行总线舵机设计的,尺寸匹配度很高,基本不用自己改。
组装的时候有几点心得:
- 打印参数建议壁厚不低于3层,填充40%以上。关节受力大,填充太低容易断裂。我用PLA打印,用了一年多还没出问题,没必要上ABS。
- 舵机安装顺序建议从底座往末端装,每装好一个关节就手动转一下,确认舵机输出轴和结构件转动一致,别等全装完才发现某个关节装反了。
- 夹爪的推杆结构比较脆弱,装的时候注意别用蛮力。
2.3 舵机初始化配置:ID、波特率与方向
这一步是很多人卡住的地方。飞特舵机出厂时默认ID是1,波特率是1000000,但一套机械臂六个舵机,ID必须各不相同,否则总线冲突,所有舵机都不动。
配置舵机参数有两种方式:
- 用飞特官方上位机软件(Feetech调试助手)
- 用Lerobot自带的舵机扫描脚本
我推荐先用飞特上位机,因为直观。操作流程是:
- 用USB转TTL模块连接舵机信号线(注意舵机线序:红线电源、黑线地线、黄线信号)
- 打开上位机,选对串口号和波特率,点击“扫描舵机”,能扫到就说明通信正常
- 逐个修改舵机ID,建议按关节顺序编号:底座1、肩部2、肘部3、腕部4、腕部5、夹爪6
- 顺手把每个舵机的“舵机方向”位设置一下,保证所有关节同一个正方向
这里有个细节:不同关节的安装方向不一样,如果直接用默认方向值,校准的时候你会发现有的关节角度反了。Lerobot的配置文件里有单独的“direction”参数可以修正,所以舵机侧的“方向”位不是必须改,如果你熟悉配置流程,留到配置文件里处理也行。
2.4 接线拓扑与供电方案
串行总线舵机最大的优势就是接线简单。六个舵机用一分二的TTL线串联起来,从控制板的GPIO口引出信号线,接到第一个舵机,然后第一个舵机的第二接口串到第二个,以此类推。电源线则全部并联到12V电源上。
控制板的接线方式取决于你用ESP32还是Arduino Due:
- ESP32:Lerobot默认用GPIO 4作为舵机总线 TX,GPIO 36作为RX,中间接一个MAX485或者硬件方向控制的TTL转RS485模块
- Arduino Due:Lerobot用的是硬件串口,接线更简单
我强烈建议你在舵机总线上并联一个1000μF以上的电解电容,靠近舵机电源端,能有效抑制电压尖峰。实测没加电容之前,舵机快速转动时偶发掉线,加了之后就再没出现过。
3. Ubuntu环境搭建与Lerobot安装
3.1 为什么推荐在Ubuntu下跑
Lerobot对Windows的支持目前还是半残状态,特别是串口通信和数据集处理这块,在Windows下经常出现权限问题或者依赖冲突。我最初就是在Windows上折腾了三天,各种报错,最后老老实实装了个Ubuntu 22.04双系统,半小时搞定。
如果你手头没有Ubuntu机器,两个方案:
- 装双系统:推荐,实时性最好,USB串口通信稳定
- 用虚拟机:能用,但串口透传偶尔延迟高,采集数据时可能丢帧
我个人建议直接上双系统。反正Lerobot只需要Ubuntu跑训练和推理,日常使用切回Windows就行。
3.2 安装步骤详解
安装过程其实不复杂,核心就三步:装Python环境、装Lerobot包、验证安装。
依次执行以下命令:
# 更新系统软件源 sudo apt update && sudo apt upgrade -y # 安装基础依赖 sudo apt install -y git python3-pip python3-venv # 创建conda环境(推荐用miniconda,别用anaconda,太臃肿) wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh # 创建Lerobot专用环境 conda create -n lerobot python=3.10 -y conda activate lerobot # 克隆Lerobot源码 git clone https://github.com/huggingface/lerobot.git cd lerobot # 安装依赖 pip install -e .等pip把依赖装完,基本就到位了。这里有个容易踩的坑:pip install -e .会安装PyTorch,默认装的是CPU版本,如果你的机器有NVIDIA显卡,需要先装CUDA版的PyTorch再装Lerobot,否则训练模型慢到怀疑人生。
# 有NVIDIA显卡的,先手动装CUDA版PyTorch pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # 然后回Lerobot目录再装其他依赖 cd lerobot pip install -e .3.3 验证安装与目录结构
装完之后,快速验证一下:
python -c "import lerobot; print('OK')"能输出OK就说明环境没问题。再看一眼Lerobot的目录结构,几个关键目录你后面会经常用到:
- lerobot/robots/:机械臂配置和控制逻辑
- lerobot/scripts/:各种启动脚本,比如采集和训练都在这里
- lerobot/configs/:所有配置文件的存放位置
熟悉了这三个目录,后面对你来说就完全透明了。
4. 真机对接:让Lerobot识别并控制飞特舵机
4.1 编写机械臂配置文件
这是Lerobot对接硬件的关键一步。进入lerobot/configs/robots/目录,能看到官方提供的各种机械臂配置文件。我们要做的,是新建一个自己的配置文件,把舵机信息填进去。
写一个so101_myarm.yaml文件,核心配置项如下:
robot: name: "so101_myarm" num_joints: 6 # 对应六个关节 joints: - name: "base" motor: "feetech" id: 1 - name: "shoulder" motor: "feetech" id: 2 - name: "elbow" motor: "feetech" id: 3 - name: "wrist1" motor: "feetech" id: 4 - name: "wrist2" motor: "feetech" id: 5 - name: "gripper" motor: "feetech" id: 6 # 每个舵机的角度范围,单位:度 joint_limits: base: [-180, 180] shoulder: [-90, 90] elbow: [-90, 120] wrist1: [-90, 90] wrist2: [-90, 90] gripper: [-45, 45] # 舵机方向和零点偏移,按实际安装情况调整 joint_direction: base: 1 shoulder: -1 elbow: 1 wrist1: -1 wrist2: 1 gripper: 1 # 舵机总线通信参数 motors: bus_baudrate: 1000000 serial_port: "/dev/ttyUSB0"注意joint_direction这个值,如果方向反了,校准的时候舵机会朝相反方向转动,改这里的正负号就能解决,不用动硬件。
4.2 串口权限与识别
配置写好之后,需要确认系统能识别到USB转TTL模块。插上模块后执行:
ls /dev/ttyUSB*正常情况下会输出/dev/ttyUSB0。如果看不到,可能是缺少驱动或者权限问题。
权限问题很常见,解法很粗暴:
sudo chmod 777 /dev/ttyUSB0但这样每次重插都要重新设置,一劳永逸的办法是把自己加入dialout组:
sudo usermod -a -G dialout $USER然后重启系统,之后插上就能直接用。
4.3 运行Lerobot舵机扫描
配置文件和串口都搞定之后,用Lerobot自带的脚本扫描一下,确认它能识别到所有舵机:
python lerobot/scripts/control_robot.py --robot.so101_myarm --robot.port /dev/ttyUSB0启动后,脚本会尝试连接舵机总线。如果一切正常,你会看到类似这样的输出:
Connecting to Feetech motors... Found 6 motors, IDs: [1, 2, 3, 4, 5, 6]这个输出代表Lerobot和飞特舵机之间的通信已经建立。
如果只扫到部分舵机,优先检查:
- 接线是否串联完整,有没有接错
- 舵机ID是否有重复
- 供电是否正常,电压低于10V时舵机可能无响应
4.4 手动驱动测试
我习惯在正式采集前,先手动发几个角度指令给各个关节,确认每个舵机的响应方向和自己预期一致。
在Lerobot的同一脚本下,有个teleoperate模式可以让你用手柄或者遥操作器控制机械臂,但我更推荐先直接向关节写入固定角度做单关节测试:
python lerobot/scripts/control_robot.py --robot.so101_myarm --reset执行reset指令后,机械臂会回到零位。如果某个关节转动方向反了,就去改配置里的joint_direction,改完再执行reset,直到所有关节回到零位为止。
这一步虽然枯燥,但非常关键。不把每个关节方向和零点校准好,后面采集的数据全是歪的,模型练出来也是白搭。
5. 数据采集、模型训练与真机部署
5.1 搭建遥操作采集环境
Lerobot标配的采集方式有两种:一是用手柄(游戏手柄)控制机械臂,二是用外置遥操作机械臂。我不建议第一种,因为手柄控制多个关节非常别扭。第二种做起来成本也不高,我在二手平台淘了一台同款机械臂当主臂,用螺丝和联轴器把主臂和从臂的关节耦合在一起,你手动掰主臂,从臂就会跟着动。
这样采集数据最自然,因为你直接控制末端执行器做动作,机械臂的运动轨迹完全贴合真实操作。
采集数据的核心脚本是:
python lerobot/scripts/control_robot.py \ --robot.so101_myarm \ --robot.port /dev/ttyUSB0 \ --teleoperate \ --task "push_red_block"这里的--task参数给任务起个名字,采集到的数据会存放在以这个名字命名的数据集文件夹中。
5.2 控制Lerobot进行有效的数据采集
启动采集后,通过可视化界面录制数据。实际采集时,每轮操作会记录约2-3秒的动作轨迹,每秒钟记录30帧的数据帧,每帧包含六个关节的角度和相机图像。
我踩过的坑是:最开始采集时,我习惯把动作做得很快,结果机械臂动作快,帧率跟不上,导致数据片段严重抖动。后来我请教了一位做机器人研究的同学,他给了我一个建议:采集时放慢速度,每个动作持续3秒以上。
具体需要注意的采集要点:
- 同一任务采集30-50条轨迹数据,太少模型学不会,太多训练时间指数增长
- 每次采集的起始位置尽量一致,这样模型学到的不是某个特定起点到终点的映射,而是更泛化的操作逻辑
- 让机械臂在终点位置做几次“夹取-释放”的动作,帮助模型区分不同动作阶段
# 摄像头画面预览 python lerobot/scripts/visualize_dataset.py --dataset.repo_id hf.co/myarm/push_red_block5.3 训练模仿学习模型(ACT)
数据采完,接下来就是训练环节。Lerobot内置了多种模仿学习算法,我强烈推荐ACT(Action Chunking with Transformers),这是目前社区效果最稳的。
训练命令:
python lerobot/scripts/train_policy.py \ --policy.type act \ --dataset.repo_id hf.co/myarm/push_red_block \ --output_dir output/act_push_red_block \ --num_epochs 200训练时长取决于你的显卡:
- 无GPU:一个任务200个epoch要跑三五天,基本不可用
- RTX 3060级别:大约4-6小时
- RTX 4090级别:不到2小时,跑起来飞快
训练过程中Loss会周期性打印到终端。正常情况是前10个epoch快速下降,之后进入缓慢下降通道。如果Loss振荡剧烈不下降,极大概率是数据采集有问题,建议先检查数据质量,再调提高epoch数。
5.4 部署策略:让机械臂自动执行任务
训练完成后,模型权重会存在output目录下,接下来是最后一步:部署到真机。
python lerobot/scripts/control_robot.py \ --robot.so101_myarm \ --robot.port /dev/ttyUSB0 \ --deploy \ --policy.path output/act_push_red_block/checkpoints/0100执行部署后,系统会加载模型权重,初始化相机,然后你就可以把目标物体放到初始位置,按下启动按钮,机械臂会自动复现你之前演示的动作序列。
第一次看到自己训练出来的模型驱动实体机械臂完成动作时,那种成就感还是很顶的。不过注意,模型复现的是“操作逻辑”,不是完全复制轨迹。如果你训练数据里夹取动作偏移了,模型也会学歪,所以训练数据质量永远是第一位的。
5.5 扩展:基于Webots的多机械臂分拣仿真
做完了单臂的模仿学习,如果你还想继续往深处玩,我推荐一个特别适合进阶的方向——把训练好的模型部署到Webots仿真环境里,做多机械臂智能分拣。
Webots是一个开源机器人仿真平台,支持导入URDF模型和ROS接口,配合Lerobot能实现“真机采集—仿真训练—真机部署”的闭环验证。多机械臂分拣场景的玩法是:
- 在Webots里搭建一条含有传送带和多个机械臂的产线环境
- 每个机械臂负责识别和分拣不同类别的物料(通过颜色或形状识别)
- 用Lerobot采集的分拣轨迹数据训练各自的策略,然后部署到仿真环境中的机械臂上
这个场景的好处是:仿真环境里没有硬件磨损风险,你可以放心尝试各种策略组合。等仿真效果稳定了,再把模型导回到真机,做到“仿真练精、真机验证”。
Webots支持Python控制API,配合OpenCV做视觉分拣,整套系统搭建起来大约一周时间,但效果非常酷,也很适合拿来做出一个完整的项目展示或毕业设计。
6. 常见问题与排查技巧实录
6.1 舵机扫描不到,怎么办?
这个问题占了整个项目排障的一半以上,遇到先逐步排查:
| 可能原因 | 排查方法 | 解决方案 |
|---|---|---|
| 供电不足 | 用万用表量舵机电源端电压,低于10V就有问题 | 换12V 5A以上电源,加1000μF电容 |
| 串口权限 | 看ls /dev/ttyUSB*是否存在,执行时是否报Permission denied | 将用户加入dialout组并重启 |
| 舵机ID冲突 | 单独接一个舵机依次扫码,确认ID不重复 | 用飞特上位机逐个改ID |
| TTL接线反了 | 信号线和地线接反是经典错误 | 核对引脚定义,拿万用表通断档确认 |
| 波特率不匹配 | 飞特默认1000000,改过的话Lerobot读不到 | 用上位机重设为1000000 |
6.2 运行Lerobot报错“No module named 'lerobot'”
大概率是没在当前conda环境内执行命令,或者pip install -e .没有成功装完。
conda activate lerobot pip list | grep lerobot如果没出现在列表里,回到lerobot目录重新装:
cd lerobot pip install -e . --no-deps6.3 舵机抖动、堵转和过热
舵机抖动通常有两个来源,一是供电纹波大,二是负载过大。
- 供电纹波:在电源输出端并联一个470μF电解电容和0.1μF瓷片电容,效果立竿见影。
- 负载过大:如果机械臂某个关节在活动范围极限位置听到舵机咔咔响,说明舵机堵转,长期堵转会烧舵机。解决办法是调整配置文件中的关节角度上下限,把实际活动范围限制在机械极限以内的安全区间。
6.4 模型训练后部署动作不对
这里要分清是“轨迹不对”还是“逻辑不对”:
- 轨迹不对:检查训练数据,通常数据量太少,或者每次采集的起始位置差异过大。对策是补充数据量到50条以上。
- 逻辑不对:模型学到了错误的动作模式,比如夹爪该夹时没夹。通常是数据中没有包含关键时刻(夹取和释放)对应的图像帧。对策是采集时让末端在关键位置多停留0.5秒。
6.5 数据采集的独家心得
最后分享一个我个人的数据采集小技巧。官方教程里的数据采集流程是“放好目标物体—按下录制—操作机械臂—停止录制”,但实际操作中,每次起始位置稍有偏移,模型性能下降非常明显。
我的做法是:在目标物体的旁边画一个明显的定位贴纸,每次采集前把物体放到贴纸位置,让机械臂也从相同位置启动。相当于把“演示”这件事标准化了,模型学到的东西也干净得多,泛化能力反而更好。
6.6 常见问题速查表
| 现象 | 直接原因 | 推荐处理 |
|---|---|---|
| 所有舵机不动 | 供电断开或串口未连接 | 先查电源和USB,再查串口权限 |
| 只有一个舵机不动 | 该舵机ID冲突或损坏 | 单独接线扫码确认 |
| 舵机朝反方向转 | 配置里direction设置反了 | 改yaml文件的joint_direction |
| 舵机偶尔掉线 | 电源电压跌落或信号线接触不良 | 加电容、检查接插件 |
| 采集数据画面黑屏 | 摄像头权限不足 | 给摄像头加udev规则,或用v4l2-ctl测试 |
| 训练Loss不降 | 数据集太小或动作太快 | 加数据量,放慢采集动作 |
写在最后的一些心得体会
从零开始用Lerobot搭一台完整的智能机械臂,这个过程走下来,你会发现自己对机器人的理解会有一个质的提升。我之前一直觉得机器人控制门槛高得吓人,运动学、动力学、控制理论哪一样都够学半年的。但Lerobot这种“数据驱动”的路线,确实把门槛拉低了一大截,你甚至不需要知道舵机怎么转成角度,只需要告诉它“这样做”,它就能从数据里学到规律。
不过我也得说句实在话——正因为门槛低了,很多人容易掉进“只会跑通、不懂原理”的陷阱里,这样很容易变成纯调参侠。我在做完第一版机械臂之后,回头补了很多控制理论的知识,包括PID调参甚至运动学解算,这时候再回头看Lerobot的代码,思路会比之前清晰得多。
如果非要说这个项目带给我最值钱的经验,那可能是:开源社区的力量远比想象中大,Lerobot的文档和代码质量都很高,飞特舵机的社区案例也非常丰富,遇到问题基本都能查到解决方案。这套组合拳再玩一段时间,我打算把Webots仿真里的多机械臂分拣方案完善一下,配合真机做一套“仿真训练+真机验证”的闭环流程,到时候再来更新一篇。也希望你做完自己的机械臂之后,能折腾出更有意思的玩法。
提示:项目相关的配置文件和代码,建议自己手动敲一遍,遇到问题也别急着搜答案,先查日志和串口输出,排查本身就是最值钱的学习过程。