背景
action可以看做升级版的service,它主要可以实现某些特定的情况,比如:客户端发送指令之后,服务端操作处理时间太久,不知道服务端到底是还在处理还是已经挂了,或者客户端发送目标之后,觉得不行,想取消任务。所以很好理解的,我们需要服务端做出反馈,所以诞生了action。
过程:action_client
发送一个目标,action_server
接收到这个目标后,执行期间会不断给客户端发送进度反馈,如果客户端没有终止任务的话,这个反馈会一直存在直到结束。客户端也可以随时结束任务。
本篇文章参考了参考博文,但是按着这篇文章中操作,是不太对的,需要部分修改。我觉得新手学习先跑一跑代码,看看效果,再自己动手改一改代码看看不一样,最后再自己写一遍,会学得比较快
,最终的代码我放这里:
可以试着跑一跑。
具体怎么使用action,请看:
1.定义action消息类型
创建action的消息类型和server的消息类型文件很像,在编译过程中该文件会被打包生成对应的好几个消息类型文件。
一个.action
文件看起来是这样的:
#part1: the goal, 客户端发送的任务目标
---
#part2: the result, 任务完成后服务端发送的结果
---
#part3: the feedback, 服务端反馈的完成度
按着这个我们在我们的s_c_demo文件夹下与src并列action文件夹,创建test.action
文件:
int32 goal_num
---
bool finsh
---
float32 complete_percent
接下去修改CMakeLists文件,主要修改的地方是:
find_package(catkin REQUIRED COMPONENTS
actionlib_msgs
roscpp
actionlib
)
add_action_files(
DIRECTORY
action
FILES
demo.action
)
generate_messages(
DEPENDENCIES
actionlib_msgs
)
之后CMakeLists.txt
文件和package.xml
可以参考文章开头的我成功运行的代码,接下去catkin_make
编译。。
在catkin_ws/devel/share/s_c_demo/msg
中可以找到生成的.msg
文件
├── testActionFeedback.msg
├── testActionGoal.msg
├── testAction.msg
├── testActionResult.msg
├── testFeedback.msg
├── testGoal.msg
└── testResult.msg
在catkin_ws/devel/include/s_c_demo/
中可以找到对应的头文件,这个很重要,会涉及到接下去看起来怪怪的类型
├── testActionFeedback.h
├── testActionGoal.h
├── testAction.h
├── testActionResult.h
├── testFeedback.h
├── testGoal.h
└── testResult.h
2.编写action_client和action_server.cpp
在/src
下添加action_client.cpp
和action_server.cpp
// action_client
#include <ros/ros.h>
#include <actionlib/client/simple_action_client.h>