ROS中action的使用

例如说:
我的Action的文件为BBB.action,它在CCC的包里面
客户端和服务端:

  1. action的类型:CCC::BBBAction
  2. action的头文件: CCC/BBBAction.h,服务端和客户端都要include一下

服务端:

  1. action的服务端都要加上 #include<actionlib/server/simple_action_server.h>
  2. 声明服务器对象:
    actionlib::SimpleActionServer <CCC::BBBAction> action_server_
  3. 回调函数为:
    void EEE::ServerCallBack(const actionlib::SimpleActionServer<CCC::BBBAction>::GoalConstPtr& goal);
  4. 在类中使用初始化列表初始化:
    action_server_(nh, “/DDD”,boost::bind(&EEE::ServerCallBack,this, _1),false)
    其中nh为ros::NodeHandle
    EEE为类名
    DDD为标识action的字符串,服务端和客户端要一致
    "false”的意思是暂时不启动这个server(在这个构造函数中的后面会启动server)
  5. 启动server
    action_server_.start()
  6. 需要返回东西的时候,调用
    action_server_.setSucceeded(result, “”);
    其中action_server_是类型的对象
    result是CCC::BBBResult类型的对象
    注意不是CCC::BBBActionResult这个类型,CCC::BBBActionResult这个类型是存在的,但是这个setSucceeded的参数需要的是CCC::BBBResult

客户端:

  1. action的客户端都要加上#include <actionlib/client/simple_action_client.h>
  2. 声明客户端对象actionlib::SimpleActionClient<CCC::BBBAction> action_client_;
  3. 在类中使用初始化列表初始化:action_client_("/DDD", true)
    DDD为标识action的字符串,服务端和客户端要一致
    参数“true”是为了说明新的client将作为一个单线程运行
  4. bool server_exists = action_client_.waitForServer(ros::Duration(3.0));
    在三秒时间内查看是否存在对应服务端,这个一般返回得很快,一瞬间就可以了
  5. 回调函数为:
    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
  6. 发送goal且指定回调函数action_client_.sendGoal(goal_,boost::bind(&FFF::ClientCallBack,this,_1,_2));

BBB包的CMakeLists.txt:

  1. find_package加上actionlib和actionlib_msgs
  2. add_action_files及上 BBB.action
  3. generate_messages 加上 actionlib_msgs
  4. catkin_package 的 CATKIN_DEPENDS加上 actionlib

服务端和客户端的包的CMakeLists.txt:

  1. find_package 加上 BBB

参考博客:
https://blog.csdn.net/will_ye/article/details/79589319

上一篇:如何得到select选中的option值的value


下一篇:数组与指针