ROS学习笔记(五)---话题发布

1. 话题通信是什么

在ROS(机器人操作系统)中,话题通信是一种常用的通信机制,用于在不同的ROS节点之间传递消息。话题通信基于发布者-订阅者模式,其中一个节点(发布者)发布消息到一个特定的话题,而其他节点(订阅者)可以订阅该话题以接收消息。
下面用房东(发布)–租房平台(管理平台)–打工人(你)来举例发布和订阅的话题通信。在ROS话题通信模型中,涉及到三个角色:
(1)ROS Master(管理者–租房平台):ROS Master是ROS系统中的中央管理节点。它负责协调和管理所有的ROS节点和话题。
(2)Talker(发布者–房东):Talker是一个ROS节点,负责发布消息到特定的话题。Talker节点可以发布多个话题的消息,每个话题都有一个唯一的名称。它可以是机器人系统中的一个组件,例如传感器节点,或者是用户自定义的节点。Talker节点通过ROS Master注册自己,并向ROS Master宣布它发布的话题。
(3)Listener(订阅者–你):Listener是另一个ROS节点,负责订阅话题并接收发布者发布的消息。Listener节点可以订阅一个或多个话题,它通过ROS Master找到对应的发布者节点,并与之建立通信连接。一旦建立连接,Listener节点就可以接收来自发布者节点的消息,并进行相应的处理。
在这里插入图片描述
上图参考了赵虚左老师的课程

2. 话题通信有什么用

以下是一些常见的ROS话题通信应用举例:

(1)机器人导航:在机器人导航中,机器人可以发布它的目标位置到一个话题,导航系统中的路径规划节点可以订阅该话题,接收目标位置信息,并计算机器人需要遵循的路径。

(2)物体识别和跟踪:当机器人需要识别和跟踪物体时,视觉系统可以发布检测到的物体位置和标识到一个话题,控制系统中的跟踪节点可以订阅该话题,接收物体信息,并相应地调整机器人的动作。

(3)传感器数据融合:当机器人使用多个传感器收集数据时,ROS话题通信可用于将不同传感器的数据进行融合和处理。例如,一个机器人可以发布来自视觉传感器、激光雷达和惯性测量单元(IMU)的数据到不同的话题,数据融合节点可以订阅这些话题,将不同传感器的数据进行融合,从而提供更准确和完整的感知信息。
3.编写话题通信(发布-订阅)的python案例
(1)任务要求:发布方每秒10次的频率发布消息,订阅方接收订阅消息后将信息打印输出。
(2)实现流程:

  • 编写发布方实现
  • 编写订阅方实现
  • 为python文件添加可执行权限
  • 编辑配置文件
  • 编译并执行

(3)编写发布方实现
我们在之前的工作空间下面新建pub_sub文件夹作为发布-订阅的功能包,然后创建script文件夹,再新建一个demo01_pub_p.py的文件来编写发布方程序,记得打开python可执行权限,然后编辑配置文件CMakeLists.txt,怎么创建新的功能包等具体可见ROS学习笔记(二)
在这里插入图片描述

#! /usr/bin/env python
#coding:utf-8
"""
使用python实现消息发布:1.导包2.初始化ROS节点3.创建发布者对象;4.编写发布逻辑并发布数据。"""
import rospy 
from std_msgs.msg import String #发布的消息类型if __name__ =="__main__":#初始化ROS节点rospy.init_node("fangdong") #传入节点名称#创建发布者对象pub = rospy.Publisher("fangzi",String,queue_size=10)#编写发布逻辑并发布数据#创建数据msg = String()#制定频率发布,10Hz,每秒10次rate = rospy.Rate(10)#设置计数器count = 0rospy.sleep(3)#使用循环发布数据while not rospy.is_shutdown():msg.data = "hello" + str(count)#发布数据pub.publish(msg)rospy.loginfo("发布的数据是:%s" , msg.data)  #查看发布情况rate.sleep()count += 1

crtl+B编译运行后,打开终端查看发布方结果
在这里插入图片描述
(4)编写订阅方实现
继续新建订阅方的python文件demo01_sub_p.py,打开python可执行权限,然后编辑配置文件CMakeLists.txt
在这里插入图片描述

#! /usr/bin/env python
#coding:utf-8
import rospy
from std_msgs.msg import String #发布的消息类型
"""
使用python实现消息发布:1.导包2.初始化ROS节点3.创建订阅者对象;4.回调函数处理数据5.spin()"""
#回调函数
def doMsg(msg):rospy.loginfo("我订阅的数据:%s" ,msg.data)if __name__ =="__main__":#2.初始化ROS节点rospy.init_node("dagongren")#3.创建订阅者对象;sub = rospy.Subscriber("fangzi",String,doMsg,queue_size=10)# 4.回调函数处理数据(执行回调函数)#5.spin()rospy.spin()

(5)查看发布方和订阅方实现的效果
① 通过终端查看发布订阅情况。首先运行发布方的程序,然后再运行订阅方的程序
在这里插入图片描述
② 通过计算图查看发布订阅模式的节点
在上述两个程序运行的情况下,在打开一个新的终端,输入:rqt_graph,就可以查看节点关系
在这里插入图片描述
可以看到计算图中,左边“/fangdong”是我们的发布方节点,右边“/dagongren”就是我们的订阅方节点,他们通过“fangzi”这个话题来搭建通信。

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

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

相关文章

java学习三

目录 Java 与 C 的区别 面向对象和面向过程的区别 面向对象特性 Java的基本数据类型 深拷贝和浅拷贝 Java创建对象的几种方式 final, finally, finalize 的区别 Java 与 C 的区别 Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object&#xff0c…

评价模型:层次分析法

