适用环境
ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息。
action也有服务的概念,但是它不一样的地方是:不是一问一答,而多了一个反馈,它会不断反馈项目进度。如navigation下的move_base package,你设定了目标点,反馈信息可能是机器人在规划路径上的即时位姿,直到机器人到达目标点,返回SUCCEEDED消息。
所以action lib适用于无法及时返回结果,处理时间较长的场合。还有需要实时获取进度的场合。
步骤一:创建action文件
action消息和msg和srv很像,
其中包括了三个部分:1. goal;2. result; 3.feedback message
步骤二:修改CMakelist.txt和package.xml
CMakelist.txt
package.xml
catkin_make
在第二步之后进行catkin_make,如果去devel下面msg查看,可以看到7个消息文件。
如果action文档的名字是DoDishes,那么这7个文档分别是
DoDishesAction
DoDishesActionFeedback
DoDishesActionGoal
DoDishesActionResult
DoDishesFeedback
DoDishesGoal
DoDishesResult
步骤三:创建client
这里引入了7个msg中的两个:DoDishesAction 和 DoDishesGoal
有3个回调函数:
- action激活后回调
- 完成之后回调
- 过程中反馈的回调
步骤四:创建server
这里引入了三个msg:DoDishesAction、DoDishesGoal 和 DoDishesResult
有一个回调函数:
- 有action goal 到来时的执行回调函数
创建了两个重要变量:
用了两个函数来发送这两个变量:
遗留问题
至此我们用到了7个msg中的4个,而其余的不知道怎么用:
大致上明白了,
DoDishesActionFeedback
DoDishesActionGoal
DoDishesActionResult
比
DoDishesFeedback
DoDishesGoal
DoDishesResult
再往上封装了一层,比如:
goal = DoDishesActionGoal
goal1 = DoDishesGoal
goal.goal 的类型就是DoDishesGoal
对于actionlib,有两个状态机,我们看一下
server端状态机:
client状态机
其中有些操作在SimpleActionServer和SimpleActionClient是没有的,但是大部分用simple这个类就足够了。