前言

在人形机器人整机调试中,我们经常用“延迟”解释一些难以复现的问题:仿真中动作干净,实机上却出现落脚发软、触地回弹、关节振荡;同一套策略更换一批关节模组后表现明显变化;主控侧增加几毫秒推理时间似乎没有明显影响,模组内部增加一两个控制周期却会让动作产生肉眼可见的差异。

这些现象容易让人产生一个误区:只要测出“策略到电机”的端到端延迟,再想办法把这个数字降下来,就能解决问题。

实际上,延迟对系统的影响并不只由毫秒数决定,更取决于两个问题:

  1. 延迟发生在闭环的什么位置;
  2. 延迟相对于该闭环的带宽有多大。

对于系统负责人而言,真正需要管理的不是一个笼统的“总延迟”,而是一套完整的延迟拓扑、延迟预算、测量方法、仿真模型和验收标准。本文结合人形机器人常见的“低频策略 + 高频关节阻抗控制”架构,对整机延迟问题进行系统梳理,并重点讨论它对策略部署、Sim2Real 和 Real2Sim 的影响。


一、先建立一个正确认识:延迟的危害不等于延迟的毫秒数

以常见的关节力位混合控制为例,上层向关节模组发送:

  • 目标位置 qdq_dqd
  • 目标速度 q˙d\dot q_dq˙d
  • 位置增益 KpK_pKp
  • 速度增益 KdK_dKd
  • 前馈力矩 τff\tau_{ff}τff

关节最终执行的控制律通常可以写成:

τcmd=τff+Kp(qd−q)+Kd(q˙d−q˙) \tau_{cmd} =\tau_{ff} +K_p(q_d-q) +K_d(\dot q_d-\dot q) τcmd=τff+Kp(qdq)+Kd(q˙dq˙)

从机械效果看,这相当于在关节上构造一个虚拟的“弹簧—阻尼器”:

  • KpK_pKp 决定关节偏离目标后被拉回去的力度,即虚拟刚度;
  • KdK_dKd 抑制运动和振荡,即虚拟阻尼;
  • τff\tau_{ff}τff 提供主动的前馈输出。

在这种架构下,上层指令晚到 5 ms,与关节反馈和力矩执行晚 5 ms,并不是同一件事。

1. 上层延迟:目标来晚了

如果策略输出或通信存在延迟,关节可能暂时仍在执行上一周期的目标:

τ(t)=Kp[qd(t−Tu)−q(t)]−Kdq˙(t)+τff(t−Tu) \tau(t) =K_p[q_d(t-T_u)-q(t)]-K_d\dot q(t)+\tau_{ff}(t-T_u) τ(t)=Kp[qd(tTu)q(t)]Kdq˙(t)+τff(tTu)

此时,目标 qdq_dqd 是旧的,但关节位置和速度反馈仍然是当前的。模组内部闭环仍在稳定工作,只是在稳定地追踪一个稍旧的参考目标。

因此,这类延迟通常首先表现为:

  • 动作整体相位滞后;
  • 轨迹跟踪误差增加;
  • 前馈力矩与运动时序发生偏移;
  • 接触切换和快速响应不够及时。

它主要影响的是“跟踪是否及时”,不一定直接破坏关节的局部稳定性。

2. 内环延迟:纠偏做晚了

如果关节控制器使用的是过去的位置和速度:

τ(t)=Kp[qd(t)−q(t−Td)]+Kd[q˙d(t)−q˙(t−Td)] \tau(t) =K_p[q_d(t)-q(t-T_d)] +K_d[\dot q_d(t)-\dot q(t-T_d)] τ(t)=Kp[qd(t)q(tTd)]+Kd[q˙d(t)q˙(tTd)]

那么控制器实际上是在根据关节过去的运动状态,决定现在应该输出什么力矩。

对于较小的延迟,可以近似写成:

q(t−Td)≈q(t)−Tdq˙(t) q(t-T_d)\approx q(t)-T_d\dot q(t) q(tTd)q(t)Tdq˙(t)

只看位置反馈,有:

−Kpq(t−Td)≈−Kpq(t)+KpTdq˙(t) -K_pq(t-T_d) \approx -K_pq(t)+K_pT_d\dot q(t) Kpq(tTd)Kpq(t)+KpTdq˙(t)

而正常的阻尼力矩应该是 −Kdq˙-K_d\dot qKdq˙。因此,延迟的刚度反馈会产生一项与正常阻尼方向相反的作用。低频近似下,可以理解为:

Kd,eff≈Kd−KpTd K_{d,\mathrm{eff}}\approx K_d-K_pT_d Kd,effKdKpTd

这意味着:

  • KpK_pKp 越高,同样的延迟越敏感;
  • KdK_dKd 越小,越容易出现阻尼不足;
  • 原本用于稳定关节的反馈,可能在部分运动阶段向系统注入能量;
  • 最终表现为超调、回弹、振荡,严重时甚至失稳。

因此,可以用一句话概括两者区别:

上层延迟是“目标来晚了”,主要影响跟踪;内环延迟是“纠偏做晚了”,会直接改变关节的等效阻抗和闭环稳定性。


二、为什么模组内部 1~2 ms,可能比上层 5~10 ms 更敏感

纯延迟在频域中可以表示为:

e−sT e^{-sT} esT

它不直接改变幅值,却会引入与频率成正比的相位滞后:

Δϕ=−ωT=−360∘fT \Delta\phi=-\omega T=-360^\circ fT Δϕ=ωT=360fT

例如,同样是 2 ms 延迟:

  • 对 2 Hz 运动只引入约 1.44∘1.44^\circ1.44 相位滞后;
  • 对 20 Hz 响应引入约 14.4∘14.4^\circ14.4
  • 对 50 Hz 响应引入约 36∘36^\circ36
  • 对 100 Hz 响应引入约 72∘72^\circ72

在人形机器人中,上层策略通常运行在 50 Hz 左右,一个控制周期约为 20 ms,动作主体频率可能只有几 Hz;但关节局部控制、触地冲击、结构弹性和电流响应涉及的频率往往高得多。

所以,不能直接比较“上层 10 ms”和“模组内 2 ms”哪个更大,而应比较:

ωT \boxed{\omega T} ωT

也就是延迟相对于所在闭环带宽的大小。

延迟会持续侵蚀闭环相位裕度。若要在延迟不变的情况下恢复稳定裕度,通常只能降低闭环带宽或减小控制增益,代价则是关节响应变慢、刚度下降。控制系统中的时延与相位裕度之间存在直接关系,这也是高性能伺服系统特别重视“采样—计算—PWM 更新”链路延迟的原因。


三、作为系统负责人,需要建立整机延迟拓扑

整机延迟不能只按硬件模块划分,更应该按信号在控制闭环中的作用划分。

1. 观测链路延迟

包括:

  • 编码器、IMU、力传感器等硬件采样;
  • 传感器内部滤波;
  • 驱动器状态回传;
  • 总线传输与数据接收;
  • 中间件转发;
  • 状态估计、坐标变换和观测拼接。

它决定策略在时刻 ttt 看到的状态,实际上对应的是多久以前的机器人。

如果观测延迟为 ToT_oTo,策略真正获得的可能是:

ot≈o(t−To) o_t \approx o(t-T_o) oto(tTo)

这会破坏训练时默认的“当前观测对应当前状态”的假设,使策略面临隐含的部分可观测问题。

2. 策略计算延迟

包括:

  • 神经网络推理;
  • CPU/GPU 数据搬运;
  • 线程调度;
  • 控制周期等待;
  • 推理完成后等待下一次发送窗口。

