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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM