☰
SmolVLA与SO101开源机械臂:从零搭建端到端模仿学习抓取系统
2026/9/28 15:05:54 网站建设 项目流程

做机器人抓取这事儿,很多朋友跟我一样,一开始以为最难的是数学,后来发现最难的是“让机械臂听懂你想让它干嘛”。SO101 这支开源六轴机械臂装好之后,我就一直想给它换一个“聪明脑子”,最后折腾到 SmolVLA 上才算踏实。SmolVLA 属于视觉-语言-动作模型(VLA)里比较轻量的那种,能把摄像头画面和文字指令直接翻译成机械臂关节动作,对消费级显卡比较友好,配 SO101 这种总线舵机驱动的开源机械臂非常合拍。

这篇文章适合谁?机械臂刚组装完、想跳过传统抓取规划直接做模仿学习的同学;已经跑过 LeRobot 但被各种坑卡住的朋友;拿到 SO101 却不知道从哪个软件入口下手的新手。我会把从硬件检查、软件环境、数据采集、训练微调到实机推理的整条链路讲一遍,重点放在我踩过的坑和最后查出来的原因上。方向对了,剩下的事情就都是细节。

1. 为什么要用 SmolVLA 控制 SO101:整体思路拆解

1.1 SmolVLA 到底是个什么东西

先简单说清楚 SmolVLA 在机器人领域的定位。它属于“视觉-语言-动作模型”,也就是把视觉理解、语言指令、关节动作输出塞进同一个网络。以前做机械臂抓取,大家习惯把流程拆成“目标识别、抓取点计算、运动规划、轨迹执行”好几个独立模块,每个模块都要单独调参数、单独写逻辑,组合起来之后鲁棒性很难保证。

SmolVLA 这类的思路是端到端:输入一张相机图像,加上一句类似“把红色方块放到碗里”的指令,再加上当前各个关节的角度,模型直接输出下一步目标关节角度。它不需要你手写抓取点检测,也不需要你维护一套运动规划库。模型是在 SmolVLM 这种视觉语言模型基础上,再接上一个机器人动作头,做行为克隆训练。因为是轻量化的 VLA,模型参数量控制在消费级显卡能承受的范围内,单张 8GB 显存左右的卡就能做微调,推理更是 6GB 就够。

这就是我想强调的第一个点:SmolVLA 不是给你解决底层电机控制的,它解决的是“高层决策”。底层谁来做?总线舵机自己的位置闭环来做。

1.2 SO101 这类开源机械臂的“脾气”

SO101 属于 SO-ARM 这一脉的开源机械臂,整体定位就是低成本、可 3D 打印、方便复现。它的每一关节基本都用总线舵机,舵机内部已经做掉位置闭环和电流保护,上位机只需要通过串口发目标角度、读当前角度。这种架构对跑 VLA 模型实在太友好了,因为你不必自己去处理关节电机的力矩环、速度环,舵机接收到的位置指令本身就是人类能理解的角度。

和 AR3 那种步进电机加驱动器的方案比,SO101 少了精确度上的优势,但多了“皮实”和“好调”。AR3 那种结构如果要跑 VLA,你得先折腾驱动器、步进细分、PID 参数,任何一个环节抖起来都够查半天的。SO101 的总线舵机在出厂时内部 PID 已经调得比较合理,你要操心的主要是供电、舵机 ID、波特率这类最基本的东西。

1.3 完整的控制链路设计

我最终落地的链路是这样的:

USB 相机或者 RealSense 采集图像,传到主控电脑;SmolVLA 在 GPU 上完成推理,输出 6 个关节的目标角度,出来的是一个数组;主控通过串口转接板把目标角度打包发给第一颗舵机,舵机之间用总线串联;舵机内部的位置闭环把机械臂驱动到目标位置,同时把当前角度通过同一根总线传回主控;这些带时间戳的关节状态再和图像一起组成下一帧的模型输入。

这个链路里最关键的一句话:SmolVLA 只管“目标角度”,不管“怎么转过去”。所以你千万别在模型里做力矩规划,也别在底层自己写一个强 PID 去和舵机内部环抢控制权。上层决策、下层执行,两层之间用位置指令衔接,这就是我推荐的设计。改起来最方便,问题也最好定位。

