ROS入門總結(二):Python定義發佈器Publisher與訂閱器Subscriber

節點ROS通信系統中就是一個可執行的程序,這邊博客主要記錄如何在Python代碼節點中定義發佈器和訂閱器。

 

發佈器:

import rospy
from std_msgs.msg import String#載入String的msg類型

def talker():
    #定義一個發佈器,話題爲'chatter'
    pub = rospy.Publisher('chatter', String, queue_size=10)
    #聲明一個名爲'talker'的節點
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz的發佈頻率
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()#休眠一段時間來保證rate的頻率

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

from std_msgs.msg import String 載入String的消息類型

rospy.Publisher()定義了一個話題,名爲"chatter",消息類型爲String,消息隊列的長度爲10

rospy.init_node()初始化一個名爲"taker"的節點,非常重要,用於與Master節點交流

pub.publish()發佈信息到對應話題

rate定義了發佈頻率

 

訂閱器:

import rospy
from std_msgs.msg import String#載入String的msg類型

#訂閱器都是通過回調函數來實現對應功能,callback()內部完成對應實現
def callback(data):
    rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)

def listener():
    
    #將該節點定義爲listener,anonymous=True表明支持同名節點同步運行
    #否則之前聲明的同名節點會被註銷
    rospy.init_node('listener', anonymous=True)
    #訂閱器,訂閱了一個名爲chatter的話題
    rospy.Subscriber('chatter', String, callback)

    # spin()函數讓listener節點一直處於工作,直到該節點被關閉
    rospy.spin()

if __name__ == '__main__':
    listener()

類似的rospy.init_node()定義了節點

rospy.Subscriber()定義了要訂閱的話題的名字,消息類型,收到消息之後的回調函數。收到消息後,消息作爲回調函數的第一個參數。

rospy.spin()讓程序程序不會退出,節點保持工作,但是它不會影響回調函數的工作,因爲它們有自己單獨的線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章