需要特别注意:推理耗时并不等于策略延迟。假如一次推理只用了 2 ms,但任务刚好错过发送周期,又等待了 18 ms,那么实际控制年龄远大于模型的纯推理时间。

3. 指令传输与生效延迟

包括:

  • 数据序列化;
  • DDS、共享内存、Zenoh 或自研中间件转发;
  • CAN、EtherCAT、RS-485 等总线调度;
  • 驱动器接收、解析和寄存器更新;
  • 指令是否立即生效,还是等待下一个内部控制周期。

这部分延迟主要决定新参考目标何时进入关节内环。

4. 关节反馈与阻抗计算延迟

它描述从关节真实运动发生变化,到新的 PD 力矩指令被计算出来所经历的时间。

这是影响关节等效刚度、阻尼和稳定裕度的关键延迟之一,尤其需要关注:

  • 位置反馈的新鲜度;
  • 速度估计使用了多长的差分窗口;
  • 低通滤波带来了多少群延迟;
  • PD 任务的实际执行周期是否稳定;
  • 反馈和控制输出是否属于同一个时间截面。

5. 力矩执行延迟

它描述从目标力矩产生,到实际电流和机械力矩建立起来的时间,包括电流环、PWM 更新以及电机电气动态等综合效果。

即使 PD 使用的是最新状态,如果实际力矩晚到,机械闭环中仍然存在执行侧相位滞后。

6. 多关节同步误差与延迟抖动

人形机器人不能只看单个关节的平均延迟,还要关注:

  • 左右腿指令是否同一时刻生效;
  • 不同总线或不同驱动板之间是否同步;
  • 关节状态是否来自同一个采样时刻;
  • 延迟是固定值,还是在一个范围内随机变化;
  • 是否存在偶发长尾延迟和丢周期。

固定的 2 ms 延迟通常可以被辨识、建模和补偿;在 0.5~4 ms 之间随机跳动的延迟更难处理,因为策略面对的是一个不断变化的系统。对整机而言,延迟的方差、长尾和跨轴不一致性,有时比平均值更重要。


四、延迟对策略与 Sim2Real 的主要影响

1. 破坏训练环境中的时序假设

大多数强化学习环境默认每个控制周期执行以下过程:

  1. 读取当前状态;
  2. 根据当前状态计算动作;
  3. 动作立即作用于仿真模型;
  4. 仿真向前推进一个控制周期。

而实机更接近:

  1. 读取不同时间戳的传感器状态;
  2. 状态经过滤波和拼接;
  3. 策略根据旧观测计算动作;
  4. 动作经过调度和总线传输;
  5. 模组在稍后的内部周期中应用目标;
  6. 实际力矩再经过电流和机械响应建立。

因此,仿真中的 ot→at→τto_t\rightarrow a_t\rightarrow\tau_totatτt,在实机中可能变成:

o(t−To)→a(t−To−Tp)→τ(t−To−Tp−Ta) o(t-T_o) \rightarrow a(t-T_o-T_p) \rightarrow \tau(t-T_o-T_p-T_a) o(tTo)a(tToTp)τ(tToTpTa)

这不仅是动作晚了,而是观测、动作和力矩已经不再属于同一个物理时刻。

2. 改变策略所面对的真实动力学

如果训练时关节力矩可以立即响应,而实机存在反馈延迟、力矩建立延迟和速度滤波,那么实机关节的等效阻抗已经不同于仿真。

策略在训练中学到的是:

输出某个目标位置后,关节会以某种刚度、阻尼和响应速度工作。

但实机可能表现为:

  • 等效阻尼更低;
  • 触地后下沉更多;
  • 力矩峰值到达更晚;
  • 关节存在额外振荡;
  • 左右腿或不同关节响应不同步。

即使质量、惯量、摩擦和电机峰值参数全部准确,延迟模型错误仍然会造成明显的 Sim2Real gap。

3. 接触状态下的误差会被全身耦合放大

