系统环境:Ubuntu16.04
在ros中,如果想要发送一个request给一个节点让该节点完成一些任务,并且给出一个回复,这样可以使用ros中的service完成。但是有一些应用中任务执行的时间很长,用户需要查看执行的进度如何,中止或者取消该任务,ros中提供了一个actionlib package来建立服务,执行一个长时间运行的可抢占目标。
使用client server接口,使用ROS action 协议通信。client和server都提供一套简单的API给用户来执行任务。
动作(action):
1.是一种问答通信机制
2.带有连续反馈
3.可以在任务过程中中止运行
4.基于ROS的消息机制实现
action接口:
1.goal:发布任务目标
2.cancel:请求取消任务
3.status:通知客户端当前的状态
4.feedback:周期反馈任务运行的监控数据
5.result:向客户端发送任务的执行结果,只发布一次
在功能包目录下新建action文件,并新建DoDishes.action文件,输入以下内容(去掉里面的句号),保存并退出。
。# Define the goal
uint32 dishwasher_id # Specify which dishwasher we want to use
—。
。# Define the result
uint32 total_dishes_cleaned
—。
。# Define a feedback message
float32 percent_complete
在功能包目录下的package.xml中添加功能包依赖
<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>
在功能包目录下的CMakeLists.txt中添加编译选项
find_package(catkin REQUIRED actionlib_msgs actionlib)
add_action_files(DIRECTORY action FILES DoDishes.action)
generate_messages(DEPENDENCIES actionlib_msgs)
注意:一个CMLists.txt中只有一个generate_messages,需要添加新的选项时直接在后面的括号里添加,无需再写一个generate_messages,否则编译时有可能出错。