適用環境
ROS中的服務service是一問一答的形式,你來查詢了,我就返給你要的信息。
action也有服務的概念,但是它不一樣的地方是:不是一問一答,而多了一個反饋,它會不斷反饋項目進度。如navigation下的move_base package,你設定了目標點,反饋信息可能是機器人在規劃路徑上的即時位姿,直到機器人到達目標點,返回SUCCEEDED消息。
所以action lib適用於無法及時返回結果,處理時間較長的場合。還有需要實時獲取進度的場合。
步驟一:創建action文件
action消息和msg和srv很像,
其中包括了三個部分:1. goal;2. result; 3.feedback message
image.png
步驟二:修改CMakelist.txt和package.xml
CMakelist.txt
image.png
image.png
package.xml
catkin_make
在第二步之後進行catkin_make,如果去devel下面msg查看,可以看到7個消息文件。
image.png
如果action文檔的名字是DoDishes,那麼這7個文檔分別是
DoDishesAction
DoDishesActionFeedback
DoDishesActionGoal
DoDishesActionResult
DoDishesFeedback
DoDishesGoal
DoDishesResult
步驟三:創建client
image.png
這裏引入了7個msg中的兩個:DoDishesAction 和 DoDishesGoal
有3個回調函數:
- action激活後回調
- 完成之後回調
- 過程中反饋的回調
步驟四:創建server
image.png
這裏引入了三個msg:DoDishesAction、DoDishesGoal 和 DoDishesResult
有一個回調函數:
- 有action goal 到來時的執行回調函數
創建了兩個重要變量:
image.png
用了兩個函數來發送這兩個變量:
遺留問題
至此我們用到了7個msg中的4個,而其餘的不知道怎麼用:
大致上明白了,
DoDishesActionFeedback
DoDishesActionGoal
DoDishesActionResult
比
DoDishesFeedback
DoDishesGoal
DoDishesResult
再往上封裝了一層,比如:
goal = DoDishesActionGoal
goal1 = DoDishesGoal
goal.goal 的類型就是DoDishesGoal
對於actionlib,有兩個狀態機,我們看一下
server端狀態機:
image.png
client狀態機
image.png
其中有些操作在SimpleActionServer和SimpleActionClient是沒有的,但是大部分用simple這個類就足夠了。