在人形机器人上,延迟影响最明显的往往不是空中摆动,而是:

  • 足底触地;
  • 单双支撑切换;
  • 快速起步和停止;
  • 跳跃落地;
  • 外力扰动恢复。

触地冲击包含较高频率成分。某个踝关节或膝关节晚几毫秒输出力矩,可能改变足端等效阻抗和地面反作用力,随后进一步影响膝、髋、躯干姿态和质心状态。单关节的局部时序误差,最终会被放大为全身运动差异。

4. 导致策略分布外运行

策略训练时可能从未见过“位置已经越过目标,但力矩仍在按越过前的方向输出”的状态组合。延迟造成的状态—动作错位会把机器人推入训练数据之外的状态分布,策略随后给出的动作可能进一步放大误差。

因此,延迟并不只是增加固定的轨迹误差,它还可能通过闭环递归累积,最终演化为明显的动作失真或失稳。


五、Real2Sim:先辨识真实系统,再决定仿真中应该建模什么

面对延迟问题,我更倾向于优先采用 Real2Sim 思路,而不是一开始就要求所有环节必须达到理想性能。

原因很现实:

  • 不同供应商模组的闭环实现不可见;
  • 供应商给出的控制频率不代表实际闭环带宽;
  • 标称 1 kHz 不能说明反馈年龄、滤波延迟和力矩建立时间;
  • 部分延迟在短期内无法通过主控侧优化消除;
  • 机器人最终需要适应的,是已经采购并装配完成的真实系统。

所以第一步不是猜测内部实现,而是从系统输入输出关系上辨识它。

1. 建立分段延迟测量

至少应区分以下三类:

测量项 起点 终点 主要意义
指令生效延迟 指令发送或到达驱动器 新参考目标开始生效 描述参考侧延迟
反馈控制延迟 关节状态发生变化 PD/目标电流发生响应 描述机械反馈闭环延迟
力矩执行延迟 目标电流或目标力矩变化 实际电流/力矩建立 描述执行侧延迟

如果暂时无法直接读取模组内部变量,也可以将模组视为黑箱,通过小幅阶跃、扫频、扰动恢复和外部测量,辨识其整体响应。

2. 不只记录平均延迟

建议至少记录:

  • 平均值;
  • 标准差;
  • 最大值与高分位值,如 P95、P99;
  • 周期性抖动;
  • 偶发丢周期;
  • 不同关节之间的相对延迟;
  • 空载、带载、不同速度和不同总线负载下的变化。

3. 建立延迟预算表

系统负责人需要把整机控制路径明确到可验收的程度,例如:

环节 目标周期/延迟 实测平均值 P99 抖动 是否进入仿真
传感器采样与状态回传 待定义 实测 实测 实测
状态估计与观测拼接 待定义 实测 实测 实测
策略推理 待定义 实测 实测 实测
中间件与总线发送 待定义 实测 实测 实测
模组目标生效 待定义 实测 实测 实测
关节反馈与力矩建立 待定义 实测 实测 实测

这张表的意义不是追求所有数字越小越好,而是把延迟从“调试经验”变成系统参数和产品指标。


六、Sim2Real:延迟必须插在正确的位置

很多训练环境只通过延迟 action 模拟实机延迟,例如把历史动作放入队列,若干周期后再执行。这样只能模拟“参考目标晚到”,不能完整模拟反馈延迟和力矩执行延迟。

至少应区分以下几类模型。

1. 观测延迟

策略读取历史观测:

otpolicy=ot−do o_t^{policy}=o_{t-d_o} otpolicy=otdo

用于模拟状态回传、滤波和观测构建造成的信息年龄。

2. 动作或目标延迟

关节收到历史动作:

atjoint=at−da a_t^{joint}=a_{t-d_a} atjoint=atda

用于模拟策略计算、调度、总线传输和目标寄存器生效延迟。

3. 关节反馈延迟

