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,然後再返回...