给机器人算下一段动作,花了200毫秒。这200毫秒里,机器人是停着等,还是沿上一段动作继续走?
停着等,交接容易安排,却会把推理时间变成动作间的停顿。继续走,动作看上去连贯了,新结果回来时却多出一个问题:原本排在开头的那两步,时间已经过去,还执行不执行?
REMAC研究的就是这种异步执行。论文的处理不只涉及跳过几个动作索引,它还要让新计划知道,等待期间执行的是旧计划里的动作。这两件事差在哪里,用八步动作就能说明白。
依据 Real-Time Robot Execution with Masked Action Chunking,arXiv:2601.20130v1。下文编号与毫秒数为教学推演,实验成绩引自论文。
1. 为什么要边执行,边重新计算
许多机器人策略会一次预测未来一段动作,称为动作块。它让模型能够表达连续运动,也减少"每走一步都重新推理"的开销。
但环境不会等模型。杯子可能被挪动,夹爪可能偏离目标,机器人自己的位置也在变化。如果预测八步就不看环境地全部执行完,后半段可能已经不合适。因此,系统通常执行一段后重新获取观测,再计算下一块动作。预测窗口与重新规划的节奏,由此成了两个不同的参数。
同步方式最容易理解:当前动作执行到约定位置,停下来等新结果,再开始下一段。这样交接关系清楚,但推理时间会变成等待。异步方式则在算新动作时,继续消耗旧块中的剩余动作,让运动与计算重叠。
等待被旧动作填上了,机器人却也在这段时间里走到了新的位置。下一块动作必须接住这段变化。

图 1:依据论文Figure 1重绘。异步执行以旧块仍有足够缓存为前提;REMAC通过训练适配与前缀保留缓解交接错位。
2. 这一轮实际执行的是A4、A5、B2、B3
现在给动作编号。设预测窗口 P=8,每经过 h=4 个动作步重新规划,推理等待 d=2 步。为便于心算,教学场景中每步100毫秒。
在时刻t,上一块A的前四步已执行,缓存中还有A4、A5、A6、A7。系统此时获取新观测,并开始生成下一块B。B0原本对应t开始的第一个时间槽,B1对应下一个,以此类推。
模型需要200毫秒才能给出B。等待期间,机器人不能使用还没算出来的B0、B1,只能按旧计划执行A4、A5。到t+200毫秒时,B0、B1对应的时间已经过去,新的执行只能从B2接上。
这一轮到t+400毫秒再次发起推理之前,实际执行的四步便是:
text
A4 → A5 → B2 → B3
而不是从B0开始把新块再走一遍。

