ROS 学习应用篇(二)话题Topic学习之话题的发布与订阅

news2025/1/18 6:59:02

顾名思义,这是一个异步的消息传达过程

首先是消息的发布,接着是消息的订阅

话题发布

由发布者发布一个“消息”的数据结构,再由订阅者订阅这个消息结构。

再开始撰写一段程序之前,我们需要在程序代码中引入库→节点初始化→创建发布者→设定循环频率→初始化消息→发布消息。

引入库

c++                                                                                python

其中的geometry_msgs是再创建功能包时候输入的依赖,rospy和roscpp等等都是依赖。

节点初始化(定义函数,定义节点名称)

c++                                                                                python

这一部分中,节点的名字叫velocity_publisher,python与C++的定义方式是不同的python中函数的名字就是节点的名字。argc和argv其实是输入的参数,但是一般不输入。

定义发布者(Publisher)

包括发布器名称、话题名称、消息类型和队列长度(这一部分就有c类程序的影子了)

c++                                                                                python 

发布器名称

等号左边是发布器的名称,turtle_vel_pub,之后的消息发布需要使用到该发布器发布。

这里就可以看出C++的程序要比python的麻烦c++的需要单独在定义一个节点句柄(一种特殊的指针)

话题名称

/turtle1/cmd_vel,这种命名方式猜测是不是按照文件夹的方式去定义名称,毕竟发布后还需要订阅,所以现在先猜测订阅的名字是/turtel1/...这种(这一猜想是正确地)。

类型

此外,除了geometry_msgs这种用于控制机器人运动的消息类型外还有很多其他消息类型,其各自还分为多种数据结构类型Twist只是geometry_msgs其中之一的数据结构(就两个可输入变量,线速度和角速度,这中消息类型),其具体的解释文档链接如下:

ROS相关消息类型&格式介绍_ros消息类型-CSDN博客

队列长度

这里暂定队列长度是10,这是因为,消息的发布是会受到通讯性能的影响的,一旦信号不好,TCP协议下是有可能,信息发布不出去的。这时候,publisher就会持续发送队列里最后10个消息以保证消息的时序新鲜性。同理队列长度越长,性能消耗占比越大,这就可以理解成缓存区域。

c++                                                                                python  

在设置好队列之后,需要通过循环的方式去实现,这时候就需要设置好循环的频率。也就是在循环的过程中不停的发送以下信息。

消息发布

c++                                                                                python  

定义消息名称

可以发现 这一部分定义了具体发布的消息的名称vel_msg,再传入线速度与角速度

消息发布

在利用之前定义的发布器turtle_vel_pub发布消息。

日志输出(非必要程序)

ROS_INFO与rospy.loginfo都是日志输出语句其实就是print。

延时

最后按照之前设置好的循环此时实现队列延时发布。

主程序调用段

这一部分是python程序特有的程序调用端,在之前的节点初始化时,Python程序中就用定义函数的方式定义了一个和节点名称相同的函数。

c++                                                                                python   

---------------------------------------------------------------------------------------------------------------------------------

代码编译规则录入CMakeList.txt

代码完成后需要在对应的CMakeList.txt文件中录入我们编译好的代码。

c++                                                                                python    

add_executable是将src文件夹下的velocity_publisher.cpp文件定义成名为velocity_publisher的可执行文件,再通过target_link_libraries将这可执行文件与ros 的数据库链接到一起。

这里需要注意的是,python文件不需要修改CMakeList.txt文件即可编译。但是py文件需要是可允许执行文件

话题发布节点运行

 话题订阅

这部分的流程同样也是引入库→节点初始化→定义发布器→消息订阅

引入库

c++                                                                                python  

这里的turtlesim和geometry_msgs、rospy和roscpp一样都是依赖,Pose则是turtlesim依赖下的一种消息类型,都是要在功能包建立的时候输入的,但是如果有遗落项应该是可以在CMakeList.txt中补全的,至于是否需要在其他位值补全代码还需要在之后的实验中验证。

