
我一直在琢磨一个问题同样是让机械臂干活为什么用传统示教器一点一点教出来的动作总透着一股“生硬感”而人在旁边演示一遍机器人跟着学出来的动作却意外地有“人样”这个念头是在看一个厨房做饭的机器人demo时冒出来的。机械臂伸过去抓土豆、切成块、倒进锅里整个过程不是教科书式地走点位而是带着一点点自然的弧度、一点点利落的顿挫像真人在操作。当时弹幕里有人问“这机械臂是被人拖着录了一遍吧”其实不是这背后是模仿学习里一个很核心的方法——ACT也就是Action Chunking with Transformer动作分块Transformer。如果你也在关注机械臂示教、机器人模仿学习或者想让自己手头的机械臂“学会”某种精细操作这篇文章值得你看完。我会把ACT从原理到实操掰开揉碎讲一遍也把我在实际部署中踩过的坑一并放进来。1. 先搞清楚传统示教到底“死”在哪1.1 我们平时说的示教通常是哪几种做机械臂应用开发的人对示教这个词再熟悉不过了。最常见的两种方式一种是示教器手动编程操作者拿着示教盒把机械臂挪到目标位置记录点位再写逻辑让机械臂按顺序走过这些点另一种是拖拽示教在协作机器人上比较常见比如法奥、遨博、JAKA这类的六轴协作臂直接拉着机械臂末端把轨迹走一遍系统把路径记下来。这两种方式在处理简单任务时很有效比如搬运、码垛、点胶、焊接。点位清晰、节拍固定、环境稳定机械臂可以做到毫秒级重复定位精度。但在厨房烹饪这种场景里事情就没那么简单了。切一颗土豆土豆大小不一样、摆放角度不一样你不可能提前把每一种位置的轨迹都示教一遍炒菜时翻锅的角度、下铲的力度、颠勺的高度这些更不是一个点位表能表达的。厨房任务的核心特点是动作带有很强的时序连续性而且需要根据当前状态做细微调整。这恰恰是传统示教的盲区。记得一个做食品自动化的朋友说过能用示教做出来的菜永远是“食堂大锅饭”的口感因为你让机械臂走固定轨迹它没法根据锅里菜的多少、火候大小临时改变节奏。1.2 为什么逐点示教教不出“手感”再往深一层说传统示教的本质是“把动作离散化成点位再用插补把它们连起来”。机械臂从一个点直线运动到另一个点中间经过的姿态、速度、加速度都是算法算出来的不是人做事时的自然状态。所以在旁观者眼里机械臂干活总有一种“一卡一卡”的机械感。手感这个东西本质上包含了很多隐性信息。人切菜的时候手腕会根据刀刃和菜之间的接触力实时调整角度炒菜翻锅时手臂的轨迹不是一个规则的圆弧而是带着加速、减速、停顿甚至轻微抖动的复杂曲线。这些信息很难用几个坐标点位去描述。数据量也不允许——如果要精确录一段30秒的炒菜动作用传统的路径点采样可能要存几千个点位而且每换一个场景就要重新录一遍。这就解释了为什么“示教”在机器人做饭这个赛道上走不通。它需要更强的泛化能力而不是更精确的路径复读。要解决这个问题思路就得换一个方向不再告诉机器人每一步怎么走而是让它自己看人是怎么做的然后跟着学。2. ACT模仿学习到底在“模仿”什么2.1 从“写剧本”到“看戏学戏”ACT属于模仿学习里一个很有意思的分支。模仿学习的核心思路不是让开发者手动写控制逻辑而是采集人类专家的演示数据让模型从数据里学出“看到什么状态、应该做什么动作”的映射关系。我用一个比较生活化的例子来解释。传统示教就像你给一个完全不懂演戏的人写剧本第1秒抬左手第2秒迈右脚第3秒回头。剧本写得再详细他演出来也是僵硬的因为他不理解角色。ACT模仿学习则更像是让这个人坐台下看老戏骨演同一出戏十遍台上演员的每个微表情、每次停顿、每处气息处理都被他默默记在心里。等他再上台时不用人提醒他自己就知道该在哪个节点稍微停一下、哪个动作要做得利索一点。“看戏学戏”这件事落到机械臂上就是数据采集。常见做法是使用遥操作夹具比如ALOHA系统里那套双机械臂主手夹具人握住主手端操作从手端完成切菜、翻炒、抓取等动作全过程里从手端的关节角度、末端位姿、夹爪开合状态会被高频记录下来形成一份或多份演示数据。这个过程的细节我在第三章会细讲先继续看算法。2.2 动作分块和Transformer解决的是两个不同问题ACT的全称是Action Chunking with Transformer两个核心组件——动作分块Action Chunking和Transformer——分别要解决模仿学习里两个非常棘手的痛点。第一个痛点是复合误差问题。早期模仿学习常用做法是逐帧预测模型输入当前图像输出下一时刻的动作。听起来没问题但实际部署时会出大事模型在工作时会不断接收新的图像输入它预测出的动作会反馈影响下一帧的图像一旦某一帧动作产生微小偏差这个偏差就会被放大成完全不同的状态模型随后看到的图像跟训练时的分布越来越远动作就越走越偏像开车走偏了方向盘却越修越猛。动作分块就是针对这个问题设计的。ACT不是逐帧输出一个动作而是一次性预测未来大约100步左右的动作序列时间跨度的单位是控制周期比如100步对应一个时间跨度。这一步输出后面所有步骤的动作而不是走一步看一步。这样做相当于让模型提前“规划”好一小段动作有效避免了逐帧预测的误差累积。这种设计对于精细操作特别重要因为动作只要更平滑更连贯系统就更稳定。第二个痛点是动作分布的多样性。同一道菜人每次做的动作细节不完全一样甚至同一个人同一道菜连续做三遍手势也会有细微差别。如果模型只学到唯一的一种输出方式就会学得死板一旦遇到新的状态变化就不知道该怎么处理。ACT用Transformer结构来做序列建模而且在动作预测头里加入了一个基于高斯混合模型的拟合头输出一个分布而不是一个确定值。分布的存在让模型学会的不是一条固定的轨迹而是一片“动作允许区域”在这个区域内部随机采样都会得到合理的动作。这也是ACT手感比传统方式更自然的重要原因。2.3 和DAGGER这类交互式模仿学习怎么选聊到模仿学习很多人会提到DAGGERDataset Aggregation。DAGGER的思路跟ACT完全不同——它是在训练过程中不断让模型控制当前机器人如果模型走进了危险或陌生的状态人类专家会及时接管操控这个被修正的样本会补充进训练集里如此循环迭代逐步缩小模型跟专家策略之间的差距。从实际使用的角度对比一下DAGGER对环境交互的要求高它需要场景里有真人实时接管对设备和操作者都有较高门槛适合在仿真环境里跑ACT则更偏向“离线学习”先把数据采够再统一训练训练完成后一次性部署不要求人类在运行时参与。对厨房做饭这个场景来说ACT的优势很明显因为做饭过程中人类不可能每次都守在旁边做“安全员”。一次性的行为克隆配合高质量演示数据成本更低也更实用。当然ACT也有自己的短板尤其是对数据质量的敏感度很高教的时候动作都做不好学出来的动作也不可能好。这一点留在第四章问题排查里细聊。3. 从数据采集到上臂实操的完整流程3.1 设备准备与数据采集一份高质量演示从哪来模仿学习这一套流程最容易被低估的就是数据采集环节。很多刚开始接触的人以为模仿学习就是拿个摄像头对着人拍视频然后用神经网络端到端学一学就完事。现实中如果真这么做大概率训练出来的动作是乱的。厨房做饭这种精细操作必须要有跟真实执行端同构的采集系统。最成熟的方案还是遥操作采集。简单说就是你需要一套主从异构的控制系统操作者握住主手端的操作手柄从手端的机械臂会复现主手端的每一格动作。这样说可能有点抽象具体讲一下流程硬件准备一对同构的机械臂比如两个六轴或七轴臂摆在一起一台主手端控制器可以是另一个机械臂、手柄或者专用的遥操作设备一个或多个摄像头用于采集操作者的视角或者机械臂操作的第一视角画面以及夹爪控制信号采集模块。设定控制频率建议至少30Hz也就是每秒记录至少30组数据。烹饪动作里有大量精细的腕部运动如果频率太低很多动作细节就丢了。我见过有人贪图省事用10Hz采结果训练出来的动作完全是“断片”的。录制流程操作者握住主手端像平时自己做菜一样去操作从手端的锅铲、菜刀等工具。整个过程要尽量自然不要因为旁边有摄像头就刻意放慢速度。刻意放慢会造成一个很麻烦的问题数据里动作节奏的信息会被扭曲机器人学到的动作会是慢吞吞的而动作速度一旦分布不均训练出来的控制策略会在快速动作和慢速动作之间来回摇摆。重复采集同一个任务建议采集至少30到50条演示数据才能覆盖常见的状态变化。比如切土豆要涵盖不同大小、不同摆放角度炒菜要涵盖锅里有菜、没菜、菜多、菜少的情况。数据多样性直接决定了模型的泛化能力这一步只能老老实实做没有捷径。采集到的原始数据一般包括每一时刻的7个关节角度、末端位姿位置四元数、夹爪开合值以及同一时刻相机画面。这些原始数据需要按照统一的频率对齐比如图像是30Hz关节状态是30Hz两边要严格时间同步。3.2 数据清洗与归一化这一步偷懒后面全得返工数据采完之后很多人急着拿去训练接着就会遇到loss降不下去、动作发散之类的问题。这不是模型不行八成是数据没洗干净。先说几个必须处理的点剔除异常片段操作过程中操作者可能不小心碰了一下桌子、夹爪意外松脱、工具掉落了这些片段必须手动逐条检查标记并移除。算法不会判断这个动作是失误——它只会觉得这是一个“有效演示”然后照单全收学出一堆奇怪的行为。关节角度连续化处理旋转关节的原始数据在跨越±180°边界时会发生跳变比如从179°跳到-179°数值上看起来像是一个巨大的突变实际上关节只转过了2°。这类跳变如果不做展开处理训练时会让模型无所适从。处理方法是对角度序列做解卷绕unwrapping根据相邻帧的差异将不连续的角度序列修正为连续的形式。归一化机械臂不同关节的角度范围差异很大有的关节可以转300°有的只有90°。如果不做归一化数值范围大的关节会主导loss的计算训练时会发现大范围关节学得很好小范围关节却怎么都练不好最终动作会出现“某一关节过冲、其他关节不动”的怪异现象。我的做法是对每个关节分别计算训练集里的均值和标准差标准化到均值为0、方差为1的范围内。图像预处理如果输入是图像需要统一裁剪、缩放、色彩空间转换。厨房环境光照变化很大可以在采集时拍摄多个时段的演示或者在预处理阶段加入随机的亮度扰动来增强模型的泛化性。3.3 训练参数与超参数建议我踩出来的配置ACT模型的训练细节在这几年已经有了不少公开经验基于我自己跑过的任务给你一份比较稳妥的默认配置作为参考。如果你是第一次在自己任务上跑ACT可以从这组配置开始。第一是瓶颈维度。ACT在Transformer编码器和解码器之间插入了一个低维瓶颈bottleneck迫使模型将场景信息压缩成紧凑的表征。这个维度太小信息不够用太大训练容易过拟合见过的最优区间是32到64左右具体取决于任务复杂度。切菜这类任务用512类似级别的任务也可以先从这个值起手。第二是动作分块长度chunk size。这是ACT最核心的超参数之一。chunk size太小分块预测的优势不明显太大机器人要预测未来的动作过于长远预测不准会导致后续动作漂移反而更糟。厨房做饭任务里100步左右是常见选择假设控制频率是30Hz这个时间跨度的动作大约对应3秒多。如果你发现机器人动作经常“抢跑”也就是还没观察到当前状态就开始做后续动作可以适当减小chunk size如果动作显得犹豫、不连贯则考虑增大一点。第三是训练步数和batch size。比较稳妥的建议是先跑200到300个epoch再用验证集观察是否过拟合。batch size设64就行对显存压力不大。学习率用1e-4再配一个余弦退火效果通常比固定学习率好很多。这些参数在不同任务上会需要微调我给到的数值不是“金科玉律”但它们能帮你先跑通流程后续再根据你自己的数据做调整。3.4 部署与真实环境对齐成功率是怎么被刷上去的训练完模型下一步是把模型部署到真实的机械臂上跑推理。这里有一个经常被忽略的关键点——训练时用的状态输入和部署时的实时状态输入必须保持一致的格式和频率。举个例子如果训练时图像经过了下采样到320×240、归一化等处理流程部署时也必须用完全相同的处理方式差别在于一个像素都会影响机器人的行为。部署时还要考虑推理延迟。ACT模型的推理包含一次完整的Transformer前向传播在边缘计算设备上可能就会有几十毫秒的耗时。你需要把这个延迟计算进整个控制循环里让机械臂的动作指令在接收到图像后尽可能短的时间内执行否则就会出现“看到东西晚了”的问题做出来的动作就会迟缓。厨房做饭场景里还有一个细节——工具与夹具的对齐。机械臂在训练时使用的锅铲、刀具、砧板部署时应该尽量保持同规格、同位置。如果你的刀具换了品牌刀柄长度稍有不同都会导致切菜动作的落点偏掉。我的做法是在每次部署前先跑一次正运动学验证再用示教器手动把机械臂末端移到关键参考点跟训练数据里记录的参考位姿做比较误差在几毫米内才允许开跑。模型部署上线后也别急着完事。先用慢速模式跑几遍观察动作是否流畅有没有明显的碰撞风险再逐步放开速度。即便是表现很好的模型提升场景也会引入新的不确定性这个循序渐进的过程不能省。4. 我在实操中踩过的坑4.1 机械臂高频抖动是怎么回事第一次把ACT模型部署到真实机械臂上时我发现一个很磨人的问题机械臂在执行动作时会出现高频抖动尤其在手腕位置的关节幅度不大但频率很高看起来像是“帕金森早期症状”。排查过程大概花了两天。先说结论高频抖动主要有两个来源。第一个是数据里的高频噪声如果远程操作时操作者手本身有轻微抖动或者关节编码器的输出有毛刺这些噪声会被模型原样学到在机械臂上复现成颤抖。抓取工具能有效解决这个问题但也可以先在数据平滑上做文章比如用低通滤波对关节角度序列做平滑处理。第二个来源是推理频率和控制频率不匹配。训练时模型输出的动作序列频率是30Hz但部署环境里机械臂底层的控制周期可能是100Hz甚至更高。如果中间缺少插补平滑处理机械臂每收到一个新目标位置就会“冲刺”过去然后又收到另一个新目标位置自然就容易抖。解决办法是加入一个低通滤波器或者做线性插值让机械臂每个控制周期只执行目标位置的一小段路径顺滑过渡。4.2 泛化能力不足换个位置就做不好了这也是模仿学习很经典的坑训练时明明效果很好一旦到了新场景就“瞎了”。比如训练时土豆永远在砧板左边部署时你把土豆放到砧板右边机械臂直接往左边空气里切。问题的根源是训练数据的多样性不足。解决办法从两个方向下手。一个是扩充数据把同一个任务在多种布局、多种光照、多种工具状态下分别演示让模型见过的状态分布足够宽。另一个是调整模型结构适当降低瓶颈维度强迫模型学习更抽象的状态表征避免把具体的位置信息背下来。这里有一个小技巧在做数据增强时随机对图像做平移、旋转、亮度扰动可以帮模型学到对位置变化更鲁棒的特征。我在实践中发现给图像加一点椒盐噪声或者高斯模糊模型学出来的动作反而更稳因为它不再过度依赖图像纹理细节而更依赖整体空间结构。4.3 数据采集顺序会影响学习效果最后分享一个比较容易被忽视的细节数据采集的顺序会直接影响训练效果。如果你先连续录了20条一模一样的动作再录10条另一种状态模型会倾向于学过拟合数量多的那部分数据。我的做法是在采集时打乱场景顺序每条演示之间都重新随机摆放物体、切换光照状态。这样模型没见过总是在同一个状态下采出来的“扎堆数据”训练时就不会陷入某一特殊状态的过拟合。另外一个相关的点是如果任务包含多个阶段比如“拿土豆-切土豆-把土豆倒进锅”建议把每个阶段的起始和结束留一小段缓冲区。不要在动作刚结束时立刻停止记录否则模型学到的结束动作会特别仓促就像人说话说到一半突然被掐断一样。5. 从做饭场景看模仿学习未来扩展开去用ACT做厨房做饭表面上只是做了一个有趣的demo但它带来的启发可以延伸到很多领域。医疗手术里的缝合动作、实验室里的微量溶液移取、电子装配里的排线插接这些操作都有一个共同点——动作复杂、精度高、环境变化大但示教编程又很难写出明确的规则。本质上这些任务都是“人做得到但很难用语言/代码描述”的隐性技能。模仿学习的价值恰恰在于把这种隐性技能从人身上“拷贝”到机器上。这跟ChatGPT时代的对齐学习也有相通之处。语言模型通过从人类反馈中学习来对齐人类的偏好模仿学习则是让机器人从人类的动作演示中学习来对齐人类的操作习惯。两者背后的哲学是一致的与其穷举所有规则不如让系统从数据中自己领悟。目前ACT这类方法的主要瓶颈还是在数据效率上。要学一个像样的技能至少需要几十条高质量演示这跟数据驱动行业的发展路径有不少差距。未来的方向很可能是在仿真环境里做大规模预训练再用真实数据做微调这跟VLA的路线形成了一股明显的合流趋势。就我个人的体会来说模仿学习真正迷人的地方在于它让工程师的思维方式发生了转变从给机器人写剧本变成给机器人找老师。ACT这个方向让我第一次觉得机器人的动作可以不再“机器人”而是多了一丝人味儿。如果你也想试试做饭机器人的效果不妨从先采集50条演示数据开始这个门槛其实比你想象的低。