ROS话题通信案例(二)——发布者订阅者传递消息(python)

参考视频:【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程_哔哩哔哩_bilibili

参考文档:http://www.autolabor.com.cn/book/ROSTutorials/

话题通信实现模型是比较复杂的,该模型如下图所示,该模型中涉及到三个角色:

  • ROS Master (管理者)
  • Talker (发布者)
  • Listener (订阅者)

ROS Master 负责保管 Talker 和 Listener 注册的信息,并匹配话题相同的 Talker 与 Listener,帮助 Talker 与 Listener 建立连接,连接建立后,Talker 可以发布消息,且发布的消息会被 Listener 订阅。

需求:

编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布文本消息,订阅方订阅消息并将消息内容打印输出。

分析:

在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:

  1. 发布方
  2. 接收方
  3. 数据(此处为普通文本)

流程:

    1. 编写发布方实现;
    2. 编写订阅方实现;
    3. 编辑配置文件;
    4. 编译并执行。

 1.发布方发布消息

#! /usr/bin/env python

from os import putenv
import rospy
from std_msgs.msg import String #发布的消息的类型

'''
    使用 python 实现消息发布:
        1.导包
        2.初始化 ros 节点;
        3.创建发布者对象
        4.编写发布逻辑并发布数据
'''


if __name__ == "__main__":

        # 2.初始化 ros 节点;
        rospy.init_node("sanDai") #传入节点名称
        # 3.创建发布者对象
        pub = rospy.Publisher("Car",String,queue_size=10)
        # 4.编写发布逻辑并发布数据
        #创建数据
        msg = String()
        #使用循环发布数据
        while not rospy.is_shutdown():
            msg.data = "Hello,I'm sanDai"
            #发布数据
            pub.publish(msg)

增加可执行权限

   

 配置和编译

 执行

  1. ctrl+shift+B
  2. roscore
  3. cd 文件夹
  4. 编译source ./devel/setup.bash
  5. 运行rosrun 包  映射名
  6. rostopic echo 话题

 打印出发布的消息并编号

#! /usr/bin/env python

from os import putenv
import rospy
from std_msgs.msg import String #发布的消息的类型

'''
    使用 python 实现消息发布:
        1.导包
        2.初始化 ros 节点;
        3.创建发布者对象
        4.编写发布逻辑并发布数据
'''


if __name__ == "__main__":

        # 2.初始化 ros 节点;
        rospy.init_node("sanDai") #传入节点名称
        # 3.创建发布者对象
        pub = rospy.Publisher("Car",String,queue_size=10)
        # 4.编写发布逻辑并发布数据
        #创建数据
        msg = String()
        #指定发布频率
        rate = rospy.Rate(1)
        #设置计数器
        count = 0
        #使用循环发布数据
        while not rospy.is_shutdown():
            count += 1
            msg.data = "Hello,I'm sanDai  " + str(count)
            #发布数据
            pub.publish(msg)
            rospy.loginfo("f发布的数据:%s",msg.data)
            rate.sleep()

重新编译再运行rosrun

 2.订阅者订阅消息

#! /usr/bin/env python

from os import putenv
import rospy
from std_msgs.msg import String #发布的消息的类型

'''
    使用 python 实现消息发布:
        1.导包
        2.初始化 ros 节点;
        3.创建发布者对象
        4.编写发布逻辑并发布数据
'''


if __name__ == "__main__":

        # 2.初始化 ros 节点;
        rospy.init_node("sanDai") #传入节点名称
        # 3.创建发布者对象
        pub = rospy.Publisher("Car",String,queue_size=10)
        # 4.编写发布逻辑并发布数据
        #创建数据
        msg = String()
        #指定发布频率
        rate = rospy.Rate(1)
        #设置计数器
        count = 0
        #休眠以防发布后还未完成注册数据订阅不到
        rospy.sleep(3)
        #使用循环发布数据
        while not rospy.is_shutdown():
            count += 1
            msg.data = "Hello,I'm sanDai  " + str(count)
            #发布数据
            pub.publish(msg)
            rospy.loginfo("发布的数据:%s",msg.data)
            rate.sleep()

 配置编译

执行

  1. 启动 roscore;
  2. 启动发布节点;
  3. 启动订阅节点。

 

 

 3.计算图

命令行:rqt_graph

 

 

posted on 2021-07-13 13:09  蔡军帅  阅读(1582)  评论(0编辑  收藏  举报