iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
1
自我挑戰組

ROS自學筆記系列 第 10

Day 10 - 使用Python撰寫Publisher

  • 分享至 

  • xImage
  •  

如何撰寫PublisherSubscriber其實官方教學就有啦,我只是拿現成的程式碼來做個練習而已~
首先我們就去我們的packagesrc資料夾內,也就是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這個函式的定義,而第七行就是最主要的設定nodetopic之間的關係,函式定義是長這樣:
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和後面的時間戳印囉!
ros topic 執行畫面

下一篇就是用python寫subscriber啦! 大家應該一點都不意外吧XD

參考資料

ROS wiki - rospy/publishers and subscribers


上一篇
Day 09 - ROS Topics
下一篇
Day 11 - 使用Python撰寫Subscriber
系列文
ROS自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言