您正在阅读的是开发版本的文档。有关最新发布的版本,请访问 Jazzy.
启用主题统计 (C++)
目标 启用 ROS 2 Topic Statistics 并查看输出统计数据。
辅导水平: 高级
时间 10 分钟
背景介绍
这是一个简短的教程,介绍如何在 ROS 2 中启用主题统计,并使用命令行工具查看已发布的统计输出 (ros2topic).
ROS 2 提供了对任何订阅所接收信息的综合统计测量功能,称为 "主题统计"(Topic Statistics)。启用订阅的主题统计功能后,您就可以确定系统性能的特点,或使用这些数据帮助诊断任何现有问题。
更多详情,请参阅 主题 统计概念页面.
先决条件
安装二进制文件或源代码。
在前面的教程中,您学习了如何 创建工作区, 创建软件包并创建一个 C++ 出版商和订户。
本教程假设您的 cpp_pubsub
软件包中的 C++ 教程。
任务
1 写入已启用统计功能的用户节点
导航进入 ros2_ws/src/cpp_pubsub/src
文件夹中创建的 上一个教程输入以下命令,下载通话程序代码示例:
wget -O member_function_with_topic_statistics.cpp https://raw.githubusercontent.com/ros2/examples/rolling/rclcpp/topics/minimal_subscriber/member_function_with_topic_statistics.cpp
wget -O member_function_with_topic_statistics.cpp https://raw.githubusercontent.com/ros2/examples/rolling/rclcpp/topics/minimal_subscriber/member_function_with_topic_statistics.cpp
右键单击此链接并选择另存为 publisher_member_function.cpp
:
现在将有一个名为 member_function_with_topic_statistics.cpp
.使用您喜欢的文本编辑器打开文件。
#include 时间顺序<chrono>;
#include <内存>;
#include "rclcpp/rclcpp.hpp";
#include "rclcpp/subscription_options.hpp";
#include "std_msgs/msg/string.hpp";
类 带主题统计的最小订阅者 : 公 rclcpp::节点
{
公:
带主题统计的最小订阅者()
: 节点("minimal_subscriber_with_topic_statistics";)
{
// 通过选项手动启用主题统计
汽车 选项 = rclcpp::订阅选项();
选项.选项.国 = rclcpp::主题统计状态::启用;
// 配置收集窗口和发布周期(默认为 1 秒)
选项.选项.出版周期 = 标准::计时器::秒钟(10);
// 配置主题名称(默认为 '/statistics')
// options.topic_stats_options.publish_topic = "/topic_statistics";
汽车 回调 = [此](std_msgs::信息::字符串::SharedPtr 信息) {
此->;topic_callback(信息);
};
订阅_ = 此->;创建订阅<;std_msgs::信息::字符串>;(
"主题";, 10, 回调, 选项);
}
私人:
空白 topic_callback(缢 std_msgs::信息::字符串::ConstSharedPtr 信息) 缢
{
RCLCPP_INFO(此->;get_logger(), "我听说:'%s'";, 信息->;数据.c_str());
}
rclcpp::订阅<;std_msgs::信息::字符串>::SharedPtr 订阅_;
};
int 主要(int 参数, 烧焦 * 参数[])
{
rclcpp::启动(参数, 参数);
rclcpp::后旋(标准::共享<;带主题统计的最小订阅者>;());
rclcpp::关闭();
返回 0;
}
1.1 检查代码
如 C++ 教程中,我们有一个订阅节点,它从
主题
从 topic_callback
功能。不过,我们现在添加了一些选项来配置订阅,以便使用 rclcpp::SubscriptionOptions()
选项结构。
// 通过选项手动启用主题统计
汽车 选项 = rclcpp::订阅选项();
选项.选项.国 = rclcpp::主题统计状态::启用;
也可选择配置统计收集/发布周期和用于发布统计的主题等字段。
// 配置收集窗口和发布周期(默认为 1 秒)
选项.选项.出版周期 = 标准::计时器::秒钟(10);
// 配置主题名称(默认为 '/statistics')
// options.topic_stats_options.publish_topic = "/my_topic";
下表介绍了可配置字段:
订阅配置字段 |
目的 |
---|---|
topic_stats_options.state |
启用或禁用主题统计(默认 |
topic_stats_options.publish_period |
收集统计数据和发布统计信息的时间段(默认为 |
topic_stats_options.publish_topic |
发布统计数据时使用的主题(默认为 |
1.2 CMakeLists.txt
现在打开 CMakeLists.txt
锉刀
添加可执行文件并将其命名为 有主题统计信息的监听器
这样您就可以使用 玫瑰2 运行
:
add_executable(listener_with_topic_statistics src/member_function_with_topic_statistics.cpp)
ament_target_dependencies(listener_with_topic_statistics rclcpp std_msgs)
install(TARGETS
话匣子
听众
有主题统计信息的监听器
DESTINATION lib/${PROJECT_NAME})
确保保存该文件,然后启用主题统计后,您的发布/子系统就可以使用了。
2 构建和运行
要进行构建,请参阅 构建和运行 部分。
运行启用统计节点的用户:
ros2 run cpp_pubsub listener_with_topic_statistics
现在运行 Talker 节点:
ros2 运行 cpp_pubsub talker
终端应该开始每 0.5 秒发布一次信息,就像这样:
[INFO] [minimal_publisher]:Publishing: "Hello World: 0";
[INFO] [minimal_publisher]:Publishing: "Hello World: 1";
[INFO] [minimal_publisher]:Publishing: "Hello World: 2";
[INFO] [minimal_publisher]:Publishing: "Hello World: 3";
[INFO] [minimal_publisher]:Publishing: "Hello World: 4";
监听器将开始向控制台打印消息,从发布者当时的消息计数开始,就像这样:
[INFO] [minimal_subscriber_with_topic_statistics]:我听到: "Hello World: 10";
[INFO] [minimal_subscriber_with_topic_statistics]:我听到:"世界你好:11";
[INFO] [minimal_subscriber_with_topic_statistics]:我听到: "Hello World: 12";
[INFO] [minimal_subscriber_with_topic_statistics]:我听到: "Hello World: 13";
[INFO] [minimal_subscriber_with_topic_statistics]:我听到: "Hello World: 14";
既然订阅节点正在接收信息,它就会定期发布统计信息。我们将在下一节观察这些信息。
3 观察已公布的统计数据
在节点运行时,打开一个新的终端窗口。执行以下命令
ros2 主题列表
这将列出当前所有活动主题。您应该看到以下内容:
/parameter_events
/rosout
/统计
/topic
如果您有选择地更改了 topic_stats_options.publish_topic
字段,那么你将看到该名称而不是 /统计
.
您创建的订阅节点正在发布统计信息,主题为 主题
,转到输出主题
/统计
.
我们可以使用 RQt

现在,我们可以使用以下命令查看发布到此主题的统计数据:
ros2 topic echo /statistics
终端应开始每 10 秒发布一次统计信息,因为
topic_stats_options.publish_period
在本教程的前面部分,订阅配置已进行了可选更改。
---
测量源名称:minimal_subscriber_with_topic_statistics(有主题统计的最小订阅者
度量源: 信息年龄
单位:毫秒
window_start:
sec: 1594856666
Nanosec: 931527366
window_stop:
sec: 1594856676
Nanosec: 930797670
统计数字
- data_type:1
data: .nan
- 数据类型:3
data: .nan
- data_type: 2
data: .nan
- 数据类型:5
数据:0.0
- 数据类型:4
data: .nan
---
测量源名称:minimal_subscriber_with_topic_statistics(有主题统计的最小订阅者
度量源:消息周期
单位:毫秒
window_start:
sec: 1594856666
Nanosec: 931527366
window_stop:
sec: 1594856676
Nanosec: 930797670
统计数字
- data_type:1
数据499.2746365105009
- 数据类型:3
数据500.0
- data_type: 2
数据499.0
- 数据类型:5
数据619.0
- 数据类型:4
数据0.4463309283488427
---
从 消息定义
的 数据类型
具体如下
数据类型值 |
统计 |
---|---|
1 |
平均数 |
2 |
最低限度 |
3 |
最大 |
4 |
标准差 |
5 |
样本数 |
在这里,我们可以看到目前两种可能的计算统计量,它们是 std_msgs::msg::String
发布到 /topic
由 最小出版商
.因为 std_msgs::msg::String
没有报文头,则 消息年龄
计算无法执行,因此返回 NaN。但是 消息周期
可以计算出来,我们可以在上面的信息中看到输入的统计数据。
摘要
您创建了一个启用了主题统计功能的用户节点,该节点从 C++的发布节点。您可以编译并运行该节点。运行时,您可以观察统计数据。