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

news/2025/2/21 16:29:16

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学习笔记(二)
在这里插入图片描述

python">#! /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 = 0
    
    rospy.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
在这里插入图片描述

python">#! /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.niftyadmin.cn/n/5018055.html

相关文章

【动态规划刷题 13】最长递增子序列 摆动序列

300. 最长递增子序列 链接: 300. 最长递增子序列 1.状态表示* dp[i] 表⽰:以 i 位置元素为结尾的「所有⼦序列」中,最⻓递增⼦序列的⻓度。 2.状态转移方程 对于 dp[i] ,我们可以根据「⼦序列的构成⽅式」,进⾏分类讨论&#…

微信小程序开发---网络数据请求

目录 一、小程序中网络数据请求的限制 二、发起get请求 三、发起post请求 一、小程序中网络数据请求的限制 具体有两个限制: (1)只能请求HTTPS类型的接口 (2)必须将接口的域名添加到信任列表中,在调试的时…

长胜证券:融券打新虽失宠 券源分配仍需透明

近期,关于战略投资者出借限售股作为融券券源的准则备受商场热议。不少投资者担心,跟着新股的大都券源被量化私募掌握,量化私募融券打新的战略有或许成为新股上市首日上涨后回身跌跌不休的首要原因。 券源分配是否有失公允?融券打…

msvcp110.dll是什么意思与msvcp110.dll丢失的解决方法

电脑突然提示msvcp110.dll丢失,无法执行此代码。导致软件无法打开运行,这个怎么办呢?我在网上找了一天的资料,终于把这个问题彻底处理好,也弄清楚了msvcp110.dll丢失的原因及msvcp110.dll丢失修复方法?现在…

Java“牵手”淘宝商品详情数据,淘宝商品详情API接口,淘宝API接口申请指南

淘宝平台商品详情接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取淘宝商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口,通过…

Spring云服务:如何将应用程序轻松迁移到云端

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

IDEA控制台取消悬浮全局配置SpringBoot配置https

IDEA控制台取消悬浮 idea 全局配置 SpringBoot(Tomcat) 配置https,同时支持http 利用JDK生成证书 keytool -genkey -alias httpsserver -keyalg RSA -keysize 2048 -keystore server.p12 -validity 3650配置类 Configuration public class TomcatConfig {Value(&quo…

第37章 优化驱动稳定性和效率实验

第37章 优化驱动稳定性和效率实验 在Linux中应用程序运行在用户空间,应用程序错误之后,并不会影响其他程序的运行,而驱动工作在内核层,是内核代码的一部分,当驱动出现问题之后,可能会导致整个系统的崩溃。…