主题统计

概述

ROS 2 为任何订阅收到的消息提供综合统计测量。 允许用户收集订阅统计信息使他们能够描述系统的性能或帮助诊断任何当前问题。

提供的测量值为接收消息的年龄和接收消息的周期。 对于每个测量,提供的统计数据为平均值、最大值、最小值、标准偏差和样本数。 这些统计数据是在移动窗口中计算的。

如何计算统计数据

每个统计集都是使用在 libstatistics_collector 包。 当订阅收到新消息时,这是当前测量窗口中用于计算的新样本。 计算出的平均值只是一个 moving average. 收到每个新样本后,最大值、最小值和样本数都会更新,而标准差则使用 Welford 在线算法 计算。

计算的统计数据类型

  • 接收消息周期

    • 单位:毫秒

    • 使用系统时钟测量接收消息之间的周期

  • 接收消息年龄

    • 单位:毫秒

    • 要求消息在标头字段中填充时间戳,以便计算从发布者发送的消息的年龄

行为

默认情况下,主题统计测量未启用。 通过订阅配置选项为特定节点启用此功能后,将为该特定订阅启用接收消息年龄和接收消息周期测量。

数据以 statistics_msg/msg/MetricsMessage 以可配置的周期(默认为 1 秒)发布到可配置的主题(默认为 /statistics)。 请注意,发布周期也用作样本收集窗口周期。 由于接收消息周期需要标头字段中的消息时间戳,因此会发布空数据。 也就是说,如果未找到时间戳,则所有统计值均为 NaN。 发布 NaN 值而不是完全不发布可避免信号缺失问题,并旨在明确表明无法进行测量。 接收消息周期统计的每个窗口的第一个样本不会产生测量值。 这是因为计算此统计数据需要知道上一条消息到达的时间,因此窗口中的后续样本会产生测量值。 与 ROS 1 的比较 ——————- 与 ROS 1 类似 Topic Statistics, 尽管是从订阅端计算消息年龄和消息周期。 目前不提供其他 ROS 1 指标,例如丢弃的消息数量或流量。

支持

此功能目前仅在 ROS 2 Foxy for C++ (rclcpp) 中受支持。 可以找到未来的工作和改进,例如 Python 支持 here.