
1. 为什么SO-ARM100值得折腾从开箱到跑通ACT的完整路径SO-ARM100这台桌面级六轴机械臂最近在开源机器人圈子里热度不低。它最大的卖点就是便宜、结构简单、完全开源配合LeRobot这套框架能把模仿学习Imitation Learning的整套流程跑通。我前后花了大概两周时间从零开始把环境搭起来中间踩了不少坑也积累了一些调参经验这篇文章就把整个过程完整记录下来。如果你手上正好有一台SO-ARM100或者正在考虑入手又或者你只是想了解ACTAction Chunking Transformer这类模仿学习模型在真实硬件上怎么落地那这篇内容应该能帮你省下不少时间。我会从硬件组装、软件环境、数据采集、模型训练到调参一步步拆开讲重点放在那些官方文档里不会写、但实际一定会遇到的问题上。先说结论SO-ARM100加LeRobot这套组合门槛不算高但坑比较分散。环境依赖、串口权限、相机标定、数据格式、训练超参每个环节都有让人卡住的地方。下面我按实际操作的顺序来展开。2. 硬件准备与组装别小看那几个螺丝2.1 物料清单与采购建议SO-ARM100的物料清单在官方仓库里有详细说明我这里只强调几个容易出问题的点。舵机用的是Feetech STS3215系列这个舵机支持串口通信可以读取位置反馈这是后面做数据采集的基础。买的时候注意区分电压版本7.4V和12V的扭矩不一样12V版本在负载稍大的场景下更稳。3D打印件建议用PETG或者ABSPLA在舵机发热后容易变形尤其是底座和关节连接处。我第一版用PLA打的跑了半小时后关节就有轻微松动后来换成PETG才稳定下来。打印填充率至少30%关键受力件可以到50%。螺丝和轴承这些标准件建议多买一套备用。M3螺丝在反复拆装后容易滑丝尤其是拧进打印件的时候力矩控制不好就会把螺纹搞坏。2.2 组装顺序与关键细节组装顺序官方有步骤图我按自己的经验调整了一下建议先装底座和第一关节再往上逐级装。每装一个关节先手动转动确认没有卡涩再通电测试舵机。舵机ID的配置是第一个大坑。每个舵机出厂默认ID都是1你需要用Feetech的调试工具或者LeRobot自带的脚本逐个改ID。改ID的时候只能单独连接一个舵机否则总线上的ID冲突会导致通信失败。我一开始不知道六个舵机全接上结果一个都认不到排查了半天才发现是ID冲突。注意改舵机ID之前先把所有舵机的中位校准好。中位没校准后面组装完机械臂的零位就是歪的数据采集出来的轨迹全是偏的。2.3 串口权限与通信测试在Ubuntu下串口设备默认权限是root普通用户访问不了。你需要把当前用户加到dialout组sudo usermod -aG dialout $USER改完要重新登录才生效。然后确认设备节点ls /dev/ttyACM*正常情况下会看到/dev/ttyACM0。如果没有检查USB线是不是只供电不传数据的那种换一根质量好点的线。通信测试可以用LeRobot自带的脚本python -m lerobot.scripts.setup_motors --port /dev/ttyACM0这个脚本会扫描总线上的舵机读取当前位置和ID。如果报超时先降波特率试试默认是1000000有些舵机固件版本对高波特率支持不好降到500000就稳了。3. 软件环境搭建Python依赖是重灾区3.1 系统选择与基础环境我用的Ubuntu 22.04Python 3.10。LeRobot对Python版本有要求3.8到3.11都行但3.10是最稳的。不建议用Windows串口和相机这块在Linux下省心太多。先装基础依赖sudo apt update sudo apt install -y python3-pip python3-venv git cmake build-essential然后创建虚拟环境python3 -m venv lerobot_env source lerobot_env/bin/activate虚拟环境这一步别省LeRobot的依赖和系统Python容易冲突尤其是torch和numpy的版本。3.2 LeRobot安装与依赖处理官方推荐从源码装git clone https://github.com/huggingface/lerobot.git cd lerobot pip install -e .这里有个坑pip install -e .会装一堆依赖其中torch的版本取决于你的CUDA。如果你有NVIDIA显卡建议先单独装好对应CUDA版本的torch再装LeRobot否则pip会自动拉一个CPU版本的torch训练的时候慢到怀疑人生。我用的RTX 3060CUDA 11.8torch安装命令pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118装完验证一下import torch print(torch.cuda.is_available())返回True才算对。3.3 相机配置与标定SO-ARM100的数据采集通常需要至少一个相机一般是腕部相机加一个全局相机。我用的是两个USB相机一个固定在机械臂末端一个放在侧面拍全局。相机在Linux下走V4L2先确认设备ls /dev/video*然后测试帧率v4l2-ctl --device/dev/video0 --list-formats-ext有些相机默认输出MJPG格式OpenCV读取的时候需要指定cap cv2.VideoCapture(0, cv2.CAP_V4L2) cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(M,J,P,G))不指定的话OpenCV可能会用YUYV格式帧率上不去采集的时候掉帧严重。提示两个相机同时采集的时候USB带宽可能不够。建议把相机插在不同的USB控制器上或者降低分辨率到640x480。我一开始用1280x720两个相机一起跑就卡顿降到640x480后流畅了。4. 数据采集质量决定模型上限4.1 遥操作方案选择LeRobot支持几种遥操作方式我用的是主从臂方案就是再拿一台SO-ARM100作为主臂手动拖动主臂从臂跟随。这种方式采集的数据最自然但需要两台机械臂。如果没有主臂也可以用键盘或者手柄遥操作但采集效率低轨迹也不够平滑。我试过键盘控制采了50条数据训练出来的模型抖动很明显后来换主从臂才解决。主从臂的配置在LeRobot里有现成的脚本python -m lerobot.scripts.teleoperate \ --robot.typeso100 \ --robot.port/dev/ttyACM0 \ --teleop.typeso100_leader \ --teleop.port/dev/ttyACM1主臂和从臂的串口别搞混接反了会出问题。4.2 采集流程与注意事项采集的时候有几个细节直接影响数据质量第一每个任务至少采50条轨迹少了模型学不会多了训练时间线性增长。我一般采50到100条看任务复杂度。第二采集前先复位到同一个初始位置。每次采集的起始位姿不一致模型会学到很多无关的变异训练loss降不下去。第三动作要平滑不要突然加速或者急停。ACT模型对轨迹的连续性比较敏感抖动大的数据训练出来的策略也会抖。第四相机画面里要包含任务相关的所有物体但背景尽量干净。背景太乱模型容易过拟合到背景纹理上。采集脚本python -m lerobot.scripts.record \ --robot.typeso100 \ --robot.port/dev/ttyACM0 \ --robot.cameras{ front: {type: opencv, index: 0, width: 640, height: 480, fps: 30}, wrist: {type: opencv, index: 1, width: 640, height: 480, fps: 30}} \ --dataset.repo_idyour_name/so100_task \ --dataset.num_episodes50 \ --dataset.episode_time_s30episode_time_s是每条轨迹的时长根据任务调整。抓取放置类任务一般20到30秒够用。4.3 数据格式与回放验证LeRobot的数据集格式是HuggingFace Datasets底层是Parquet加视频。采集完可以用回放脚本检查python -m lerobot.scripts.replay \ --dataset.repo_idyour_name/so100_task \ --robot.typeso100 \ --robot.port/dev/ttyACM0回放的时候重点看动作是否连贯相机画面和动作是否对齐。如果发现动作和画面对不上可能是采集的时候时间戳没同步好需要重新采。注意数据集路径里不要有中文和空格HuggingFace Datasets对路径比较敏感中文路径会报编码错误。5. ACT模型训练与调参实战5.1 ACT模型结构简析ACT的全称是Action Chunking Transformer核心思想是一次预测未来一段时间的动作序列而不是单步预测。这样做的好处是减少累积误差动作更平滑。模型结构上输入是当前观测图像加关节位置输出是未来K步的动作。K就是chunk size默认是100。Transformer的encoder处理图像特征decoder生成动作序列。训练的时候用L1损失加KL散度KL项用来约束隐变量的分布。为什么用Transformer而不是LSTM因为Transformer对长序列的建模能力更强而且可以并行训练速度快。ACT在多个模仿学习基准上都超过了之前的方案这也是LeRobot选它作为默认模型的原因。5.2 训练配置与参数选择训练脚本python -m lerobot.scripts.train \ --dataset.repo_idyour_name/so100_task \ --policy.typeact \ --policy.chunk_size100 \ --policy.n_action_steps100 \ --training.batch_size8 \ --training.num_epochs2000 \ --training.lr1e-5几个关键参数chunk_size是预测的动作序列长度100是默认值。任务周期长的可以加到200但显存占用会增加。n_action_steps是实际执行的动作步数一般等于chunk_size。如果设小了模型预测了100步但只执行10步就重新预测会浪费计算。batch_size取决于显存。8GB显存用812GB用1624GB可以上32。batch size太小训练不稳定太大收敛慢。lr学习率1e-5是安全值。我试过3e-5loss震荡得厉害后来降到1e-5才稳。num_epochs一般2000到5000。看loss曲线如果2000轮后loss还在降可以继续训。5.3 调参经验与loss曲线解读训练过程中重点看两个指标L1 loss和KL loss。L1 loss反映动作预测的准确度KL loss反映隐变量的分布是否正常。正常情况下L1 loss在前500轮快速下降然后缓慢收敛。如果L1 loss降到某个值就不动了可能是模型容量不够可以加宽Transformer的hidden dim或者增加层数。KL loss如果一直很高说明隐变量分布偏离先验太远可以调大KL的权重系数。LeRobot里对应的参数是policy.kl_weight默认是10可以试到20。如果训练loss很低但实际执行效果差大概率是过拟合。解决办法是增加数据量或者加数据增强。LeRobot支持图像随机裁剪和颜色抖动在配置里打开就行。提示训练的时候用TensorBoard看曲线命令是tensorboard --logdiroutputs。不要只看最终loss要看曲线的形状震荡下降和单调下降对应的模型质量差别很大。5.4 模型评估与部署训练完的模型存在outputs/train/下面评估脚本python -m lerobot.scripts.eval \ --policy.pathoutputs/train/act_so100/checkpoints/last/pretrained_model \ --robot.typeso100 \ --robot.port/dev/ttyACM0 \ --eval.n_episodes10评估的时候看成功率10次里成功几次。如果成功率低于50%先别急着调模型检查一下评估环境和训练环境是否一致。相机位置、光照、物体摆放任何一项变了都会影响效果。部署的时候可以把模型导出成ONNX推理速度会快一些。但SO-ARM100本身对实时性要求不高直接用PyTorch推理也够用。6. 常见问题与排查速查6.1 环境类问题问题现象可能原因解决方法串口打不开权限不足加入dialout组重新登录舵机不响应ID冲突或波特率不对单独连接改ID降波特率相机掉帧USB带宽不足降分辨率换USB控制器torch用不了GPU装了CPU版torch重装对应CUDA版本数据集加载报错路径含中文改成纯英文路径6.2 训练类问题问题现象可能原因解决方法loss不下降学习率太大或数据质量差降lr到1e-5检查数据loss震荡batch size太小增大batch size过拟合数据量不足增加采集条数加数据增强执行抖动训练数据抖动大重新采集平滑轨迹成功率低环境不一致对齐训练和评估环境6.3 独家避坑技巧第一个技巧采集数据前先用回放脚本跑一遍空轨迹确认机械臂能完整执行任务空间内的所有动作。有些关节限位没设好采集的时候会撞到限位数据就废了。第二个技巧训练的时候先跑一个小数据集比如10条轨迹训500轮看看流程能不能跑通。跑通了再上全量数据避免浪费时间。第三个技巧模型效果不好的时候先别调模型参数先检查数据。我遇到的大部分问题都是数据问题不是模型问题。数据质量上去了默认参数就能出不错的效果。第四个技巧机械臂的零位会漂移尤其是跑了一段时间后。每次采集和评估前都重新校准一次零位能显著提升一致性。7. 一些个人体会这套流程跑下来最大的感受是模仿学习的门槛不在模型在数据。ACT模型本身很成熟LeRobot的封装也做得不错真正花时间的是硬件调试和数据采集。我前前后后采了大概300条轨迹废掉的有一半要么是轨迹不平滑要么是相机没对准要么是零位漂了。另一个体会是调参不要贪多。一次只改一个参数改完看效果有效再继续。我一开始同时改学习率和batch size结果loss曲线乱七八糟根本不知道是哪个参数的问题。后来改成单变量调参效率反而高了。最后分享一个小技巧如果你只有一台机械臂没有主臂可以用手机录屏的方式做遥操作。把手机固定在支架上通过蓝牙手柄控制虽然不如主从臂自然但成本低很多。采集的时候慢一点动作平滑一点效果也能接受。这个方向后续还可以扩展比如加力反馈、加多任务数据集、试试Diffusion Policy。SO-ARM100的硬件平台够开放想怎么折腾都行。