ROS 2话题统计教程 (c ++)

Goal目标: Enable启用ROS 2话题统计并查看输出统计数据 [待校准@8752]

Tutorial教程级别: Intermediate中级 [待校准@6713]

时间: 10分钟 [Alyssa@7452]

背景

这是一个关于如何在ROS 2中启用 Topic Statistics 并使用命令行工具 ( ros2topic ) 查看已发布的统计输出的简短教程。 [待校准@8753]

ROS 2为任何订阅收到的消息提供了统计信息的综合测量,调用ed话题统计信息。通过为您的订阅启用话题统计信息,您可以描述系统性能或使用数据来帮助诊断任何当前问题。 [待校准@8754]

更多详情请见 Topic Statistics Concepts Page[待校准@8755]

先决条件

安装从二进制文件或源文件。 [待校准@8756]

在之前的教程中,您学习了如何 create a workspace, create a package, and create a C++ 出版商和订阅者。 [待校准@8757]

本教程假设您仍然拥有 C++ 教程中的 cpp_pubsub 包。 [待校准@8758]

任务

1在启用统计信息的情况下写入订户节点 [待校准@8759]

导航到在 previous tutorial 中创建的 dev_ws/src/cpp_pubsub/src 文件夹,并通过输入以下命令下载talker代码示例: [待校准@8760]

wget -O member_function_with_topic_statistics.cpp https://raw.githubusercontent.com/ros2/examples/master/rclcpp/topics/minimal_subscriber/member_function_with_topic_statistics.cpp

现在将会有一个名为 member_function_with_topic_statistics.cpp 的新文件。使用您喜欢的文本编辑器打开文件。 [待校准@8763]

#include <chrono>
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "rclcpp/subscription_options.hpp"

#include "std_msgs/msg/string.hpp"

class MinimalSubscriberWithTopicStatistics : public rclcpp::Node
{
public:
  MinimalSubscriberWithTopicStatistics()
  : Node("minimal_subscriber_with_topic_statistics")
  {
    // manually enable topic statistics via options
    auto options = rclcpp::SubscriptionOptions();
    options.topic_stats_options.state = rclcpp::TopicStatisticsState::Enable;

    // configure the collection window and publish period (default 1s)
    options.topic_stats_options.publish_period = std::chrono::seconds(10);

    // configure the topic name (default '/statistics')
    // options.topic_stats_options.publish_topic = "/topic_statistics"

    auto callback = [this](std_msgs::msg::String::SharedPtr msg) {
        this->topic_callback(msg);
      };

    subscription_ = this->create_subscription<std_msgs::msg::String>(
      "topic", 10, callback, options);
  }

private:
  void topic_callback(const std_msgs::msg::String::SharedPtr msg) const
  {
    RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
  }
  rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MinimalSubscriberWithTopicStatistics>());
  rclcpp::shutdown();
  return 0;
}

1.1检查代码 [待校准@8367]

作为在 C++ 教程,我们用户节点接收string消息从 topic 话题从 topic_callback 功能。但是,我们现在添加了选项来配置订阅,以使用 “rclcpp:: subscript options ()” 选项结构启用话题统计信息。 [待校准@8764]

// manually enable topic statistics via options
auto options = rclcpp::SubscriptionOptions();
options.topic_stats_options.state = rclcpp::TopicStatisticsState::Enable;

也可以配置诸如统计信息收集/发布期间和用于发布统计信息的话题之类的字段。 [待校准@8765]

// configure the collection window and publish period (default 1s)
options.topic_stats_options.publish_period = std::chrono::seconds(10);

// configure the topic name (default '/statistics')
// options.topic_stats_options.publish_topic = "/my_topic"

下表描述了可配置字段: [待校准@8766]

订阅配置字段 [待校准@8767]

目的

话题 _ 状态 _ 选项.状态 [待校准@8769]

启用或禁用话题统计 (默认 “rclcpp::话题统计状态:: 禁用”) [待校准@8770]

话题 _ 状态 _ 选项.发布 _ 周期 [待校准@8771]

收集统计数据和发布统计信息的时间段 (默认 1s ) [待校准@8772]

话题 _ 状态 _ 选项.发布 _ 话题 [待校准@8773]

发布统计数据时使用的话题 (默认 /statistics ) [待校准@8774]

1.2 CMakeLists.txt [待校准@8637]

