从 500 Hz 控制到 30 Hz 数据集:Action 降采样如何改变控制语义

机器人数据集经常同时面对两种频率:遥操作与底层控制需要较高频率,图像采集、数据存储和模型推理则通常运行得更慢。一个自然做法是对高频控制流等间隔抽样,让每个低频 observation 配上一条 action。

但 action 与普通传感器读数不同。图像或 state 描述某个时刻观察到了什么,action 则是一条会在随后一段时间内影响系统的控制命令。对 action 抽样,不仅减少了数据点,还会丢失相邻命令及其作用时间。之后如果把留下的样本重新解释为低频保持目标或插值终点,得到的已经不是原来的控制过程。

这次实验从一段 UR10e 遥操作示范出发,对比 30 Hz dataset action、典型的 300 Hz 推理式插值,以及保留原始时序的约 500 Hz 外部控制指令回放。结果显示:30 Hz 原样回放相对原始实际轨迹晚约 21 ms;将当前帧 action 插值到 300 Hz 后,延迟增加到 38 ms;把插值目标改为下一帧后,延迟下降到 4 ms;直接回放原始高频控制事件时,没有检测到明显的额外延迟。

这些数字不是为了比较“30 Hz 和 300 Hz 哪个更好”,而是用来回答一个更基础的问题:一串高频控制指令被抽取成低频 action 后,留下的数值在时间轴上究竟还代表什么?

先看信号如何流动

本文只使用下面四组核心变量:

符号 名称 定义
$u_i$ 高频外部控制指令 在主机时刻 $t_i$ 实际提交给机器人控制接口的第 $i$ 条目标,约 500 Hz
$a_k$ dataset action 第 $k$ 个 30 Hz 数据帧抽取到的某一条 $u_i$,即 $a_k=u_{j(k)}$
$S(t)$ 原始实际轨迹 录制示范时,RTDE(Real-Time Data Exchange)报告的实际 TCP 位姿
$R_m(t)$ 回放实际轨迹 使用回放方法 $m$ 时,RTDE 报告的实际 TCP 位姿

$i$ 是高频指令序号,$t_i$ 是其主机提交时刻;$k$ 是 30 Hz 数据帧序号,$j(k)$ 表示第 $k$ 帧关联到的高频指令序号;$m$ 表示一种回放方法。

$u_i$ 包含经适配层限幅和夹爪量化后实际提交的 TCP 位姿与夹爪目标;本文的定量比较只使用 TCP 位姿。原始分析图中的 sent_action 是日志字段名,对应本文的 $u_i$。

flowchart LR
    U["高频控制事件<br/>u[i] 与发送时刻 t[i]<br/>约 500 Hz"]
    A["低频训练标签<br/>a[k] = u[j(k)]<br/>30 Hz"]
    H["原始高频回放<br/>保留相邻 t[i] 间隔"]
    Z["30 Hz 原样回放<br/>保持 a[k]"]
    I["300 Hz 推理式插值<br/>以 a[k] 或 a[k+1] 为终点"]
    R["回放实际轨迹<br/>R_m(t)"]
    S["原始实际轨迹<br/>S(t)"]
    C["统一 RTDE 比较"]

    U -->|每个数据帧只抽取一条| A
    U --> H
    A --> Z
    A --> I
    H --> R
    Z --> R
    I --> R
    R --> C
    S --> C

图中的关键断点发生在 $u_i\rightarrow a_k$:一个 30 Hz 数据帧只关联到某一条真实提交的控制指令,而相邻数据帧之间的其他高频指令并不进入 action 序列。后面的三种低频回放,实际上是在为 $a_k$ 重新指定执行方式。

Action 不是普通的传感器采样

在原始遥操作中,机械臂以约 500 Hz 接收绝对位姿目标。第 $i$ 条外部控制指令 $u_i$ 提交后,直到约 2 ms 后 $u_{i+1}$ 到来。从时间轴上看,它是一串带有发送时刻和先后关系的控制事件:

u[i] ──约 2 ms──> u[i+1] ──约 2 ms──> u[i+2]

抽取到 30 Hz 后,每 33.3 ms 只留下一个 $a_k$。这个值确实等于某一条真实提交过的 $u_i$,但原来位于两个 dataset 帧之间的其他 $u_i$ 不再出现在低频序列中。$a_k$ 可以说明采样附近提交了哪个目标,却不能单独描述整个 33.3 ms 内机器人依次接收了哪些目标。

