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.发布方发布消息
#! /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)
增加可执行权限
配置和编译
执行
- ctrl+shift+B
- roscore
- cd 文件夹
- 编译source ./devel/setup.bash
- 运行rosrun 包 映射名
- 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()
配置编译
执行
- 启动 roscore;
- 启动发布节点;
- 启动订阅节点。
3.计算图
命令行:rqt_graph