做机器人策略这些年我踩过最大的一个坑就是对控制频率这件事的执念。早期做机械臂插拔作业模型每走一步就重新推理一次姿态倒是调得快但末端轨迹毛刺多得离谱到一个位置附近来回震荡像打摆子。后来换了个思路——让模型一次推理输出一整段动作序列问题一下就缓解了大半。动作分块Action Chunking在 agentic robotics 里就是这么个东西把决策粒度从一个动作提高到一段动作让智能体机器人既能保持上层规划的意图感又不至于被底层控制的高频噪声拖垮。今天把这件事的原理、参数、实现路线和实操坑位一次说透适合正在做模仿学习策略、准备把大模型接到实体机器人上的朋友参考。1. 动作分块到底解决了什么问题1.1 先看一步一决策的困境传统机器人策略基本是 Markov 式的当前状态输入网络输出一个动作执行完再观测新状态再推理下一个动作。听起来很合理但真实系统里这个模式会撞上三堵墙。第一堵墙是推理延迟。感知、网络前向、通信、底层计算加在一起一次决策动不动几十毫秒。如果要求控制频率到 20Hz那么一次推理必须卡在 50ms 以内模型稍微大一点就超时你只能牺牲模型容量。第二堵墙是高频闭环的抖动。每一步都基于当前瞬时状态重新决策策略容易过度反应。传感器噪声、视觉抖动、关节摩擦力矩波动这些高频扰动全都会被放大成动作抖动。很多时候模型在目标点附近来回震荡不是它笨是它在用 20Hz 的频率回应 5Hz 的噪声。第三堵墙是时间连贯性缺失。单步策略没有接下来一段打算怎么走的表达每一个动作都是孤立的姿态、力度这类连续量就容易失稳。打个比方你打字的时候如果每敲一个字母都要停下来想下一个键是哪个速度会惨不忍睹人实际上是把词和短语打成一组手指连续运动中间不需要逐字母思考。动作分块就是这个道理。1.2 动作分块的核心形式动作分块的做法很直接在决策时刻 t策略一次性输出未来 H 步的动作序列也就是a_t, a_{t1}, ..., a_{tH-1}机器人以开环方式连续执行这段动作序列执行完毕后再重新观测状态、推理下一段。这里 H 就是分块长度。关键点在于它不是把单步策略在时间轴上重复调用 H 次而是让网络把未来一段动作当成一个整体来生成。整个问题从单步动作预测变成了动作序列生成。这个转变带来的第一个好处是决策频率骤降。一步一决策时你需要每 20ms 动一次脑分块之后你只需要每 400ms 动一次脑但输出仍然是 20ms 一个动作点因为那一段里已经包含了未来所有动作点。算力预算从每个时间步换成了每个动作片段预算宽裕了模型可以更大、看得更远。1.3 为什么 agentic robotics 尤其需要它Agentic robotics 和传统机器人控制有个本质区别传统控制通常是给了一条参考轨迹机器人跟踪它agentic 系统是只给一个目标比如把这堆零件按顺序装配好系统要自己决定先做什么、怎么做还要在不确定环境里随机应变。这种系统天然分成两个层级上层做任务规划和常识推理下层做灵巧操作和运动控制。动作分块恰好是这两个层级之间的桥梁。上层每次决策生成的不是单个动作点而是一段带意图的动作片段。比如上层说拿起螺丝刀这句语义翻译到底层就是一段 1 秒左右的关节轨迹序列——正好是一个动作分块。分块让技能这个概念有了可计算的形式一个技能就是一段动作序列一段动作序列就是一个分块。没有这个抽象层上层语义和底层运动就永远对不齐。2. 把原理拆开为什么一次一段反而更稳2.1 决策成本是被摊薄了不是消失了很多人以为动作分块是省了计算其实严格说是把计算集中到更少的决策点上。假设一次推理要 40ms一步一决策的模式下推理时间已经超过控制周期你只能降低控制频率或者换小模型。分块长度 H16 时一次推理能覆盖 320ms 的动作推理频率降到约 3Hz但输出到控制器的指令仍然是 20Hz 的完整序列。我实际测过的结果是同样的数据集单步策略只能跑到 10Hz换成分块长度 H10 之后推理频率降到 5Hz但输出依然是 50Hz 的动作点轨迹平滑度和任务成功率反而都涨了。分块等于把每个时刻都要想改成了每个时间段想一次省下来的频率预算全变成了模型容量和时间视野。这是它能稳住任务成功率的一个底层原因。2.2 误差累积在块内被切断了模仿学习有个经典问题叫 cascading error也叫复合误差。训练时模型在专家的状态分布里做单步预测每一步都假设上一步是对的可推理时一旦某一步偏离了训练分布下一步输入的状态就是没见过的状态预测继续偏离误差越滚越大。动作分块对这个问题有两个天然的缓解机制。第一分块内部是开环执行中间没有重新决策也就没有基于错误状态的再次决策误差不会在块内被一步一步放大。第二分块重规划时模型的输入是整个最近的时间窗口它学到的是当前状态和这一整段动作的关系而不是单个状态到单个动作的映射对状态扰动的鲁棒性明显更好。代价当然也有。块内是开环的如果执行到中段出现意外控制器不能立刻反应必须等块结束才有下一次规划机会。所以分块不是万灵药它的稳定性来自放弃部分实时性换取整体连贯性。这个取舍很微妙后面讲参数和保险机制的时候细说。2.3 时间抽象分块边界就是重计划边界动作分块本质上是一种时间抽象和分层强化学习里的 option 概念一脉相承。高层决定做哪件事低层负责怎么把这件事做完分块长度就是这个抽象的粒度。粒度越粗高层规划负担越小但低层灵活性越低粒度越细系统越灵活但高层干预太频繁又回到了高频决策的老问题。所以选 H 不是越大越好。它应该对应这个技能本身需要的连续运动时间。插拔动作从对准到插入可能 1 秒控制周期 20msH 取 50 比较合理从一个工位移动到另一个工位可能要 3 秒那 H 就得更大。我习惯先标定技能时长再除以控制周期得到一个初始 H然后在这附近做扫描实验微调。这样选出来的 H 才是任务驱动的而不是拍脑袋定的。3. 落地到 Agentic 系统的三层架构3.1 规划层从语义目标到技能序列Agentic 系统的规划层接收任务目标负责把长程目标拆解成子任务序列和技能调用。这一层可以是大型语言模型做推理也可以是经典符号规划器甚至是一张状态机表。它的输出是抽象的一个技能列表比如抓取螺丝刀 → 移动到阀门 → 对准插槽 → 旋转拧紧。这层完全不关心关节角是多少也不关心轨迹长什么样。动作分块在这里扮演的角色是可执行单元的规格说明。规划层每调用一个技能等同于要求策略层生成一个分块。所以规划层的决策频率和分块长度是挂钩的一个技能一个分块分块长度就是技能的默认持续时间。规划层不需要知道控制周期只需要知道技能时长预算这个接口非常干净。3.2 策略层技能到动作分块的映射策略层是动作分块的主战场。它接收当前的观测历史、任务目标、技能标识输出一段动作序列。这一层的核心能力是运动先验——它不需要处理长程语义推理也不需要处理高频动力学细节它要回答的问题只有一个在给定上下文里接下来这段动作应该是什么样。我自己的经验是策略层的输入里短期动作历史非常关键。如果只把当前帧图像和任务目标输进去模型对现在进行到哪一步了没有概念拼上最近 10~20 步的动作历史模型就能判断当前处于技能的哪个阶段输出更精准。这相当于给模型一个进度指针效果提升非常明显。3.3 执行层安全过滤与时间对齐分块策略输出的动作不能直接发给电机。执行层要做两层处理。第一层是安全过滤检查关节限位、奇异位形、力矩上限发现超限动作点要拦下来或者修正。这一步必须放在执行层因为策略本身不保证安全分块再优秀也只是在预测动作不是在做安全论证。第二层是时间对齐。策略输出的控制频率和执行层的控制频率如果不一致需要用插值或者保持器对齐。这里有个反直觉的注意点对齐的时候不要顺手再加低通滤波否则整段动作被抹平分块带来的干脆利落感就没了。分块执行的一个优势就是保留了动作的意图感和边界感过度滤波等于把这个优势丢掉。4. 核心实现路线与选型对比4.1 Transformer 序列回归最直接的实现把最近一段观测编码成 token解码器一次性输出 H 个连续动作。训练时用专家轨迹里连续的 H 步作为监督。Transformer 天然适合序列到序列的任务实现起来也是最简单的一条路。连续动作的回归精度是个注意点。直接用回归头输出多维连续值训练容易不稳我试过离散化到 256 个 bin加上类别交叉熵损失效果很稳。还有一个优化是混合密度头输出高斯混合分布的参数表达不确定性更强但实现复杂度高一些。如果你的任务动作模式比较单一用离散化就足够了。4.2 Diffusion Policy 生成式路线另一条路线是用扩散模型生成动作分块。从噪声动作序列开始迭代去噪 H 步得到清晰的动作片段。扩散路线的优势在于分布建模能力同一个状态下不同专家可能有完全不同但都合理的动作策略比如抓取同一杯水有人从左边抓有人从右边抓。单峰回归会把这种多模态平均成一个什么都没学到的中间动作扩散模型能表达多种合理方案。代价是推理开销。扩散模型要多次采样一步一决策肯定跑不动但分块模式天然适合它——因为本来决策频率就低。我的选型经验是动作多样性明显的任务抓取、插孔找位用扩散动作模式比较确定的任务插拔、按压、走固定轨迹用 Transformer 回归快且稳。4.3 向量量化动作 Token 路线第三种思路是把动作用向量量化编码成离散动作词然后像语言模型一样做动作序列的自回归生成。这个思路对 agentic 系统特别有吸引力因为上层语言推理和下层动作序列可以共用同一个 token 空间——任务目标、观测描述、动作片段全都变成 token喂给同一个模型推理链条可以无缝衔接。工程上的前置工作是要先训练一个动作 tokenizer。采集足够的动作数据训练一个自编码器把动作片段压缩成离散码本。这个 tokenizer 的质量直接决定后面生成动作的精度tokenizer 没训好后面全是空中楼阁。所以这条路线上限最高工程量也最大。4.4 三条路线的对比路线动作表达多模态能力推理开销工程量适合场景Transformer 回归连续/离散动作弱低低动作模式单一、要求快速迭代Diffusion Policy生成式动作序列强中高中抓取、找位等多模态任务VQ Token 自回归离散动作词中中高统一语言与动作、长期规划我的建议是不要贪多。第一版项目先用 Transformer 回归把整个链路跑通验证分块的收益如果发现多模态模式导致成功率上不去再换 diffusion只有当系统里已经有语言模型做高层推理而且你打算长期投入才值得做 VQ token 路线。5. 参数整定与训练实操5.1 分块长度 H先算后调分块长度是最重要的超参数没有之一。我的初始值方法是先标定技能时长。看十段示教数据统计从技能开始到结束的平均时长假设是 1 秒控制周期是 20ms那初始 H 1000ms / 20ms 50。然后在这个初始值附近做扫描实验对比几个候选 H 的成功率和轨迹平滑度。经验参考值控制周期 20ms短程灵巧操作插拔、按压H 20~50覆盖 0.4~1.0 秒拾取-放置H 50~80覆盖 1.0~1.6 秒移动与转向H 100~200覆盖 2~4 秒注意 H 翻倍常会带来一个成功率平台期再往上加反而会掉。原因很直白任务里的反馈需求超过了分块能提供的响应能力环境变了它还在执行旧计划。5.2 重叠重规划让相邻块平滑过渡纯分块执行是执行 H 步 → 重规划 H 步但两个块之间容易接不上。更稳的做法是重叠式重规划每执行 k 步k 小于 H就重新规划一次规划时参考上一块末尾的 H-k 步或者对重叠区间的预测做加权平均。这相当于后退水平控制保留了分块的高效率又让块与块之间平滑衔接。重叠比例的常见选择是 50% 或 75%。重叠越多越平滑但推理频率也越高太高的重叠就等于回到了高频决策。我的经验是纯位置型动作重叠 50% 就够涉及力的任务要重叠到 75%因为力控对连续性极其敏感边界跳变会直接在力矩曲线上炸出尖峰。5.3 训练数据切块与损失函数设计训练数据通常来自人工示教或遥操作采集。关键步骤是把连续轨迹切成块从轨迹起点开始每 H 步切一块相邻块之间设置重叠形成训练样本。为了让模型对中途状态也有鲁棒性训练时可以对块内做随机裁剪或者掩码模拟执行过程中的部分观测缺失。损失函数要兼顾两个目标块内动作的逐点回归误差以及块与块之间的连续性。主损失一般用 L1 或 Huber另外加一个边界处动作差异的正则项。这个正则权重我建议取 0.1 左右太小了没用太大了反而牺牲块内精度。还有一个细节块内每个动作点的损失权重靠近块起点的动作预测往往更准末尾更不准可以给后面几个动作降权训练会更稳。5.4 容易被忽略的细节动作归一化动作分块模型预测的是连续动作序列不同维度的尺度差异可以非常大——关节角在正负 π 量级速度可能到正负 3 rad/s。如果不归一化直接回归网络会被大尺度维度带偏训练发散。我的做法是对每维动作分别做 min-max 归一化到 [-1,1]把归一化参数持久化保存推理时反归一化。这个细节看着 trivial但影响极大。我见过不少项目训练到一半崩了各种调学习率、换网络结构都没用最后查出来就是归一化没做好。在你怀疑模型结构有问题之前先检查归一化。6. 常见问题与排查实录6.1 环境变了策略还在执行旧计划这是分块最典型的问题。场景执行到块中段目标物体被碰歪了但分块策略还在按原计划动作直到块结束才会重新规划。处理办法分三级第一级把 H 调小一点牺牲效率换响应速度。第二级做重叠重规划提高重规划频率这是性价比最高的改法。第三级在安全机制层面加中断。执行层设置快速检测——接触力突变、视觉目标丢失、关节力矩超限——一旦触发立即中断当前分块进入紧急重规划流程。这不改变分块策略本身但给开环执行加了一个保险丝。我在实际项目里三级会同时用H 取适中值重叠 50%再挂一个力矩突变检测做保险。三管齐下之后因为环境突变导致失败的比例降了一半以上。6.2 块边界处动作跳变重规划出来的新块和正在执行的旧块在边界上对不上末端会有一个小小的抖动。如果重叠比例已经给到很高还是抖排查两个点。第一个点重规划时的上下文有没有包含旧块末尾的部分动作。如果模型看不到当前块已经执行到哪了它在边界处的预测就是盲猜。把最近一段动作历史拼进输入大部分跳变问题都能解决。第二个点动作归一化参数是否前后一致。训练和推理如果用了不同的归一化统计量边界处就会出现系统性偏移这个问题非常隐蔽因为单块内看不出异常只有边界处能看到突变。6.3 部署时想改 H模型性能明显下滑训练时固定 H50部署时想临时改成 H30模型表现通常会变差。原因在于位置编码和注意力模式都对不上训练分布。我后来用了一个办法训练时对 H 做随机采样在 [H_min, H_max] 之间随机指定本次预测的长度让模型学会适应不同长度。这样部署时任何长度都能用只是性能在中间区间最好。这个 trick 不是必须的但它对产品化部署特别有用。因为现场调试的时候你永远不知道会不会因为传感器帧率变化而不得不调整分块长度与其到现场抓狂不如训练时就把这个鲁棒性练出来。6.4 控制频率抖动导致动作时间语义错乱分块假设执行层能以固定频率消费动作序列但真实系统里控制循环偶尔会抖动比如某一帧感知超时。如果执行层只是简单按序号取动作频率一波动整段动作的时间语义就乱了——本来该 0.5 秒完成的一个技能可能被拉长到 0.8 秒轨迹形状也变了。我的做法是在执行层维护一个时间戳对齐器分块里的每个动作点都带时间戳对齐到当前控制器时刻做插值而不是按第几个动作点硬消费。这个小改动让动作时间语义对频率波动免疫强烈建议从一开始就写上。7. 我的几点实操体会说点论文里不会写的东西。动作分块这个技术做到最后的难点不在模型而在判断什么时候信任它。你把它接到真实机器人上第一个发现的问题永远是它在一段动作里表现不错但你不知道它在哪一刻会做出反直觉的决定。所以我的习惯一直是第一个版本宁可把 H 调保守一点跑通之后再逐步拉长不要一上来就追求最大效率。另一个我后来才意识到的点是动作分块和任务级上下文应该共享同一个表示。早期我只把任务目标当成一个条件变量输给策略效果一般把目标、观测、短期动作历史拼成一个 token 序列统一输入之后成功率明显高了。模型需要知道目标从哪来、动作进行到哪一步了这些信息放在同一个上下文里注意力机制才能充分利用。最后分享一个小扩展分块长度不一定要固定。让模型根据任务进度自适应缩短短块——比如接近目标时自动把 H 调小以便精细修正。这个方向我试过初步版本效果不错后续应该会继续做下去。动作分块的门槛不高改动量小、收益直接几乎不需要改变现有训练流程只需要把输出从一个动作改成一段动作值得你先拿自己的任务试一下。