沒想到action我居然要拆成3天寫...不過這真的是一個比較深的應用,在ROS官網的tutorial更是將action獨立一個章節出來寫,所以我也盡量將我能理解的部分寫出來了~~如果未來有更深的體悟,再來補充吧XD
昨天簡介了Action的應用範例,基本上就是call 一些actionlib內的API來用,因此覺得今天可以來稍微寫一下actionlib內還有哪些API可以使用。
action其實可以透過protocol傳遞下列資訊:
看到這邊不曉得大家會不會跟筆者當初看到的時候感到一樣的混亂,阿前兩天的文章不是message只定義了goal, feedback和result嗎,怎麼突然多兩個出來!!! 原來是因為cancel和status都是API內定義好的功能,因此只需要在需要用的時候呼叫就好囉!
下面列出一些跟cancel 和status有關的APIs,可以根據不同的情況下不同的指令:
in action client
:
// 可以一鍵取消所有進行中的任務
void cancelAllGoals ()
// 取消特定某任務
void cancelGoal ()
// 取消在指定時間之前的所有任務
void cancelGoalsAtAndBeforeTime (const ros::Time &time)
in action server
:
// 設定目標為終止狀態
void setAborted (const Result &result=Result(), const std::string &text=std::string(""))
// 設定目標為取消但是還沒確認的狀態
void setPreempted (const Result &result=Result(), const std::string &text=std::string(""))
// 設定目標為已完成的狀態
void setSucceeded (const Result &result=Result(), const std::string &text=std::string(""))
關於狀態的部分,server端其實有分為下列幾種狀態:
狀態機的部分有點深奧,看圖應該比較好理解:
基本上就是本來server在某些狀態,會因為server或client端打了什麼API而進行的狀態轉換的示意圖。
http://wiki.ros.org/actionlib
http://wiki.ros.org/actionlib/DetailedDescription
https://docs.ros.org/api/actionlib/html/classactionlib_1_1SimpleActionClient.html
https://docs.ros.org/api/actionlib/html/classactionlib_1_1SimpleActionServer.html