ROS 2边学边练(4)-- 何为主题(topics)

概念       

        主题是一种节点间的通信方式,某个节点充当发布特定(主题)消息(数据)的角色,另外一些节点则可以订阅接收该特定(主题)消息(数据)。两者(发布者和订阅者)间可以一对一(一个订阅该主题的节点 + 一个发布该主题的节点),也可以一对多(一个发布多个订阅),也可以多对一,更可以多对多,理论上并没有节点数量的限制(但可能会受到到某些平台环境资源的限制,此处不表),下面两张图分别代表了一对一和一对多及多对多的情况。

(一对一)

(一对多&多对多)

        主题这种通信方式比较适合一些[不断更新的数据传输相关]的场景,比如不断更新的雷达数据,就适合用这种方式。

动动手

启动小海龟

        分别执行如下命令启动海龟节点及控制节点(不熟悉的出口在右手边):

$ros2 run turtlesim turtlesim_node
$ros2 run turtlesim turtle_teleop_key

新工具rqt_graph

        下面我们介绍个新朋友rqt_graph,这个其实已经集成在之前安装的rqt工具中了,通过它可以看到节点与主题之间的微妙关系(可视化),在复杂的系统中,我们可以利用它理清各自的逻辑关系。

        有两种方式可以打开,其一直接执行rqt_graph,其二在rqt窗口中,选择Plugins > Introspection > Node Graph,这两种方法都行,我们试试第一种,打开的界面如下所示(将鼠标挪动到图形上面会变色),

        左边是节点/turtlesim,右边是节点/teleop_turtle,中间的三条箭头连线,上面两个是动作(本篇不提),最下面的是主题/turtle1/cmd_vel,箭头是从节点/teleop_turtle指向节点/turtlesim,代表的是数据流向,/teleop_turtle节点负责发布主题(/turtle1/cmd_vel)数据,该数据是通过键盘产生的,而节点/turtlesim订阅了该主题数据,所以数据从主题发布者流向主题订阅者。

主题列表

$ros2 topic list

        通过上面的命令会列出当前活动节点的主题信息,非常简单概括,如下图所示,咱们开启了两个节点,一共产生了5个主题,

我们再查看各个主题详细的信息,返回了各个主题对应的数据类型(可类比成结构体),只有相同的数据类型,才能正常进行通信。

$ros2 topic list -t

在rqt_graph中我们Hide那一行所有的勾选后,我们会看到一幅包含所有主题信息的完整图,此刻不必深究。

主题数据

        大家好不好奇从发布者节点发出的主题数据是怎样的呢,该怎么查看呢? 别急,往下瞧,

$ros2 topic echo <topic_name>

我们通过上面的初步摸索已经了解到小海龟例子中/teleop_turtle节点通过/turtle1/cmd_vel主题发布位姿数据到/turtle_sim节点,我们就来看看/turtle1/cmd_vel这个主题数据到底是何方神圣,执行如下命令进行查看:

$ros2 topic echo /turtle1/cmd_vel

输入为命令后你会发现,咋啥都没有,不是骗人嘛,还是别急,接着往下瞧。我们切换到启动了/teleop_turtle节点的终端,鼠标点击一下这个终端,使得焦点在这里,随便摁下之前说过的那些键(F周遭),确认小海龟游动了之后,大家再切换回echo那个终端,看看它返回了什么,如下所示,

我们再来瞅瞅rqt_graph里面会相应发生些什么,打开后我们会看到下面的图形,

里面比之前多了一个节点(/_ros2cli_43366),而主题/turtle1/cmd_vel也有个箭头连线指向了这个节点,目前为止,一共有两个订阅者节点和一个发布者节点,发布者节点会通过主题/turtle1/cmd_vel实时将键盘产生的位姿数据发布给两个订阅者。

主题信息

        如果我们想要了解某个活动的主题的相关信息(如主题数据类型、该主题对应的发布者和订阅者各自数量),我们可以通过下面的命令得到:

$ros2 topic info <topic_name>

来看看/turtle1/cmd_vel这个活动主题的信息(ros2 topic info /turtle1/cmd_vel),结果如下:

主题数据消息类型

        订阅者和发布者之间通过消息通信,二者会共用同样数据结构类型的消息,否则牛头对马嘴,胡拉乱扯。之前我们通过ros2 topic list -t命令获取到当前活动的一些主题的概括信息,对于主题/turtle1/cmd_vel我们查看得知,它的消息类型是geometry_msgs/msg/Twist(geometry_msgs功能包下消息类型Twist),那这个Twist类型到底长的啥样,我们可以直接找到geometry_msgs/msg/Twist文件打开查看(文本文件),当然我们要做符合身份的事,通过命令看:

$ros2 interface show <msg_type>

对于geometry_msgs/msg/Twist,我们这样输入:

$ros2 interface show geometry_msgs/msg/Twist

