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方式发布主题,看看打印出来个啥)。

本篇完。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos JDK1.8 下载安装

https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 一 RPM包安装 rpm -ivh jdk-8u391-linux-x64.rpm /etc/profile export JAVA_HOME/usr/java/jdk1.8.0-x64 export PATH$JAVA_HOME/bin:$PATHsource /etc/profile二 tar.gz 包手动…

如何在极狐GitLab 配置 邮件功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

封装性练习

练习 1 &#xff1a; 创建程序&#xff1a;在其中定义两个类&#xff1a; Person 和 PersonTest 类。定义如下&#xff1a; 用 setAge() 设置人的合法年龄 (0~130) &#xff0c;用 getAge() 返回人的年龄。在 PersonTest 类中实例化 Person 类的对象 b &#xff0c;调用 set…

基于Web的社区医院管理服务系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 1. 系统功能…

模型 可编程思想

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。一切皆有可能。 1 可编程思想的应用 1.1 自动化智能投资顾问服务 传统的财富管理服务通常需要专业的财务顾问来为客户提供投资建议和资产管理服务。随着技术的发展&#xff0c;越来越多的投资者开始寻求…

【群晖】白群晖如何公网访问

【群晖】白群晖如何公网访问 ——> 点击查看原文 在使用默认配置搭建好的群晖NAS后&#xff0c;我们可以通过内网访问所有的服务。但是&#xff0c;当我们出差或者不在家的时候也想要使用应该怎么办呢&#xff1f; 目前白群提供了两种比较快捷的方式&#xff0c;一种是直接注…

广发期货:从灾备中心、信创云到主中心,超融合支撑云化与国产化双转型

案例亮点 超过 30 节点承载灾备中心、信创云及主中心的 60% 以上业务系统。超融合信创资源池稳定运行超 1 年&#xff0c;承载 80% 以上的信创系统&#xff0c;顺利通过信创验收。引入超融合架构后&#xff0c;业务在 1 周内快速上线&#xff0c;稳定运行 3 年&#xff1b;减少…

【MySql数据库】MySQL5.7在navicat中建立连接报错1045及重装MySQL过程中3306端口号被占用释放的过程

文章目录 一、报错1、软件中报错2、navicat中报错3、数据库密码是正确的4、卸载数据库5、重装数据库发现3306端口被占用 二、释放3306端口1、找到3306端口对应的PID值2、释放3306端口号3、释放端口后&#xff0c;重装数据库 一、报错 1、软件中报错 2、navicat中报错 在navic…

HTTP常见状态码

1xx 该类状态码属于提示信息&#xff0c;协议处理的中间状态&#xff0c;实际用到的比较少 2xx 该类状态码表示服务器成功处理了客户单的请求 200 OK 表示服务器成功处理了客户端的请求&#xff0c;一切正常 204 no content 表示服务器返回的内容里没有body 206 partial co…

北京小蓝蜂科技有限公司 基本情况

北京小蓝蜂科技有限公司 基本情况 公司概述 北京小蓝蜂科技有限公司(简称“小蓝蜂”)是一家专注于互联网行业的公司,成立于4年前,位于北京市海淀区成府路45号中关村智造大街G座一层J030。小蓝蜂主要业务包括技术开发、技术咨询、技术转让、技术推广等,同时也涉及销售自行…

【Go】六、函数

文章目录 1、函数的定义2、内存分析3、注意点4、函数数据类型5、自定义数据类型&#xff08;起别名&#xff09;6、支持对返回值命名 1、函数的定义 语法&#xff1a; func 函数名&#xff08;形参列表)&#xff08;返回值类型列表&#xff09;{执行语句..return 返回值列…

Android 12.0 mtp模式下连接pc后显示的文件夹禁止删除copy重命名功能实现

1.前言 在12.0的系统rom定制化开发中,usb连接pc端的时候有好几种模式,在做otg连接pc端的时候,改成mtp模式的时候,在pc端可以看到产品设备 的显示的文件夹的内容,对于产品设备里面的文件在pc端禁止做删除重命名拷贝等操作功能的实现 2.mtp模式下连接pc后显示的文件夹禁止删…

《HelloGitHub》第 96 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

Ubuntu系统设置静态固定IP保姆级教程

1、查看网络接口信息 ifconfig 首先需要确认要设置固定IP的网络接口。在大多数情况下&#xff0c;这通常是ens33 2、查看路由网关信息 route -n # 查看打印 路由表 网关地址 3、备份文件 为了防止防止出现意外问题。Ubuntu中的网络配置文件通常存储在/etc/netplan/目录下&…

Linux内核之debugfs_create_dir与debugfs_create_file实例与调用栈流程(三十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

康耐视visionpro-CogDistancePointLineTool工具详细说明

CogDistancePointLineTool功能说明: 测量点到线的距离 备注&#xff1a;在“Geometry-Measurement”选项中的所有工具都是测量尺寸或角度工具&#xff0c;包括测量线与线 的角度、点与线的距离、圆与圆的距离等测量工具&#xff0c;工具使用的方法相似。 ①.打开工具栏&#…

正大国际:期货入门的基础知识是什么?

期货的概念很简单&#xff0c;就是一种远期合同&#xff0c;买卖双方约定交易物、交易价格与交易时间。难就难在如何理解它具备的杠杆率&#xff0c;人们是如何在这上面暴富或破产的 很多人抱有这么个错觉&#xff0c;觉得期货是一个小众市场。但其实&#xff0c;世界上所发生…

【服务端】node.js详细的配置

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【御控物联】JavaScript JSON结构转换(5):对象To对象——转换映射方式

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

学习鸿蒙基础(9)

目录 一、鸿蒙国际化配置 二、鸿蒙常用组件介绍 三、鸿蒙像素单位介绍 四、鸿蒙布局介绍 1、Row与Column线性布局 2、层叠布局-Stack 3、弹性布局 4、栅格布局 5、网格布局 一、鸿蒙国际化配置 base目录下为默认的string。en_US对应美国的。zh_CN对应中国的。新增一个s…