尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SmolVLA与SO101开源机械臂:从零搭建端到端模仿学习抓取系统

SmolVLA与SO101开源机械臂:从零搭建端到端模仿学习抓取系统 做机器人抓取这事儿很多朋友跟我一样一开始以为最难的是数学后来发现最难的是“让机械臂听懂你想让它干嘛”。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 到 LeRobot3.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 python3.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 转 UARTLinux 下默认不允许普通用户直接操作串口设备最常见的报错是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-pathlerobot/configs/policy/smolvla --config-namepretrained_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 训练时显存溢出 OOMOOM 基本就是配置超出显卡能力。我的建议是分优先级先降低 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 不是万能的它只是把高层决策这块补上了。你别指望模型能解决舵机扫齿、供电不足、相机模糊这些底层问题。底层的活儿越稳模型的表现就越接近理论水平。如果新手朋友照着完整链路做仍然遇到不太一样的报错建议按我的排查思路一条条拆硬件先行再查数据最后才动模型。这套顺序能帮你避开大多数绕远路的坑。
返回列表