您正在阅读的是开发版本的文档。有关最新发布的版本,请访问 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

现在将有一个名为 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

启用或禁用主题统计(默认 rclcpp::TopicStatisticsState::Disable)

topic_stats_options.publish_period

收集统计数据和发布统计信息的时间段(默认为 1s)

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

././././_images/topic_stats_rqt.png

现在,我们可以使用以下命令查看发布到此主题的统计数据:

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++的发布节点。您可以编译并运行该节点。运行时,您可以观察统计数据。