(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Actionlib API support

Description: Create remote tasks as Actionlib Client

Keywords: decision_making

Tutorial Level: BEGINNER

C++

Node : node.cpp

Entry point of node

#include <ros/ros.h>
#include "Tasks.hpp"
....
int main(int argc, char** argv){
          ros::init(argc, argv, "Name_of_node");
          Task1 task1;
          Task2 task2;
          ros::spin();
          return 0;
}

Tasks: Tasks.hpp

#include <actionlib/server/simple_action_server.h>
#include <robot_task/RobotTask.h>
#include <robot_task/RobotTaskAction.h>
#include <robot_task/StringOperations.h>


using namespace std;
using namespace robot_task;

example of persistent task (do something forever)

class Task1:public RobotTask{
public:
   Task1(string name="/Name_Of_Task1"):
      RobotTask(name) ...
   {
       ...
   }
   ...
   TaskResult task(const string& name, const string& uid, Arguments& args){
      //hear you can advertise your topics and services, subscribes to others topics, etc.
      //for example
      ros::ServiceServer my_service =
        _node.advertiseService<MyNodeName::MyServiceRequest, MyNodeName::MyServiceResponse>(
             "service_name",boost::bind(&Task1::FunciontNameForService,this,_1,_2)
        );
      ...
      while(true){
            if (isPreempt()){

                /* HERE PROCESS PREEMPTION OR INTERAPT */

                return TaskResult::Preempted();
            }

            /* HERE PROCESS TASK */
            
            ...

            /* SLEEP BETWEEN LOOP ITERATIONS */
            sleep(1000);
      }
      return TaskResult::FAIL();
   }
   ...
};

example of one action task (do something and finish with success or fail)

class Task2:public RobotTask{
public:
   Task1(string name="/Name_Of_Task2"):
      RobotTask(name) ...
   {
       ...
   }
   ...
   TaskResult task(const string& name, const string& uid, Arguments& args){
      //hear proc your arguments
      string target("");
      double distance(-1);
      if( args.find("target")!=args.end() ){
          target = args["target"];
      }
      if( args.find("distance")!=args.end() ){
          std::stringstream tmp; tmp << (args["distance"]);
          tmp >> distance;
      }
      ...
      if(...){
         ...
         return TaskResult(SUCCESS, "OK. Task is done.");
      }
      if(...){
         ...
         return TaskResult(FAIL, "Error. Task aborted because ...");
      }
      return TaskResult::FAIL();
   }
   ...
};

Python

Manifest

<package>
  ....
  <depend package="robot_task"/>
  ...
</package>

MyTask.py

import roslib; roslib.load_manifest('MyTaskProject')
import rospy
import actionlib
from RobotTaskPy import *
                
class MyTask(RobotTask):
        def __init__(self, name):
                print "Init",name
                RobotTask.__init__(self, name)  
        def task(self, name, uid, parameters):
                print "Start",name
                r = rospy.Rate(1)
                #parameters is a dictionary with task arguments
                #{arg_name: arg_value, arg_name: arg_value, ...}
                #while True:                    
                for i in xrange(1, 10):
                        if self.isPreepted():
                                print "Preempt MyTask"
                                return RTResult_PREEPTED()
                        print '-- ',i,'Do something in MyTask'
                        r.sleep()
                print "Finish MyTask"
                #error_code = RobotTask_FAIL + 1
                #return RTResult_ABORT(error_code,"Some Error detected: finished with error code "+str(error_code));
                return RTResult_SUCCESSED("Finished in Success")
if __name__ == '__main__':
        rospy.init_node('MyTaskNode')
        MyTask("MyTask")
        rospy.spin()

Wiki: decision_making/Tutorials/Actionlib (last edited 2014-01-07 19:33:16 by Ari Yakir)