主题统计

概述

ROS 2 提供了对任何订阅接收的消息进行统计的集成测量。允许用户收集订阅统计数据,以便他们能够评估系统的性能或帮助诊断任何现有问题。

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

统计数据的计算方式

每个统计数据集都是通过使用`libstatistics_collector <https://github.com/ros-tooling/libstatistics_collector>`__包中实现的工具在固定的时间和固定的内存中计算得出的。当订阅接收到新消息时,这是当前测量窗口中的一个新样本,所以所得到的平均值只是一个`移动平均值 <https://en.wikipedia.org/wiki/Moving_average>`__。最大值、最小值和样本数量会在接收到每个新样本时进行更新,而标准差则是使用`Welford的在线算法 <https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm>`__计算得出的。

计算的统计数据类型

  • 接收消息周期

    • 单位: 毫秒

    • 使用系统时钟来测量接收到的消息之间的时间间隔

  • 接收消息的年龄

    • 单位: 毫秒

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

行为

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

数据以可配置周期(默认为1秒)发布为`statistics_msg/msg/MetricsMessage <https://github.com/ros2/rcl_interfaces/blob/humble/statistics_msgs/msg/MetricsMessage.msg>`__到可配置主题(默认为``/statistics``)。请注意,发布周期也作为样本收集窗口期。

由于接收到的消息周期需要在头部字段中包含消息时间戳,因此会发布空数据。也就是说,如果没有找到时间戳,所有统计值都为NaN。不发布任何值而是发布NaN值,避免了信号缺失的问题,并明确表示无法进行测量。

接收消息周期统计的每个窗口的第一个样本不会产生测量。这是因为计算此统计值需要知道前一条消息到达的时间,因此窗口中的后续样本会产生测量结果。

与ROS 1的比较

与ROS 1的`Topic Statistics <https://wiki.ros.org/Topics#Topic_statistics>`__类似,消息的年龄和周期也会被计算,尽管是从订阅端计算的。其他ROS 1的指标,如丢失的消息数量或流量大小,目前尚未提供。

支持

当前仅支持ROS 2 Foxy的C++(rclcpp)。未来的工作和改进,例如Python支持,可以在`这里 <https://github.com/ros2/ros2/issues/917>`__找到。