void cartControlReachAvoidThread::run() { yDebug("************* run() ************************************"); ts.update(); bool newTarget = false; avoidanceVectors.clear(); newTargetFromPort = checkTargetFromPortInput(targetPosFromPort,targetRadius); if(newTargetFromPort || newTargetFromRPC){ //target from RPC is set asynchronously newTarget = true; if (newTargetFromRPC){ //RPC has priority printf("run: setting new target from rpc: %f %f %f \n",targetPos[0],targetPos[1],targetPos[2]); newTargetFromRPC = false; } else{ targetPos = targetPosFromPort; printf("run: setting new target from port: %f %f %f \n",targetPos[0],targetPos[1],targetPos[2]); newTargetFromPort = false; } } getReachingGainFromPort(); getAvoidanceGainFromPort(); getAvoidanceVectorsFromPort(); //fills up global avoidanceVectors vector //debug code vector<avoidanceStruct_t>::const_iterator it; for(it=avoidanceVectors.begin(); it!=avoidanceVectors.end(); it++) { yDebug("run(): Avoidance struct read from port: SkinPart:%s, x,y,z: %s, n1,n2,n3: %s",SkinPart_s[it->skin_part].c_str(),it->x.toString().c_str(),it->n.toString().c_str()); } if (state==STATE_IDLE){ yDebug("run(): STATE_IDLE\n"); if (newTarget){ if (reachableTarget(targetPos)){ printf("--- Got new target => REACHING\n"); state = STATE_REACH; reachTimer = Time::now(); } else{ printf("Target (%f %f %f) is outside of reachable space - x:<%f %f>, y:<%f %f>, z:<%f %f>\n", targetPos[0],targetPos[1],targetPos[2],reachableSpace.minX,reachableSpace.maxX,reachableSpace.minY, reachableSpace.maxY,reachableSpace.minZ,reachableSpace.maxZ); } } //else - remain idle } else if(state==STATE_REACH){ yDebug("run(): STATE_REACH\n"); selectArm(); setControlModeArmsAndTorso(VOCAB_CM_VELOCITY); doReach(); } /*else if(state == STATE_CHECKMOTIONDONE) { yDebug("run(): STATE_CHECKMOTIONDONE\n"); bool done = false; done = targetCloseEnough(); //cartArm->checkMotionDone(&done); //cannot be used here - we are controlling manually with velocity if (!done) { if( ((Time::now()-reachTimer)>reachTmo)){ fprintf(stdout,"--- Reach timeout => go home\n"); state = STATE_GO_HOME; } } else{ //done fprintf(stdout,"--- Reach done. => go IDLE\n"); state = STATE_IDLE; } }*/ else if(state==STATE_GO_HOME){ yDebug("run(): STATE_GO_HOME\n"); setControlModeArmsAndTorso(VOCAB_CM_POSITION); steerTorsoToHome(); steerArmToHome(LEFTARM); steerArmToHome(RIGHTARM); checkTorsoHome(3.0); checkArmHome(LEFTARM,3.0); checkArmHome(RIGHTARM,3.0); yDebug("--- I'm home => go idle\n"); state=STATE_IDLE; } }
void TaskManager::actionlib_callback(const apc_bt_comms::ManagerGoalConstPtr &goal) { ROS_INFO("BT Task Manager got a request!"); sleep(0.1); if (goal->success) { if (task_ == "pick") { ROS_INFO("Will mark bin as solved!"); if (markAsSolved(current_bin_)) { nh_.setParam("/apc/task_manager/running", false); } } else { ROS_INFO("Will mark object as solved!"); if (markAsSolved(current_object_)) { nh_.setParam("/apc/task_manager/running", false); } } } else { if (goal->pop) { if (task_ == "pick") { if (!current_bin_.empty()) { ROS_INFO("Current bin is not empty! Will mark as impossible"); markAsImpossible(current_bin_); current_bin_.clear(); current_object_.clear(); } ROS_INFO("Will pop next mission bin!"); current_bin_ = getNextInMission(); current_object_ = getOrderForBin(current_bin_); current_arm_ = selectArm(current_object_, current_bin_); } else { if (!current_object_.empty()) { ROS_INFO("Current object is not empty! Will mark as impossible"); markAsImpossible(current_object_); current_bin_.clear(); current_object_.clear(); } ROS_INFO("Will pop next mission object!"); current_object_ = getNextInMission(); current_arm_ = selectArm(current_object_, current_bin_); current_bin_ = getBinWithFewerItems(current_arm_); } } else { if (task_ == "stow") // Failed to place an object { setParam("/apc/task_manager/place_failure", true); current_bin_ = getOtherBin(); } } } setSystemTarget(); writeOutputFile(); result_.result = true; action_server_.setSucceeded(result_); }