SO-ARM100+LeRobot+ACT:低成本机械臂模仿学习全流程实战
1. 项目缘起与整体思路拆解1.1 为什么选择 SO-ARM100 这套低成本机械臂方案搞机器人最怕两件事一是硬件贵得离谱二是软件生态稀碎。SO-ARM100 这套东西恰好把这两个痛点都按住了。它是一套开源的低成本舵机机械臂整机物料成本控制得相当克制结构件可以自己打印关节用的是常见的串行总线舵机配合 LeRobot 这个开源框架能把数据采集、模型训练、真机部署串成一条完整的链路。我最初盯上它是因为想验证一个想法用模仿学习Imitation Learning的方式让机械臂学会一些简单的抓取和放置动作到底需要多少数据、多强的算力、多长的调试周期。市面上动辄几万块的协作臂对个人开发者不友好而 SO-ARM100 这种几百块到一千出头就能凑齐的方案试错成本低坏了也不心疼特别适合拿来跑通全流程。LeRobot 是这套方案里的软件核心。它把机器人数据的采集格式、数据集管理、策略训练、真机推理都做了封装底层还是 PyTorch 那一套。你可以理解成SO-ARM100 是身体LeRobot 是大脑和神经系统ACT 模型则是具体要训练的那个技能包。1.2 ACT 模型在整个链路里扮演什么角色ACT全称 Action Chunking with Transformers是模仿学习里一个很实用的策略网络。它的核心思想不复杂传统方法是一帧观测对应一个动作ACT 则是一次性预测未来一小段动作序列也就是 action chunk这样能缓解单步预测的抖动问题让机械臂动作更连贯。为什么选 ACT 而不是别的我的考量有三点。第一它对数据量的要求相对温和几十条演示轨迹就能看到初步效果不像某些方法动辄要几百上千条。第二它对观测的利用比较充分图像加关节状态一起喂进去能学到视觉和动作之间的关联。第三LeRobot 官方对 ACT 的支持比较完善配置文件和训练脚本都是现成的改起来方便。当然ACT 也不是万能的。它对任务的时间跨度比较敏感动作 chunk 的长度设小了学不到长程依赖设大了又容易过拟合。这个参数后面会重点讲。1.3 整体实施路线的规划逻辑我把整个项目拆成了四个阶段每个阶段都有明确的验收标准避免一锅粥地往前冲。第一阶段是环境搭建目标是让 LeRobot 能在本机跑起来能读到机械臂的串口能采集到第一帧图像和关节数据。第二阶段是数据采集目标是攒够一批质量过关的演示数据并且能可视化回放确认没问题。第三阶段是模型训练目标是让 ACT 在训练集上 loss 收敛在验证集上动作预测合理。第四阶段是真机部署和调参目标是机械臂能稳定复现演示动作并且针对失败案例做针对性优化。这个顺序不能乱。我见过太多人环境还没跑通就急着训模型结果数据格式不对、串口读不到白白浪费几天时间。先把地基打牢后面才顺。提示整个链路里最容易出问题的不是模型本身而是数据采集环节。数据质量差再好的模型也救不回来。这一点后面会反复强调。2. 环境搭建的核心细节与实操要点2.1 系统与 Python 环境的选择考量LeRobot 对系统环境有一定要求我实测下来 Ubuntu 22.04 是最省心的选择。为什么不用 Windows因为串口权限管理、USB 设备识别、以及部分依赖库在 Linux 下更顺滑尤其是涉及到实时读取舵机数据的时候Linux 的稳定性明显更好。如果你只有 Windows用 WSL2 也能跑但串口透传会多一层折腾我建议直接上原生 Ubuntu 或者双系统。Python 版本我锁定在 3.10。3.8 太老部分新库不支持3.11 和 3.12 有些依赖还没跟上容易在编译阶段报错。3.10 是当前生态兼容性最好的甜点版本。虚拟环境必须用。我习惯用 conda 建一个独立环境避免和系统 Python 打架。命令很简单conda create -n lerobot python3.10 conda activate lerobot建完环境先别急着装 LeRobot先把 PyTorch 装好。这里有个坑PyTorch 版本要和你的 CUDA 驱动匹配。如果你有 NVIDIA 显卡先跑nvidia-smi看驱动支持的 CUDA 版本然后去 PyTorch 官网找对应的安装命令。没有显卡也能跑用 CPU 训练就是慢ACT 这种模型用 CPU 训可能要等到天荒地老所以强烈建议至少有一张 8G 显存的卡。2.2 LeRobot 安装过程中的依赖处理LeRobot 的安装方式有几种我推荐从源码装因为后面要改配置、看源码源码装最灵活。git clone https://github.com/huggingface/lerobot.git cd lerobot pip install -e .这个-e是 editable 模式改了代码不用重装。装的过程中最容易卡在几个地方一是ffmpeg相关的依赖视频编解码要用二是pybullet之类的仿真依赖如果你不需要仿真可以跳过三是串口库pyserial这个必须装好不然读不到机械臂。我遇到过一次pip install -e .卡在编译某个包上最后发现是系统缺libffi-dev和build-essential。所以装之前先把系统依赖补齐sudo apt update sudo apt install -y build-essential libffi-dev ffmpeg装完之后验证一下跑python -c import lerobot不报错就说明基础环境 OK。2.3 机械臂串口识别与权限配置SO-ARM100 通过 USB 转串口和电脑通信插上之后系统会识别成一个/dev/ttyUSB*或者/dev/ttyACM*设备。先用ls /dev/tty*看一眼插拔前后对比多出来的那个就是。默认情况下普通用户没有串口读写权限直接跑程序会报 Permission denied。解决办法有两个一是每次用sudo但这样会把环境变量搞乱不推荐二是把用户加到dialout组sudo usermod -aG dialout $USER加完要重新登录才生效。这一步很多人会忘然后纳闷为什么权限还是不对。还有一个坑如果同时插了多个串口设备ttyUSB0和ttyUSB1可能会变。我建议用 udev 规则给机械臂绑定一个固定的设备名或者每次插拔后用dmesg | grep tty确认当前是哪个口再填到配置文件里。2.4 舵机 ID 与波特率的核对SO-ARM100 用的是串行总线舵机每个舵机有一个 ID出厂默认可能都是 1需要你逐个改成不同的 ID。这一步如果没做机械臂会完全不响应或者乱动。核对方法是用厂商提供的调试工具或者用 LeRobot 自带的脚本扫描总线。波特率也要对上常见的是 1000000但不同批次可能不一样以实际为准。我踩过的坑是波特率设错程序不报错但读回来的数据全是乱的排查了半天才发现是波特率问题。注意改舵机 ID 的时候一次只接一个舵机改完再接下一个。同时接多个同 ID 的舵机会导致总线冲突严重时可能损坏舵机。3. 数据采集与数据集构建的实操过程3.1 采集前的机械臂标定与零点设置数据采集之前必须做一次标定。标定的目的是告诉系统机械臂的每个关节在什么位置是零位运动范围是多少。如果标定不准采集的数据里关节角度就是错的训出来的模型自然也是歪的。LeRobot 提供了标定脚本大致流程是把机械臂摆到一个已知的参考姿态记录当前各关节的原始读数作为零点偏移。然后手动把每个关节推到极限位置记录最小值和最大值作为运动范围。标定过程中手要稳别抖。我建议标定两到三次取一致的结果。如果每次标定出来的数值差异很大说明机械臂的机械结构有松动或者舵机有回程差需要先解决硬件问题。3.2 演示数据的采集节奏与质量控制采集数据就是人手动拖着机械臂或者用遥控器完成一遍任务系统同步记录图像和关节状态。听起来简单但采集节奏很讲究。第一动作要平滑。不要忽快忽慢不要中途停顿太久。ACT 学的是动作序列的分布你的演示越接近真实执行时的节奏模型学出来越自然。第二每个任务至少采集 30 到 50 条轨迹。太少了模型学不到泛化性太多了采集成本高。我一般先采 30 条跑一版看效果再决定要不要补。第三要覆盖不同的初始条件。比如抓取任务物体的位置要有些变化不能每次都放在同一个点。否则模型只会记住那一个位置换个地方就抓瞎。第四采集环境的光照要稳定。图像是模型的重要输入光照突变会让模型困惑。我吃过这个亏白天采的数据晚上训完部署识别率直接掉一半就是因为光照变了。3.3 数据集格式与可视化回放验证LeRobot 的数据集有自己的格式底层是视频加 parquet 或者类似的列式存储。采集完之后一定要做可视化回放确认三件事图像和关节数据是否对齐、时间戳是否连续、有没有丢帧。回放的时候重点看关节曲线正常的曲线应该是平滑的如果出现锯齿状或者跳变说明采集时有丢包或者干扰。这种数据要剔掉不然会污染训练集。我一般会把数据集按 8:2 分成训练集和验证集。验证集不参与训练只用来评估模型泛化能力。如果训练 loss 一直降但验证 loss 不降说明过拟合了要么加数据要么减模型复杂度。提示数据集命名和版本管理要规范。我习惯用任务名_日期_版本号的格式比如pick_cube_20240510_v2。不然过几天你自己都分不清哪个是哪个。4. ACT 模型训练与调参的核心环节4.1 训练配置文件的参数解读LeRobot 里 ACT 的训练配置是一个 YAML 或者 Python 字典里面有几个关键参数必须搞懂。chunk_size是 action chunk 的长度也就是模型一次预测多少个未来动作。这个参数直接决定了模型的时间视野。设太小比如 10模型只能看到很短的一段动作会碎设太大比如 100模型要预测很长的序列训练难度陡增而且容易过拟合。我的经验是从 30 到 50 开始试根据任务的时间跨度调整。hidden_dim是 Transformer 的隐藏层维度决定了模型的容量。太小欠拟合太大过拟合还费显存。一般 256 到 512 之间比较合适。n_heads是注意力头数要和hidden_dim配合通常hidden_dim能被n_heads整除。learning_rate学习率ACT 对学习率比较敏感我一般从 1e-5 开始配合 warmup 和 cosine 衰减。batch_size看显存8G 显存大概能跑 8 到 16不够就开梯度累积。4.2 训练过程的监控与收敛判断训练启动之后要盯着几个指标训练 loss、验证 loss、以及动作预测的可视化。训练 loss 正常应该是先快速下降然后缓慢收敛。如果一开始就不降检查学习率是不是太大或者太小检查数据有没有问题。如果降到一半开始震荡可能是 batch size 太小或者学习率没有衰减。验证 loss 是判断过拟合的关键。理想情况是训练 loss 和验证 loss 同步下降最后都趋于平稳。如果训练 loss 继续降而验证 loss 开始上升就是过拟合了这时候要么早停要么加数据增强要么减小模型。我还会在训练过程中定期跑一次推理把模型预测的动作和真实动作画在一起对比。如果预测曲线和真实曲线形状接近只是有相位差说明模型学到了动作模式如果预测曲线是一条直线或者乱跳说明模型没学到东西。4.3 学习率与 chunk_size 的联合调参经验这两个参数是相互影响的不能单独调。我的一般流程是先固定chunk_size为 50调学习率找到 loss 下降最稳的那个值。然后固定学习率试chunk_size为 20、30、50、80看哪个在验证集上表现最好。实测下来对于抓取放置这类任务chunk_size在 30 到 50 之间效果最好。太小了动作不连贯太大了模型会想太多反而预测出一些莫名其妙的动作。学习率方面1e-5 配合 500 步 warmup 是个比较稳的起点。如果 loss 下降太慢可以试 3e-5但要注意别太大太大了会直接发散。注意调参的时候一次只改一个变量改完记录结果。同时改多个参数你根本不知道是哪个起了作用。我习惯用一个表格记录每次实验的配置和结果后面回看非常有用。5. 真机部署与常见问题排查实录5.1 模型推理的延迟与实时性优化训练好的模型要部署到真机上最大的挑战是推理延迟。ACT 模型不算小如果推理一次要几百毫秒机械臂动作就会一顿一顿的。优化手段有几个一是用半精度fp16推理速度能快不少精度损失很小二是把模型导出成 ONNX 或者 TensorRT进一步加速三是减少输入图像的分辨率但要注意别降太多否则模型看不清。我实测下来在 RTX 3060 上fp16 推理一次大概 30 到 50 毫秒配合 action chunk 的机制机械臂动作基本流畅。如果用 CPU 推理可能要 200 毫秒以上那就很卡了。5.2 动作抖动与执行失败的典型原因部署之后最常见的问题是动作抖动。原因可能有好几个一是模型预测的动作本身就不平滑这通常是训练数据质量或者 chunk_size 设置的问题二是推理频率和执行频率不匹配导致动作被重复执行或者跳过三是舵机的控制精度不够指令和实际位置有偏差。排查的时候先把模型预测的动作序列单独打出来看如果预测本身就抖那是模型问题如果预测平滑但执行抖那是控制链路问题。执行失败还有可能是初始位置不对。模型是在特定初始条件下训练的如果部署时机械臂的起始姿态和训练时差太多模型会懵。解决办法是在每次执行前把机械臂复位到一个固定的初始姿态。5.3 常见问题速查表问题现象可能原因排查方向解决办法串口读不到数据权限不足或设备名错误检查/dev/tty*和用户组加入 dialout 组确认设备名舵机不响应ID 冲突或波特率错误扫描总线核对波特率逐个改 ID统一波特率训练 loss 不降学习率不当或数据有问题检查数据可视化和学习率调整学习率清洗数据验证 loss 上升过拟合对比训练和验证曲线加数据减模型早停真机动作抖动推理延迟或预测不平滑单独看预测序列优化推理调 chunk_size换环境后失效光照或背景变化对比采集和部署环境固定光照增加数据多样性5.4 独家避坑经验分享第一个坑数据采集时忘了开摄像头或者摄像头被占用。LeRobot 采集时会同时读摄像头和串口如果摄像头被其他程序占用采集会静默失败数据里只有关节没有图像。所以采集前先确认摄像头可用。第二个坑训练时显存不够程序直接崩。ACT 的显存占用和 batch_size、图像分辨率、chunk_size 都有关。显存不够就减 batch_size开梯度累积或者降图像分辨率。第三个坑部署时忘了切换模型到 eval 模式。PyTorch 模型在 train 和 eval 模式下行为不同如果忘了切dropout 和 batchnorm 会捣乱导致推理结果不稳定。第四个坑机械臂电源功率不够。多个舵机同时运动时电流很大如果电源功率不足舵机会掉电复位表现为机械臂突然软掉。换一个功率足够的电源能解决。第五个坑数据集路径写错。LeRobot 读数据集是按配置里的路径找的路径错了会报找不到文件。建议用绝对路径别用相对路径省得因为工作目录不同而出错。6. 项目复盘与后续扩展方向整套流程跑下来我最大的感受是模仿学习的门槛不在模型而在数据和工程细节。ACT 本身并不复杂LeRobot 也把很多脏活累活封装好了但数据采集的质量、环境搭建的稳定性、部署时的实时性这些才是决定项目成败的关键。如果让我重新做一遍我会在数据采集阶段投入更多时间把演示轨迹的质量再提高一档而不是急着训模型。因为数据质量的上限决定了模型效果的上限。后续可以扩展的方向有几个一是增加任务复杂度从单物体抓取扩展到多物体、多步骤的任务二是尝试其他策略网络比如 Diffusion Policy对比一下和 ACT 的优劣三是加入语言条件让机械臂能听懂指令这就涉及到视觉语言动作模型VLA的范畴了。最后分享一个小技巧每次实验都做好记录配置、数据、结果、问题全部记下来。机器人项目周期长细节多不记录的话过两周你自己都忘了当时为什么那么调。我用一个简单的 Markdown 表格记录每次实验回看的时候一目了然省了很多重复踩坑的时间。