2. 动手前的硬件检查和成本预估

2.1 SO101 硬件组成清单

你要跑通 SmolVLA,不是只买一支机械臂就完事。SO101 本身是散件,需要自己打印结构件、买舵机、接线,我列一下我当时的清单:

部件规格建议备注
机械臂结构件3D 打印外壳,按开源图纸打即可材料选 PETG 或 PLA+,别用普通 PLA
关节舵机总线舵机,兼容 SO101 图纸型号建议同一批次买,ID 号要能改
夹爪执行器一个舵机加夹爪结构任务需要抓取时再用
主控板树莓派、Jetson 或者电脑都行推荐 x86 电脑,省去编译烦恼
USB 转 UART 模块CP2102 或 FT232 都行注意选支持 3.3V 电平的
舵机供电6V 左右、持续 5A 以上必须单独供电,别指望 USB 带起来
相机RealSense D435i 或普通 USB 摄像头固定视角任务用普通摄像头即可

这套东西下来,不算电脑,整体成本一般在两千到四千人民币之间,如果已经有打印机和旧电脑,还能再压。关键不是省钱,而是所有部件出了问题都能自己拆开换。

2.2 选用什么等级的主控和显卡

SmolVLA 再轻量,也是一个神经网络,CPU 推理不太现实,至少需要一块支持 CUDA 的显卡。我实测下来的感受是:训练微调阶段用 8GB 显存能跑小 batch,用 12GB 以上会比较从容;推理阶段 6GB 显存就够开一个实时策略。

如果你手头只有 Jetson Orin Nano 这种板子,也不是不能跑,但推理帧率会明显下降,适合做固定场景、动作频率要求不高的任务。如果要流畅做数据采集和实时推理,我还是推荐一台带着 NVIDIA 显卡的 Ubuntu 电脑。Windows 也不是完全不行,但跑 LeRobot、串口控制这些工具链会遇到各种奇怪的权限问题,后面错误章节我会专门讲。

2.3 相机选型与安装

相机是很多新手忽略的环节。SmolVLA 的输入图像质量直接决定行为克隆的效果,如果画面模糊、曝光不稳定,模型很难学到稳定的策略。我首推 RealSense D435i,不是因为它贵,而是因为它驱动稳定、时间戳对齐方便,后面做真机部署和扩展强化学习都用得上。

普通 USB 摄像头能不能用?能用。但要注意把分辨率固定下来,不要自动对焦、自动曝光乱跳。装相机的位置也很重要,我建议固定在机械臂底座旁边某一个稳定支架上,而不是装在末端。末端视角虽然接近人类视角,但手眼标定和图像变化太剧烈,模型学习难度直接上一个档次。摆放时让工作桌面在画面里占主要区域,机械臂基座部分露出来一点没关系,关键是让模型看到“手从哪里来”。

3. 软件环境搭建:从 Ubuntu 到 LeRobot

3.1 系统与 GPU 驱动

我强烈建议用 Ubuntu 22.04,这个版本的生态兼容性最省心。装好系统后先把显卡驱动、CUDA 环境整理清楚,nvidia-smi能看到显卡状态再继续。PyTorch 版本尽量选和 CUDA 匹配的预编译版本,不要在驱动和 CUDA 上浪费太多时间。

有一个容易踩的坑:很多教程让你装最新版 CUDA,结果和 PyTorch 默认编译版本不匹配,一跑训练就报 “CUDA driver version is insufficient”。我的做法是用 conda 建一个独立环境,PyTorch 按官方命令装,CUDA 运行时跟着 PyTorch 走,系统驱动保持较新版本就行。这种“跟随式”装法比手动折腾 CUDA 路径省力得多。

3.2 安装 LeRobot 和 SmolVLA 依赖

SmolVLA 的训练、数据采集、推理一般都依托 LeRobot 这个开源框架。安装的时候不要直接在系统 Python 里硬来,一定要建虚拟环境:

conda create -n smolvla python=3.10 -y conda activate smolvla git clone https://github.com/huggingface/lerobot.git cd lerobot pip install -e .

