Go to the documentation of this file.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 #include <srs_assisted_arm_navigation/assisted_arm_navigation/arm_manip_node.h>
00029
00030 using namespace srs_assisted_arm_navigation;
00031 using namespace srs_assisted_arm_navigation_msgs;
00032
00033 void ManualArmManipActionServer::executeCB(const ManualArmManipGoalConstPtr &goal) {
00034
00035 ros::Rate r(1);
00036 ros::Rate r5(5);
00037 ArmNavStart srv_start;
00038
00039 result_.result.collision = false;
00040 result_.result.success = false;
00041 result_.result.repeat = false;
00042 result_.result.failed = false;
00043 result_.result.timeout = false;
00044 result_.result.time_elapsed = ros::Duration(0);
00045
00046 ROS_INFO("Executing ManualArmManipAction");
00047
00048 start_time_ = ros::Time::now();
00049 timeout_ = ros::Time::now();
00050 state_ = S_NONE;
00051
00052 while(!ros::service::exists(SRV_START,true)) {
00053
00054 ROS_INFO("Waiting for arm_nav_start service");
00055 r5.sleep();
00056
00057 };
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 srv_start.request.allow_repeat = goal->allow_repeat;
00074 srv_start.request.action = goal->action;
00075 srv_start.request.object_name = goal->object_name;
00076
00078 ros::service::call(SRV_START,srv_start);
00079
00080 inited_ = true;
00081
00082 ROS_INFO("Actionserver: starting looping");
00083
00084
00085 while(ros::ok()) {
00086
00087 state_ = new_state_;
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 if (server_.isPreemptRequested() || !ros::ok()) {
00115
00116 ROS_INFO("%s: Preempted", action_name_.c_str());
00117
00118
00119
00120 result_.result.time_elapsed = ros::Time::now() - start_time_;
00121 server_.setPreempted(result_.result);
00122
00123 break;
00124
00125 }
00126
00127
00128 if ((state_ != S_SUCCESS) && (state_ != S_FAILED) && (state_ != S_REPEAT)) {
00129
00130
00131 setFeedbackFalse();
00132
00133 if (state_ == S_NEW) feedback_.feedback.starting = true;
00134 if (state_ == S_PLAN) feedback_.feedback.planning = true;
00135 if (state_ == S_EXECUTE) feedback_.feedback.executing = true;
00136 if (state_ == S_RESET) feedback_.feedback.reset = true;
00137
00138 server_.publishFeedback(feedback_.feedback);
00139
00140 } else {
00141
00142 result_.result.failed = false;
00143
00144
00145 result_.result.time_elapsed = ros::Time::now() - start_time_;
00146
00147 if (state_ == S_SUCCESS) {
00148
00149 result_.result.success = true;
00150 server_.setSucceeded(result_.result);
00151
00152 }
00153
00154 if (state_ == S_FAILED) {
00155
00156 ROS_INFO("S_FAILED");
00157 result_.result.failed = true;
00158 server_.setAborted(result_.result);
00159
00160 }
00161
00162 if (state_ == S_REPEAT) {
00163
00164 ROS_INFO("S_REPEAT");
00165 result_.result.repeat = true;
00166 server_.setAborted(result_.result);
00167
00168 }
00169
00170
00171 break;
00172
00173 }
00174
00175 r.sleep();
00176
00177 }
00178
00179 inited_ = false;
00180 new_state_ = S_NONE;
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 }
00191
00192
00193 void ManualArmManipActionServer::srv_set_state(unsigned int n) {
00194
00195 if (inited_) {
00196 new_state_ = n;
00197 ROS_DEBUG("Setting internal state to %u",n);
00198 timeout_ = ros::Time::now();
00199 }
00200
00201 }
00202
00203 void ManualArmManipActionServer::setFeedbackFalse() {
00204
00205 feedback_.feedback.starting = false;
00206 feedback_.feedback.executing = false;
00207 feedback_.feedback.planning = false;
00208 feedback_.feedback.reset = false;
00209
00210 }