CMakeList.txt文件

节点初始化(定义函数,定义节点名称)

 c++                                                                                python  

 在这里我们定义节点的名称为pose_subscriber,而python函数的名字也是pose_subscriber,可以发现节点的名字是和在CMakeList.txt文件中定义的可执行文件的名字是一样的。

定义订阅者(subscriber)

包括订阅器名称、订阅的话题名称、消息类型、话题的队列长度以及回调函数(这一部分就有c类程序的影子了),此外和发布器的定一样C++程序依旧多了一个节点句柄的定义。

 c++                                                                                python   

订阅器名称 

这一部分因为后续是直接订阅而不像消息发布的时候需要循环发布消息所以并没有像发布器一样顶一个确定的名字,我猜测如果需要定义的话在等号的左边定义一个和turtle_vel_pub类似的turtle_vel_sub即可。

订阅的话题名称

这里果然和之前猜测的一样,此处定义的话题名称是/turtle1/pose正与之前发布器定义的话题名称/turtle1/cmd_vel对应。

消息类型

这里C++程序中并没有定义消息的类型,Python中声明了消息类型,而C++程序则是通过回调函数中定义消息类型来实现整个订阅器消息类型的订阅。

队列长度

发布器会需要因为消息传送能力建立缓冲队列(队列的长度设置为10),同理订阅器也因为订阅端口的处理能力需要建立缓冲队列来存储最近的10个消息。特别的是python中没有设置缓冲队列,这一个遗留问题

回调函数(PoseCallback)

日志输出

回调函数中封装的恰是是一个print程序,个人认为非必要,空函数也没关系,主要是需要回调这个一直等待,直到消息进入就启动的机制。

 c++                                                                                python  

 死循环等待spin()

通常情况下,回调函数的使用需要搭配死循环函数spin()一起进行。spin函数是一个死循环,只有当目标消息队列输入进来才会调用回调函数,否则就不停的循环,C++hai需要一个返回值,但是python就可以不写这一步,这只是两种语言书写上的差异,并不影响整体的逻辑。

另外在定义订阅器的时候,python在该除定义了消息的类型,而C++并没有,C++实在回调函数顶一段定义了消息的类型。

 c++                                                                                python   

主程序调用段

和之前订阅器一样,这一部分是python程序特有的程序调用端,在之前的节点初始化时,Python程序中就用定义函数的方式定义了一个和节点名称相同的函数。

c++                                                                                python   

---------------------------------------------------------------------------------------------------------------------------------

代码编译规则录入CMakeList.txt

代码完成后需要在对应的CMakeList.txt文件中录入我们编译好的代码。

c++                                                                                python    

add_executable是将src文件夹下的pose_subscriber.cpp文件定义成名为pose_subscriber的可执行文件,再通过target_link_libraries将这可执行文件与ros 的数据库链接到一起。

这里需要注意的是,python文件不需要修改CMakeList.txt文件即可编译。但是py文件需要是可允许执行文件

话题发布、订阅节点编译

工作空间编译

工作空间文件夹下开启编译

ROS工作空间文件夹下启动终端输入catkin_make

 环境变量设置

编译成功(无红色报错)后,设置环境变量

source devel/setuo.bash

这一句是如果已经将工作空间加入环境变量文件了的话可忽略,具体怎么把工作空间文件夹加入环境变量文件参考如下链接:

启动ros

这一步就不约束终端启动文件夹了

输入roscore

另开一个终端启动小海龟控制器,输入:

rosrun turtlesim turtlesim_node

话题发布节点启动

再开一个终端输入:

rosrun learning_me_topic velocity_publisher

这是我们做的话题发布器(懒得输入全称的话,就打几个字母,然后按一下TAB按键就自动补全)

这时候小海龟就回转圈圈了。

话题发布节点启动

接下来的订阅器的编译,再再新开一个终端

输入订阅器运行代码:

rosrun learning_me_topic pose_subscriber