官方依赖装完,还需要确认是否把 SmolVLA 相关的模型权重入口拉下来。不同版本的 LeRobot 对 SmolVLA 的支持情况不一样,有的直接在lerobot/configs/policy/下能看到 smolvla 配置,有的需要指定预训练模型地址。我的经验是先看本地仓库里有没有smolvla字样:

find lerobot/configs -iname "*smol*"

如果没有,说明这个版本太老,直接git pull更新到最新主干。有了配置文件入口,后面训练和推理都会顺很多。

3.3 串口权限与总线舵机连接

SO101 的控制依赖 USB 转 UART,Linux 下默认不允许普通用户直接操作串口设备,最常见的报错是Permission denied或者打开串口超时。解决办法是把当前用户加进dialout组:

sudo usermod -a -G dialout $USER

然后注销重新登录。这步不做,后面所有舵机通信都会卡在“设备打不开”。

连接舵机之前,还要先确认 USB 转 UART 对应的设备名,一般是/dev/ttyUSB0或/dev/ttyACM0。如果插拔之后设备名变了,建议用ls /dev/ttyUSB*先看一下,再在控制脚本里写死对应端口。

4. 数据采集:让模型知道机械臂该怎么动

4.1 准备遥控与任务设计

SmolVLA 的学习方式是行为克隆,也就是说,你得先亲自操作机械臂做任务,把它记录成样本。LeRobot 生态里最常用的采集方式是用一个主手,通过遥控操作让从手 SO101 跟着动,同时记录相机图像、主手关节角、从手关节角和时间戳。

如果你没有主手,也可以用键盘、游戏手柄做离散步进控制,但采集效率会低。我建议一开始不要贪多,先固定一个特别简单的任务,比如“把左边的小方块推到右边的矩形区域”,连续采集 50 到 100 条演示数据。任务越明确,模型越容易学到正确映射。

采集的时候,动作要稳定,不要忽快忽慢,也不要中途大幅度停顿。行为克隆本质上是在学“图像到动作”的条件分布,如果同一个画面对应了太多杂乱动作,模型会学出一个平均动作,结果就是机械臂慢吞吞、犹豫不决。

4.2 数据格式与目录结构

LeRobot 会把采集的数据组织成一个标准数据集目录,里面有图像文件夹、轨迹状态 parquet 文件、元信息 JSON。每一帧都保存了时间戳、各关节角度、各关节速度、以及图像路径。SmolVLA 训练时直接用这个数据集,不需要额外转换成其他格式。

一个常见错误是采集时只记录了目标关节角度,没记录当前关节角度。VLA 模型通常需要输入当前状态,否则模型不知道“现在手在哪”,推理时动作会乱。所以采集前一定确认配置里同时保留了执行器状态和动作数据。LeRobot 默认都会记录,但你自己的脚本如果只转发角度,就容易漏。

4.3 数据质量和数量经验

数据越多效果越好,这个说法理论上没错,但实际操作中“高质量 50 条”往往强过“低质量 300 条”。我踩过一次大坑:采集时长了一个多小时,机械臂夹爪偶尔没抓稳,物体位置每次都不一样,结果模型学到了“永远往中间伸一下”,成功率惨不忍睹。

后来我把数据重新筛了一遍,只要成功轨迹,并且保证物体初始位置在画面里有多种变化,差不多 80 条左右,模型的成功率就能稳定在八成以上。我的经验是:考虑增加物体位置随机性,比盲目增加演示次数更重要。每个任务至少覆盖 5 到 10 种不同初始布局,每种布局重复演示 8 到 10 次。

5. 训练和调参:把模型调到能真机跑的细节

5.1 训练入口与通用命令

LeRobot 里训练 VLA 的脚本入口在不同版本里改过名字,有的版本是train.py,有的版本拆成了train_policy.py。建议你先在本地仓库里搜一下:

python lerobot/scripts/train.py --config-path=lerobot/configs/policy/smolvla --config-name=pretrained_policy

如果你的版本里没有这个配置名,用ls lerobot/configs/policy/ | grep smol查一下实际名字。整体参数上,你需要指定数据集仓库名、预训练权重路径、输出目录、batch size、学习率这些字段。

训练过程中要特别留意 loss 曲线。VLA 训练通常看动作预测的 loss,如果 loss 一直不降,先别调模型,回头查数据:图像是不是黑的、关节角度是不是有大量缺失值、任务标签是不是写错了。数据问题引发的训练失败,比模型结构问题多得多。

