例如说:
我的Action的文件为BBB.action,它在CCC的包里面
客户端和服务端:
- action的类型:CCC::BBBAction
- action的头文件: CCC/BBBAction.h,服务端和客户端都要include一下
服务端:
- action的服务端都要加上 #include<actionlib/server/simple_action_server.h>
- 声明服务器对象:
actionlib::SimpleActionServer <CCC::BBBAction> action_server_ - 回调函数为:
void EEE::ServerCallBack(const actionlib::SimpleActionServer<CCC::BBBAction>::GoalConstPtr& goal); - 在类中使用初始化列表初始化:
action_server_(nh, “/DDD”,boost::bind(&EEE::ServerCallBack,this, _1),false)
其中nh为ros::NodeHandle
EEE为类名
DDD为标识action的字符串,服务端和客户端要一致
"false”的意思是暂时不启动这个server(在这个构造函数中的后面会启动server) - 启动server
action_server_.start() - 需要返回东西的时候,调用
action_server_.setSucceeded(result, “”);
其中action_server_是类型的对象
result是CCC::BBBResult类型的对象
注意不是CCC::BBBActionResult这个类型,CCC::BBBActionResult这个类型是存在的,但是这个setSucceeded的参数需要的是CCC::BBBResult
客户端:
- action的客户端都要加上#include <actionlib/client/simple_action_client.h>
- 声明客户端对象actionlib::SimpleActionClient<CCC::BBBAction> action_client_;
- 在类中使用初始化列表初始化:action_client_("/DDD", true)
DDD为标识action的字符串,服务端和客户端要一致
参数“true”是为了说明新的client将作为一个单线程运行 - bool server_exists = action_client_.waitForServer(ros::Duration(3.0));
在三秒时间内查看是否存在对应服务端,这个一般返回得很快,一瞬间就可以了 - 回调函数为:
void FFF::ClientCallBack(const actionlib::SimpleClientGoalState& state, const CCC::BBBResultConstPtr& result)
actionlib::SimpleClientGoalState表示处理的状态,源文件为http://docs.ros.org/hydro/api/actionlib/html/simple__client__goal__state_8h_source.html - 发送goal且指定回调函数action_client_.sendGoal(goal_,boost::bind(&FFF::ClientCallBack,this,_1,_2));
BBB包的CMakeLists.txt:
- find_package加上actionlib和actionlib_msgs
- add_action_files及上 BBB.action
- generate_messages 加上 actionlib_msgs
- catkin_package 的 CATKIN_DEPENDS加上 actionlib
服务端和客户端的包的CMakeLists.txt:
- find_package 加上 BBB
参考博客:
https://blog.csdn.net/will_ye/article/details/79589319