1. 程式人生 > >ROS開發 之 資料通訊(活動)

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

概述

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

活動說明

活動是一種基於訊息實現的,比服務更加強大和靈活的通訊方式,可以進行非同步執行,在執行過程中也可以實時檢視當前執行的狀態和進度,當然也可以取消當前執行甚至啟動新的活動來搶佔原先執行的活動。活動的使用方式跟服務一樣,包括定義和實現兩步,活動通常放置於action目錄下,且檔案以action為副檔名,下面展示活動的定義步驟,例子中程式碼程式可以在這個地址下載:

https://github.com/zacSuo/vejoeRos

  1. 建立目錄:mkdir action
  2. 目錄中建立檔案:pushup.action # goal uint32 push_up_count --- # result duration time_used --- #feedback duration time_elapsed uint32 finish_count uint32 remain_count
  3. 為構建增加編譯庫:pakage.xml <build_depend>actionlib_msgs</build_depend> <exec_depend>actionlib_msgs</exec_depend>
  4. 為構建增加庫說明:CMakeLists.txt find_package(#約在第10 **** actionlib_msgs  #新增 ) catkin_package(#約在第105 **** CATKIN_DEPENDS actionlib_msgs #新增 ) add_action_files(#約在第66行,此處不同於訊息和服務 **** DIRECTORY action   #新增 FILES pushup.action  #新增 ) generate_messages(#約在第71 DEPENDENCIES actionlib_msgs    #
    新增 ) #去掉註釋以啟用
  5. 進入catkin根目錄:cd ~/catkin_ws
  6. 編譯生成:catkin_make
  7. 檢視訊息:rosmsg list | grep vejoe_slam

catkin_make編譯之後,會在vejoe_slam包中新生成多個訊息檔案,這些訊息檔案用於實現活動的互動協議,在呼叫action時,系統會用到對應的訊息,從這裡可以基本看出活動是基於訊息實現的。

pushupAction.msg
pushupActionGoal.msg
pushupActionResult.msg
pushupActionFeedback.msg
pushupGoal.msg
pushupResult.msg
pushupFeedback.msg

活動實現

本實用活動的示例為一個做俯臥撐的功能,活動本身用於實現做俯臥撐的功能,並反饋當前已經做了多少個,用時多久,在呼叫端可以指定要做多少個,並隨時檢視當前已經做的個數和狀態。

  1. 拷貝程式到src目錄:demo_action.pydemo_action_client.py
  2. 檔案執行授權:chmod +x demo_action.py demo_action_client.py
  3. 啟動主節點:roscore
  4. 啟動活動:rosrun vejoe_slam demo_action.py
  5. 呼叫服務:rosrun vejoe_slam demo_action_client.py

左側為主節點,右上為活動啟動(服務端),右下為活動呼叫(客戶端)

if __name__ == '__main__':
   rospy.init_node('pushup_action_client')
   client = PushupActionClient(rospy.get_name())
   print '============='
   client.ShowWork()
   print '#############'
   client.showCancel()
   print '*************'
   client.showInvalid()
   rospy.spin()

客戶端主函式如上,其執行結果如上圖所示,當正常執行時會順序執行完所有任務,對於第二種取消的情況認為是中斷了活動,第三種非正常資料資料活動裡面任務的一部分,可以進行判斷和響應。


歡迎感興趣的朋友一起加QQ群交流學習。