当低频序列被再次执行时,还会引入新的解释。例如,同一个 $a_k$ 可以被当作:

  • 当前周期一开始立即发送并保持的目标;
  • 当前 33.3 ms 周期结束时应到达的目标;
  • 从当前实测 state 出发进行高频插值的终点。

这三种执行方式使用相同的数组,却会产生不同的控制输入。降采样后真正需要重新确认的,不只是数值精度,而是 action 的时间归属和作用范围。

原始 UR10e 录制包含三条数据链路

原始示范是一个 335 帧、30 Hz 的 LeRobot episode,持续约 11 秒。录制时同时存在三条频率和时间语义不同的链路。

第一条是约 500 Hz 的遥操作控制。程序读取 UR 状态和 Sigma 输入,计算上层请求目标;适配层完成限幅和夹爪量化后,将 $u_i$ 提交给机器人控制接口。高频控制日志同步保存发送前状态、上层请求目标、实际提交的 $u_i$,以及每次状态读取和指令提交的主机时间。

第二条是约 500 Hz 的 RTDE 记录。它直接订阅机器人控制器报告的实际 TCP 位姿和内部目标 TCP 位姿。这条链路使用控制器时间,与外部遥操作控制日志相互独立。

第三条是 30 Hz dataset 采样。每个 dataset 帧从最近成功完成的控制周期中提取发送前状态,并把该周期的 $u_i$ 保存为 $a_k$,再读取两台相机的最新缓冲帧。dataset state 不是一次新的 30 Hz 硬件测量,图像的 dataset timestamp 也不能直接视为曝光时刻。

数据 记录内容 主要时间来源
高频控制日志 发送前状态、上层请求目标、$u_i$ 主机单调时钟
RTDE 日志 实际 TCP 位姿、控制器内部目标 TCP 位姿 机器人控制器时间
30 Hz dataset 抽取的 state、$a_k$ 与最新相机帧 dataset 采样时间与控制序号

这里的关键是:$a_k$ 是 $u_i$ 的抽样结果,不是控制器内部目标 TCP 位姿的降采样。两种目标位于控制链路的不同阶段,名称相似并不代表物理含义相同。

从 5531 条控制事件到 335 个训练标签

这个 episode 对应的原始控制区间包含 5531 条连续的 $u_i$,实际平均频率约为 496.853 Hz;最终 dataset 只有 335 个 $a_k$。平均来看,一个 30 Hz dataset 周期覆盖约 16~17 次真实控制更新。

降采样保留了:

  • 某个真实控制周期实际提交的 $u_i$ 数值;
  • 与该 $u_i$ 同源的发送前 state;
  • dataset 帧与原始控制序号的关联。

低频序列 ${a_k}$ 本身没有保留:

  • 相邻 dataset 帧之间完整的命令序列;
  • 每条中间命令的发送时刻和持续时间;
  • 高频目标在 33.3 ms 区间内如何变化。

因此,${a_k}$ 是高频控制流 ${u_i}$ 的采样视图,却不是原始控制过程的完整低频等价物。这不是说 $a_k$ 的数值被改坏了,而是它离开高频事件流后,不再携带足够的信息来唯一确定原来的执行过程。

从训练标签到推理目标,又发生了一次解释

数据录制时,$a_k$ 等于采样附近某个已经真实提交过的 $u_i$。模型训练后,推理系统通常每 33.3 ms 产生一个新的 $a_k$,底层执行适配器还需要决定如何在两个推理时刻之间控制机器人。

这次实验中的 300 Hz 插值模拟一种典型情况:模型以 30 Hz 提供目标,执行侧以 300 Hz 从当前实测 state 平滑移动到该目标。XYZ 和夹爪采用线性插值,姿态采用球面线性插值(SLERP),并在周期末完整提交目标。

这个过程没有恢复被降采样丢失的 $u_i$。它只是根据低频端点重新构造了一条平滑输入,同时把 $a_k$ 解释为当前插值周期的终点。300 Hz 因而只是执行适配器的频率;它无法自行回答这个端点应该属于当前周期还是下一个周期。

四种回放分别检验什么

为了观察不同解释造成的结果,我比较了四种回放方式。每次运行都先通过直线运动指令到达原始首帧位姿,再开始正式回放。