仿真 PD 使用历史位置和速度:

τt=Kp(qd,t−qt−df)+Kd(q˙d,t−q˙t−df)+τff,t \tau_t =K_p(q_{d,t}-q_{t-d_f}) +K_d(\dot q_{d,t}-\dot q_{t-d_f}) +\tau_{ff,t} τt=Kp(qd,tqtdf)+Kd(q˙d,tq˙tdf)+τff,t

用于模拟模组内部反馈、速度估计和阻抗计算的综合滞后。

4. 力矩执行动态

最终作用于仿真的力矩不应始终等于瞬时计算力矩,可以使用纯延迟、低通动态或二者组合:

τreal(t)=Gactuator(s)e−sTττcmd(t) \tau_{real}(t) =G_{actuator}(s)e^{-sT_\tau}\tau_{cmd}(t) τreal(t)=Gactuator(s)esTττcmd(t)

其中 Gactuator(s)G_{actuator}(s)Gactuator(s) 可以用于描述电流环、力矩建立、限幅以及模组等效响应。

5. 延迟随机化

训练时应根据实测分布随机化,而不是随意给一个很大的均匀分布。建议分别建模:

  • 固定基线延迟;
  • 小范围周期抖动;
  • 少量长尾延迟;
  • 不同关节之间的差异;
  • 不同观测通道的时间戳差异。

随机化范围过小,无法提高鲁棒性;范围过大,则会迫使策略过度保守,降低动作精度和动态性能。合理做法是以实测分布为中心,再保留一定工程裕量。


七、策略层可以如何适应延迟

在真实延迟暂时无法完全消除时,可以从策略和状态表达上提高鲁棒性。

1. 引入历史观测或循环网络

单帧观测无法区分“状态本身如此”和“状态因为延迟看起来如此”。加入历史观测、历史动作,或者使用 LSTM/GRU,可以帮助策略隐式估计速度、趋势和延迟状态。

2. 向策略提供上一时刻动作

由于当前关节可能仍在执行历史动作,把最近若干步 action 纳入观测,有助于策略理解当前系统实际受到了什么控制输入。

3. 基于时间戳进行状态外推

如果每个状态量都有可靠时间戳,可以根据位置、速度和必要的动力学模型,将旧状态外推到当前时刻。它不能替代低延迟反馈,但可以降低观测年龄带来的状态错位。

4. 参考轨迹适当前瞻

对于已知未来的动作模仿轨迹,可以向策略提供未来若干帧参考,或按照已辨识的延迟对参考相位进行前移,使动作到达实机时更接近正确时刻。

但需要注意,前瞻可以补偿确定性的参考延迟,不能真正修复关节反馈闭环的稳定性问题。

5. 对延迟进行条件化

如果不同机器人、不同关节或不同工况的延迟差异较大,可以将估计延迟、模组类型或执行器状态作为策略条件,让同一策略学会适配不同执行特性。


八、延迟优化:先处理高风险闭环,再优化端到端数字

Sim2Real 和 Real2Sim 是为了让策略能够在现有系统上可靠工作,但这并不意味着不需要优化真实延迟。正确的优先级应该是:

  1. 先测量并确定延迟发生在哪里;
  2. 优先处理位于高带宽闭环中的延迟;
  3. 将暂时无法消除的部分准确建模到仿真;
  4. 再逐步优化主控、通信和计算效率。

1. 架构层

  • 将高带宽反馈闭环尽可能放在靠近执行器的位置;
  • 明确上层策略与底层阻抗控制的带宽分工;
  • 避免上层和模组内部同时实现相互冲突的滤波与控制;
  • 建立统一时钟、时间戳和多轴同步机制。

2. 主控与软件层

  • 使用实时优先级、CPU 绑核和合理的任务调度;
  • 减少不必要的数据复制、序列化和跨进程转发;
  • 避免多级队列和隐式缓存;
  • 将推理完成时刻与总线发送时刻统一分析;
  • 监控周期抖动、偶发阻塞和长尾延迟,而不是只看平均推理时间。

