節點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()讓程序程序不會退出,節點保持工作,但是它不會影響回調函數的工作,因爲它們有自己單獨的線程。