Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

Grasper.h

Go to the documentation of this file.
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   TODO
00020   - Add code to validate Grasper requests and complain, e.g., if reach is missing an object
00021   - fix up the Fail/Success/Complete thing; do we need all those different classes?
00022   - plan failure is currently not being caught; the Grasper hangs
00023   - take out all the DEBUG printouts
00024  
00025   - Sweep
00026   - Test-suite
00027   - Calculate the offset of the gripper frame from wristYaw when projected in XY
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   //**************** Nodes Used in Grasper Actions ****************
00053   //
00054   // A collection of nodes from which complex Grasper actions are built
00055 
00056   //! Forward the request type through a SignalTrans
00057 class ForwardRequestType : public StateNode {
00058  public:
00059   ForwardRequestType(const std::string &nodename="ForwardRequestType") : StateNode(nodename) {}
00060     virtual void doStart();
00061 };
00062 
00063   //! Forward the target's centroid through a SignalTrans
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   // ==== PLANNING NODES ====
00073 
00074   //! Plan an unconstrained path
00075 class PathPlanUnconstrained : public StateNode {
00076  public:
00077   PathPlanUnconstrained(const std::string &nodename="PathPlanUnconstrained") : StateNode(nodename) {}
00078     virtual void doStart();
00079 };
00080 
00081   //! Plan a constrained path
00082 class PathPlanConstrained : public StateNode {
00083  public:
00084   PathPlanConstrained(const std::string &nodename="PathPlanConstrained") : StateNode(nodename) {}
00085     virtual void doStart();
00086 };
00087 
00088   //! Plan a path to the rest state
00089 class PathPlanToRest : public StateNode {
00090  public:
00091   PathPlanToRest(const std::string &nodename="PathPlanToRest") : StateNode(nodename) {}
00092     virtual void doStart();
00093 };
00094 
00095   //! Runs all appropriate planners based on the requested action: move OBJECT to TARGET and then REST
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   //==== MOTION ====
00148   
00149   //! Executes an arm movement
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;  // cache the constructor's parameter
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   //! Grasps or releases an object from the gripper if the gripper is manipulable
00168 class Grasp : public StateNode {
00169  public:
00170   Grasp(const std::string &nodename, bool _closeGripper=true) : StateNode(nodename), closeGripper(_closeGripper) {}
00171   bool closeGripper;  // cache the constructor's parameter
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   //! Moves the arm to the rest state
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   //! Open the gripper
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   //! Close the gripper
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   //==== POSTING OF EVENTS ====
00326 
00327   //! Signal the failure of a grasp sub-statemachine via a signalTrans
00328 class SignalGraspError : public StateNode {
00329  public:
00330   SignalGraspError(const std::string &nodename, GraspError _e=GrasperRequest::noError) : StateNode(nodename), e(_e) {}
00331   GraspError e;  // cache the constructor's parameter
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   //! Report successful completion of the grasper request via a GrasperEvent
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   //! Report failure of the grasper request via a GrasperEvent
00365 class GrasperFailed : public StateNode {
00366  public:
00367   GrasperFailed(const std::string &nodename, GraspError _err=GrasperRequest::badMove) : StateNode(nodename), err(_err) {}
00368   GraspError err;  // cache the constructor's parameter
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       // myEvent.suggestedRobotLocation = VRmixin::grasper->getDesiredRobotLocation();
00376       // myEvent.suggestedLookAtPoint = VRmixin::grasper->getDesiredLookAtPoint();
00377     }
00378     erouter->postEvent(myEvent);
00379   }
00380 };
00381 
00382   //! Move on to the next grasper request
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   //**************** End of Grasper Actions ****************
00395   
00396 
00397   StateNode *checkRoot;   //!< The state machine entrance for any check* request
00398   StateNode *graspRoot;   //!< The state machine for only acquiring and grasping
00399   StateNode *releaseRoot;   //!< The state machine for only releasing
00400   StateNode *moveRoot;    //!< The state machine to move an object to the targetLocation
00401   StateNode *reachRoot;   //!< The state machine for acquiring
00402   StateNode *touchRoot;   //!< The state machine for performing the touch action
00403   StateNode *restRoot;    //!< The state machine to execute resting
00404   StateNode *computeReachRoot;
00405 
00406 public:
00407       
00408   Grasper(): StateNode(),
00409        checkRoot(), graspRoot(), releaseRoot(), moveRoot(), reachRoot(), 
00410        touchRoot(), restRoot(), computeReachRoot(),
00411              // desiredRobotLocation(), desiredLookAtPoint(),
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   //! User-level interface for queueing a request to the Grasper
00573   unsigned int executeRequest(const GrasperRequest& req, BehaviorBase* requestingBehavior);
00574 
00575   //! Executes the next pending request, i.e., the one at the front of the queue
00576   void executeRequest();
00577 
00578   //! Dispatches on the request type, running the appropriate state machine; called by executeRequest()
00579   void dispatch();
00580   
00581   //  Point& getDesiredRobotLocation() { return desiredRobotLocation; }
00582   //  Point& getDesiredLookAtPoint() { return desiredLookAtPoint; }
00583   
00584   //! Converts the manipulated object to a planner obstacle and adds it to the planner obstacles list
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   //! Removes the manipulated object's planner obstacle from the planner obstacles list
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   //! Gets current state of robot's arm from the end effector given
00618   /* If no joint is given, pulls values from WorldState */
00619   static void getCurrentState(NodeValue_t &current, KinematicJoint* endEffector=NULL);
00620   
00621   //! Computes all goal states around a point and rotating the approach orientation
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   //  Point desiredRobotLocation; //! When an object or target is out of range, this will hold the desired robot's location in order to manipulate
00628   //  Point desiredLookAtPoint; //! When an object or target is out of range, this will hold the desired robot's orientation in order to manipulate
00629 
00630   //! Converts all environmental obstacles to planner obstacles
00631   void convertObstacles();
00632   
00633   std::queue<GrasperRequest*> requests; //!< Queue of pending Grasper requests
00634   unsigned int idCounter;               //!< Counter for assigning a unique id to each Grasper request
00635 
00636 public:
00637   static GrasperRequest* curReq;        //!< The request itself
00638   static GrasperVerbosity_t verbosity;
00639 
00640 private:
00641   Grasper(const Grasper& o);  //!< Copy constructor; do not use
00642   void operator=(const Grasper& o); //!< Assignment operator; do not use
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

Tekkotsu v5.1CVS
Generated Fri Mar 16 05:26:41 2012 by Doxygen 1.6.3