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
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
右键单击此链接并选择另存为 publisher_member_function.cpp
: [待校准@8761]
https://raw.githubusercontent.com/ros2/示例/主/rclcpp/话题/最小 _ 订阅者/成员 _ 功能 _ 与 _ 话题 _ 统计.cpp [待校准@8762]
现在将会有一个名为 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] |
收集统计数据和发布统计信息的时间段 (默认 |
话题 _ 状态 _ 选项.发布 _ 话题 [待校准@8773] |
发布统计数据时使用的话题 (默认 |
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]
现在,我们可以使用以下命令查看发布到此话题的统计数据: [待校准@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] |
---|---|
平均 [待校准@8796] |
|
最小值 [待校准@8798] |
|
最大值 [待校准@8800] |
|
标准偏差 [待校准@8802] |
|
样本计数 [待校准@8804] |
在这里,我们看到了由 minimal_publisher
发布给 /topic
的 “std_msgs::msg:: string” 消息的两个当前可能的计算统计数据。因为 “std_msgs::msg:: string” 没有消息头,所以无法执行 message_age
计算,因此返回NaNs。但是,可以计算出 message_period
,我们在上面的消息中看到了统计数据。 [待校准@8805]
总结
您创建了一个启用了话题统计信息的订户节点,该节点从 C++ 的发布节点发布统计数据。您能够编译并运行此节点。运行时,您可以观察统计数据。 [待校准@8806]