ROS開發 之 資料通訊(服務)

2021-09-02 18:13:21 字數 2212 閱讀 4304

ros中通訊方式有三種,分別為話題(msg)、服務(srv)和活動(action),其中話題屬於基本的發布/訂閱通訊方式,適用於單個節點發布訊息,乙個或多個節點接受訊息的情況;服務屬於實時獲取結果的情況,應用於請求/響應式的應用環境,類似於乙個函式呼叫關係,適用於基本功能的呼叫或者狀態的檢視;活動屬於無阻塞的執行方式,也應用於請求/響應式的環境,具有比服務更靈活的控制形式,並且在執 行的過程中可以對狀態的反饋,適用於執行需要較長時間的情況。

類似訊息型別放置於msg目錄,服務常放置於srv子目錄中,且服務檔案以srv結尾。

建立目錄:

mkdir srv

目錄中建立檔案:

personinfoshow.srv personinfo person --- string stroutput

為構建增加編譯庫:

pakage.xml message_generation message_runtime

為構建增加庫說明:

cmakelists.txt find_package(#

約在第10

行 **** message_generation  #

新增 ) catkin_package(#

約在第105

行 **** catkin_depends message_runtime #

新增 ) add_service_files(#

約在第59

行,此處不同於訊息

**** files personinfoshow.srv  #

新增 ) generate_messages(#

約在第71行 #

雖然用了自定義訊息型別,但在同個程式包中,不需要做引入說明

) #去掉注釋以啟用

進入catkin

根目錄:

cd ~/catkin_ws

編譯生成:

catkin_make

檢視服務:

rossrv show personinfoshow

訊息包裡定義的服務:

本實驗中服務的示例用於將自定義的訊息型別personinfo的顯示格式化,在服務端輸入為personinfo物件,輸出為將物件內容格式化為字串,在客戶端通過呼叫服務得到格式化的字串並將結果列印出來。

拷貝程式到

src目錄:

demo_service.py

,demo_service_client.py

檔案執行授權:

chmod +x demo_service.py demo_service_client.py

啟動主節點:

roscore

啟動服務:

rosrun vejoe_slam demo_service.py

呼叫服務:

rosrun vejoe_slam demo_service_client.py

除了使用**的方式在程式中呼叫,也可以直接在命令列呼叫,引數的順序為訊息型別中的順序需要一致,否則會錯配:

rosservice call show_person_info [引數]

檢視啟動的服務列表:

rosservice list

檢視服務詳情:

左上圖為啟用服務,右上圖為呼叫服務,左下圖為顯示服務資訊,右下圖為啟用主節點

如上圖所示,可以看到personinfo中的資料定義依次為name、***、age,因此在使用rosservice直接呼叫時程式也是按照這個順序進行解析的,上圖最後一條命令中由於將***和age資訊寫反了,因此程式中直接將true認為是age,在python中bool型變數為int的子集,因此型別可以驗證通過,邏輯判斷中可以,不過值的顯示卻因為對應錯誤顯示錯誤。

歡迎感興趣的朋友一起加qq**流學習。

ROS開發 之 資料通訊(活動)

ros中通訊方式有三種,分別為話題 msg 服務 srv 和活動 action 其中話題屬於基本的發布 訂閱通訊方式,適用於單個節點發布訊息,乙個或多個節點接受訊息的情況 服務屬於實時獲取結果的情況,應用於請求 響應式的應用環境,類似於乙個函式呼叫關係,適用於基本功能的呼叫或者狀態的檢視 活動屬於無...

Android開發之USB資料通訊

android開發中usb串列埠通訊開發主要涉及到以下幾個類及相應的方法 1 usbmanager 負責管理usb裝置的類,你可以在相應 中通過以下方法獲得 獲取usbmanager例項方法 usbmanager manager usbmanager getsystemservice context...

Activity資料通訊

若要從子activity獲取返回資訊時,可呼叫以下activity方法 public void startactivityforresult intent intent,int requestcode 該方法的第乙個引數為intent,第二個引數是請求 請求碼是先傳送給子activity,然後再返回...