ROS : Writing a Simple Publisher and Subscriber (Python)

網路上雖然有教學但是沒有很完整, 我幫忙以中文並一步步完整教學與截圖

http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29

如果要從sensor 讀取資料,我們就需要寫一個Listener (Subscriber),來訂閱sensor (Publisher) 發送的資訊,所以

第一步在terminal 輸入 $ rostopic list
來看需想要Subscribe的sensor 資訊,舉例來說,我這裡想訂閱的是 ARcode的topic 會長得像 /ar_pose_marker
如果我們想確認sensor 是否真的發送資料,可以用 $ rostopic echo /你想聽的topic/ ,這裡用 /ar_pose_marker,就可以看到資料,因為有時候 rostopic list 可以看到有topic 宣告,但資料可能不會進來

第二步,$ rostopic info /你想聽的topic/ ,這裡用 /ar_pose_marker,你就會發現他回傳的格式,
這格式是 Type: ar_track_alvar_msgs/AlvarMarkers,這時候你要在第三行處填入 from 你的訊息.msg import 你的topic,記得別忘記加.msg,很多新手都以為直接複製ar_track_alvar_msgs會忘記,要加.msg,
完成的格式如下方截圖第三行,from ar_track_alvar_msgs.msg import AlvarMarkers

第三步,在listener (=Subscriber) 裡面寫上一個訂閱消息的node,上方截圖的第二段第四行,
rospy.Subscriber(“/ar_pose_marker", AlvarMarkers, callback)
rospy.Subscriber(“/你訂閱的topic", 你訂閱的topic type, callback)

第四步,寫一個callback function,當收到 sensor 的消息時,callback function 的程式會被執行,
這時候你會不知道data. 後面會有甚麼資料格式,例如:我的ARcode.data資料,上方截圖的第一段第八行,
data.marker[0].pose.pose.position.x,指的是AR_code 收到的第0個ID的marker的位置中的,相對位置中的,x位置。
如何知道資料格式,就要用$rosmsg info /填上你的msg,例如: $ rosmsg info /ar_track_alvar_msgs
他就會回傳data裡面有甚麼資料。

恭喜你完成一個Subscirber(=Listener),你的程式可以成功擷取sensor讀到的資訊


第五步,如果你的主程式是一個class,你要記得如下圖,第79行,在setup裡面寫上你的Subscirber(=Listener),
然後callback function 也要寫在class裡面,記得要加上self,如第82行。def callback(self.data)
最後溫馨提醒,callback function 可以取任意名字,只要記得跟第79行,最後一個參數self.callback,同樣名字就好
self.ar_sub = rospy.Subscriber(“/ar_pose_marker", AlvarMarkers, self.callback)


發表留言