00001 #ifndef _GRASPER_H
00002 #define _GRASPER_H
00003
00004 #include "Shared/RobotInfo.h"
00005 #if (defined(TGT_HAS_ARMS) || !defined(STRICT_TGT_MODEL)) && !defined(TGT_IS_AIBO)
00006
00007 #include "Behaviors/StateNode.h"
00008 #include "Behaviors/Nodes/DynamicMotionSequenceNode.h"
00009 #include "Behaviors/Nodes/PostMachine.h"
00010 #include "Behaviors/Transitions/CompareTrans.h"
00011 #include "Behaviors/Transitions/CompletionTrans.h"
00012 #include "Behaviors/Transitions/NullTrans.h"
00013 #include "Behaviors/Transitions/SignalTrans.h"
00014 #include "Crew/GrasperRequest.h"
00015 #include "Crew/MotionNodes.h"
00016 #include "Events/GrasperEvent.h"
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 class Grasper: public StateNode {
00031 public:
00032 #ifdef TGT_CALLIOPE
00033 typedef ShapeSpacePlanner3DR<NumArmJoints> Planner;
00034 typedef Planner::NodeType_t NodeType_t;
00035 typedef PlannerObstacle3D PlannerObstacle;
00036 #else
00037 typedef ShapeSpacePlanner2DR<NumArmJoints> Planner;
00038 typedef Planner::NodeType_t NodeType_t;
00039 typedef PlannerObstacle2D PlannerObstacle;
00040 #endif
00041 typedef NodeType_t::NodeValue_t NodeValue_t;
00042
00043 typedef unsigned int GrasperVerbosity_t;
00044 static const GrasperVerbosity_t GVstart = 1<<0;
00045 static const GrasperVerbosity_t GVexecuteRequest = 1<<1;
00046 static const GrasperVerbosity_t GVnumObstacles = 1<<2;
00047 static const GrasperVerbosity_t GVexecutePath = 1<<3;
00048 static const GrasperVerbosity_t GVcomputeGoals = 1<<4;
00049 static const GrasperVerbosity_t GVsetJoint = 1<<5;
00050
00051 private:
00052
00053
00054
00055
00056
00057 class ForwardRequestType : public StateNode {
00058 public:
00059 ForwardRequestType(const std::string &nodename="ForwardRequestType") : StateNode(nodename) {}
00060 virtual void doStart();
00061 };
00062
00063
00064 class ForwardTargetLocation : public StateNode {
00065 public:
00066 ForwardTargetLocation(const std::string &nodename="ForwardTargetLocation") : StateNode(nodename) {}
00067 virtual void doStart() {
00068 postStateSignal<Point>(curReq->targetLocation->getCentroid());
00069 }
00070 };
00071
00072
00073
00074
00075 class PathPlanUnconstrained : public StateNode {
00076 public:
00077 PathPlanUnconstrained(const std::string &nodename="PathPlanUnconstrained") : StateNode(nodename) {}
00078 virtual void doStart();
00079 };
00080
00081
00082 class PathPlanConstrained : public StateNode {
00083 public:
00084 PathPlanConstrained(const std::string &nodename="PathPlanConstrained") : StateNode(nodename) {}
00085 virtual void doStart();
00086 };
00087
00088
00089 class PathPlanToRest : public StateNode {
00090 public:
00091 PathPlanToRest(const std::string &nodename="PathPlanToRest") : StateNode(nodename) {}
00092 virtual void doStart();
00093 };
00094
00095
00096 class Plan : public StateNode {
00097 public:
00098 Plan(const std::string &nodename="Plan") : StateNode(nodename) {}
00099 virtual void setup() {
00100 startnode = new ForwardRequestType("startnode");
00101 addNode(startnode);
00102
00103 PathPlanUnconstrained *objectUncon = new PathPlanUnconstrained("objectUncon");
00104 addNode(objectUncon);
00105
00106 PathPlanUnconstrained *objectUnconCont = new PathPlanUnconstrained("objectUnconCont");
00107 addNode(objectUnconCont);
00108
00109 PathPlanConstrained *targetCon = new PathPlanConstrained("targetCon");
00110 addNode(targetCon);
00111
00112 PathPlanToRest *restPlan = new PathPlanToRest("restPlan");
00113 addNode(restPlan);
00114
00115 PostMachineCompletion *postmachinecompletion1 = new PostMachineCompletion("postmachinecompletion1");
00116 addNode(postmachinecompletion1);
00117
00118 GrasperFailed *grasperfailed1 = new GrasperFailed("grasperfailed1");
00119 addNode(grasperfailed1);
00120
00121 startnode = startnode;
00122
00123 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans1",objectUncon,GrasperRequest::grasp));
00124 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans2",objectUncon,GrasperRequest::checkGraspable));
00125 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans3",objectUncon,GrasperRequest::reach));
00126 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans4",objectUncon,GrasperRequest::computeReach));
00127 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans5",objectUncon,GrasperRequest::touch));
00128 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans6",targetCon,GrasperRequest::release));
00129 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans7",objectUnconCont,GrasperRequest::moveTo));
00130 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans8",objectUnconCont,GrasperRequest::checkMovable));
00131 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans9",restPlan,GrasperRequest::rest));
00132 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRequestType_t>("signaltrans10",restPlan,GrasperRequest::checkRestable));
00133 objectUncon->addTransition(new CompletionTrans("completiontrans1",restPlan));
00134 objectUnconCont->addTransition(new CompletionTrans("completiontrans2",targetCon));
00135 targetCon->addTransition(new CompletionTrans("completiontrans3",restPlan));
00136 restPlan->addTransition(new CompletionTrans("completiontrans4",postmachinecompletion1));
00137
00138 SignalTrans<GraspError> *signaltrans11 = new SignalTrans<GraspError>("signaltrans11",grasperfailed1);
00139 objectUncon->addTransition(signaltrans11);
00140 objectUnconCont->addTransition(signaltrans11);
00141 targetCon->addTransition(signaltrans11);
00142 restPlan->addTransition(signaltrans11);
00143
00144 }
00145 };
00146
00147
00148
00149
00150 class MoveArm : public DynamicMotionSequenceNode {
00151 public:
00152 MoveArm(const std::string &nodename, GrasperRequest::GrasperPathType_t _pa) : DynamicMotionSequenceNode(nodename), pa(_pa) {}
00153 GrasperRequest::GrasperPathType_t pa;
00154 virtual void doStart();
00155 void executeMove(const std::vector<NodeValue_t>& path);
00156 unsigned int advTime(const NodeValue_t& confDif) {
00157 float maxDiff = abs(confDif[0]);
00158 for (unsigned int i = 1; i < NumArmJoints; i++) {
00159 if (confDif[i] > maxDiff)
00160 maxDiff = abs(confDif[i]);
00161 }
00162 unsigned int time = (unsigned int)( maxDiff/(M_PI/6)*1500 );
00163 return max((unsigned)11, (unsigned int)(time * curReq->armTimeFactor));
00164 }
00165 };
00166
00167
00168 class Grasp : public StateNode {
00169 public:
00170 Grasp(const std::string &nodename, bool _closeGripper=true) : StateNode(nodename), closeGripper(_closeGripper) {}
00171 bool closeGripper;
00172 virtual void setup() {
00173 startnode = new StateNode("startnode");
00174 addNode(startnode);
00175
00176 StateNode *split = new StateNode("split");
00177 addNode(split);
00178
00179 OpenTheGripper *openTheGripper = new OpenTheGripper("openTheGripper");
00180 addNode(openTheGripper);
00181
00182 PostMachineCompletion *postmachinecompletion2 = new PostMachineCompletion("postmachinecompletion2");
00183 addNode(postmachinecompletion2);
00184
00185 CloseTheGripper *closeTheGripper = new CloseTheGripper("closeTheGripper");
00186 addNode(closeTheGripper);
00187
00188 PostMachineCompletion *postmachinecompletion3 = new PostMachineCompletion("postmachinecompletion3");
00189 addNode(postmachinecompletion3);
00190
00191 SignalGraspError *failed = new SignalGraspError("failed", GrasperRequest::badMove);
00192 addNode(failed);
00193
00194 startnode = startnode;
00195
00196 startnode->addTransition(new NullTrans("nulltrans1",split));
00197 split->addTransition(new CompareTrans<bool>("comparetrans1",openTheGripper,&closeGripper,CompareTrans<bool>::EQ,true));
00198 split->addTransition(new CompareTrans<bool>("comparetrans2",closeTheGripper,&closeGripper,CompareTrans<bool>::EQ,false));
00199 openTheGripper->addTransition(new CompletionTrans("completiontrans5",postmachinecompletion2));
00200 closeTheGripper->addTransition(new CompletionTrans("completiontrans6",postmachinecompletion3));
00201 }
00202 };
00203
00204
00205 class Rest : public StateNode {
00206 public:
00207 Rest(const std::string &nodename="Rest") : StateNode(nodename) {}
00208 class GetRestType : public StateNode {
00209 public:
00210 GetRestType(const std::string &nodename="GetRestType") : StateNode(nodename) {}
00211 virtual void doStart() {
00212 postStateSignal<GrasperRequest::GrasperRestType_t>(curReq->restType);
00213 }
00214 };
00215
00216 class GetOpenGripperFlag : public StateNode {
00217 public:
00218 GetOpenGripperFlag(const std::string &nodename="GetOpenGripperFlag") : StateNode(nodename) {}
00219 virtual void doStart() {
00220 postStateSignal<bool>(curReq->openGripperOnRest);
00221 }
00222 };
00223
00224 virtual void setup() {
00225 startnode = new GetRestType("startnode");
00226 addNode(startnode);
00227
00228 MoveArm *restArm = new MoveArm("restArm", GrasperRequest::disengage);
00229 addNode(restArm);
00230
00231 MoveArm *restToOpen = new MoveArm("restToOpen", GrasperRequest::disengage);
00232 addNode(restToOpen);
00233
00234 GetOpenGripperFlag *open = new GetOpenGripperFlag("open");
00235 addNode(open);
00236
00237 OpenTheGripper *openthegripper1 = new OpenTheGripper("openthegripper1");
00238 addNode(openthegripper1);
00239
00240 PostMachineCompletion *succeeded = new PostMachineCompletion("succeeded");
00241 addNode(succeeded);
00242
00243 SignalGraspError *failed = new SignalGraspError("failed", GrasperRequest::badMove);
00244 addNode(failed);
00245
00246 startnode = startnode;
00247
00248 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRestType_t>("signaltrans12",succeeded,GrasperRequest::stationary));
00249 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRestType_t>("signaltrans13",restArm,GrasperRequest::settleArm));
00250 startnode->addTransition(new SignalTrans<GrasperRequest::GrasperRestType_t>("signaltrans14",restToOpen,GrasperRequest::settleBodyAndArm));
00251 restArm->addTransition(new CompletionTrans("completiontrans7",succeeded));
00252 restArm->addTransition(new SignalTrans<StateNode::SuccessOrFailure>("signaltrans15",failed,StateNode::failureSignal));
00253 restToOpen->addTransition(new CompletionTrans("completiontrans8",open));
00254 restToOpen->addTransition(new SignalTrans<StateNode::SuccessOrFailure>("signaltrans16",failed,StateNode::failureSignal));
00255 open->addTransition(new SignalTrans<bool>("signaltrans17",succeeded,false));
00256 open->addTransition(new SignalTrans<bool>("signaltrans18",openthegripper1,true));
00257 openthegripper1->addTransition(new CompletionTrans("completiontrans9",succeeded));
00258 }
00259 };
00260
00261
00262 class OpenTheGripper : public StateNode {
00263 public:
00264 OpenTheGripper(const std::string &nodename="OpenTheGripper") : StateNode(nodename) {}
00265 virtual void setup() {
00266 #if defined(TGT_HAS_GRIPPER)
00267 startnode = new StateNode("startnode");
00268 addNode(startnode);
00269
00270 SetJoint *openLeft = new SetJoint("openLeft", "ARM:gripperLeft", outputRanges[capabilities.findFrameOffset("ARM:gripperLeft")][0]);
00271 addNode(openLeft);
00272
00273 SetJoint *openRight = new SetJoint("openRight", "ARM:gripperRight", outputRanges[capabilities.findFrameOffset("ARM:gripperRight")][1]);
00274 addNode(openRight);
00275
00276 PostMachineCompletion *postmachinecompletion4 = new PostMachineCompletion("postmachinecompletion4");
00277 addNode(postmachinecompletion4);
00278
00279 startnode = startnode;
00280
00281 NullTrans *nulltrans2 = new NullTrans("nulltrans2",openLeft);
00282 nulltrans2->addDestination(openRight);
00283 startnode->addTransition(nulltrans2);
00284
00285 CompletionTrans *completiontrans10 = new CompletionTrans("completiontrans10",postmachinecompletion4);
00286 openLeft->addTransition(completiontrans10);
00287 openRight->addTransition(completiontrans10);
00288
00289 #endif
00290 }
00291 };
00292
00293
00294 class CloseTheGripper : public StateNode {
00295 public:
00296 CloseTheGripper(const std::string &nodename="CloseTheGripper") : StateNode(nodename) {}
00297 virtual void setup() {
00298 #if defined(TGT_HAS_GRIPPER)
00299 startnode = new StateNode("startnode");
00300 addNode(startnode);
00301
00302 SetJoint *closeLeft = new SetJoint("closeLeft", "ARM:gripperLeft", outputRanges[capabilities.findFrameOffset("ARM:gripperLeft")][1]);
00303 addNode(closeLeft);
00304
00305 SetJoint *closeRight = new SetJoint("closeRight", "ARM:gripperRight", outputRanges[capabilities.findFrameOffset("ARM:gripperRight")][0]);
00306 addNode(closeRight);
00307
00308 PostMachineCompletion *postmachinecompletion5 = new PostMachineCompletion("postmachinecompletion5");
00309 addNode(postmachinecompletion5);
00310
00311 startnode = startnode;
00312
00313 NullTrans *nulltrans3 = new NullTrans("nulltrans3",closeLeft);
00314 nulltrans3->addDestination(closeRight);
00315 startnode->addTransition(nulltrans3);
00316
00317 CompletionTrans *completiontrans11 = new CompletionTrans("completiontrans11",postmachinecompletion5);
00318 closeLeft->addTransition(completiontrans11);
00319 closeRight->addTransition(completiontrans11);
00320
00321 #endif
00322 }
00323 };
00324
00325
00326
00327
00328 class SignalGraspError : public StateNode {
00329 public:
00330 SignalGraspError(const std::string &nodename, GraspError _e=GrasperRequest::noError) : StateNode(nodename), e(_e) {}
00331 GraspError e;
00332 virtual void doStart() {
00333 if (const DataEvent<GraspError> *datev = dynamic_cast<const DataEvent<GraspError>*>(event))
00334 postParentSignal<GraspError>(datev->getData());
00335 else
00336 postParentSignal<GraspError>(e);
00337 }
00338 };
00339
00340
00341 class GrasperSucceeded : public StateNode {
00342 public:
00343 GrasperSucceeded(const std::string &nodename="GrasperSucceeded") : StateNode(nodename) {}
00344 virtual void doStart() {
00345 GrasperEvent ev(true, curReq->requestType, GrasperRequest::noError, (size_t)curReq->requestingBehavior);
00346 switch (curReq->populateEventPathWith) {
00347 case GrasperRequest::moveFree:
00348 ev.path = curReq->moveFreePath;
00349 break;
00350 case GrasperRequest::moveConstrained:
00351 ev.path = curReq->moveConstrainedPath;
00352 break;
00353 case GrasperRequest::disengage:
00354 ev.path = curReq->disengagePath;
00355 break;
00356 case GrasperRequest::noPath:
00357 default:
00358 break;
00359 }
00360 erouter->postEvent(ev);
00361 }
00362 };
00363
00364
00365 class GrasperFailed : public StateNode {
00366 public:
00367 GrasperFailed(const std::string &nodename, GraspError _err=GrasperRequest::badMove) : StateNode(nodename), err(_err) {}
00368 GraspError err;
00369 virtual void doStart() {
00370 GraspError e(err);
00371 if (const DataEvent<GraspError> *datev = dynamic_cast<const DataEvent<GraspError>*>(event))
00372 e = datev->getData();
00373 GrasperEvent myEvent(false, curReq->requestType, e, (size_t)curReq->requestingBehavior);
00374 if (e == GrasperRequest::pickUpUnreachable || e == GrasperRequest::dropOffUnreachable) {
00375
00376
00377 }
00378 erouter->postEvent(myEvent);
00379 }
00380 };
00381
00382
00383 class NextRequest : public StateNode {
00384 public:
00385 NextRequest(const std::string &nodename="NextRequest") : StateNode(nodename) {}
00386 virtual void doStart() {
00387 delete curReq;
00388 curReq = NULL;
00389 VRmixin::grasper->executeRequest();
00390 stop();
00391 }
00392 };
00393
00394
00395
00396
00397 StateNode *checkRoot;
00398 StateNode *graspRoot;
00399 StateNode *releaseRoot;
00400 StateNode *moveRoot;
00401 StateNode *reachRoot;
00402 StateNode *touchRoot;
00403 StateNode *restRoot;
00404 StateNode *computeReachRoot;
00405
00406 public:
00407
00408 Grasper(): StateNode(),
00409 checkRoot(), graspRoot(), releaseRoot(), moveRoot(), reachRoot(),
00410 touchRoot(), restRoot(), computeReachRoot(),
00411
00412 requests(), idCounter(0)
00413 {
00414 curReq = NULL;
00415 }
00416
00417 virtual void setup() {
00418 startnode = new StateNode("startnode");
00419 addNode(startnode);
00420
00421 Plan *check_Plan = new Plan("check_Plan");
00422 addNode(check_Plan);
00423
00424 Plan *reach_Plan = new Plan("reach_Plan");
00425 addNode(reach_Plan);
00426
00427 MoveArm *reach_Move = new MoveArm("reach_Move", GrasperRequest::moveFree);
00428 addNode(reach_Move);
00429
00430 Rest *reach_Rest = new Rest("reach_Rest");
00431 addNode(reach_Rest);
00432
00433 Plan *grasp_Plan = new Plan("grasp_Plan");
00434 addNode(grasp_Plan);
00435
00436 MoveArm *grasp_Move = new MoveArm("grasp_Move", GrasperRequest::moveFree);
00437 addNode(grasp_Move);
00438
00439 Grasp *grasp_Grasp = new Grasp("grasp_Grasp", false);
00440 addNode(grasp_Grasp);
00441
00442 Rest *grasp_Rest = new Rest("grasp_Rest");
00443 addNode(grasp_Rest);
00444
00445 Plan *release_Plan = new Plan("release_Plan");
00446 addNode(release_Plan);
00447
00448 MoveArm *release_Move = new MoveArm("release_Move", GrasperRequest::moveConstrained);
00449 addNode(release_Move);
00450
00451 Grasp *release_Grasp = new Grasp("release_Grasp", true);
00452 addNode(release_Grasp);
00453
00454 Rest *release_Rest = new Rest("release_Rest");
00455 addNode(release_Rest);
00456
00457 Plan *moveTo_Plan = new Plan("moveTo_Plan");
00458 addNode(moveTo_Plan);
00459
00460 MoveArm *moveTo_MoveA = new MoveArm("moveTo_MoveA", GrasperRequest::moveFree);
00461 addNode(moveTo_MoveA);
00462
00463 Grasp *moveTo_GraspO = new Grasp("moveTo_GraspO", false);
00464 addNode(moveTo_GraspO);
00465
00466 MoveArm *moveTo_MoveB = new MoveArm("moveTo_MoveB", GrasperRequest::moveConstrained);
00467 addNode(moveTo_MoveB);
00468
00469 Grasp *moveTo_GraspC = new Grasp("moveTo_GraspC", true);
00470 addNode(moveTo_GraspC);
00471
00472 Rest *moveTo_Rest = new Rest("moveTo_Rest");
00473 addNode(moveTo_Rest);
00474
00475 Plan *touch_Plan = new Plan("touch_Plan");
00476 addNode(touch_Plan);
00477
00478 MoveArm *touch_Move = new MoveArm("touch_Move", GrasperRequest::moveFree);
00479 addNode(touch_Move);
00480
00481 Grasp *touch_Grasp = new Grasp("touch_Grasp", false);
00482 addNode(touch_Grasp);
00483
00484 Plan *rest_Plan = new Plan("rest_Plan");
00485 addNode(rest_Plan);
00486
00487 Rest *rest_Rest = new Rest("rest_Rest");
00488 addNode(rest_Rest);
00489
00490 Plan *computeReach_Plan = new Plan("computeReach_Plan");
00491 addNode(computeReach_Plan);
00492
00493 GrasperSucceeded *succeeded = new GrasperSucceeded("succeeded");
00494 addNode(succeeded);
00495
00496 GrasperFailed *failed = new GrasperFailed("failed");
00497 addNode(failed);
00498
00499 NextRequest *next = new NextRequest("next");
00500 addNode(next);
00501
00502 startnode = startnode;
00503
00504 check_Plan->addTransition(new CompletionTrans("completiontrans12",succeeded));
00505 check_Plan->addTransition(new SignalTrans<GraspError>("signaltrans19",failed));
00506 reach_Plan->addTransition(new CompletionTrans("completiontrans13",reach_Move));
00507 reach_Move->addTransition(new CompletionTrans("completiontrans14",reach_Rest));
00508 reach_Rest->addTransition(new CompletionTrans("completiontrans15",succeeded));
00509 reach_Plan->addTransition(new SignalTrans<GraspError>("signaltrans20",failed));
00510 reach_Move->addTransition(new SignalTrans<GraspError>("signaltrans21",failed));
00511 grasp_Plan->addTransition(new CompletionTrans("completiontrans16",grasp_Move));
00512 grasp_Move->addTransition(new CompletionTrans("completiontrans17",grasp_Grasp));
00513 grasp_Grasp->addTransition(new CompletionTrans("completiontrans18",grasp_Rest));
00514 grasp_Rest->addTransition(new CompletionTrans("completiontrans19",succeeded));
00515 grasp_Plan->addTransition(new SignalTrans<GraspError>("signaltrans22",failed));
00516 grasp_Move->addTransition(new SignalTrans<GraspError>("signaltrans23",failed));
00517 grasp_Grasp->addTransition(new SignalTrans<GraspError>("signaltrans24",failed));
00518 release_Plan->addTransition(new CompletionTrans("completiontrans20",release_Move));
00519 release_Move->addTransition(new CompletionTrans("completiontrans21",release_Grasp));
00520 release_Grasp->addTransition(new CompletionTrans("completiontrans22",release_Rest));
00521 release_Rest->addTransition(new CompletionTrans("completiontrans23",succeeded));
00522 release_Plan->addTransition(new SignalTrans<GraspError>("signaltrans25",failed));
00523 release_Move->addTransition(new SignalTrans<GraspError>("signaltrans26",failed));
00524 release_Grasp->addTransition(new SignalTrans<GraspError>("signaltrans27",failed));
00525 moveTo_Plan->addTransition(new CompletionTrans("completiontrans24",moveTo_MoveA));
00526 moveTo_MoveA->addTransition(new CompletionTrans("completiontrans25",moveTo_GraspO));
00527 moveTo_GraspO->addTransition(new CompletionTrans("completiontrans26",moveTo_MoveB));
00528 moveTo_MoveB->addTransition(new CompletionTrans("completiontrans27",moveTo_GraspC));
00529 moveTo_GraspC->addTransition(new CompletionTrans("completiontrans28",moveTo_Rest));
00530 moveTo_Rest->addTransition(new CompletionTrans("completiontrans29",succeeded));
00531 moveTo_Plan->addTransition(new SignalTrans<GraspError>("signaltrans28",failed));
00532 moveTo_MoveA->addTransition(new SignalTrans<GraspError>("signaltrans29",failed));
00533 moveTo_GraspO->addTransition(new SignalTrans<GraspError>("signaltrans30",failed));
00534 moveTo_MoveB->addTransition(new SignalTrans<GraspError>("signaltrans31",failed));
00535 moveTo_GraspC->addTransition(new SignalTrans<GraspError>("signaltrans32",failed));
00536 touch_Plan->addTransition(new CompletionTrans("completiontrans30",touch_Move));
00537 touch_Move->addTransition(new CompletionTrans("completiontrans31",touch_Grasp));
00538 touch_Grasp->addTransition(new CompletionTrans("completiontrans32",succeeded));
00539 touch_Plan->addTransition(new SignalTrans<GraspError>("signaltrans33",failed));
00540 touch_Move->addTransition(new SignalTrans<GraspError>("signaltrans34",failed));
00541 touch_Grasp->addTransition(new SignalTrans<GraspError>("signaltrans35",failed));
00542 rest_Plan->addTransition(new CompletionTrans("completiontrans33",rest_Rest));
00543 rest_Rest->addTransition(new CompletionTrans("completiontrans34",succeeded));
00544 rest_Plan->addTransition(new SignalTrans<GraspError>("signaltrans36",failed));
00545 rest_Rest->addTransition(new SignalTrans<GraspError>("signaltrans37",failed));
00546 computeReach_Plan->addTransition(new CompletionTrans("completiontrans35",succeeded));
00547 computeReach_Plan->addTransition(new SignalTrans<GraspError>("signaltrans38",failed));
00548 succeeded->addTransition(new NullTrans("nulltrans4",next));
00549 failed->addTransition(new NullTrans("nulltrans5",next));
00550
00551 checkRoot = check_Plan;
00552 reachRoot = reach_Plan;
00553 graspRoot = grasp_Plan;
00554 releaseRoot = release_Plan;
00555 moveRoot = moveTo_Plan;
00556 touchRoot = touch_Plan;
00557 restRoot = rest_Plan;
00558 computeReachRoot = computeReach_Plan;
00559 }
00560
00561 virtual void preStart() {
00562 StateNode::preStart();
00563 if ( verbosity & GVstart ) {
00564 cout << "Grasper starting up" << endl;
00565 }
00566 while ( !requests.empty() ) {
00567 delete requests.front();
00568 requests.pop();
00569 }
00570 }
00571
00572
00573 unsigned int executeRequest(const GrasperRequest& req, BehaviorBase* requestingBehavior);
00574
00575
00576 void executeRequest();
00577
00578
00579 void dispatch();
00580
00581
00582
00583
00584
00585 void appendObjectToObstacles() {
00586 if (!curReq->object.isValid()) return;
00587 if (curReq->objectPlannerObstacle == NULL) {
00588 PlannerObstacle::convertShapeToPlannerObstacle(curReq->object, 0, curReq->plannerObstacles);
00589 curReq->objectPlannerObstacle = curReq->plannerObstacles.back();
00590 } else {
00591 curReq->plannerObstacles.push_back(curReq->objectPlannerObstacle);
00592 }
00593 if (!curReq->moveConstrainedPath.empty()) {
00594 #ifdef TGT_CALLIOPE
00595 fmat::Column<3> newPos = fmat::pack(curReq->targetLocation->getCentroid().coordX(),
00596 curReq->targetLocation->getCentroid().coordY(),
00597 curReq->targetLocation->getCentroid().coordZ());
00598 #else
00599 fmat::Column<2> newPos = fmat::pack(curReq->targetLocation->getCentroid().coordX(),
00600 curReq->targetLocation->getCentroid().coordY());
00601 #endif
00602 curReq->objectPlannerObstacle->updatePosition(newPos);
00603 }
00604 }
00605
00606
00607 void removeTargetFromObstacles() {
00608 if (!curReq->object.isValid()) return;
00609
00610 std::vector<PlannerObstacle*>::iterator obj = std::find(curReq->plannerObstacles.begin(), curReq->plannerObstacles.end(), curReq->objectPlannerObstacle);
00611 if (obj != curReq->plannerObstacles.end())
00612 curReq->plannerObstacles.erase(obj);
00613 delete curReq->objectPlannerObstacle;
00614 curReq->objectPlannerObstacle = NULL;
00615 }
00616
00617
00618
00619 static void getCurrentState(NodeValue_t ¤t, KinematicJoint* endEffector=NULL);
00620
00621
00622 void computeGoalStates(Point& toPt, std::vector<std::pair<float, float> >& rangesX,
00623 std::vector<std::pair<float, float> >& rangesY, std::vector<std::pair<float, float> >& rangesZ,
00624 float res, std::vector<NodeValue_t>& goals, fmat::Column<3> offset);
00625
00626 protected:
00627
00628
00629
00630
00631 void convertObstacles();
00632
00633 std::queue<GrasperRequest*> requests;
00634 unsigned int idCounter;
00635
00636 public:
00637 static GrasperRequest* curReq;
00638 static GrasperVerbosity_t verbosity;
00639
00640 private:
00641 Grasper(const Grasper& o);
00642 void operator=(const Grasper& o);
00643 };
00644
00645 #else // not TGT_HAS_ARMS
00646 class Grasper: public StateNode {
00647 public:
00648 unsigned int executeRequest(const GrasperRequest& req, BehaviorBase* requestingBehavior) {
00649 std::cout << "Warning: cannot execute Grasper request: robot has no arms!" << std::endl;
00650 return 0;
00651 }
00652 };
00653 #endif
00654
00655 #endif