ROS2学习笔记25--ros2话题统计编写教程(C++)

概要:这篇内容主要介绍用c++编写能够统计话题的侦听器

环境:ubuntu20.04,ros2-foxy,vscode

最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现

4.1 ros2话题统计教程(C++)(原文:https://docs.ros.org/en/foxy/Tutorials/Topics/Topic-Statistics-Tutorial.html)

>>教程>>ros2话题统计教程(C++)

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

ros2话题统计教程(C++

目标:能够统计ros2话题数,查看统计数据的输出

课程等级:中级(提高篇)

时长:10min

目录

1.背景
2.预备知识
3.步骤
3.1编写能够统计的侦听器
3.1.1代码解析
3.1.2CMakeLists.txt
3.2编译运行
3.3观察发布数据
4.总结
5.相关概念

1.背景

这是一个(介绍)如何在ros2里面统计话题(https://docs.ros.org/en/foxy/Concepts/About-Topic-Statistics.html#abouttopicstats)的简短教程,并且使用命令行工具ros2topichttps://docs.ros.org/en/foxy/Tutorials/Topics/Understanding-ROS2-Topics.html#ros2topics)查看发布的统计数据的输出.

ros2可对从一些侦听器接收的信息进行综合的数据统计,这叫话题数据统计.话题统计数可方便描述,你可以描述系统的性能或使用数据来帮助诊断任何存在的问题。

想了解更多细节,可以看话题统计概念页面(https://docs.ros.org/en/foxy/Concepts/About-Topic-Statistics.html#abouttopicstats).

2.预备知识

既可从二进制也可从源进行安装ros2.

在前面课程中,你学习了如何创建一个工作空间,创建包,创建c++版的发布器和侦听器.

这节课假设你已经有了在前面课程(https://docs.ros.org/en/foxy/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html#cpppubsub)创建的cpp_pubsub包.

3.步骤

3.1编写能够统计的侦听器

导航到前面课程创建的dev_ws/src/cpp_pubsub/src文件夹,并且输入下面指令下载talker案例代码:

linux:

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新文件,用你喜欢的文本编辑器打开:

#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;
}

3.1.1代码解析

在(https://docs.ros.org/en/foxy/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html#cpppubsub)这个教程里面,我们有一个侦听器节点接收,来自topic话题的topic_callback函数获取的字符串信息.然而,我们现在增加一些操作,定义一个结构rclcpp::SubscriptionOptions(),配置侦听器,使得可以进行话题统计.

// 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 = "/my_topic"

配置内容如同下表描述:

Subscription Config Field

Purpose

topic_stats_options.state

Enable or disable topic statistics (default rclcpp::TopicStatisticsState::Disable)

topic_stats_options.publish_period

The period in which to collect statistics data and publish a statistics message (default 1s)

topic_stats_options.publish_topic

The topic to use when publishing statistics data (default /statistics)

3.1.2CMakeLists.txt

现在打开CMakeLists.txt文件.

添加可执行文件,并将其命名为listener_with_topic_statistics,这样子你就可以使用ros2 run运行你的节点了:

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})

记得保存文件,具有统计话题数功能的pub/sub系统准备可以使用了.

3.2编译运行

参考 pub/sub课程的编译运行章节进行编译.

运行具有数据统计的侦听器节点:

ros2 run cpp_pubsub listener_with_topic_statistics

然后,启动talker节点:

ros2 run 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"

listener将开始打印消息到控制台(终端),不管消息算到哪里,发布者都会同时开始,像这样子:

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

既然用户节点接收到消息,那么它就会定期发布统计信息,在下一节中我们将观察这些消息.

3.3观察发布数据

当节点在运行时,新开一个终端,执行下面指令:

ros2 topic list

将会罗列出当前活动状态的话题.你会看如下内容:

/parameter_events
/rosout
/statistics
/topic

在课程早些时候,如果你选择性修改了topic_stats_options.publish_topic,你将会看到名字更改为/statistics

你创建的侦听器节点正在发布统计数据到话题topic,(接着)输出到话题/statistics

我们可以使用rqt对此进行可视化:

图片.png现在,我们可以用下面指令,对发布到话题的统计数据进行可视化:

ros2 topic echo /statistics

终端应该开始每10秒发布一次统计数据信息,因为topic_stats_options.publish_period侦听器配置早些时候被有选择地修改了.

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

根据消息定义(https://github.com/ros2/rcl_interfaces/tree/master/statistics_msgs),数据类型data_types如下:

data_type value

statistics

1

average

2

minimum

3

maximum

4

standard deviation

5

sample count

这里,我们看到两个可能正确计算的统计数据,std_msgs::msg::String型消息通过minimal_publisher发布到/topic.因为std_msgs::msg::String没有消息头(?),message_age计算并没有执行,所以返回nan.然而,message_period可以计算,并且我们可以看到上面消息中增长的统计数据.

4.总结

你创建一个带有话题统计的侦听器节点,其发布来自c++https://docs.ros.org/en/foxy/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html#cpppubsub)发布器节点统计数据.你可以编译运行这个节点.运行时,你会观察到统计数据.

5.相关概念

为了观察message_age如何周期性统计数据的,请查看ros2话题统计案例(https://github.com/ros2/demos/tree/master/topic_statistics_demo).

其他

个人认为重点:

编写侦听器节点统计数据代码实现,以及编译时CMakeLists.txt文件如何配置.

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值