3. 通信层

  • 明确总线调度周期和指令生效时刻;
  • 控制总线负载,避免拥塞导致的不确定延迟;
  • 对多关节进行同步发送和同步生效;
  • 对丢包、旧包和重复包建立明确处理机制。

4. 驱动与控制层

  • 减少不必要的反馈滤波和过长的速度估计窗口;
  • 在噪声与群延迟之间做系统权衡;
  • 根据真实延迟重新设计 KpK_pKpKdK_dKd 和闭环带宽;
  • 避免只通过提高 KdK_dKd 粗暴补偿,因为速度噪声和延迟同样会被放大;
  • 将反馈延迟、力矩执行延迟作为模组选型和供应商验收指标。

九、建议建立的测试与验收体系

延迟治理最终需要落实到可重复的测试流程,而不是依赖某位工程师“感觉这个模组响应更快”。

1. 单关节基础测试

  • 小幅位置阶跃;
  • 速度阶跃;
  • 力矩或电流阶跃;
  • 正弦扫频;
  • 外力扰动后的自由衰减;
  • 不同 Kp/KdK_p/K_dKp/Kd 下的响应对比;
  • 空载与典型负载对比。

关注指标包括:

  • 上升时间;
  • 超调量;
  • 稳态误差;
  • 相位滞后;
  • 共振峰;
  • 扰动衰减速度;
  • 指令与实际电流/力矩的时序关系。

2. 整机动态测试

  • 原地站立扰动;
  • 慢速与快速踏步;
  • 不同地面硬度下的触地;
  • 跑步、急停和落地;
  • 不同总线负载和主控负载下的重复测试。

3. 仿真对齐测试

同一条参考动作分别在仿真与实机中执行,统一比较:

  • qd−qq_d-qqdq
  • q˙d−q˙\dot q_d-\dot qq˙dq˙
  • 目标力矩与实际电流/估计力矩;
  • 触地时刻;
  • 足端速度;
  • IMU 角速度和姿态;
  • 关键关节的频响和衰减特征。

如果加入延迟模型后,仿真中的超调、相位和触地响应更接近实机,说明 Real2Sim 模型正在逼近真实系统;如果只是整体轨迹晚了一点,而关节振荡特征仍然不同,则说明可能只模拟了 action delay,没有覆盖反馈和执行动态。


十、系统负责人的最终关注点

从整机角度看,延迟问题不应被简单归属给算法、软件、通信或关节模组中的某一个团队。它贯穿传感器、主控、策略、中间件、总线、驱动器、电流环和机械系统,是典型的跨模块系统问题。

系统负责人真正需要把控的是以下几件事:

  1. 闭环位置:延迟发生在参考输入侧、观测侧,还是高带宽反馈和执行侧;
  2. 频率关系:延迟相对于所在闭环带宽有多大,而不是只比较毫秒数;
  3. 时间一致性:观测、动作和力矩是否对应同一物理时间;
  4. 统计特征:不仅看平均值,也看抖动、长尾和多轴差异;
  5. 仿真映射:不同延迟必须被插入仿真中的正确位置;
  6. 工程优先级:优先治理会破坏阻尼和稳定裕度的内环延迟,再优化影响跟踪及时性的上层延迟;
  7. 闭环验证:通过 Real2Sim 辨识、Sim2Real 训练和实机复测持续迭代,而不是一次性设定参数。

最终目标并不是把整机所有延迟都降到理论最小,而是做到:

延迟可测量、来源可定位、影响可解释、仿真可复现、策略可适应、指标可验收。

当延迟从一个模糊的“实机效果问题”转化为明确的系统参数后,很多原本依赖反复试错的 Sim2Real 调试,就能够进入可建模、可对比、可迭代的工程流程。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