现在打开 CMakeLists.txt 文件。 [待校准@8775]

添加可执行文件并将其命名为 listener_with_topic_statistics ,以便您可以使用 ros2 run 运行节点: [待校准@8776]

add_executable(listener_with_topic_statistics member_function_with_topic_statistics.cpp)
ament_target_dependencies(listener_with_topic_statistics rclcpp std_msgs)

install(TARGETS
  talker
  listener
  listener_with_topic_statistics
  DESTINATION lib/${PROJECT_NAME})

确保保存文件,然后你的发布/子系统,启用了话题统计信息,应该可以使用了。 [待校准@8777]

2构建和运行 [待校准@7729]

要构建,请参阅发布/子教程中的 Build and run 部分。 [待校准@8778]

使用启用统计信息的节点运行订阅服务器: [待校准@8779]

ros2 run cpp_pubsub listener_with_topic_statistics

现在运行talker节点: [待校准@8780]

ros2 run cpp_pubsub talker

终端应每0.5秒开始发布信息消息,如下所示: [待校准@8781]

[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"

侦听器将开始将消息打印到控制台,从发布者当时打开的任何消息计数开始,如下所示: [待校准@8782]

[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 10"
[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 11"
[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 12"
[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 13"
[INFO] [minimal_subscriber_with_topic_statistics]: I heard: "Hello World: 14"

现在,订户节点正在接收消息,它将调用y发布统计信息消息。我们将在下一节中观察这些消息。 [待校准@8783]

3观察公布的统计数据 [待校准@8784]

在节点运行时,打开一个新的终端窗口。执行以下命令: [待校准@8785]

ros2 topic list

这将列出所有当前活跃的话题。您应该看到以下内容: [待校准@8786]

/parameter_events
/rosout
/statistics
/topic

如果您在本教程的前面选择更改 topic_stats_options.publish_topic 字段,那么您将看到该名称而不是 /statistics[待校准@8787]

您创建的订户节点正在将话题 topic 的统计信息发布到输出话题 /statistics[待校准@8788]

我们可以用 RQt 可视化 [待校准@8789]

../../_images/topic_stats_rqt.png

现在,我们可以使用以下命令查看发布到此话题的统计数据: [待校准@8790]

ros2 topic echo /statistics

终端应该每10秒开始发布一次统计信息,因为在本教程的前面可选地更改了 topic_stats_options.publish_period 订阅配置。 [待校准@8791]

---
measurement_source_name: minimal_subscriber_with_topic_statistics
metrics_source: message_age
unit: ms
window_start:
  sec: 1594856666
  nanosec: 931527366
window_stop:
  sec: 1594856676
  nanosec: 930797670
statistics:
- data_type: 1
  data: .nan
- data_type: 3
  data: .nan
- data_type: 2
  data: .nan
- data_type: 5
  data: 0.0
- data_type: 4
  data: .nan
---
measurement_source_name: minimal_subscriber_with_topic_statistics
metrics_source: message_period
unit: ms
window_start:
  sec: 1594856666
  nanosec: 931527366
window_stop:
  sec: 1594856676
  nanosec: 930797670
statistics:
- data_type: 1
  data: 499.2746365105009
- data_type: 3
  data: 500.0
- data_type: 2
  data: 499.0
- data_type: 5
  data: 619.0
- data_type: 4
  data: 0.4463309283488427
---

message definition 乙, data_types 如下 [待校准@8792]

data_type值 [待校准@8793]

统计 [待校准@8794]

1 [待校准@8795]

平均 [待校准@8796]

2 [待校准@8797]

最小值 [待校准@8798]

3 [待校准@8799]

最大值 [待校准@8800]

4 [待校准@8801]

标准偏差 [待校准@8802]

5 [待校准@8803]

样本计数 [待校准@8804]

在这里,我们看到了由 minimal_publisher 发布给 /topic 的 “std_msgs::msg:: string” 消息的两个当前可能的计算统计数据。因为 “std_msgs::msg:: string” 没有消息头,所以无法执行 message_age 计算,因此返回NaNs。但是,可以计算出 message_period ,我们在上面的消息中看到了统计数据。 [待校准@8805]

总结

您创建了一个启用了话题统计信息的订户节点,该节点从 C++ 的发布节点发布统计数据。您能够编译并运行此节点。运行时,您可以观察统计数据。 [待校准@8806]