00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <ros/ros.h>
00038 #include <actionlib/server/simple_action_server.h>
00039 #include <actionlib_tutorials/FibonacciAction.h>
00040
00041 class FibonacciAction
00042 {
00043 public:
00044
00045 FibonacciAction(std::string name) :
00046 as_(nh_, name, boost::bind(&FibonacciAction::executeCB, this, _1)),
00047 action_name_(name)
00048 {
00049 }
00050
00051 ~FibonacciAction(void)
00052 {
00053 }
00054
00055 void executeCB(const actionlib_tutorials::FibonacciGoalConstPtr &goal)
00056 {
00057
00058 ros::Rate r(1);
00059 bool success = true;
00060
00061
00062 feedback_.sequence.clear();
00063 feedback_.sequence.push_back(0);
00064 feedback_.sequence.push_back(1);
00065
00066
00067 ROS_INFO("%s: Executing, creating fibonacci sequence of order %i with seeds %i, %i", action_name_.c_str(), goal->order, feedback_.sequence[0], feedback_.sequence[1]);
00068
00069
00070 for(int i=1; i<=goal->order; i++)
00071 {
00072
00073 if (as_.isPreemptRequested() || !ros::ok())
00074 {
00075 ROS_INFO("%s: Preempted", action_name_.c_str());
00076
00077 as_.setPreempted();
00078 success = false;
00079 break;
00080 }
00081 feedback_.sequence.push_back(feedback_.sequence[i] + feedback_.sequence[i-1]);
00082
00083 as_.publishFeedback(feedback_);
00084
00085 r.sleep();
00086 }
00087
00088 if(success)
00089 {
00090 result_.sequence = feedback_.sequence;
00091 ROS_INFO("%s: Succeeded", action_name_.c_str());
00092
00093 as_.setSucceeded(result_);
00094 }
00095 }
00096
00097 protected:
00098
00099 ros::NodeHandle nh_;
00100 actionlib::SimpleActionServer<actionlib_tutorials::FibonacciAction> as_;
00101 std::string action_name_;
00102
00103 actionlib_tutorials::FibonacciFeedback feedback_;
00104 actionlib_tutorials::FibonacciResult result_;
00105 };
00106
00107
00108 int main(int argc, char** argv)
00109 {
00110 ros::init(argc, argv, "fibonacci");
00111
00112 FibonacciAction fibonacci(ros::this_node::getName());
00113 ros::spin();
00114
00115 return 0;
00116 }