5.2 Batch Size、学习率和显存设置

SmolVLA 属于扩散政策或者回归政策这类输出动作的架构,对显存敏感。8GB 显卡建议把 batch size 调到 4 以下,图像输入分辨率也适当降低;12GB 以上可以开到 8 左右。如果你一开训练就 OOM,最简单的方法是先把 batch 调成 1,确认能跑通,再逐步往上加。

学习率这块我不建议用太大,微调预训练权重时一般从1e-5到5e-5这个范围起跳,稳定之后再考虑降低。如果你从零训练一个随机初始化的 SmolVLA,那要另说学习率调度,但通常情况下我们都会基于预训练权重做迁移,所以小学习率更靠谱。

5.3 动作输出模式的取舍

SmolVLA 可以预测“绝对角度”,也可以预测“相对增量”。我在 SO101 上的经验是:绝对角度模式对总线舵机更友好,因为即使模型某一步预测失误,机械臂也不会瞬间飞出巨大增量;相对增量模式反应更快,但对噪声更敏感。

部署调试时,可以在配置里切换这两个模式,分别跑几轮看效果。如果模型在目标点附近抖动,大概率是增量模式加舵机响应滞后叠加出来的。换成绝对角度模式后,抖动常常会明显减轻。

6. 实机推理:部署到 SO101 的完整流程

6.1 实机推理前要做的手动检查

在任何自动推理代码跑起来之前,先手动发几个固定角度给舵机,确认串口链路正常。我习惯用一个很简单的测试:让机械臂依次到达初始位姿、中间位姿、目标位姿,每个位置停留两秒。如果这一步能平稳走完,再考虑接 SmolVLA。

千万别一上来就跳级。模型输出也可能是错的,如果舵机突然收到一个离谱角度,供电能力不足或者结构件强度不够,直接就是扫齿或者断件。手动检查是花十分钟省下几千块维修费的操作。

6.2 推理脚本的大致工作方式

推理时,脚本会持续读取相机图像和当前关节角度,把图像预处理成模型输入尺寸,把语言指令转换成文本 token,然后调用 SmolVLA 跑一次前向传播,得到目标角度数组。这个数组经过简单限制(比如最大关节速度限制),再写入串口,驱动舵机运动。

我建议在推理脚本里加一个最大角度变化阈值,比如单步关节角度变化不超过 3 到 5 度。这样即使模型短暂出错,机械臂也不会猛地甩出去。这个保护逻辑不是模型的一部分,而是部署层的安全护栏,非常有必要。

6.3 推理帧率和及时性优化

SmolVLA 推理频率取决于显卡、图像分辨率、模型量化和 batch 设置。我自己的 3060 12GB 跑一个 SmolVLA 尺寸的模型,图像分辨率取 224 左右,推理大约能到每秒 5 到 10 次。对于抓取这种精度要求不高的任务,这个频率足够。

想要提速,可以做的几件事:降低输入图像分辨率、开启 PyTorch 的torch.compile、把模型切换到半精度推理、关闭终端里的实时视频显示窗口。很多人没发现,最占时间的不是模型前向,而是终端里那个预览窗口的渲染和编码,关掉之后帧率能立竿见影提升。

7. 常见错误与解决方案:踩坑实录

7.1 机械臂不动或者一直嗡嗡响

这个问题九成出在供电。SO101 的舵机如果供电不足,会频繁重启或者无法正常响应位置指令,表现就是机械臂“僵住”或者轻微抖动。用 USB 给舵机供电几乎必翻车,必须用独立稳压电源,电压按舵机要求来,持续电流至少 5A 以上。

排查方法很简单:把机械臂所有关节手动摆到中间位置,单发一条角度指令,看舵机是否立刻响应。如果不响应,先查舵机供电指示灯,再查串口波特率和舵机 ID。总线舵机通信一般要先匹配波特率,常见的是 1000000 或 500000,别想当然。

7.2 推理时机械臂突然“发疯”

我遇到过一次机械臂往极限位置猛冲,差点扫齿。最后查出来不是模型问题,而是上位机发给舵机的指令频率太高,舵机还没执行到位,新指令又来了,位置环形成震荡。这个震荡在末端看起来就是疯狂抖动。