回放方式 执行解释 要检验的问题
30 Hz 原样 $a_k$ $a_k$ 立即发送,帧间零阶保持 抽样值被直接当作低频保持目标时会怎样?
300 Hz 插值 $a_k$ 从实测 state 插值到 $a_k$ 典型推理式插值能否复现原始时序?
300 Hz 插值 $a_{k+1}$ 当前周期改为插值到 $a_{k+1}$ 调整一帧时间归属后,误差是否随之移动?
原始高频 $u_i$ 保留连续指令与相邻 $t_i$ 的间隔 保留原始控制事件时能否复现实际轨迹?

30 Hz 原样组发送 335 个 $a_k$。两种 300 Hz 回放分别发送 3350 和 3340 个插值点;$a_{k+1}$ 组没有补齐最后一帧。高频组不插值、不移动标签,直接回放 5531 条 $u_i$ 并保留相邻 $t_i$ 的间隔,平均频率约为 496.853 Hz。

$a_{k+1}$ 不是面向所有策略的改进方案,而是一个诊断对照:如果仅改变 action 的帧级时间归属就能移动实际轨迹,那么误差主要来自标签和执行周期之间的时间解释,而不只是发送频率或空间插值质量。

统一使用原始实际轨迹作为参考

四次回放全部与原始实际轨迹 $S(t)$ 比较,不使用 dataset state 参与延迟评分。$S(t)$ 直接来自 RTDE 报告的实际 TCP 位姿,因此可以避免不同实验引用不同 state 定义。

设回放方法为 $m$。分析在原始实际轨迹 $S(t)$ 与回放实际轨迹 $R_m(t)$ 的共同覆盖区间约 0.5~10.93 秒内进行,排除前 0.5 秒启动段;位置线性插值到 2 ms 网格,姿态使用 SLERP。随后在 $[-300,300]$ ms 范围内,以 1 ms 步长寻找:

\[\tau^*=\underset{\tau}{\operatorname{argmin}}\; \operatorname{mean}\left(\left\|S_{xyz}(t)-R_{m,xyz}(t+\tau)\right\|^2\right).\]

正的 $\tau$ 表示回放实际轨迹更晚。所有候选延迟使用相同的 5215 个参考点。分析还检查 XYZ 分轴结果、速度有限差分相关性,以及 2 秒滑动窗口中的局部延迟。

同时报告两种位置误差:未平移 RMSE 直接比较相同相对时刻,描述实际复现结果;平移后 RMSE 扣除最佳拟合时间差,帮助判断轨迹形状是否一致。后者用于诊断,不能替代前者。

结果:相同 action 数组,不同时间解释

统一计算得到:

回放方式 位置拟合延迟 速度拟合延迟 未平移位置 RMSE 平移后位置 RMSE
30 Hz 原样 $a_k$ 21 ms 22 ms 1.941 mm 0.085 mm
300 Hz 插值 $a_k$ 38 ms 38 ms 3.492 mm 0.084 mm
300 Hz 插值 $a_{k+1}$ 4 ms 3 ms 0.387 mm 0.074 mm
原始高频 $u_i$ 0 ms 1 ms 0.095 mm 0.095 mm

四种回放方式与原始 RTDE actual 轨迹的 XYZ 对比

四种回放的实际 TCP 轨迹整体都很接近。图中没有扣除拟合延迟;在完整时间尺度上,几十毫秒的错位不容易直接分辨。

位置与速度拟合得到的延迟彼此接近,说明各组结果在两种指标下都保持一致。下面结合每种回放的执行方式,解释这些时间差异。

30 Hz 原样回放没有重现帧间的 16~17 个 $u_i$,而是将每个 $a_k$ 保持整个 33.3 ms 周期,因此实际轨迹相对 $S(t)$ 晚约 21 ms。

300 Hz $a_k$ 回放虽然增加了发送点,却仍将 $a_k$ 作为当前周期末的插值目标,拟合延迟反而增至 38 ms。增加的只是低频端点之间的平滑采样密度,并没有恢复原始的 $u_i$。

将插值目标从 $a_k$ 改为 $a_{k+1}$ 后,拟合延迟从 38 ms 降至 4 ms,变化了 34 ms,接近一个 30 Hz 帧周期(33.3 ms)。空间插值和发送频率都未改变;仅调整 action 所属的执行周期,就显著改变了回放轨迹的时间位置。这说明帧级时间解释足以主导回放误差。

原始高频组保留了连续的 $u_i$ 和相邻 $t_i$ 的间隔,未平移位置 RMSE 为 0.095 mm,在当前分析下没有检测到明显的额外延迟。它说明相同控制事件与相似控制器动态可以产生高度一致的实际响应,但不能据此认为机器人对单条指令没有物理响应时间。