图 2:P=8、h=4、d=2的教学时间线。A/B表示动作所属的计划及时间位置,不表示其数值必定不同。训练损失覆盖新块后缀,也不意味着本周期会把后缀一次全部执行完。
图里有两个长度,后面会反复用到:旧块还剩 P−h=4 步,可以提供A4到A7;这次等待只消耗 d=2 步,即A4、A5。记住"还剩四步,实际先走两步",采样时就不容易把初始化和固定前缀混在一起。
B看到的画面仍拍于t时刻。结果刚算完,输入已经旧了200毫秒。后面的错位就从这里开始。
3. 接得平滑,也可能走错方向
第一种是块间不连续。单独看A和B,每段动作都可能平滑;接在一起时,A5与B2却可能位置相差过大,或速度方向突然改变。前一块打算从杯子左侧绕行,后一块倾向右侧,交界处就可能不自然。
这类问题在同步执行中也可能存在,异步等待又让交接更复杂。时序集成、双向解码和RTC等方法从不同角度处理动作块之间的关系,论文将它们作为相关方法讨论。
第二种是块内不一致。在t开始的这个执行周期里,前两步来自较早观测对应的A,后两步来自当前观测对应的B。若B按照自己设想的B0、B1推演后续,却没有适应实际走出的A4、A5,那么即使交接点看起来平滑,之后的动作仍可能偏离需要的轨迹。
用前面的绕杯子场景说,A可能已经把夹爪往左带了一点,B的后续动作却建立在另一条前进路线之上。单纯把交界处抹平,不一定能消除这种"后续计划与已发生前缀不一致"的问题。
因此,检查A5到B2是否平滑,只覆盖了第一个问题。还得看B2往后的计划,是否适应前面实际执行的A4、A5。REMAC把后一个问题也放进了训练。
4. 来不及执行的前两项,还要照常训练吗
REMAC首先改变训练时计算误差的位置。在P=8、d=2的例子里,掩码就是:
text
时间位置: 0 1 2 3 4 5 6 7
损失掩码: 0 0 1 1 1 1 1 1
0表示忽略该位置的误差,1表示计入。前两个位置已有旧计划覆盖,监督便集中到后面仍能影响执行的部分。这里改变的是损失的计算范围,前两步动作仍会发生。论文使用flow-matching策略,具体监督量是生成过程的流场,对应论文式(2)、(3)。
部署时,新模型要解决的是"已经走了这两步,后面怎么办"。把监督重点移到后缀,训练目标就更贴近它实际要负责的部分。论文还会改变掩码长度,并用课程调整训练过程,让模型接触不同等待条件。
单独把损失前缀遮住,仍有一个现实落差:部署时那段旧动作来自模型自己的预测,可能有误差;训练时若总给它完美答案,后续衔接依然容易过于乐观。
5. 旧计划有误差,训练时也要见过
REMAC的第二个做法,是逐渐改变训练动作输入的来源。早期更多使用真实动作,后期逐步改用预训练策略生成的动作,仍要求微调后的策略给出正确结果。论文用伯努利采样在两种来源中选择,并随训练降低采用真实动作的概率。
同样等两步,前缀可能很准,也可能已经偏了一点。只改变等待长度,没有覆盖这个差别。逐步换用预训练策略的预测,就是让训练输入也带上模型可能产生的误差。
论文另加入残差对齐目标,完整设置在实验中进一步提高了成绩。但论文式(5)里的两个预训练预测若为同一张量,残差之差便会抵消这两项;在二值掩码下,得到与直接误差相同的数值形式。仅凭显示公式还不足以独立解释这部分增益,仍需核对实现中的梯度路径、输入与损失配置。
6. 初始化拿四步,真正固定的是两步
训练完成后,生成动作的过程也要与之配合。
在已有上一块动作时,REMAC把旧块最后 P−h 个动作放到新采样初始化序列的开头,其余位置置零。回到例子,A4到A7可以用于初始化新块的前四项。
但初始化不等于四项都必须永远固定。采样迭代中,由延迟掩码指定的前缀保持为旧动作,其余位置可以由模型更新。d=2时,关键是前两项与等待期间实际采用的A4、A5一致;后面的动作在这个条件下继续生成。
这样,执行器等待时走的是A4、A5,模型生成后缀时也以A4、A5为前缀。两边终于用上了同一段动作,而不再各自假设一套开头。
训练和采样由此连在一起:训练时见过这种延迟和前缀质量,采样时又把旧前缀固定下来。接下来要看的是,这套安排在任务里到底有没有收益。
适配采用LoRA,增加的参数量至多为原模型的1.5%,权重可合并回主干。也就是说,多做的工作主要发生在训练阶段,运行时省去了RTC一类额外修正计算。对于本来就来不及更新动作的系统,这种成本放在哪里的区别很实际。
7. d=4这一列,比总成绩更值得拆开看
论文先在Kinetix仿真器的12个高动态任务上测试。预测窗口P=8,延迟d从0增加到4;每个延迟下还评估多个执行窗口,Table 1报告的是相应设置的平均成功率。