解决的思路不是去调舵机内部 PID,而是限制指令下发频率,并对输出角度做平滑。我用的方法是对模型输出做一阶低通滤波,把上一帧指令和当前帧指令按比例混合,例如 0.3 新指令加 0.7 旧指令。这样机械臂动作会柔和很多,成功率反而更高。

7.3 训练时显存溢出 OOM

OOM 基本就是配置超出显卡能力。我的建议是分优先级:先降低 batch size,再降低图像分辨率,最后才考虑换模型尺寸。LeRobot 的配置里通常有policy.input_shape这样的参数,把宽度和高度都缩小到原来的四分之三,显存占用能降不少。

另外,训练时要把终端里视频可视化功能关掉,LeRobot 有些版本会默认把训练样本渲染出来,这个功能在笔记本上非常吃显存。训练日志里出现CUDA out of memory时,优先看是不是可视化相关代码在跑。

7.4 目标抓偏、手眼没对齐

模型抓不到目标,很多时候不是模型笨,是相机视角和你采集数据时不一致。训练数据里相机在左侧,部署时相机换到右侧,模型自然懵。解决办法就是部署时保持和采集时完全一致的相机位置,或者干脆用底座固定支架,不拆不挪。

如果相机位置没变但还是偏,问题可能出在图像裁剪和缩放。有的预处理会把图像中心裁掉一部分,导致模型看到的画面和你眼睛看到的对不上。我把预处理后的画面保存出来对比一次,一眼就发现了问题。

7.5 系统环境骚操作导致的应用被拦截

这部分主要针对有人非要用 Windows 当开发机。Windows 这边有些安全策略会自动拦截看起来“可疑”的 Python 子进程,比如开摄像头采集时,终端里跑的一堆辅助脚本会被系统安全策略中止。报错信息五花八门,最常见的是提示应用被系统策略阻止,或者摄像头画面突然断掉。

这不是机器人代码的问题,是系统环境在干扰。要么临时把项目目录加入信任区域,要么干脆换成 Linux 开发环境。我的看法很直接:做机器人开发,别和系统安全策略较劲,换回 Ubuntu 省下的时间够你多采两轮数据。

7.6 数据集时间戳错位

如果训练出来的模型动作时序很奇怪,比如动作比画面慢半拍,往往不是模型问题,而是数据里图像和关节角度的对齐出了问题。USB 摄像头没有硬件时间戳,帧率又不稳定,就容易出现“图像还停在上一秒,关节角度已经更新到下一秒”的情况。

我后来在采集脚本里给每一帧图像打了本地时间戳,再和关节状态按时间最近邻匹配,问题就明显缓解。如果对时序一致性要求更高,就用 RealSense 这类带硬件时间的相机,匹配误差会小很多。

7.7 推理结果都在动,但成功率不高

这里我总结一个规律:先看机械臂有没有到达模型想要的位置。如果机械臂整体动作是对的,只是最终差几厘米,重点查相机标定和数据处理。如果机械臂动作看起来和演示完全不像,重点查数据标签和任务描述。

调试时把模型预测的角度直接打印出来,对照遥控器回放的数据看,差别一眼就能看出来。养成打印中间结果的习惯,比闭着眼睛调参数高效十倍。

8. 个人实测下来的一些体会

SmolVLA 配 SO101 这套组合,最大的优势不是性能多强,而是“可复现、可调试”。模型确实有聪明的地方,但真正把项目做成的关键,往往是你对底层链路有多熟悉。我自己的习惯是先把串口通信、供电、相机预处理这些“脏活”全部跑通,再去碰模型,这样出了问题永远知道该查哪一层。

这阵子折腾下来,我更确信一件事:VLA 不是万能的,它只是把高层决策这块补上了。你别指望模型能解决舵机扫齿、供电不足、相机模糊这些底层问题。底层的活儿越稳,模型的表现就越接近理论水平。如果新手朋友照着完整链路做,仍然遇到不太一样的报错,建议按我的排查思路一条条拆:硬件先行,再查数据,最后才动模型。这套顺序能帮你避开大多数绕远路的坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询