背景
ROS2能够为任何的订阅提供消息的统计测量,这有助于用户利用收集到的订阅统计信息判断所使用系统的性能,也可以去做现有问题的诊断
如何计算统计信息
使用libstatistics_collector功能包中的工具在常数时间和常量内存的条件下计算每一个统计集合。每当一个订阅收到新消息时,当前测量窗口都会将这个消息纳入新样本的计算。计算的平均值是一个移动平均值。每收到一个新样本,都会更新最大、最小值以及样本技术,而标准差这是使用Welford Online算法计算。
统计信息的类型
received message period 接收消息的周期
单位:毫秒
使用系统时钟去测量接收消息的周期
received message age 接收消息的年龄
单位:毫秒
需要在消息头字段添加一个时间戳,以计算从消息发出已经过去了多少时间(年龄)
使用方法
- Topic Statistics方法默认为不开启,需要通过设置订阅者的配置选项来开启指定节点的这一特性。一旦开启,两种类型的统计信息都会启用。
- 统计信息的消息类型为statistics_msg/msg/MetricsMessage,发送周期默认为1s,对应的话题可以自定义(默认为/statistics)。
- 接收消息的周期需要在头字段添加消息时间戳,因此可以发布空数据。如果没有找到时间戳,name空数据所有的统计值都是NaN。
- 每个测量窗口用于周期性统计的第一个采样值都不会产生一个测量方法,因为计算统计值需要知道前一个消息的时间,因此只有一个采样序列才会产生测量方法。
案例分析
从github下载demo案例topic_statistics_demo,下载链接:https://github.com/ros2/demos/tree/master/topic_statistics_demo
1. 创建消息发布者和使能statistics的消息接收者
1 | #include <chrono> |
2. 创建接收统计消息的订阅者
1 | #include <sstream> |
3. 显示话题的统计信息
1 | // Configuration variables |
4. 编译运行
1 | colcon build --packages-select topic_statistics_demo |
1 | ros2 run topic_statistics_demo display_topic_statistics imu |
查看当前的topic
1 | ros2 topic list |
使用rqt工具查看整个话题的通信结构
也可以使用以下命令查看统计信息的内容
1 | ros2 topic echo /statistics |
data_type value | statistics |
---|---|
1 | average |
2 | minimum |
3 | maximum |
4 | standard deviation |
5 | sample count |