如何撰寫Publisher
和Subscriber
其實官方教學就有啦,我只是拿現成的程式碼來做個練習而已~
首先我們就去我們的package
的src
資料夾內,也就是beginner_tutorials/src
:
$ roscd beginner_tutorials
$ cd src
接著可以選擇直接從官方github下載範例,
$ wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/rospy_tutorials/001_talker_listener/talker.py
或是新增一個talker.py
,然後把底下我附上的程式碼複製貼上:
1 #!/usr/bin/env python
2 # license removed for brevity
3 import rospy
4 from std_msgs.msg import String
5
6 def talker():
7 pub = rospy.Publisher('chatter', String, queue_size=10)
8 rospy.init_node('talker', anonymous=True)
9 rate = rospy.Rate(10) # 10hz
10 while not rospy.is_shutdown():
11 hello_str = "hello world %s" % rospy.get_time()
12 rospy.loginfo(hello_str)
13 pub.publish(hello_str)
14 rate.sleep()
15
16 if __name__ == '__main__':
17 try:
18 talker()
19 except rospy.ROSInterruptException:
20 pass
接著,記得要把這個python檔改成可執行的檔案喔:
$ chmod +x talker.py
接著其實就可以執行看看了 XD 但是為了不那麼偷懶,就讓我們來解析程式碼吧!
1 #!/usr/bin/env python
2 # license removed for brevity
3 import rospy
4 from std_msgs.msg import String
第1行就是設定執行環境是python啦,3、4行是在引用函式庫,一個是我們上次使用的rospy
,另外一個就是topic
需要的std_msgs.msg
,是用來定義訊息格式的。
6 def talker():
7 pub = rospy.Publisher('chatter', String, queue_size=10)
8 rospy.init_node('talker', anonymous=True)
9 rate = rospy.Rate(10) # 10hz
接著6~14行就是關於talker
這個函式的定義,而第七行就是最主要的設定node
和topic
之間的關係,函式定義是長這樣:rospy.Publisher(topic_name, msg_class, queue_size)
第一個參數就是設定topic
的名稱,接下來指定訊息的格式,最後設定這個topic
一次可以放幾個訊息,因此在第7行 pub = rospy.Publisher('chatter', String, queue_size=10)
就表示我們定義了一個pub
這個publisher
,可以針對chatter
這個topic
發布訊息,格式就是String
,一次最多可以放10筆資料。
接著第8行就是把這個node
初始化出來,第二個參數anonymous=True
是表示要不要匿名,如果是true
,就會在原本的node
名稱後面加上一個亂數,這個設定可以方便一次執行多個node
,因為node
的名稱不能重複。
第9行是設定間隔的頻率,也就是每秒需要發送幾次訊息,中間的參數是用赫茲在算的,10就表示一秒發送10次訊息。
10 while not rospy.is_shutdown():
11 hello_str = "hello world %s" % rospy.get_time()
12 rospy.loginfo(hello_str)
13 pub.publish(hello_str)
14 rate.sleep()
10~14行就是在這個node
沒有停止的時候持續發送hello world
和時間戳印,12行是印在command line
上,13行是發佈到topic
上,最後14行就是間隔時間啦!
16 if __name__ == '__main__':
17 try:
18 talker()
19 except rospy.ROSInterruptException:
20 pass
函式定義完了,最後16-20行就是執行talker
這個函式啦!
16行表示如果call這個package
的人是自己的話,才可以執行這個node
,至於為什麼要用這個,應該是某種保護機制吧! 可以用來分辨程式是直接執行還是被引用的,但其實我刪掉這行也可以執行XD 關於這個設定的說明可以參考這篇
後面19~20就是error hanndle
啦,應該也沒甚麼好講的,那就讓我們來執行吧!
$ rosrun beginner_tutorials talker.py
可以看到他印了一堆hello world
出來,但是這是上面第12行rospy.loginfo
印出來的喔! 至於第13行的發送至topic
要怎麼查看到底有沒有送出去呢? 就需要使用新的指令啦!
就像rosnode list
可以看出當前有哪些執行中的node
一樣,rostopic list
一樣可以看出目前有哪些topic
喔! 接著就可以針對該topic
進行監聽的動作啦!
$ rostopic echo /chatter
就可以看到傳送出來的data和後面的時間戳印囉!
下一篇就是用python寫subscriber啦! 大家應該一點都不意外吧XD
ROS wiki - rospy/publishers and subscribers