主题统计¶
概述¶
ROS 2 提供了对任何订阅接收到的消息进行综合统计测量的功能。允许用户收集订阅统计信息,从而能够对其系统的性能进行表征或诊断当前存在的任何问题。
提供的测量方式包括接收消息的时间间隔和接收消息的周期。对于每个测量,提供的统计信息包括平均值、最大值、最小值、标准差和样本数量。这些统计信息是在一个移动窗口中计算的。
统计计算方式¶
每个统计集合通过使用 libstatistics_collector 包中实现的工具,在常数时间和常数内存下进行计算。当订阅接收到新消息时,这被视为当前测量窗口中的一个新的样本。计算的平均值是一个移动平均值。最大值、最小值和样本数量在每次收到新样本时更新,而标准差是使用 Welford 的在线算法计算的。
计算的统计类型¶
接收消息周期¶
- 单位:毫秒
- 使用系统时钟测量接收消息之间的周期
接收消息时间间隔¶
- 单位:毫秒
- 需要消息头字段中填充的时间戳,以便计算从发布者发送消息以来的时间间隔
行为¶
默认情况下,主题统计测量功能未启用。通过订阅配置选项为特定节点启用此功能后,接收消息时间间隔和接收消息周期的测量将针对该特定订阅启用。
数据将以 statistics_msg/msg/MetricsMessage 的形式以可配置的周期(默认为 1 秒)发布到可配置的主题(默认为 /statistics)。需要注意的是,发布周期也作为样本收集窗口的周期。
由于接收消息周期需要消息头字段中的时间戳,如果没有时间戳,则发布空数据。也就是说,如果找不到时间戳,则所有统计值均为 NaN。发布 NaN 值而不是不发布任何数据可以避免信号丢失的问题,并明确表示测量无法进行。
每个窗口的接收消息周期统计的第一个样本不会产生测量结果。这是因为计算此统计值需要知道前一条消息到达的时间,因此窗口中的后续样本会生成测量结果。
与 ROS 1 的对比¶
类似于 ROS 1 的主题统计,两者都计算消息年龄和消息周期,尽管是从订阅端计算的。其他 ROS 1 指标,例如丢弃的消息数量或流量体积,目前尚未提供。
支持情况¶
此功能目前仅在 ROS 2 Foxy 的 C++(rclcpp)中受支持。未来的改进和工作,例如 Python 支持,请参见此处。