图 3:依据REMAC v1 Table 1重绘。各曲线对应逐步增加组件的设置,纵轴是仿真任务成功率;不是后文真机实验的完成进度,也不是本项目重新训练所得。
先看d=4这一列。朴素异步的平均成功率为0.451;只加LoRA、没有相应训练策略时为0.428。参数多一点,并没有在这个设置里自然解决问题。
加入前缀掩码后升到0.636,再加入自条件课程到0.710,完整方法到0.779。随着训练目标与输入条件逐步贴近异步执行,成绩也在这条实验路径上持续上升。
完整方法比朴素异步高32.8个百分点。只加LoRA那一项却没有提高,说明在这组实验里,多一点适配参数还不够。损失算在哪些位置、输入里出现什么质量的旧预测,才是需要一起改的训练条件。
这是论文特定设置下的累加消融,各增量依赖此前已加入的组件,不能视为单个组件的独立贡献。
8. 真机表里的0.812,是什么成绩
真实机器人实验使用Franka Research 3机械臂,控制频率15 Hz,执行窗口h=8,端到端延迟约122---140毫秒,论文报告有效延迟为2或3步。每个任务、每种方法进行30次评估,每次上限300步。
| 方法 | Grasp-Easy | Grasp-Medium | Grasp-Hard |
|---|---|---|---|
| 同步推理 | 0.805 | 0.718 | 0.670 |
| 朴素异步 | 0.825 | 0.825 | 0.460 |
| 时序集成 | 0.825 | 0.868 | 0.717 |
| RTC | 0.823 | 0.848 | 0.753 |
| REMAC | 0.903 | 0.943 | 0.812 |
论文Table 3,指标为平均完成进度。任务分为接近、抓握、移动、放置四个阶段,再对多次试验的归一化进度取平均。
REMAC在三个难度的平均进度上均领先。阅读时应保留"进度"这个单位:0.812汇总的是多次试验推进的程度,完整成功的试验占比还需要单独的统计。
Hard任务中,朴素异步从同步的0.670降到0.460,尤其能说明"不断运动"不是唯一目标。减少空等的安排,若带来更严重的感知与执行错位,也可能使任务走得更差。REMAC在该项达到0.812,表明论文的适配在这一条件下有效。
论文这一实现中,RTC额外增加55---64毫秒延迟,REMAC没有同类推理时修正。这让它的优势更具体了:成绩提高的同时,没把额外修正工作继续堆到推理阶段。代价是前面的任务数据和训练适配,采用它之前要把这部分投入算进去。
9. 接到Q1,先别把200毫秒算成100步
Q1公开接口文档建议HAL关节指令以500---1000 Hz下发,但论文里的d是策略动作时间步。把这两个频率混用,会把同一段推理延迟算成完全不同的前缀长度。
例如,教学配置中的策略动作频率是10 Hz,200毫秒对应2个策略步;HAL如果按500 Hz运行,同一段时间覆盖100个下发周期。这100帧可能由插值或低层控制器生成,不能直接拿100作为策略动作块的掩码长度。
接入前先把几个时刻记全:观测形成、模型拿到输入、推理结束、结果进入控制器。旧缓存还能维持多久也放在同一张时间线上。GPU耗时只是其中一段,输入排队、传输和结果交接都可能继续吃掉旧缓存。
有了这些记录,就能先离线回放索引:结果延迟返回时,是不是按A4、A5、B2、B3推进?旧位置有没有重放?缓存耗尽后做什么?这一步值得放在模型适配之前。新块若接错了位置,后面比较策略成绩也很难判断究竟是哪一层出了问题。
索引与交接成立之后,再用任务数据判断是否需要REMAC式适配。Q1输出层还要满足时间戳严格递增和单帧位置增量约束;观测字段 stamp、meas_stamp 的生产端含义也要先核实,才能把整条时间线接起来。
适用范围:本文未在Q1部署REMAC,也未审查训练源码。主实验围绕π₀,附录包含ACT适配。论文§4.3说明掩码超参数不是延迟硬上限,附录G仍提醒超出预设延迟范围时可能失败;采用时应按任务核实延迟与微调数据需求。
新块返回后跳到B2,是时间已经过去的结果;让B2适应A4、A5,则是策略需要学习的事。REMAC把这两个问题接起来,靠前缀掩码、自条件训练和采样约束共同处理。
实际部署时也可以照这个顺序检查:先确认哪两步已经执行,再确认新计划依据什么续上。能把这一次交接说清楚,才知道下一步该改调度,还是该改模型。
资料:REMAC v1论文、作者项目页、公开代码仓库、启元SDK下载。方法解读对应论文§4,仿真及真机数据分别引自Table 1与Table 3。欢迎在启元开发者社区交流策略部署问题。