这时候 订阅器就会实时显示海龟当前的位置,并做好记录文档,存放在。

python的编译

python的编译直接在可执行文件处改成“python文件名.py”

例如:rosrun learning_me_topic pose_subscriber.py

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

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

相关文章

前端开发入门笔记(八)CSS3属性详解:动画详解+Flex布局图文详解+Web字体

参考链接:https://web.qianguyihao.com/02-CSS%E5%9F%BA%E7%A1%80/12-CSS3%E5%B1%9E%E6%80%A7%E8%AF%A6%E8%A7%A3%EF%BC%9A%E5%8A%A8%E7%94%BB%E8%AF%A6%E8%A7%A3.html#_3%E3%80%81%E6%97%8B%E8%BD%AC%EF%BC%9Arotate 过渡 transition的中文含义是过渡。过渡是CSS…

【数据结构】深度剖析ArrayList

目录 ArrayLIst介绍 ArrayList实现的接口有哪些? ArrayList的序列化:实现Serializable接口 serialVersionUID 有什么用? 为什么一定要实现Serialzable才能被序列化? transient关键字 为什么ArrayList中的elementData会被transient修…

C++ 常用方法,刷oj必备(持续更新!!!)

输出结果保留小数点后n位(4位) #include<iostream> #include <iomanip> using namespace std;int main(){double s ;cin >> s ;cout<<fixed << setprecision(4) << s ;return 0; } 类型转换 string 转 int #include <iostream> …

耗时3年写了一本数据结构与算法pdf!开源了

前言 大家好&#xff0c;我是bigsai&#xff0c;很早就在写博客&#xff0c;我将csdn的文章整理成了一个pdf&#xff0c;并且开源到github上&#xff01; 自己写东西断断续续也不少时间了&#xff0c;也写了不少东西(虽然是偏向小白)&#xff0c;这个其实花费的时间还是比较多…

SQL 聚合函数

前言 SQL中的聚合函数是对一组值执行计算&#xff0c;并返回单个值的函数。 常用的聚合函数有&#xff1a; 函数作用AVG&#xff08;&#xff09;求平均值MAX&#xff08;&#xff09;求最大值MIN&#xff08;&#xff09;求最小值SUM&#xff08;&#xff09;求和COUNT&…

Windows 中 kubectl 配置详细指南

目录 前言 什么是 Chocolatey与Minikube Chocolatey Minikube 安装 Minikube 安装 Chocolatey&#xff08;如果尚未安装&#xff09; Minikube 遇到的问题 通过获取集群状态的方法 kubectl 可选配置和插件 启用 shell 自动补全功能 安装 kubectl convert 插件 前言 …

C语言、c++史上最全最全爱心代码大全,彩色闪动、字符填充,附源码

第一种&#xff1a;红色爱心代码 直接上代码&#xff1a; #include<stdio.h> #include<Windows.h> int main() {system(" color 0c");//设计程序颜色 printf("遇见你是一件很开心的事情,爱你哟&#xff01;&#xff01;&#xff01;\n");//打…

【神经网络】GAN:生成对抗网络

GAN&#xff1a;生成对抗网络 Generator&#xff08;生成器&#xff09;概念 和传统的神经网络不同&#xff0c;Generator除了接受x的输入之外&#xff0c;还会接受一个简单的分布作为z进行输入&#xff0c;从而使得网络的输出也是一个复杂的分布 为什么输出需要时一个分布呢…

RocketMQ(一):基本概念和环境搭建

Spring源码系列文章 RocketMQ(一)&#xff1a;基本概念和环境搭建 目录 一、RocketMQ简介二、各个MQ产品的比较三、RocketMQ重要概念1、基本概念2、消息从发送到被消费的的流程3、生产和消费理解 四、RocketMQ安装1、下载RocketMQ2、解压并配置环境变量3、修改nameServer的运行…

JVM之jmap java内存映射工具

