主要作用
在ros中,如果想要发送一个request给一个节点该节点完成一些任务,并且给出一个回复,这样可以使用ros中的service完成。但是有一些应用中任务执行的时间很长,用户需要查看执行的进度如何,以及或者取消该任务,ros中提供了一个actionlib package来建立服务,执行一个长时间运行的可抢占目标。
使用client server接口,使用ROS action 协议通信。client和server都提供一套简单的API给用户来执行任务。
为了能够通信,需要定义少量的messages,也就是action specification。定义包括Goal, FEedback, Result.
使用方法
定义类
typedef actionlib::SimpleActionClient<dji_sdk::DroneTaskAction> DroneTaskActionClient;
DroneTaskActionClient drone_task_action_client;
定义了client之后可以调用给出的很多API函数
void cancelAllGoals ()
void cancelGoal ()
void cancelGoalsAtAndBeforeTime (const ros::Time &time)
ResultConstPtr getResult () const
SimpleClientGoalState getState () const
bool isServerConnected () const
void sendGoal (const Goal &goal, SimpleDoneCallback done_cb=SimpleDoneCallback(), SimpleActiveCallback active_cb=SimpleActiveCallback(), SimpleFeedbackCallback feedback_cb=SimpleFeedbackCallback())
SimpleClientGoalState sendGoalAndWait (const Goal &goal, const ros::Duration &execute_timeout=ros::Duration(0, 0), const ros::Duration &preempt_timeout=ros::Duration(0, 0))
SimpleActionClient (const std::string &name, bool spin_thread=true)
SimpleActionClient (ros::NodeHandle &n, const std::string &name, bool spin_thread=true)
void stopTrackingGoal ()
bool waitForResult (const ros::Duration &timeout=ros::Duration(0, 0))
bool waitForServer (const ros::Duration &timeout=ros::Duration(0, 0)) const
定义server端
typedef actionlib::SimpleActionServer<dji_sdk::DroneTaskAction> DroneTaskActionServer;
DroneTaskActionServer* drone_task_action_server;
dji_sdk::DroneTaskFeedback drone_task_feedback;
dji_sdk::DroneTaskResult drone_task_result;
bool drone_task_action_callback(const dji_sdk::DroneTaskGoalConstPtr& goal);
drone_task_action_server = new DroneTaskActionServer(nh,
"dji_sdk/drone_task_action",
boost::bind(&DJISDKNode::drone_task_action_callback, this, _1), false);
drone_task_action_server->start();
在回调函数中给出feedback, result等,feedback, result都是messages.