• 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 = 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
            
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

  • 相关阅读:
    算法链表-局部反转
    [数据结构与算法]全网最详细的二叉树详解,一文刷遍Leetcode
    (02)Cartographer源码无死角解析-(19) SensorBridge→雷达点云数据预处理(函数重载)
    基于 Bresenham 算法画圆
    内存泄漏Memory leak
    QT 使用QPixmap自定义光标 缩放图像模糊问题
    Android Kotlin知识汇总(一)编程语言
    十九、MyBatis Plus详解
    读写分离和主从复制
    刘二大人 PyTorch深度学习实践 笔记 P1 Overview
  • 原文地址:https://blog.csdn.net/lyx4949/article/details/132792912