结果来了:

可以看见Twist数据类型为两个向量(线性及角度)构成,如果你要主动发布主题消息控制小海龟,你必须得按照这个格式来。

发布主题消息

        我们来试试上个小标题最后提到的发布主题消息,它的命令是这样的:

$ros2 topic pub <topic_name> <msg_type> '<args>'

需要注意的是最后一个参数'<args>',它就是按照对应消息类型填充的参数,必须得是YAML语式:

$ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

--once表示只发生一次主题消息就退出,看看效果,

如果要让它自动(一定频率)发布下去呢,我们可以将--once变为--rate 1,表示按1Hz的频率(1次/秒)周期发布消息,来试试:

$ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

我们再来看看rqt_graph又变成啥样了,

又多了一个发布者节点(/_ros2cli_43523),它通过/turtle1/cmd_vel主题发布Twist消息数据,/turtlesim和/_ros2cli_43366作为订阅者节点不断接收消息数据。

        最后我们可以尝试echo一下pose主题并查看一下rqt_graph,

$ros2 topic echo /turtle1/pose

可以看到/turtlesim节点发布了一个/turtle1/pose主题,/_ros2cli_43706节点(刚刚echo pose的那个终端)订阅了该主题。

        如果我们想在发布主题消息里面加入时间戳呢,我们有下面这个主题,该主题消息包含了时间戳字段,geometry_msgs/msg/PoseStamped,我们来看看这个主题的详细信息(还记得查看命令吧),ros2 interface show geometry_msgs/msg/PoseStamped,

如上,该主题消息由两部分组成,第一部分为标准消息头结构(std_msgs/msg/Header),stamp字段我们可以用auto填充,我们再来试试,

$ros2 topic pub /pose geometry_msgs/msg/PoseStamped '{header: "auto", pose: {position: {x: 1.0, y: 2.0, z: 3.0}}}'
 

时间戳有啦(小海龟此时此刻会有什么反应呢,思考一下,如果将命令行中的/pose变成/turtle1/pose呢)。

        还有一种带时间的主题,sensor_msgs/msg/TimeReference,看它的消息结构有点头大吧,其中builtin_interfaces/Time消息类型变量time_ref,我们可以填充now(先暂时留个印象吧)。

        

主题消息发布频率

当我们想要知道某些主题消息的发布频率时,我们可以通过hz查询,如下:

$ros2 topic hz /turtle1/pose

通过键盘控制小海龟,再来查看/turtle1/cmd_vel主题消息频率(大家可以试试上面讲的--rate 1方式发布主题,看看打印出来个啥)。

本篇完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在ubuntu上搭建系统监控系统

大纲 数据生产方安装和运行验证 数据收集、存储和分发方下载和解压修改配置运行验证 数据消费方下载和运行验证新增数据源新增看板关联看板和数据源效果展现 参考资料 在一个监控系统中&#xff0c;一定会有“数据生产方”和“数据消费方”存在。“数据生产方”用于产出需要监控…

Android MediaRecorder

AndroidManifest.xml中添加权限标记 <uses-permission android:name"android.permission.RECORD_AUDIO"/> 动态添加权限MainActivity requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO},100); 创建MediaReco…

Flask学习(五):session相关流程

流程图如下图所示&#xff1a; 调用相关类如下图所示&#xff1a; 相关代码如下&#xff1a; from flask import Flask, sessionapp Flask(__name__)1. 加密会话数据&#xff1a;在 Flask 中&#xff0c;会话数据存储在客户端的 cookie 中。设置 app.secret_key 可以加密会话…

OLED模块

OLED模块 综述&#xff1a;本篇文章简要讲述了oled的定义&#xff0c;两种oled的引脚和接线情况、iic通讯协议、spi通讯协议、OLED代码引用和注意事项。 1.定义 OLED&#xff08;Organic Light-Emitting Diode&#xff09;模块是一种使用有机发光二极管作为显示元素的显示模…

DFS:二叉树的深搜与回溯