jmap java内存映射工具 1、jmap jdk安装后会自带一些小工具&#xff0c;jmap命令(Memory Map for Java)是其中之一。主要用于打印指定Java进程(或核 心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行中的jvm的堆的快照&#xff0c;从而可以离…

超强C语言跨年烟花代码,精美无比,附源码分步解析

现在大家是不是都觉得程序员不懂浪漫&#xff1f;那真的大错特错&#xff0c;今天就让你们看看什么是程序员的浪漫&#xff01; 我们今天就来写写《烟花》表白程序&#xff0c;不要惊讶&#xff0c;不要激动&#xff0c;学会了快去拿给心中的那个人看&#xff01;&#xff01;…

if,switch语句

1.if public class IfDemo1 {public static void main(String[] args) {// 目标&#xff1a;掌握if分支三种形式的用法和执行流程// 需求&#xff1a;测量用户体温&#xff0c;发现高于37度就报警double temperature 38.5;if (temperature > 37){System.out.println("…

Ruoyi框架开发项目(宝藏干货)

若依勾选框导出数据 效果图&#xff1a; package com.ruoyi.web.controller.school;import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.pag…

Linux使用gdb进行代码调试

1.debug版本 在编译阶段会加入某些调试信息; 调试信息是在编译的过程中加入到中间文件.o文件的;gcc -c main.c -g:生成包含调试信息的中间文件 gcc -o main main.o一步执行:gcc -o main main.c -g 2.release版本 发行版本,没有调试信息; gcc默认生成release版本; 3.gdb基础命…

关于session的不断变化问题

今天在帮同学解决一个小问题&#xff0c;差点阴沟翻船。 问题再现&#xff1a;他从github上拉了一个项目下来跑&#xff0c;结果发生跑不通问题出现在验证码一直不对。 我一看项目源码&#xff0c;验证码生成后存储再session中了&#xff0c;等用户发送请求验证的时候sessionI…

[SHCTF]web方向wp

[SHCTF]web方向wp [WEEK1]babyRCE题目源码wp [WEEK1]1zzphp题目源码wp [WEEK1]ez_serialize题目源码wp [WEEK1]登录就给flag题目wp [WEEK1]生成你的邀请函吧~题目源码wp [WEEK1]飞机大战题目wp [WEEK1]ezphp题目源码wp [WEEK2]no_wake_up题目源码wp [WEEK2]MD5的事就拜托了题目…

MES系统如何赋能制造企业实现4M防错追溯?

生产过程4M管理和MES系统的结合是现代制造业中关键的质量管理实践&#xff0c;它有助于提高生产效率、降低生产成本并保证产品质量。本文将深入探讨4M管理的概念&#xff0c;以及MES系统如何赋能制造企业实现4M防错追溯。 一、4M管理的概念 4M管理是指在制造过程中管理和控制四…

信息系统“好用”的标准探讨

数字化转型建设的关键不在建设信息系统。这是为了避免走信息化建设的老路——业务和信息化两张皮&#xff0c;寄希望信息系统解决业务问题。在数字化转型建设中&#xff0c;信息系统仍然是重要抓手和显性成果&#xff0c;是企业业务和数据的承载平台&#xff0c;也是IT厂商向客…

FTP、NFS以及SAMBA服务

一、FTP服务 1、Linux下ftp客户端管理工具 ftp、lftp都是Linux下ftp的客户端管理工具&#xff0c;但是需要独立安装 # yum install ftp lftp -y ☆ ftp工具 # ftp 10.1.1.10 Connected to 10.1.1.10 (10.1.1.10). 220 (vsFTPd 3.0.2) Name (10.1.1.10:root): 输入FTP的账号…

Windows系统安装2个版本得的MySQL

一、MySQL官网下载对应版本的zip文件 最新版本8.0.34下载链接&#xff1a;https://dev.mysql.com/downloads/mysql/ MySQL 5.7下载链接&#xff1a;https://downloads.mysql.com/archives/community/ 二、将下载到的压缩包解压到指定目录 使用解压工具将下载到的压缩包解…