在机器人控制系统开发中,“实时性很好”“控制周期很稳定”“EtherCAT 通信正常”,这些描述经常出现在项目测试报告中。但如果进一步追问:系统最大延迟是多少?1 ms 控制周期是否每次都能按时完成?ROS 2、Linux 内核、EtherCAT 主站和伺服驱动器分别引入了多少延迟?很多时候,团队并没有一套统一的测试指标来回答这些问题。
例如,一套采用 ROS 2、IgH EtherCAT Master 和实时 Linux 的机械臂控制系统,设置了 1 ms 的 EtherCAT 通信周期。开发人员运行了cyclictest,发现线程唤醒延迟总体较低,于是认为系统已经满足实时控制要求。
但当机械臂开始执行复杂轨迹,同时运行传感器处理、日志记录和路径规划时,控制线程却偶尔出现超期。进一步检查发现,问题可能来自数据交接中的锁竞争,也可能来自网卡中断、控制算法执行时间波动,甚至可能来自驱动器同步配置。
这说明一个重要问题:实时性不是一个单独的数字,而是一组需要结合任务要求、测量方法和系统边界共同解释的指标。
如果只看平均延迟,可能忽略少量严重的超期事件;如果只看操作系统唤醒延迟,又无法判断整个控制链路是否按时完成;如果只看 EtherCAT 工作计数器,也不能直接证明通信时序和机器人运动响应满足要求。
本文将从机器人实时控制的工程需求出发,建立一套由操作系统、周期线程、通信链路和端到端响应组成的测试指标体系,说明每项指标应该如何理解、怎样测量,以及如何在望获rtLinux 等实时运行平台上形成可复现的验证报告。
一、先定义实时性要求:究竟什么叫“按时完成”?
在开始测试之前,首先需要回答一个问题:系统究竟要满足什么样的实时性要求?
如果没有明确的截止时间、允许误差和运行条件,即使测量出一组非常漂亮的数据,也很难判断它是否满足实际项目需求。
1. 实时性不等于运行速度快
机器人控制任务通常具有周期性。例如,控制程序每隔一定时间读取关节反馈,计算目标输出,再更新伺服驱动器的过程数据。
假设一个控制任务的周期为 1 ms,那么系统计划每秒执行 1000 次。但这并不代表每次任务都可以随意使用 1 ms,也不代表只要平均执行时间小于 1 ms,就算满足实时要求。
需要区分三个概念:
周期(Period):任务计划重复执行的时间间隔。
执行时间(Execution Time):任务实际完成指定工作的耗时。
截止时间(Deadline):任务必须完成工作的最晚时刻。
在某些系统中,任务的截止时间与周期一致;在另一些系统中,截止时间可能早于下一个周期,或者受到 EtherCAT 通信窗口和伺服同步时序的进一步限制。
因此,实时性测试首先应明确:测量的是哪个任务、哪个时间区间,以及任务最晚必须在什么时刻完成。
2. 为什么平均延迟不能代表实时性?
假设某个周期线程在大量测试周期中,大部分唤醒延迟都只有几十微秒,但偶尔会出现明显更大的延迟。
如果只报告平均值,这些少量但重要的异常可能被掩盖。
对于机器人控制系统,更有价值的指标通常包括:
平均值,用于观察总体趋势。
中位数,用于描述典型情况。
高分位数,用于观察尾部延迟。
测试期间观察到的最大值。
超过指定阈值的次数和比例。
连续超期的次数及持续长度。
需要特别强调,测试期间观察到的最大延迟,不等于系统理论上的最坏情况执行时间。
测试只能覆盖已经运行过的环境、负载和持续时间。未被触发的硬件干扰、罕见的锁竞争、驱动异常或其他特殊路径,都可能使实际表现不同。
如果项目需要证明严格的硬实时属性,还需要结合任务模型、最坏情况执行时间分析、平台约束和相应的验证方法,而不能仅凭长时间测试中没有出现超期,就宣称所有运行条件下都不会超期。
3. 为每个关键任务建立实时性需求表
建议在测试开始前,先建立任务需求清单。
| 任务 | 需要定义的内容 | 重点关注的问题 |
|---|---|---|
| ROS 2 目标生成 | 更新周期、数据有效期、处理时限 | 是否存在目标更新延迟或积压 |
| 底层控制线程 | 周期、截止时间、执行预算 | 是否按时唤醒并完成任务 |
| EtherCAT 主站周期任务 | 通信周期、操作顺序、时序约束 | 是否按预期完成数据交换 |
| 反馈处理 | 数据采样时刻、允许的数据年龄 | 控制计算使用的数据是否过期 |
| 伺服驱动器 | 工作模式、同步配置、状态约束 | 命令是否被正确处理与执行 |
| 故障处理任务 | 检测时间、响应时间、处理策略 | 异常是否被及时发现和处理 |
这里的周期和时限应由项目需求、设备手册、控制算法与系统架构共同确定,不能为了方便测试而随意指定。
二、操作系统层:如何测量唤醒延迟、调度抖动和执行时间?
操作系统层的测试主要用于回答:线程能否在预期时刻得到运行机会?系统负载变化是否会明显影响调度行为?实时线程开始运行之后,又需要多长时间完成自己的工作?
这三个问题彼此相关,但并不是同一项指标。
1. 唤醒延迟:线程是否及时获得运行机会?
假设一个周期线程计划在时刻 tkt_ktk 被唤醒,实际开始运行的时刻为 aka_kak,则可以将唤醒延迟定义为:
Lk=ak−tkL_k = a_k - t_kLk=ak−tk
其中,LkL_kLk 表示第 kkk 个周期的唤醒延迟。
如果线程计划在 10.000 ms 开始运行,而实际在 10.035 ms 才开始,那么该周期的唤醒延迟就是 35 μs。
这类指标能够帮助识别操作系统调度和定时唤醒过程中的延迟问题。
Linux 上常用的cyclictest可以用于测量周期线程的唤醒延迟,并观察测试条件下的延迟分布。
例如,以下命令可以作为某些rt-tests版本中的基础测试示例:
Bash
sudo cyclictest \ -m \ -p 80 \ -i 1000 \ -D 10m \ -h 500这条命令的具体参数含义和支持情况,应以目标系统安装的cyclictest版本为准。示例中的优先级、周期、直方图范围和测试时长也不是适用于所有机器人的通用配置。
执行测试时,应记录内核版本、CPU 亲和性、实时调度策略、测试负载和其他关键配置,避免只保留一张结果截图,却无法复现当时的运行条件。
最重要的是,cyclictest测量的是相应测试线程的唤醒行为。它不等于真实 EtherCAT 控制线程的完整执行时间,更不能直接证明伺服驱动器的端到端响应。
2. 调度抖动:每个周期是否都在接近预期的时刻开始?
对于周期任务,可以进一步观察唤醒延迟随时间的变化。
如果连续多个周期的唤醒延迟分别为 20 μs、22 μs、19 μs 和 21 μs,那么这些样本的变化较小。
如果后续出现 25 μs、80 μs、30 μs 和 170 μs,则说明系统在部分周期出现了更明显的延迟波动。
工程上通常会用“抖动”描述周期时序的变化,但必须说明具体计算方法,因为不同团队可能采用不同的定义。
例如,可以统计:
唤醒延迟的标准差。
唤醒延迟的高低范围。
相邻周期实际启动间隔的变化。
实际周期相对理想周期的偏差。
如果使用实际启动时刻 aka_kak,相邻周期的实际间隔可以写为:
Pk=ak−ak−1P_k = a_k - a_{k-1}Pk=ak−ak−1
再将其与目标周期 TTT 比较:
Jk=Pk−TJ_k = P_k - TJk=Pk−T
这里的 JkJ_kJk 是相邻启动间隔相对于目标周期的偏差。
这种方法与单纯统计唤醒延迟并不相同。一个线程可能有相对稳定的唤醒延迟,却仍然因为周期漂移而出现实际启动间隔偏差。因此,测试报告应明确所使用的抖动定义。
3. 线程执行时间:开始运行之后,多久才能完成任务?
唤醒延迟只能回答线程何时开始运行,不能回答线程完成工作需要多长时间。
假设底层控制线程开始运行后,需要完成反馈读取、控制计算、PDO 更新以及相关主站调用。可以在任务开始和结束的位置记录时间:
Ck=fk−akC_k = f_k - a_kCk=fk−ak
其中:
aka_kak 是本周期任务开始执行的时刻。
fkf_kfk 是本周期定义的工作完成时刻。
CkC_kCk 是本周期实际执行时间。
测量时,必须明确任务完成的边界。例如,是指控制算法计算结束,还是指 EtherCAT 主站已经完成指定的数据交换操作?不同边界得到的数值不能直接比较。
建议在真实控制程序中设置多个测量点:
周期线程开始执行。
获取反馈数据完成。
控制算法计算完成。
PDO 数据更新完成。
主站周期通信步骤完成。
本周期任务结束。
这样可以进一步定位执行时间主要消耗在哪个阶段。
4. 如何判断一个周期是否超期?
如果某个任务的截止时间相对于周期启动时刻为 DDD,那么可以根据实际完成时刻判断任务是否满足要求。
fk−tk≤Df_k - t_k \leq Dfk−tk≤D
这里 tkt_ktk 是该周期的计划启动时刻。
如果不等式不成立,就说明任务没有在定义的截止时间之前完成。
注意,这里测量的是相对于计划启动时刻的完成情况,因此既包含唤醒延迟,也包含任务执行时间。
只记录 CkC_kCk 而不记录启动延迟,可能漏掉“任务执行很快,但启动已经晚了”的问题;只记录唤醒延迟,也可能漏掉“启动准时,但任务执行太慢”的问题。
这正是建立多指标测试体系的意义:让不同类型的延迟能够被区分、分析和定位。
三、通信层:EtherCAT 周期、WKC 与分布式时钟应该如何验证?
对于采用 EtherCAT 的机器人控制系统,操作系统实时性只是整个链路的一部分。即使底层线程能够准时启动,也不代表通信、从站处理和伺服执行已经满足项目的时序要求。
因此,需要建立独立的通信层指标。
1. EtherCAT 周期线程按时运行,不代表报文按时到达
假设底层控制线程每隔 1 ms 执行一次。在每次执行中,程序都会更新 PDO,并调用 IgH EtherCAT Master 的相应接口。
这只能说明应用按照预定流程执行了相关操作,不能直接证明报文在固定时刻到达每个从站。
实际通信过程还受到网卡驱动、发送路径、网络负载、从站处理方式、拓扑和同步配置等因素影响。
因此,至少应区分以下时间点:
控制线程开始执行。
PDO 数据更新完成。
主站提交或发送相关数据。
从站处理相关过程数据。
主站获取并处理反馈。
控制线程完成本周期任务。
这些时间点不一定都能通过同一种软件工具直接观测。如果某个阶段无法直接测量,应在报告中说明观测边界,而不是将某个软件时间戳当作整个链路的实际传输时刻。
2. 工作计数器 WKC 能说明什么?
在 EtherCAT 系统中,工作计数器(Working Counter,WKC)可用于检查相关过程数据交换是否获得了预期的处理响应。
当实际工作计数器与根据数据报文和从站配置预期的值不一致时,可能需要进一步检查从站状态、PDO 配置、通信异常或其他问题。
但 WKC 不是延迟指标。
即使 WKC 始终符合预期,也不能直接证明:
每个周期都在目标时间内完成。
报文延迟和抖动满足特定要求。
从站内部控制环已经满足时序要求。
所有轴的采样与执行完全同步。
机器人实际运动响应达到预期。
因此,WKC 应与周期执行时间、通信状态、从站状态和同步相关指标共同分析。
3. 分布式时钟 DC:同步误差需要单独关注
在需要多轴协调或同步采样的机器人系统中,EtherCAT 分布式时钟(Distributed Clocks,DC)可能用于协调从站的时间基准。
这时需要明确系统真正关注的同步目标:是从站时钟之间的偏差、输入采样时刻的一致性,还是输出动作相对于目标时刻的偏差。
这些指标的定义和测量方式不同,不能笼统地用“DC 正常”代替同步性能验证。
实际测试应结合主站配置、从站能力、设备手册以及可用的诊断信息,记录相关时钟状态和同步误差。如果需要更精确地测量物理层事件,则可能需要额外的硬件测量手段。
4. 通信层建议记录哪些指标?
| 指标 | 主要用途 | 不能单独证明什么 |
|---|---|---|
| 主站周期执行时间 | 观察周期通信程序的耗时 | 实际报文的全部传输延迟 |
| WKC 状态 | 检查过程数据交换的处理响应 | 通信抖动和端到端时序 |
| 从站状态 | 观察设备是否处于预期状态 | 驱动器一定已执行运动指令 |
| 周期超期次数 | 统计周期任务未按时完成的情况 | 超期原因的具体来源 |
| DC 同步状态与相关偏差 | 评估配置和可观测的同步情况 | 机器人完整的端到端运动误差 |
| 输入反馈数据年龄 | 评估控制计算使用的数据是否过期 | 物理传感器的全部测量误差 |
这张表最重要的作用,是避免把不同指标混为一谈。通信是否正常、时序是否稳定、驱动器是否执行命令,以及机械系统是否达到预期运动效果,需要分别建立证据。
四、端到端层:如何测量从 ROS 2 目标到机器人实际响应的完整链路?
对于机器人应用来说,最终关心的往往不是某个线程的调度延迟,而是系统从接收指令到产生实际运动响应的完整表现。
例如,用户通过上层节点发送一条关节目标,系统经过数据交接、控制计算、EtherCAT 通信、驱动器处理和机械执行,最终产生可观测的反馈。
如果其中任意一个阶段出现明显延迟,整体响应时间都可能受到影响。
1. 先明确端到端延迟的起点和终点
“端到端延迟”不是一个天然只有一种定义的指标。
不同场景可以采用不同的测量边界:
从 ROS 2 目标生成到实时线程读取目标。
从实时线程读取目标到 EtherCAT 主站完成指定操作。
从目标生成到驱动器反馈出现相应变化。
从上层发出运动命令到外部传感器观测到实际运动响应。
这些指标分别反映不同阶段,不能混用。
例如,从 ROS 2 发布目标到驱动器反馈变化的时间,并不完全等于软件通信延迟,因为驱动器内部控制周期、滤波、加减速限制和机械系统动态也会影响最终结果。
因此,测试报告必须写明起点、终点、时钟基准,以及该指标包含哪些处理阶段。
2. 数据年龄有时比单次延迟更值得关注
在控制系统中,反馈数据即使传输成功,也可能已经过期。
假设底层控制线程当前运行在时刻 ttt,而反馈数据对应的采样时刻是 tst_sts,那么可以定义数据年龄:
A=t−tsA = t - t_sA=t−ts
其中 AAA 表示当前控制计算使用的反馈数据已经经过多长时间。
如果系统只检查数据是否存在,却不检查其采样时间,就可能使用已经过期的反馈计算新的控制输出。
对于机器人控制,数据年龄应结合控制周期、传感器采样方式、通信延迟和算法要求进行评估。某些系统更关注数据的绝对新鲜度,另一些系统还需要考虑多个关节或多个传感器之间的数据时间一致性。
同样,ROS 2 消息时间戳只有在时钟语义明确、时间同步可靠的条件下,才适合用于相应的时序分析。
3. 如何理解端到端延迟的组成?
在一个简化的机器人控制链路中,可以将总延迟分解为多个阶段:
Ltotal=Lgeneration+Lhandoff+Lcontrol+Lcommunication+LdriveL_{\text{total}} = L_{\text{generation}} + L_{\text{handoff}} + L_{\text{control}} + L_{\text{communication}} + L_{\text{drive}}Ltotal=Lgeneration+Lhandoff+Lcontrol+Lcommunication+Ldrive
其中:
LgenerationL_{\text{generation}}Lgeneration:目标生成相关延迟。
LhandoffL_{\text{handoff}}Lhandoff:上层到实时线程的数据交接延迟。
LcontrolL_{\text{control}}Lcontrol:底层控制处理延迟。
LcommunicationL_{\text{communication}}Lcommunication:相关通信阶段的延迟。
LdriveL_{\text{drive}}Ldrive:驱动器处理和响应所对应的时间。
这只是一个便于分析的模型,并非适用于所有系统的精确计算公式。各阶段的测量边界必须互不重叠,并且需要明确是否包含等待下一个周期、驱动器内部控制以及机械响应。
如果不同阶段的数据使用不同的时钟,或者各时间戳之间没有可靠的关联关系,就不能直接把它们相加得到可信的端到端延迟。
在这类情况下,应先建立统一的时间基准或可靠的事件关联方法,再进行分段分析。
4. 机械运动响应还需要结合控制性能指标
对于机器人,软件链路按时完成,并不等于实际运动轨迹一定符合要求。
例如,机械臂在跟踪轨迹时,还可能受到控制算法、伺服参数、负载惯量、机械结构和传感器精度等因素影响。
因此,端到端测试可以进一步关注:
目标位置与实际位置之间的误差。
目标速度与实际速度之间的偏差。
轨迹跟踪误差。
指令变化到反馈响应的时间。
多轴之间的同步误差。
异常条件下的停止或降级响应。
这些指标应根据机器人类型和控制需求确定。不能仅凭操作系统延迟较低,就推断机器人轨迹精度或运动安全性一定满足要求。
五、如何形成可复现的实时性测试体系?以望获rtLinux 评估为例
前面讨论的指标,最终需要落到可执行的测试流程中。
对于采用望获rtLinux 的机器人控制项目,可以围绕实际硬件和软件组合建立测试基线,将实时内核、核心隔离、ROS 2 执行模型、EtherCAT 主站和伺服设备放在同一个验证框架中。
重点不是预先认定某个平台一定具有某个性能,而是通过可复现的数据确认它在目标应用中的表现。
1. 第一步:记录完整测试环境
每次测试至少应记录:
CPU 型号、核心拓扑及相关硬件配置。
望获rtLinux 的具体版本与内核版本。
内核实时配置及启动参数。
CPU 亲和性、核心隔离与 IRQ 配置。
ROS 2 发行版、RMW 实现和 Executor 设置。
IgH EtherCAT Master 与网卡驱动版本。
从站设备、PDO 映射与同步配置。
控制周期、截止时间和线程优先级。
测试负载、持续时间与测试工具版本。
如果缺少这些信息,即使两次测试得到不同结果,也很难判断变化来自软件版本、系统配置、硬件负载还是测量方式。
2. 第二步:建立分层测试流程
阶段一:操作系统基础测试
检查唤醒延迟、延迟分布和系统负载对调度行为的影响。
阶段二:真实控制线程测试
测量周期执行时间、截止时间超期、目标数据年龄和连续超期情况。
阶段三:EtherCAT 通信测试
检查主站状态、WKC、从站状态、周期行为及相关同步配置。
阶段四:端到端应用测试
测量目标生成、数据交接、驱动器响应和实际运动表现,并验证异常处理。
这种分层方式能够帮助团队逐步定位问题,而不是一开始就把所有延迟归结为操作系统。
3. 第三步:在不同负载下重复测试
只在空闲系统中测试,通常不足以反映机器人真实运行状态。
建议至少考虑以下场景:
| 测试场景 | 重点观察内容 |
|---|---|
| 系统空闲 | 基础唤醒延迟与周期执行时间 |
| ROS 2 正常负载 | 回调执行、数据交接和控制线程之间的影响 |
| CPU 高负载 | 调度延迟、执行时间变化和周期超期 |
| 日志与 I/O 活动 | 是否出现阻塞或额外延迟 |
| 多轴协同运行 | 数据一致性、同步表现与轨迹误差 |
| 目标更新中断 | 过期目标识别和预定义处理策略 |
| 通信异常 | 从站状态变化、错误检测和恢复行为 |
| 连续超期 | 故障记录、降级逻辑和系统响应 |
测试应在安全可控的环境中进行。涉及机器人运动、通信中断和驱动器故障的场景,需要事先设计保护措施,避免将测试风险转移给人员或设备。
4. 第四步:明确通过标准,而不是事后挑选好看的指标
在测试之前,就应确定每项指标的目标值、统计方法和判定规则。
例如:
控制线程的截止时间超期次数是否允许为零。
目标数据年龄允许达到多少。
通信状态异常时允许多长时间被检测到。
轨迹跟踪误差应满足什么要求。
发生连续超期时,系统应执行什么策略。
具体阈值必须来自项目需求、控制设计和设备约束,不能直接套用某个通用数值。
测试结束后,应同时报告平均值、分位数、观测最大值、超期统计和异常场景表现,并明确测试时长及覆盖范围。
对于需要严格硬实时保证的项目,还应根据系统风险与要求补充适当的分析和验证证据。
5. 第五步:将核心隔离等配置转化为可比较的实验
如果项目希望评估核心隔离对实时性的影响,可以设计对照实验。
例如,在相同硬件、内核版本、应用负载和测试时长下,对比不同 CPU 分配与 IRQ 配置的测试结果。
需要尽可能保持其他变量一致,并重复测试,避免把偶然波动误认为配置优化的效果。
测试时可以观察:
唤醒延迟分布是否发生变化。
控制线程执行时间是否更加稳定。
截止时间超期次数是否减少。
高负载下的尾部延迟是否改善。
EtherCAT 通信和端到端指标是否同步改善。
核心隔离的作用是减少特定类型的 CPU 干扰,但它不一定改善所有指标,也无法完全消除共享缓存、内存带宽、固件活动等因素带来的影响。
因此,最终应以实际测量结果为依据,而不是仅凭配置名称推断性能。
总结:用指标体系回答实时性问题,而不是用单个数字代替结论
对于机器人控制系统,实时性至少应从四个层面评估:
操作系统层: 唤醒延迟、调度抖动和线程执行时间。
控制线程层: 周期稳定性、截止时间超期和数据有效性。
通信层: EtherCAT 主站周期、WKC、从站状态和同步表现。
端到端层: 目标到执行响应的延迟、反馈数据年龄、轨迹误差和异常响应。
这四个层面相互关联,但不能互相替代。
cyclictest可以帮助分析调度行为,却不能独立证明 EtherCAT 通信和实际运动的端到端实时性;WKC 可以帮助检查过程数据交换的处理响应,却不能代替通信时序测量;周期线程按时运行,也不代表机械运动精度一定达到要求。
对于望获rtLinux,评估实时能力的有效方式,是在明确的硬件、内核、驱动和应用环境下,结合实时内核配置、核心隔离和真实控制程序建立完整测试证据。
只有当实时性要求被明确量化、关键执行路径被实际测量、异常场景被充分验证,实时性能才能从一句技术描述,转变为可复现、可比较、可用于工程决策的证据。