01-ROS入門-10 Python寫ROS 訂閱與發(fā)布程序

(注意 python中首行必須是 #!/usr/bin/env python 否則import失敗)

1. 編寫talker代碼

vim ..../src/talker.py

#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    #調(diào)用publisher函數(shù) 創(chuàng)建發(fā)布節(jié)點(diǎn) ,定義數(shù)據(jù)類型,
    #queue_size參數(shù)是當(dāng)其接受者接受不夠快造成信號堵塞中隊列信息的數(shù)量限制
    
    rospy.init_node('talker', anonymous=True)
    #啟動節(jié)點(diǎn)同時為節(jié)點(diǎn)命名, 若anoymous為真則節(jié)點(diǎn)會自動補(bǔ)充名字,實(shí)際名字以talker_322345等表示
    #若為假,則系統(tǒng)不會補(bǔ)充名字,采用用戶命名。但是一次只能有一個同名節(jié)點(diǎn),若后面有一個相同listener
    #名字的節(jié)點(diǎn)則后面的節(jié)點(diǎn)啟動會注銷前面的相同節(jié)點(diǎn)名。
    
    rate = rospy.Rate(10) # 10hz
    #延時的時間變量賦值,通過rate.sleep()實(shí)現(xiàn)延時
    
    while not rospy.is_shutdown():
    # 判定開始方式,循環(huán)發(fā)送,以服務(wù)程序跳出為終止點(diǎn) 一般ctrl+c也可
    
        hello_str = "hello world %s" % rospy.get_time()
        # 數(shù)據(jù)變量的內(nèi)容 rospy.get_time() 是指ros系統(tǒng)時間,精確到0.01s 
        # 也可以使用 import time  time.strftime('%Y%m%d%H%M%S')
        
        rospy.loginfo(hello_str)
        #在運(yùn)行的terminal界面info 出信息,可不加,可隨意改
        
        pub.publish(hello_str)
        #發(fā)布數(shù)據(jù) 必須發(fā)布
        
        rate.sleep()
        #ros中的延時表示,也可用系統(tǒng)的延時 import time  time.sleep(1) 
        #ros系統(tǒng)中的延時應(yīng)該比ubuntu自帶好好,盡量用ros的
if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

2. 編寫listener代碼

vim ..../src/listener.py

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
    #回調(diào)函數(shù) 收到的參數(shù).data是通信的數(shù)據(jù) 默認(rèn)通過這樣的 def callback(data) 取出data.data數(shù)據(jù)
    
def listener():

    # In ROS, nodes are uniquely named. If two nodes with the same
    # node are launched, the previous one is kicked off. The
    # anonymous=True flag means that rospy will choose a unique
    # name for our 'listener' node so that multiple listeners can
    # run simultaneously.
    rospy.init_node('listener', anonymous=True)
    
    #啟動節(jié)點(diǎn)同時為節(jié)點(diǎn)命名, 若anoymous為真則節(jié)點(diǎn)會自動補(bǔ)充名字,實(shí)際名字以 listener_322345等表示
    #若為假,則系統(tǒng)不會補(bǔ)充名字,采用用戶命名。但是一次只能有一個同名節(jié)點(diǎn),若后面有一個相同listener
    #名字的節(jié)點(diǎn)則后面的節(jié)點(diǎn)啟動會注銷前面的相同節(jié)點(diǎn)名。
    
    rospy.Subscriber("chatter", String, callback)
    
    #啟動訂閱,訂閱主題,及標(biāo)準(zhǔn)字符串格式,同時調(diào)用回調(diào)函數(shù),當(dāng)有數(shù)據(jù)時調(diào)用函數(shù),取出數(shù)據(jù)
    
    # spin() simply keeps python from exiting until this node is stopped
    
    #循環(huán)程序
    rospy.spin()

if __name__ == '__main__':
    listener()
#函數(shù)不被用作模塊調(diào)用

3. 添加權(quán)限

chmod +x ..../src/talker.py |chmod +x .../src/listener.py

4. 編譯

catkin_make

5. 運(yùn)行talker

rosrun exam talker.py

6. 運(yùn)行l(wèi)istener

rosrun exam listener.py

注釋:最簡單的訂閱與發(fā)布程序:

  • 訂閱

      #!/usr/bin/env python
      import rospy
      from std_msgs.msg import String
      rospy.init_node('talker',anonymous=0)
      pub=rospy.Publiser('chatter',String)
      rate=rospy.Rate(1)
      while not rospy.is_shutdown():
          rospy.loginfo('telll myself')
          pub.publish('hello')
          rate.sleep()
    
  • 發(fā)布
    #!/usr/bin/env python
    import rospy
    from std_msgs.msg import String
    rospy.init_node('listener',anonymous=0)
    lis=rospy.Subscriber('chatter',String,callback)
    rospy.spin()
    def callback(data):
    rospy.loginfo(data.data)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容