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

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

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

话题发布

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

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

引入库

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

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

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

相关文章

合成数据加速机器视觉学习

虽然机器学习在基于视觉的自动化中的应用正在增长,但许多行业都面临着挑战,并难以在其计算机视觉应用中实施它。这在很大程度上是由于需要收集许多图像,以及与准确注释这些图像中的不同产品相关的挑战。 该领域的最新趋势之一是利用合成数据…

【Github】git clone命令下载文件中途停止

方法一: 使用git clone命令下载github上的源代码时,有时文件下载到一定百分比时就停止不动, 这是因为我们所下载的文件很大,超过了git预先分配的Postbuffer容量,所以一直卡在那里。可以使用以下命令查看当前Postbuffe…

景联文科技加入中国人工智能产业发展联盟(AIIA),与行业各方共促AI产业发展

近日,景联文科技加入中国人工智能产业发展联盟(AIIA),与行业各方共同挖掘人工智能数据的更多价值,破解中国人工智能AI数据短缺难题。 中国人工智能产业发展联盟(简称AIIA)是在国家发改委、科技部…

省钱攻略:三大运营商保号套餐办理攻略,不再当冤大头!

现在的朋友都是相当的聪明,都不想直接在营业厅办理套餐,而是选择保号套餐流量卡。 今天,小编主要介绍的就是三大运营商的保号套餐,以及如何办理! 如图所示: ​  电信最低可改5元套餐,移动、联…

计蒜客详解合集(2)期

目录 T1126——单词倒排 T1617——地瓜烧 T1612——蒜头君的数字游戏 T1488——旋转单词 T1461——校验信用卡号码 T1437——最大值和次大值 T1126——单词倒排 超级水的一道题,和T1122类似但更简单,分割后逆序输出即可~ 编写程序,读入…

51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)

PCF8591数字电压表数码管显示 1.主要功能:讲解视频:2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接(可点击): 51单片机PCF8591数字电压表数码管设计( proteus仿真程序设计报告讲解视…

收藏!7个国内「小众」的程序员社区

技术社区是大量开发者的集聚地,在技术社区可以了解到行业的最新进展,学习最前沿的技术,认识有相同爱好的朋友,在一起学习和交流。 国内知名的技术社区有CSDN、博客园、开源中国、51CTO,还有近两年火热的掘金&#xff…

【Kurbernetes集群】Pod资源、Pod资源限制和Pod容器的健康检查(探针)详解

Pod资源 一、Pod概述1.1 Pod的定义1.2 一个Pod能包含几个容器?1.3 Pod的分类1.3.1 控制器管理的Pod1.3.2 自主式Pod1.3.3 静态Pod 1.4 Pod中容器的分类1.4.1 Pause容器1.4.2 初始化容器1.4.3 应用容器 1.5 Pod常见的状态 二、Pod中的策略2.1 镜像拉取策略2.2 Pod中容…

【计算机网络】HTTPS

文章目录 前言为什么会出现 HTTPSHTTPS 是如何进行加密的1. 对称加密非对称加密中间人攻击3. 引入证书 前言 前面我们学习了应用层中使用比较常见的 HTTP 协议,但是呢?在实际的使用中,浏览器和服务器之间的通信其实很少使用到 HTTP&#xff…

Google Firebase PHP实现消息推送

获取key的方法: 登录谷歌开发者后台 https://console.firebase.google.com/?hlzh-cn function firebaseNotice($title,$body){$token_arr[token1,token2]; //用户的firebasetoken列表$notify_msg ["notification" > ["title" > $title…

C++入门 1——命名空间,缺省参数

C入门 一.前言二.命名空间2.1命名空间的定义2.2命名空间的使用 三.C的输入&输出四.缺省参数4.1概念4.2缺省分类 五.函数重载5.1概念5.2函数重载条件及代码 六.引用6.1概念6.2引用特性6.3常引用6.4使用6.5引用和指针的区别和联系 七.内联函数7.1概念7.2特性 一.前言 今天就…

[ Linux Busybox ] nandwrite 命令解析

文章目录 相关结构体nandwrite 函数实现nandwrite 实现流程图 文件路径:busybox-1.20.2/miscutils/nandwrite.c 相关结构体 MTD 相关信息结构体 struct mtd_info_user {__u8 type; // MTD 设备类型__u32 flags; // MTD设备属性标志__u32…

(免费版?)CLion Nova 强势登陆 C 和 C++ 开发领域

系列文章目录 文章目录 系列文章目录前言一、CLion Nova二、目标三、优势和改进四、显著差异五、如何安装 CLion Nova六、分享您的反馈意见总结 阿纳斯塔西娅-卡扎科娃 2023 年 11 月 9 日 前言 今天,我们宣布推出免费的 CLion 早期预览版,它使用 ReSh…

400G OSFP SR8光模块最新解决方案

数字化时代,意味着网络速度、能效和成本成为数据中心和通信网络关注的焦点。为了满足这些需求不断催生和进化新的产品,因此在这一背景下400G OSFP SR8光模块最新解决方案成为了很好的助力。该方案不仅提高了网络速度,还实现了节能降耗&#x…

ARM 基础学习记录 / ARM 裸机编程

汇编程序调用 C 程序详情 在 C 程序和 ARM 汇编程序之间相互调用时必须遵守 ATPCS 规则,其是基于 ARM 指令集和 THUMB 指令集过程调用的规范,规定了调用函数如何传递参数,被调用函数如何获取参数,以何种方式传递函数返回值。 寄存…

95. 费解的开关

题目 思路 因为最优解是每个灯只操作一次所以顺序无所谓只要确定了第一行后&#xff0c;下面都可以确定当前灯不亮就操作它下面的格子即可点亮它我觉得这种方法是唯一不会互相干扰的方法还是不太理解… 代码 #include <cstdio> #include <cmath> #include <c…

2023最新版本 从零基础入门C++与QT(学习笔记) -1- C++输入与输出

&#x1f38f;说在前面 &#x1f388;我预计是使用两个月的时间玩转C与QT &#x1f388;所以这是一篇学习笔记 &#x1f388;根据学习的效率可能提前完成学习,加油&#xff01;&#xff01;&#xff01; 输入(代码如下方代码块) &#x1f384;分析一下构成 &#x1f388;…

Rocksdb LSM Tree Compaction策略

RocksDB读写简介 直接画图说明。这张图取自Flink PMC大佬Stefan Richter在Flink Forward 2018演讲的PPT&#xff0c;笔者重画了一下。 RocksDB的写缓存&#xff08;即LSM树的最低一级&#xff09;名为memtable&#xff0c;对应HBase的MemStore&#xff1b;读缓存名为block cac…

CV计算机视觉每日开源代码Paper with code速览-2023.11.8

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构】&#xff08;WACV2024&#xff09;SBCFo…

Vue3-ref函数、reactive函数的响应式

Vue3-ref函数、reactive函数的响应式 在这之前&#xff0c;先讲Vue2的响应式处理 Vue2原本使用的是Object.defineProperty的响应式处理方式 methods方法中的this.name指的是vm.namereturn的name属性在通过this.name的间接调用时&#xff0c;通过了Object.defineProperty响应式…