1. 模型建立 1.1 建立层次结构模型 在深入分析实际问题的基础上,将有关的各个因素按照不同属性自上而下地分解成若干层次,同一层的诸因素从属于上一层的因素或对上层因素有影响,同时又支配下一层的因素或受到下层因素的作用。最上层为目标层…

【多线程】死锁 详解

死锁 一. 死锁是什么二. 死锁的场景1. 一个线程一把锁2. 两个线程两把锁3. N 个线程 M 把锁 三. 死锁产生的四个必要条件四. 如何避免死锁 一. 死锁是什么 死锁是这样一种情形: 多个线程同时被阻塞,因为每个进程都在等其他线程释放某些资源,…

Postman应用——初步了解postman

Postman 是一个用于构建和使用 API 的 API 平台,Postman 简化了 API 生命周期的每个步骤并简化了协作,可以更快地创建更好的 API。 Postman 包含一个基于Node.js的强大的运行时,允许您向请求(request)和分组&#xff…

UE4/UE5 动画控制

工程下载​ ​​​​​​​​​​​​​https://mbd.pub/o/bread/ZJ2cm5pu 蓝图控制sequence播放/倒播动画: 设置开启鼠标指针,开启鼠标事件 在场景中进行过场动画制作 设置控制事件

APP自动化之weditor工具

由于最近事情颇多,许久未更新文章。大家在做APP自动化测试过程中,可能使用的是Appium官方提供的inspect进行元素定位,但此工具调试不方便,于是今天给大家分享一款更好用的APP定位元素工具:weditor weditor基于web网页…

C# Onnx Yolov8 Seg 分割

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

合宙Air724UG LuatOS-Air LVGL API控件-开关 (Switch)

开关 (Switch) 示例代码 function event_handler(obj, event)if event lvgl.EVENT_VALUE_CHANGED thenprint("State", lvgl.switch_get_state(obj))end endsw1 lvgl.switch_create(lvgl.scr_act(), nil) lvgl.obj_align(sw1, nil, lvgl.ALIGN_CENTER, 0, -50) lvg…

Docker核心原理与实操

第一章、Docker基本概念 1、概念:Docker是一种容器技术,可以解决软件跨环境迁移问题。 2、实现原理:是一个分层复用的文件系统;每一层都是一个独立的软件; …

java:逆序排序的三种方法

// 逆序第一种方法 public static void main(String[] args) {int arr[] {11, 22, 33, 44, 55, 66};for (int i arr.length-1; i > 0; i--) {System.out.print("\t"arr[i]);}}缺点:这个是直接逆转,如果里面是随机数没办法比较 逆序第二种…

小技巧!Python生成excel文件的三种方式!

在我们做平常工作中都会遇到操作excel,那么今天写一篇,如何通过python操作excel。当然python操作excel的库有很多,比如pandas,xlwt/xlrd,openpyxl等,每个库都有不同的区别,具体的区别&#xff0…

5.9.Webrtc线程事件处理

在前面的课程中呢,我已经向你介绍了事件处理的一些基础知识,那今天呢,我们再来看一下外边儿rtc下事件处理的基本逻辑是什么? 那首先呢,我们来看一下事件是如何协调线程工作的,那就如果这张图所展示的有两个…

ArcGIS标注的各种用法和示例

标注是将描述性文本放置在地图中的要素上或要素旁的过程。 本文整理了ArcGIS中的各种标注方法、可能遇到的问题和细节,内容比较杂,想到哪写到哪。 一、正常标注某一字段值的内容 右键点击【属性】,在【标注】选项卡下勾选【标注此图层中的的要素】,在【文本字符串】栏中…

【SpringBoot集成Redis + Session持久化存储到Redis】

目录 SpringBoot集成Redis 1.添加 redis 依赖 2.配置 redis 3.手动操作 redis Session持久化存储到Redis 1.添加依赖 2.修改redis配置 3.存储和读取String类型的代码 4.存储和读取对象类型的代码 5.序列化细节 SpringBoot集成Redis 1.添加 redis 依赖 …

指针进阶(2)

6.函数指针数组 数组是一个存放相同类型数据的存储空间,那我们已经学习了指针数组, 比如: int *arr[10]; //数组的每个元素是int* 那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢&…

dart项目规范

​ dart项目结构 假设有一个名称为 enchilada 的完整的包目录(基本用到了所有的子目录),那么它的目录结构看起来像下面这样: enchilada/ .dart_tool/ * .packages * pubspec.yaml pubspec.lock ** LICENSE README.md CHANGELOG…

【LeetCode每日一题】——面试题10.11.峰与谷

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 排序 二【题目难度】 中等 三【题目编号】 面试题10.11.峰与谷 四【题目描述】 在一个整数…

灰度变换原理//test later

灰度变换原理 图像灰度变换变换原理:通过变换函数T将原图像像素灰度值r映射为灰度值s: 2、灰度反转 2.1原理 灰度反转:将图像亮暗对调,可以增强图像中暗色区域细节 ��(�)�−1−…

【C++】哈希表的实现

哈希是什么理解哈希哈希所用的容器计算key值方法哈希的插入和查找解决哈希冲突闭散列也叫开放寻址法开散列 哈希闭散列实现闭散列结构闭散列结构插入闭散列查找闭散列删除 哈希开散列实现(链表式)开散列结构开散列结构插入开散列结构查找开散列结构删除 …

Map和Set及其实现类详解

目录 一, 搜索 1,传统搜索 2,Map和Set模型 二, Map的使用 1,Map接口的继承及实现图 2,Map接口的使用 3,TreeMap和HashMap的使用和对比 1,TreeMap 代码示例 map中插入的数据按照key进行排序 map中插入的数据必须具有可比较性(或者实现了比较器相关接口) ​map中插入…