平移后轨迹接近,说明差异主要在时间轴

前三种低频或插值回放在扣除各自的最佳时间平移后,位置 RMSE 都下降到约 0.07~0.09 mm。它们生成的空间轨迹形状高度相似,未平移误差的主要来源是时间错位,而不是路径被插值得明显变形。

滑动窗口结果也保持稳定:30 Hz 原样 $a_k$ 组约为 20~21 ms;300 Hz $a_k$ 组约为 37~38 ms;$a_{k+1}$ 组的九个窗口均为 4 ms;原始高频 $u_i$ 组为 0~1 ms。结果不是由某一个局部转折偶然决定的。

这也解释了为什么仅观察完整 XYZ 曲线容易低估问题。路径几乎重合,不代表同一位置出现在同一时刻;而对于需要视觉闭环、接触或多机械臂协同的任务,时间归属本身就是 action 语义的一部分。

不要把语义变化与机器人动态混为一谈

原始材料中还存在两种含义不同的目标。把同一 RTDE 流中的控制器内部目标轨迹与实际轨迹 $S(t)$ 比较,联合 XYZ 位置拟合约为 0 ms,分轴和速度结果为 0~1 ms,未平移位置 RMSE 约为 0.090 mm。

把 $u_i$ 的主机发送时刻近似映射到 RTDE 时间后,再与 $S(t)$ 比较,位置拟合约为 101 ms,速度拟合约为 93 ms。

外部控制指令、控制器内部目标与实际 TCP 位姿的关系

$u_i$ 明显领先;控制器内部目标与 $S(t)$ 在这次轨迹中几乎重合。两种目标位于控制链路的不同位置。原图图例中的 sent_action 即 $u_i$。

约 100 ms 描述外部目标到实际反馈之间的整体动态关系,可能共同包含接口处理、轨迹生成、限速、滤波和机械响应。它不是这次降采样产生的帧级错位,也不能被归到控制器内部目标上。位置与速度拟合结果并不完全一致,也说明这段响应不是严格的单一固定时间平移。

同样,高频回放相对原始实际轨迹得到 0 ms,只表示在当前分析分辨率和同步条件下没有检测到明显的额外相对延迟。原始示范和回放都包含相似的机器人动态,这个结果不代表机器人能瞬时到达外部控制指令。

这次实验能说明什么

这组结果支持以下判断:

  • ${u_i}$ 是带有发送时刻 $t_i$ 的高频控制事件序列;
  • ${a_k}$ 只保留了其中的抽样值,没有保留帧间完整的控制过程;
  • 将 $a_k$ 解释为保持目标或插值终点,会重新定义其作用时间和执行周期;
  • 300 Hz 插值提高了端点之间的发送密度,但没有恢复原始的 $u_i$;
  • $a_k$ 与 $a_{k+1}$ 对照表明,一个 dataset 帧量级的时间归属变化会直接反映到实际轨迹上。

它不能单独给出一种适用于所有 action 类型、控制器和任务的降采样方法,也不能证明所有模型都应该使用下一帧 action。不同表示中的绝对位置、增量位置、速度、力矩或 action chunk 具有不同语义,需要各自的实验和控制定义。本文的结论止于识别语义变化及其在本次回放中的影响。

结果还受单个 episode、每种方法各一次成功回放、初始内部状态、设备条件和主机—机器人时钟近似映射影响。1 ms 是搜索步长,不是经过标定的同步精度;亚毫米 RMSE 是相对轨迹复现误差,也不是 UR10e 的绝对定位精度。

结论

从约 500 Hz 的 ${u_i}$ 中抽取 30 Hz 的 ${a_k}$,并不是把同一控制过程换一种采样率保存。$u_i$ 只在相邻高频指令之间短暂生效;进入低频数据集后,$a_k$ 成为与 state 配对的离散标签;进入推理执行器后,它又可能被解释为一个周期内保持的目标或周期末的插值终点。

300 Hz 插值实验的意义正在这里:它没有证明插值本身好或坏,而是展示了即使使用相同的 action 数值和更高的发送频率,只要 action 对应的执行周期发生变化,实际轨迹就会出现一个 dataset 帧量级的错位。

Action 降采样保留了部分目标数值,却不自动保留完整的控制语义。理解一条 action 属于哪个时刻、作用多久、由执行器如何消费,是解释机器人数据和回放结果的前提。




Enjoy Reading This Article?

Here are some more articles you might like to read next: