zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    zookeeperclient代码解读
    封装scrollView 循环滚动,tableViewCell(连载) mvc
    PHP经典项目案例-(一)博客管理系统5
    Android插件化(三)载入插件apk中的Resource资源
    比树莓派配置好接地气的香蕉派上手初体验
    HDU Group
    JVM 类的卸载
    JVM 自定义类加载器
    JVM 初始化阶段例子
    JVM 初始化阶段例子 final常量
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/15005969.html
Copyright © 2011-2022 走看看