一、计算布尔二叉树的值 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool evaluateTree(TreeNode* root) {if(root->leftnullptr) return root->val0?false:true; bool left evaluateTree(root->left);bool rightevaluateTree(root->rig…

1.1 单片机的概念

一,单片机的概念 单片机(Single-Chip Microcomputer),也被称为单片微控制器,是一种集成电路芯片。它采用超大规模集成电路技术,将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、…

springcloud基本使用(搭建eureka服务端)

创建springbootmaven项目 next next finish创建成功 删除项目下所有文件目录&#xff0c;只保留pox.xml文件 父项目中的依赖&#xff1a; springboot依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s…

Swift:“逻辑运算子“与“比较运算符“

1. 逻辑非 ! 逻辑非运算符 ! 是用于对布尔值取反的。当操作数为 true 时&#xff0c;! 将返回 false&#xff0c;而当操作数为 false 时&#xff0c;! 将返回 true。 let isTrue true let isFalse !isTrue // isFalse 现在是 false 2. 逻辑与 && 逻辑与运算符 &a…

爬取b站音频和视频数据,未合成一个视频

一、首先找到含有音频和视频的url地址 打开一个视频&#xff0c;刷新后&#xff0c;找到这个包&#xff0c;里面有我们所需要的数据 访问这个数据包后&#xff0c;获取字符串数据&#xff0c;用正则提取&#xff0c;再转为json字符串方便提取。 二、获得标题和音频数据后&…

linux基础命令篇:Linux基础命令讲解——文件浏览(cat、less、head、tail和grep)

Linux基础命令讲解——文件浏览&#xff08;cat、less、head、tail和grep&#xff09; 本文详细介绍Linux中的cat、less、head、tail和grep命令&#xff0c;这些命令在日常工作中非常实用&#xff0c;以下是关于这些命令的详细介绍&#xff1a; 1. cat命令&#xff1a;用于查看…

JUC:synchronized优化——锁的升级过程(偏向锁->轻量级锁->重量级锁)以及内部实现原理

文章目录 锁的类型轻量级锁重量级锁自旋优化偏向锁偏向锁的细节偏向锁的撤销批量重偏向批量撤销锁消除 锁的类型 重量级锁、轻量级锁、偏向锁。 加锁过程&#xff1a;偏向->轻量级->重量级 轻量级锁 轻量级锁的使用场景&#xff1a;如果一个对象虽然有多线程要加锁&am…

登录者个人信息查询

目录 &#x1f95e;1.vo层描述 &#x1f37f;2..vo层创建 &#x1f32d;3.编写controller层 &#x1f953;4.service层 &#x1f9c2;5.测试 1.vo层描述 Spring Boot项目中的实体类通常用于映射数据库表&#xff0c;包含了业务对象的所有属性。然而&#xff0c;前端或其…

Jenkins详细安装配置部署

目录 简介一、安装jdk二、安装jenkins这里如果熟悉 Jenkins &#xff0c;可以【选择插件来安装】&#xff0c;如果不熟悉&#xff0c;还是按照推荐来吧。注意&#xff1a; 三、插件安装如果上面插件安装&#xff0c;选择的不是【安装推荐的插件】&#xff0c;而是【选择插件来安…

ZYNQ学习之PetaLinux与Vitis的安装

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Petalinux安装 1.1、Petalinux资源下载 百度云安装包&#xff1a; Petalinux 安装…

FFMPEG C++封装(一)(C++ FFMPEG)

1 概述 FFMPEG是一个C语言开源视音频编解码库。本文将FFMPG4.1.3进行C封装&#xff0c;形成C FFMPG库。 2 架构 架构图如下所示&#xff1a; 架构说明: Init 初始化FFMPEG库。IStream 输入流&#xff0c;FFMPEG的输入音视频文件。Packet 音视频数据包Decoder 音视频编码器F…

OpenHarmony:RichEditor组件样例开发

使用 richEditor 组件实现一个富文本编辑框&#xff0c;包含富文本编辑区域和功能栏&#xff0c;功能栏中有多个按键&#xff0c;可以调整字体大小、字体样式、字体颜色、布局&#xff0c;并可以插入图片。 api 版本&#xff1a;api11 主页面 import { TitleBar } from ../.…

element跑马灯/轮播图,第一页隐藏左边按钮,最后一页隐藏右边按钮(vue 开箱即用)

图示&#xff1a; 第一步&#xff1a; <el-carousel :class"changeIndex0?leftBtnNone:changeIndeximgDataList.length-1? rightBtnNone:" height"546px" :autoplay"false" change"changeNext"><el-carousel-item v-for…

Stata 15 for Mac:数据统计分析新标杆,让研究更高效!

Stata 是一种统计分析软件&#xff0c;适用于数据管理、数据分析和绘图。Stata 15 for Mac 具有以下功能&#xff1a; 数据管理&#xff1a;Stata 提供强大的数据管理功能&#xff0c;用户可以轻松导入、清洗、整理和管理数据集。 统计分析&#xff1a;Stata 提供了广泛的统计…

A Little Is Enough: Circumventing Defenses For Distributed Learning

联邦学习的攻击方法&#xff1a;LIE 简单的总结&#xff0c;只是为了能快速想起来这个方法。 无目标攻击 例如总共50个客户端&#xff0c;有24个恶意客户端&#xff0c;那么这个时候&#xff0c;他需要拉拢2个良性客户端 计算 50 − 24 − 2 50 − 24 0.923 \frac{50-24-2}{…

瑞_23种设计模式_中介者模式

文章目录 1 中介者模式&#xff08;Mediator Pattern&#xff09;1.1 介绍1.2 概述1.3 中介者模式的结构1.4 中介者模式的优缺点1.5 中介者模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《2…