基于LeRobot与ACT模型的开源机械臂模仿学习实战指南
1. 项目缘起从开源机械臂到具身智能的实践最近在折腾一个挺有意思的项目就是给一台开源的SO 101机械臂训练一个ACT模型。这事儿听起来挺“前沿”但说白了就是想让它更“聪明”一点能自己学会一些简单的操作比如从A点抓个东西放到B点而不是我们手把手地给它写死每一个关节的转动角度和速度。你可能在各种社区里看到过“LeRobot”、“具身智能”、“强化学习”这些词感觉很高深其实核心目标很朴素让机器能通过与环境互动来学习就像小孩学抓东西一样。我用的这台SO 101是一个挺受欢迎的开源机械臂项目结构清晰文档也相对齐全非常适合用来做学习和实验的平台。而ACT模型全称是Action Chunking with Transformers是近年来在机器人模仿学习领域一个挺火的思路。它不像传统的控制方法那样需要你精确建模整个物理世界也不像一些早期的模仿学习那样学出来的动作僵硬、不连贯。ACT的核心思想是让模型学会预测一连串的动作“块”从而生成更平滑、更拟人的轨迹。所以这个项目的全貌就是用LeRobot这套开源机器人学习框架在SO 101机械臂上从头到尾跑通一个ACT模型的训练和部署流程。这中间会涉及到硬件组装、仿真环境搭建、数据采集、模型训练、策略部署等一系列环节。我把自己踩过的坑、试出来的有效配置以及一些关键的原理理解都整理了下来希望能给同样想入门机器人学习特别是想用真实硬件而不是纯仿真做点事情的朋友提供一个可复现的参考。2. SO-101机械臂硬件拆解与前期准备在开始写代码和训练模型之前我们必须先和硬件打好交道。SO-101是一个六轴的开源机械臂它的魅力在于其模块化和清晰的机械设计让我们可以清晰地理解从电机到末端的整个动力传递链。2.1 核心组件深度解析一台SO-101机械臂拆开来看主要由以下几个部分构成关节模组舵机/步进电机这是机械臂的动力源。SO-101通常使用数字舵机如Dynamixel AX/MX系列或步进电机配合驱动器。这里的选择直接影响控制精度和响应速度。舵机优点是控制简单自带位置反馈编码器扭矩通常较大适合需要较大抓取力的场景。但高端舵机成本较高。步进电机优点是成本相对较低在开环控制下也能达到很高精度。但需要额外的驱动器且如果丢失步数堵转无法自我感知需要搭配编码器实现闭环控制才更可靠。参数调优关键无论选择哪种都需要关注几个核心参数额定电压、堵转扭矩、转速、分辨率每圈脉冲数或位置分辨率。在LeRobot的配置中我们需要将这些参数转化为机器人描述文件URDF中的动力学参数以及控制器中的PID参数。结构件与传动包括铝合金或3D打印的连杆、底座、法兰盘等。这里需要注意的不仅是强度还有装配精度。各连杆之间的连接如果存在旷量会直接导致末端定位误差这种误差是软件算法很难完全补偿的。在组装时务必确保各紧固件锁紧轴承运转顺滑。末端执行器夹爪/吸盘等SO-101通常标配一个二指夹爪。夹爪的开合本身又是一个自由度可以由一个小型舵机或直线舵机驱动。在定义机器人模型时夹爪需要作为最后一个连杆link和关节joint添加到URDF中。控制器这是机器人的“小脑”。常见方案有树莓派/ Jetson Nano等单板机运行ROS系统作为上层决策和控制指令下发节点。STM32/Arduino等单片机作为底层电机伺服驱动器接收来自树莓派的关节角度目标值运行PID控制循环驱动电机转动。SO-101项目通常会提供对应的固件。一体化控制器一些商业舵机如Dynamixel可以通过总线TTL/RS485直接由树莓派控制省去中间的单片机层。传感器可选但推荐为了让ACT模型学得好丰富的环境感知是关键。摄像头最常用的传感器。可以安装在机械臂底座全局视角或末端眼在手外 Eye-in-Hand。用于提供图像观测。关节编码器电机自带提供精确的关节位置反馈。力/力矩传感器高级安装在腕部可以感知接触力实现更柔顺的操作但成本高昂。2.2 系统连接与供电方案一个稳定可靠的供电和通信系统是实验成功的基础。混乱的接线不仅可能导致控制失灵还可能损坏设备。供电分离原则强烈建议将控制电路树莓派、单片机的电源与电机驱动电源分开。电机启停时会产生巨大的电流波动和电压毛刺如果共用一个电源极易导致树莓派死机或重启。可以采用两个独立的开关电源或者使用一个大功率电源配合隔离型DC-DC模块为控制部分供电。通信总线如果使用总线式舵机如Dynamixel需注意总线拓扑菊花链和终端电阻的设置否则通信会不稳定。UART转TTL/RS485模块的驱动也需要在树莓派上正确安装。接地确保所有设备的“地”是共地的避免电势差引入干扰。在硬件准备妥当后我们需要在电脑开发机和树莓派机器人本体上搭建软件环境。这包括安装ROS或ROS2、LeRobot框架、PyTorch等依赖。由于网络环境差异这里特别建议使用国内镜像源来加速pip和apt-get的安装过程。一个常见的坑是不同软件包对Python版本、CUDA版本的要求冲突最好使用conda或venv创建独立的Python环境进行管理。3. 仿真与现实搭建训练与验证环境在真机上直接尝试学习算法成本高、风险大、效率低。因此我们通常先在仿真环境中进行大量的训练再将训练好的策略迁移到真机上。这个过程被称为“仿真到现实”Sim2Real。3.1 仿真环境选型与搭建对于机械臂主流的仿真器有MuJoCo物理精度高计算速度快在学术界和LeRobot中广泛应用。但它并非完全开源免费需要注意许可证问题。PyBullet开源免费物理引擎也不错易用性好是另一个热门选择。Isaac Sim基于NVIDIA Omniverse图形渲染和物理仿真能力极强特别适合需要高质量视觉输入的训练但对硬件GPU要求很高。GazeboROS生态的传统选择功能全面但相对笨重实时性有时不如前两者。对于ACT模型训练我们更关心的是物理仿真的速度和稳定性以及方便的程序接口。LeRobot默认很好地支持了MuJoCo。搭建步骤通常如下获取机器人模型URDF这是仿真和现实连接的桥梁。你需要一个精确描述SO-101机械臂尺寸、质量、惯性、关节限位、碰撞模型的URDF文件。开源项目通常会提供但可能需要根据你实际使用的电机型号和结构进行微调。一个关键技巧可以用SolidWorks、Fusion 360等软件导出初始URDF然后用check_urdf工具检查其完整性并手动调整连杆的惯性矩阵如果项目没提供可以近似为长方体或圆柱体计算不准确的惯性参数会导致仿真动力学失真。在仿真器中加载场景创建一个简单的训练场景比如一张桌子桌子上放一个目标物体如方块、球。在MuJoCo中这对应一个.xml场景文件。你需要将机器人的URDF模型、桌子、物体的模型定义都整合进去并定义它们之间的位置关系、物理属性质量、摩擦系数等。集成LeRobot环境LeRobot提供了封装好的仿真环境接口。你需要根据其框架要求编写一个环境类继承自gym.Env或LeRobot自定义的基类。这个类需要实现几个核心方法reset()重置环境随机化机器人和物体的初始位置这很重要可以增加训练数据的多样性提升模型泛化能力。step(action)接收模型预测的动作通常是关节角度增量或速度在仿真器中推进一步物理返回新的观测图像、关节状态、奖励、完成标志等信息。get_observation()组织观测空间。对于ACT观测通常包括关节位置/速度、末端执行器位置/姿态、夹爪状态、摄像头图像。图像可能需要经过裁剪、缩放等预处理。3.2 关键参数让仿真更贴近现实仿真的目标不是创造一个完美的虚拟世界而是创造一个能高效训练出可迁移到真机策略的环境。这需要一些“技巧”动力学随机化Domain Randomization这是Sim2Real的核心技术之一。在每次训练episode一个完整的抓取尝试开始时随机化一些物理参数例如物体质量、尺寸、摩擦系数电机驱动器的力/扭矩增益、阻尼关节执行器的延迟、噪声摄像头的视角、光照、颜色偏移 这样训练出来的模型见识过“各种各样”的物理世界就不会过度拟合某个特定仿真参数从而在面对略有差异的真实世界时表现出更强的鲁棒性。观测噪声注入在返回给模型的观测值特别是关节编码器读数中加入高斯噪声模拟真实传感器的误差。动作平滑与延迟真实电机执行命令有延迟且动作不能突变。可以在环境step函数中对模型输出的原始动作进行低通滤波并模拟几个毫秒的延迟让生成的动作轨迹更平滑。搭建一个“好用”的仿真环境其工作量不亚于算法本身。它直接决定了你采集的数据质量和模型训练的效率。建议先从最简单的场景如机械臂自由空间运动开始验证环境是否正确再逐步增加物体和任务复杂度。4. 数据采集教会机械臂“模仿”ACT是一种模仿学习方法它不依赖人工设计的奖励函数而是需要示范数据。也就是说我们要先“手把手”教机械臂做几次正确的动作让它去学。4.1 示范数据采集方法有几种方式可以采集机械臂的示范轨迹遥操作Teleoperation这是最直观的方式。操作员通过一个手柄如游戏手柄、3D鼠标或另一个“主手”机械臂实时控制从手机械臂SO-101完成抓取任务。在这个过程中我们需要以高频率如10-30Hz同步记录下每一时刻的观测图像、关节状态和动作我们通过手柄下达的控制指令。LeRobot提供了一些与常见输入设备集成的工具。动觉示教Kinesthetic Teaching直接用手抓住真实机械臂的末端带着它完成一遍任务。这种方式更自然但需要机械臂本身具备“零力拖动”或高背隙驱动模式否则很难拖动。对于SO-101如果使用带扭矩控制的舵机可以通过软件设置进入扭矩模式来实现。仿真环境录制在搭建好的仿真环境中用脚本或者简单的键盘控制操作虚拟机械臂完成任务并录制轨迹。这种方式成本最低可以快速生成大量数据但数据的“真实性”和多样性依赖于仿真环境的保真度。无论哪种方式记录的数据格式至关重要。一个标准的示范数据点通常包含obs观测字典。例如{‘image’: (H, W, 3)的numpy数组 ‘joint_pos’: (6,)数组 ‘ee_pos’: (3,)数组}。action动作数组。对于关节空间控制可以是6个关节的目标角度绝对位置或角度增量相对位置对于末端空间控制可以是末端执行器的6维位姿变化量3维位置3维旋转常用轴角表示。reward模仿学习中通常设为固定值或忽略因为我们认为示范本身就是最优的。done标志该条轨迹是否结束。我们需要将多条这样的轨迹保存下来形成一个数据集。LeRobot通常使用一种高效的存储格式如HDF5或自定义的二进制格式来管理大量的图像和数组数据。4.2 数据预处理与增强原始采集的数据往往不能直接用于训练需要进行清洗和增强时间对齐确保观测和动作在时间戳上是严格对齐的。如果传感器数据流和动作指令流来自不同的线程或节点需要仔细处理同步问题。动作表示转换如果我们记录的是末端执行器的位姿但想用关节空间控制就需要进行逆运动学IK求解将末端位姿转换为关节角度。反之亦然。IK的求解速度和稳定性会影响数据质量。轨迹切片与重叠ACT模型预测的是未来一小段时序的动作块。因此在构建训练样本时我们需要从长轨迹中滑动截取固定长度的观测序列和对应的动作序列。数据增强对于图像观测可以随机进行裁剪、颜色抖动、高斯模糊等操作增加模型的泛化能力。对于状态观测可以添加少量噪声。一个重要的心得数据质量远胜于数据数量。10条干净、准确、覆盖了任务关键变化如物体初始位置不同的示范轨迹比100条杂乱、有错误或重复的轨迹要有用得多。在采集初期宁可慢一点也要保证每条示范都是“教科书级别”的。5. ACT模型原理与训练实战有了环境和数据我们终于可以进入核心环节理解和训练ACT模型。5.1 ACT模型到底在学什么传统的行为克隆Behavior Cloning模型通常给定当前观测预测当前时刻的单一动作。这种方式容易导致误差累积动作看起来不连贯像“抽搐”。ACT的改进在于它预测的是未来一段时间例如2秒内的一系列动作即一个“动作块”。它的网络结构通常是一个编码器-解码器架构核心是Transformer编码器处理历史观测序列。将一段时间窗口内的图像通过CNN编码成特征向量和机器人状态关节角、末端位置等融合成一个上下文特征。解码器以这个上下文特征为条件像语言模型生成单词一样自回归地生成未来一系列动作。每一步生成下一个动作时都会考虑到之前已经生成的动作。动作分块Chunking这是关键。模型不是逐秒生成动作而是以较低的频率比如5Hz生成一个“动作块”这个块内部包含更高频率比如50Hz插值后的细粒度动作。这样既保证了长期规划性又保证了执行的平滑性。简单类比传统方法是“看一步走一步”ACT是“看一阵规划好接下来几步怎么走然后按规划走”。5.2 使用LeRobot训练ACT模型LeRobot框架已经实现了ACT模型并提供了清晰的训练脚本和配置入口。我们的工作主要是配置和调参。配置文件LeRobot使用YAML或Hydra配置文件来管理所有超参数。你需要创建一个配置文件指定model 模型类型为act以及其隐藏层维度、注意力头数、层数等。dataset 你采集的数据集路径和数据格式。training 学习率、批次大小、训练轮数、优化器类型等。environment 仿真环境的名称和参数如果在仿真中训练。action_chunking 动作块的长度、生成频率等关键参数。启动训练命令通常很简单如python lerobot/train.py --config-nameyour_config.yaml。训练过程会在终端打印损失曲线也可以使用TensorBoard或WandB等工具进行可视化监控。核心超参数调优经验动作块长度与预测时域这是最重要的参数之一。太短模型没有足够的“前瞻性”太长预测误差会增大且训练更困难。对于SO-101抓取这种任务预测未来1-2秒的动作对应10-20个动作块通常是个不错的起点。学习率使用带热身的余弦退火学习率调度器Cosine Annealing with Warmup效果通常很好。热身阶段让模型稳定起步。观测编码如何编码图像观测非常关键。可以使用预训练的ResNet backbone并在训练时冻结其前面几层只微调后面几层这样可以加速收敛并利用大规模图像数据上学到的通用特征。归一化Normalization务必对输入模型的所有观测值和动作值进行归一化。将关节角度、位置等缩放到[-1, 1]或[0, 1]区间。这能极大提升训练的稳定性和速度。需要从数据集中计算出每个维度的均值和标准差。训练过程监控训练损失观察动作预测的均方误差MSE是否平稳下降。验证损失在预留的验证集上计算损失防止过拟合。可视化回放定期在仿真环境中运行当前训练得到的策略录制视频。这是最直观的判断方式——看机械臂的动作是否越来越像人类的示范任务成功率是否在提高。一个常见的坑是“分布偏移”模型在训练集上表现很好损失很低但一放到仿真或真机上就失败。这往往是因为训练数据覆盖的场景太窄或者仿真环境与训练数据采集环境或真机的差异太大。解决方法就是回到前面几步采集更多样化的示范数据或者在仿真环境中使用更激进的动力学随机化。6. 模型部署与真机调试从虚拟到现实当模型在仿真环境中能够稳定完成任务后我们就可以尝试将它部署到真实的SO-101机械臂上了。这是最激动人心也最容易出问题的环节。6.1 策略部署流水线部署的核心是创建一个“推理循环”以一定的控制频率如10-50Hz运行观测获取从真机读取当前时刻的观测。这包括通过ROS话题或直接硬件接口读取所有关节的编码器值。从摄像头读取图像并进行与训练时完全一致的预处理裁剪、缩放、归一化。模型推理将处理好的观测输入到训练好的ACT模型中。模型会输出未来一段时间一个动作块的动作序列。动作执行我们只取这个动作块里的第一个动作作为当前控制周期要执行的目标例如目标关节角度。这就是所谓的“模型预测控制MPC”思想每个控制周期都重新规划但只执行第一步以应对实时误差。底层控制将目标关节角度发送给底层的电机控制器如STM32上的PID控制器由它去驱动电机实际运动。循环等待下一个控制周期回到步骤1。这个循环需要在树莓派上稳定、低延迟地运行。通常我们会使用一个独立的、高优先级的线程或ROS节点来完成。6.2 Sim2Real迁移的挑战与调试技巧即使仿真训练很成功真机上也大概率不会一次成功。常见的差距和解决方法如下动力学差异仿真中的电机响应、摩擦力、惯性模型和现实不同。调试先让机械臂在自由空间不抓取物体执行一些简单轨迹比如画圆。对比仿真和真机的末端轨迹。如果偏差有规律可以尝试在真机控制器上调整PID参数或者在部署代码中对模型输出的动作加入一个简单的线性校正标定。例如发现模型输出的某个关节角度增量在真机上总是移动得比预期多10%那就乘以0.9的系数。视觉差异仿真图像和真实摄像头图像在纹理、光照、颜色上差异巨大。调试这是最棘手的问题。可以尝试领域随机化在仿真训练时已经做了这是第一道防线。图像预处理对真实图像进行更强的预处理如转为灰度图、施加高斯模糊、调整对比度使其风格更接近仿真图像。在线自适应如果条件允许可以在真机上采集少量数据对模型的视觉编码器部分进行微调Fine-tuning。延迟从读取观测到电机开始运动存在不可忽略的延迟摄像头曝光、图像传输、模型推理、指令下发、电机响应。调试在部署代码中引入“动作历史缓冲区”。模型推理时不仅使用当前观测还融合过去几帧的观测和已执行的动作让模型能够感知到系统延迟带来的状态变化。也可以尝试降低控制频率给系统留出更多的处理时间。校准误差机械臂的“零位”不准URDF模型尺寸与实际有微小偏差摄像头外参标定不准。调试这是基础工作必须做扎实。重新进行机械臂的关节零位校准、工具坐标系标定和手眼标定。一个像素的标定误差在近距离抓取时可能导致厘米级的末端定位误差。一个非常实用的调试流程是“分阶段验证”状态控制屏蔽视觉输入只给模型提供关节状态观测让它执行自由空间运动。验证基础动力学迁移是否成功。静态视觉伺服固定机械臂在它面前摆放物体只运行模型的前向推理看它根据图像预测的动作方向是否合理例如物体在左边预测的动作是否向左移动。简化任务先尝试一个极其简单的任务比如“将末端移动到桌面上的一个固定标记点上方”而不是直接抓取移动的物体。逐步复杂化成功后再增加任务难度比如抓取固定位置的物体最后再抓取随机位置的物体。这个过程需要极大的耐心经常需要反复在仿真中调整训练参数然后在真机上测试。做好实验记录每次只改变一个变量才能有效定位问题。7. 进阶思考与优化方向当你成功让SO-101机械臂通过ACT模型完成一个抓取任务后可能会思考如何让它做得更好、更智能。这里有一些可以深入探索的方向7.1 提升数据效率与策略性能模仿学习的一大瓶颈是对示范数据的依赖。如何用更少的数据学到更好的策略数据回放Replay与混合不仅使用人类示范数据也将模型自己在探索中成功的轨迹可能不完美加入训练集进行迭代训练。这有点类似DAgger算法。引入奖励函数进行微调纯粹的模仿学习天花板在于“老师”的水平。我们可以用模仿学习得到一个不错的初始策略然后结合强化学习定义一个简单的奖励函数如“夹爪到物体的距离越近奖励越高”让策略在环境中继续自我优化甚至超越人类的示范。这种思路被称为“模仿学习强化学习”的混合方法。多任务学习采集多种任务如抓取方块、抓取圆柱、开门的示范数据训练一个统一的ACT模型。模型会学习到更通用的物体操作表征可能在新任务上表现出更好的泛化能力。7.2 模型架构与输入的改进多模态观测融合除了RGB图像是否可以加入深度图Depth或触觉传感器信息如何有效地在Transformer中融合这些不同模态的特征是一个研究点。语言指令驱动让模型不仅能看懂“场景”还能听懂“要求”。可以将自然语言指令如“请把红色的方块拿起来”编码成特征与视觉特征一同输入模型实现基于语言的机器人操控。更高效的Transformer标准的Transformer计算量较大。可以探索更轻量化的架构如Perceiver、Diffusion Policy等以便在算力有限的边缘设备如Jetson上实现更快的推理速度。7.3 系统工程的可靠性在实际应用中稳定性是第一位的。安全监控层在模型输出的动作被执行前增加一个安全校验层。例如检查目标关节角度是否超出软限位末端是否即将发生碰撞可以通过简单的几何模型或一个快速的碰撞检测库实现。如果预测动作不安全则触发停止或回退到安全位置。失败恢复策略当一次抓取尝试失败如物体滑落策略应该能自动进入一个“恢复”模式比如后退一点重新观察再次尝试而不是僵在原地或乱动。长期任务规划对于复杂的多步骤任务如“打开抽屉取出里面的东西再关上抽屉”单一的ACT模型可能力有不逮。需要上层有一个任务规划器将其分解为多个子任务每个子任务由一个专门的或通用的ACT策略来执行。从一台静态的SO-101机械臂到一个能通过观察学习并执行任务的智能体这个过程充满了挑战但也极具成就感。它不仅仅是调通一个算法更是对机器人系统——从硬件电路、固件、驱动、中间件到算法——的完整理解和实践。每一个环节的微小偏差都可能导致最终结果的失败。因此严谨的工程习惯、系统的调试方法和解决问题的耐心在这个领域里比任何一个炫酷的算法都更为重要。希望这份详细的流程解析能为你点亮实践路上的第一盏灯。