1. 项目概述
作为一名长期从事机器人系统开发的工程师,我最近完成了SO101机械臂从零开始到部署推理的全流程实践。这个项目让我深刻体会到,在实际硬件上部署机器人学习模型远比单纯跑通demo要复杂得多。本文将分享我在部署过程中的完整经验,特别是那些官方文档没有明确说明的细节和坑点。
SO101是一款开源的6轴协作机械臂,配合LeRobot框架可以实现基于视觉的智能抓取任务。我的目标是让机械臂完成"抓取螺丝刀"这个具体动作,整个流程涉及环境配置、硬件连接、模型训练和最终部署四个主要环节。
提示:在实际操作中,我发现机械臂的标定质量和相机帧率对最终推理效果影响极大,这也是很多新手容易忽略的关键点。
2. 环境准备与配置
2.1 基础环境搭建
LeRobot框架的安装相对简单,但有几个细节需要注意:
bash复制# 推荐使用Python 3.8-3.10版本
conda create -n lerobot python=3.9
conda activate lerobot
# 安装基础包(必须使用-e开发模式安装)
git clone https://github.com/lerobot/lerobot.git
cd lerobot
pip install -e .
# 如果使用SmolVLA策略需要额外安装
pip install -e ".[smolvla]"
我在三台不同配置的机器上测试发现,PyTorch的版本兼容性是个潜在问题。建议明确指定版本:
bash复制pip install torch==2.0.1 torchvision==0.15.2
2.2 网络加速配置
由于需要从Hugging Face下载模型和数据集,国内用户强烈建议配置镜像:
bash复制# 设置镜像端点
export HF_ENDPOINT=https://hf-mirror.com
# 可选:离线模式(当网络不稳定时)
# export TRANSFORMERS_OFFLINE=1
# export HF_DATASETS_OFFLINE=1
实测发现,离线模式下如果本地缓存不完整会导致各种难以排查的错误。建议首次运行时保持网络畅通,确保所有依赖下载完整。
3. 硬件连接与标定
3.1 机械臂连接
SO101通过USB转串口与主机通信,在Linux下通常识别为/dev/ttyACM*设备。常见问题及解决方案:
- 权限问题:
bash复制# 临时解决方案(每次重启后需重新执行)
sudo chmod 666 /dev/ttyACM*
# 永久解决方案(创建udev规则)
echo 'KERNEL=="ttyACM*", MODE="0666"' | sudo tee /etc/udev/rules.d/50-so101.rules
sudo udevadm control --reload-rules
- 多设备识别:当连接多个SO101时,可以通过拔插顺序确定对应端口:
bash复制# 查看设备信息
ls -l /dev/ttyACM*
udevadm info -q path -n /dev/ttyACM0
3.2 标定流程详解
标定质量直接影响后续推理精度,必须认真对待。以下是完整标定流程:
bash复制lerobot-calibrate \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm
关键参数说明:
robot.id:标定文件会保存在~/.cache/huggingface/lerobot/calibration/robots/下,以该ID命名- 标定时机械臂应处于初始位姿(各关节归零)
- 标定过程约需3-5分钟,期间不要移动机械臂
注意:如果更换了机械臂安装方式或相机位置,必须重新标定。我曾因为忽略这点导致后续推理完全失效。
4. 模型训练与部署
4.1 使用预训练模型
对于快速验证,可以直接使用官方预训练模型:
bash复制lerobot-record \
--policy.path=lerobot/smolvla_base \
# 其他参数...
4.2 自定义训练
当需要适配特定任务时,建议进行微调训练。以SmolVLA为例:
bash复制lerobot-train \
--policy.path=lerobot/smolvla_base \
--dataset.repo_id=seeed/screwdriver_demo \
--batch_size=64 \
--steps=20000 \
--output_dir=outputs/train/my_smolvla \
--policy.device=cuda
训练过程监控建议:
- 启用WandB记录(需提前安装wandb)
- 关注loss曲线和验证成功率
- 当batch_size较大时,可能需调整学习率
4.3 推理部署
完整的推理脚本如下,我将逐段解析关键参数:
bash复制#!/bin/bash
sudo chmod 666 /dev/ttyACM*
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{
camera1: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30},
camera2: {type: opencv, index_or_path: 2, width: 640, height: 480, fps: 30}
}" \
--dataset.single_task="Grab the screwdriver123" \
--policy.path=/path/to/pretrained_model
相机配置要点:
index_or_path:通常0是内置摄像头,外接USB摄像头从2开始fps:过高会导致推理延迟,建议30以下- 相机分辨率建议640x480,过高会影响推理速度
任务描述技巧:
- 必须与训练时使用的描述一致
- 可以尝试相近语义的不同表述(如"Pick up the screwdriver")
- 避免使用过于笼统的描述
5. 常见问题排查
5.1 推理延迟高
可能原因及解决方案:
-
相机配置过高:
- 降低分辨率到320x240
- 减少fps到15
- 关闭不必要的相机流
-
模型计算量大:
bash复制# 尝试量化模型
--policy.quantize=true
- 系统资源不足:
- 使用
nvidia-smi监控GPU利用率 - 关闭其他占用资源的程序
- 使用
5.2 抓取成功率低
我的调优经验:
-
标定检查:
- 重新运行标定流程
- 检查
~/.cache下的标定文件日期
-
任务描述优化:
- 尝试更具体的描述(如"Grab the silver screwdriver from the left side")
- 确保与训练数据分布一致
-
数据增强:
bash复制# 训练时增加数据增强
--dataset.augmentation=true
6. 高级技巧
6.1 远程推理部署
对于计算资源受限的场景,可以采用客户端-服务端架构:
服务端(高性能机器):
bash复制python -m lerobot.async_inference.server \
--port=8080 \
--policy.path=/path/to/model
客户端(连接机械臂的机器):
bash复制python -m lerobot.async_inference.robot_client \
--server_address=10.0.0.1:8080 \
# 其他机器人参数...
6.2 双臂协同控制
对于更复杂的任务,可以配置双臂系统:
bash复制lerobot-record \
--robot.type=bi_so_follower \
--robot.left_arm_config.port=/dev/ttyACM0 \
--robot.right_arm_config.port=/dev/ttyACM1 \
# 其他参数...
关键点:
- 每个手臂需要独立标定
- 相机需要明确区分左右视角
- 任务描述需要更精确(如"Left arm holds while right arm screws")
经过两周的反复调试,我的SO101现在已经能稳定完成螺丝刀抓取任务。最大的体会是:机器人部署是一个系统工程,需要同时考虑软件配置、硬件特性和环境因素。建议新手从一个简单的任务开始,逐步增加复杂度,这样更容易定位问题。