ROS2学习笔记25--ros2话题统计编写教程(C++)
Posted 鸿_H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
)的简短教程,并且使用命令行工具ros2topic
(https://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
对此进行可视化:
现在,我们可以用下面指令,对发布到话题的统计数据进行可视化:
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
文件如何配置.
这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.
#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈
以上是关于ROS2学习笔记25--ros2话题统计编写教程(C++)的主要内容,如果未能解决你的问题,请参考以下文章
ROS2学习笔记28--ros2环境下,多激光雷达启动的launch文件编写样式参考
ROS2学习笔记21--编写action服务器和客户端(C++)