Пример #1
0
void workerPoolUninit() {
	assert(M != NULL);

	int i;
	for (i=0; i < M->threadNum; i++) {
		threadRelease(M->threads[i]);
	}
	zfree(M->threads);
	contextQueueRelease(M->queue);
	pthread_mutex_destroy(&M->lock);
	pthread_cond_destroy(&M->cond);
	zfree(M);
}
bool cartControlReachAvoidThread::threadInit()
{
       
        ts.update();
    
        inportTargetCoordinates.open(("/"+name+"/reachingTarget:i").c_str());
        inportAvoidanceVectors.open(("/"+name+"/avoidanceVectors:i").c_str());
        inportReachingGain.open(("/"+name+"/reachingGain:i").c_str());
        inportAvoidanceGain.open(("/"+name+"/avoidanceGain:i").c_str());
    
        //getting values from config file
        // general part
        Bottle &bGeneral=rf.findGroup("general");
        useLeftArm=bGeneral.check("left_arm",Value("on"),"Getting left arm use flag").asString()=="on"?true:false;
        useRightArm=bGeneral.check("right_arm",Value("on"),"Getting right arm use flag").asString()=="on"?true:false;
        trajTime=bGeneral.check("traj_time",Value(3.0),"Getting trajectory time").asDouble();
        reachTol=bGeneral.check("reach_tol",Value(0.05),"Getting reaching tolerance").asDouble();
        reachTmo=bGeneral.check("reach_tmo",Value(10.0),"Getting reach timeout").asDouble();
              
        // torso part
        torsoSwitch.resize(3,0);
        torsoLimits.resize(4,3); torsoLimits.zero();
        torsoHomePoss.resize(3,0.0);
        torsoHomeVels.resize(3,10.0);
        
        Bottle &bTorso=rf.findGroup("torso");
        if(!bTorso.isNull()){ 
            yInfo("Setting torso options from config file:");
            bTorso.setMonitor(rf.getMonitor());
            getTorsoOptions(bTorso,"pitch",0,torsoSwitch,torsoLimits);
            getTorsoOptions(bTorso,"roll",1,torsoSwitch,torsoLimits);
            getTorsoOptions(bTorso,"yaw",2,torsoSwitch,torsoLimits);  
            getTorsoHomeOptions(bTorso,torsoHomePoss,torsoHomeVels);
        }
        else{
           yInfo("Setting default torso options ([torso] in .ini file not found)");
           torsoSwitch(0)=0; torsoSwitch(1)=0; torsoSwitch(2)=0;  //all off
           //torsoSwitch(0)=1; torsoSwitch(1)=0; torsoSwitch(2)=1;  //pitch on, roll off, yaw on
           //torsoLimits(0,2)=1.0; 
           //torsoLimits(1,0)=10.0; //pitch max limit
           //torsoHomePoss and torsoHomeVels was already intialized fine during definition
        }
        yInfo("torsoSwitch: %s",torsoSwitch.toString().c_str());
        yInfo("torsoLimits: %s",torsoLimits.toString().c_str());
        yInfo("torsoHomePoss: %s",torsoHomePoss.toString().c_str());
        yInfo("torsoHomeVels: %s",torsoHomeVels.toString().c_str());
   
            
        // arm home part
        armHomePoss.resize(7,0.0); armHomeVels.resize(7,0.0);
        Bottle &bHome=rf.findGroup("home_arm");
        if(!bHome.isNull()){  
            bHome.setMonitor(rf.getMonitor());
            getArmHomeOptions(bHome,armHomePoss,armHomeVels);
            yInfo("Setting arm home from config file:");           
        }
        else{
            yInfo("Setting default arm home values (home_arm in .ini file not found)");
            armHomePoss[0]=-30.0; armHomePoss[1]=30.0; armHomePoss[2]=0.0; armHomePoss[3]=45.0; armHomePoss[4]=0.0; armHomePoss[5]=0.0; armHomePoss[6]=0.0;
            armHomeVels[0]=10.0; armHomeVels[1]=10.0; armHomeVels[2]=10.0; armHomeVels[3]=10.0; armHomeVels[4]=10.0; armHomeVels[5]=10.0; armHomeVels[6]=10.0;
        }
        yInfo("armHomePoss: %s",armHomePoss.toString().c_str());
        yInfo("armHomeVels: %s",armHomeVels.toString().c_str());
      
        newTargetFromPort = false;
        newTargetFromRPC = false;
        
        targetPosFromPort.resize(3,0.0);
        targetPosFromRPC.resize(3,0.0);
        targetPos.resize(3,0.0);
       
        //TODO add to config file
        reachableSpace.minX=-0.4; reachableSpace.maxX=-0.2;
        reachableSpace.minY=-0.3; reachableSpace.maxY=0.3;
        reachableSpace.minZ=-0.1; reachableSpace.maxZ=0.1;
        
        string fwslash="/";

        // open remote_controlboard drivers
        Property optTorso("(device remote_controlboard)");
        Property optLeftArm("(device remote_controlboard)");
        Property optRightArm("(device remote_controlboard)");

        optTorso.put("remote",(fwslash+robot+"/torso").c_str());
        optTorso.put("local",(fwslash+name+"/torso").c_str());

        optLeftArm.put("remote",(fwslash+robot+"/left_arm").c_str());
        optLeftArm.put("local",(fwslash+name+"/left_arm").c_str());

        optRightArm.put("remote",(fwslash+robot+"/right_arm").c_str());
        optRightArm.put("local",(fwslash+name+"/right_arm").c_str());

        drvTorso=new PolyDriver;
        if (!drvTorso->open(optTorso))
        {
            threadRelease();
            return false;
        }

        if (useLeftArm)
        {
            drvLeftArm=new PolyDriver;
            if (!drvLeftArm->open(optLeftArm))
            {
                threadRelease();
                return false;
            }
        }

        if (useRightArm)
        {
            drvRightArm=new PolyDriver;
            if (!drvRightArm->open(optRightArm))
            {
                threadRelease();
                return false;
            }
        }

        // open cartesiancontrollerclient drivers
        Property optCartLeftArm("(device cartesiancontrollerclient)");
        Property optCartRightArm("(device cartesiancontrollerclient)");
       
        optCartLeftArm.put("remote",(fwslash+robot+"/cartesianController/left_arm").c_str());
        optCartLeftArm.put("local",(fwslash+name+"/left_arm/cartesian").c_str());
    
        optCartRightArm.put("remote",(fwslash+robot+"/cartesianController/right_arm").c_str());
        optCartRightArm.put("local",(fwslash+name+"/right_arm/cartesian").c_str());

      
        if (useLeftArm)
        {
            drvCartLeftArm=new PolyDriver;
            if (!drvCartLeftArm->open(optCartLeftArm))
            {
                threadRelease();
                return false;
            }
           
        }

        if (useRightArm)
        {
            drvCartRightArm=new PolyDriver;
            if (!drvCartRightArm->open(optCartRightArm))
            {
                threadRelease();
                return false;
            }

            
        }

        // open views
      
        drvTorso->view(encTorso);
        drvTorso->view(posTorso);
        drvTorso->view(velTorso);
        drvTorso->view(modTorso);
        
        if (useLeftArm)
        {
            drvLeftArm->view(encArm);
            drvLeftArm->view(posArm);
            drvLeftArm->view(velArm);
            drvLeftArm->view(modArm);
            drvCartLeftArm->view(cartArm);
            armSel=LEFTARM;
        }
        else if (useRightArm)
        {
            drvRightArm->view(encArm);
            drvRightArm->view(posArm);
            drvRightArm->view(velArm);
            drvRightArm->view(modArm);
            drvCartRightArm->view(cartArm);
            armSel=RIGHTARM;
        }
        else
        {
            encArm=NULL;
            posArm=NULL;
            velArm=NULL;
            cartArm=NULL;
            armSel=NOARM;
        }

        encArm->getAxes(&armAxes);
        arm.resize(armAxes,0.0);
        encTorso->getAxes(&torsoAxes);
        torso.resize(torsoAxes,0.0);

         
        /* set reference speeds for position controllers (used for homing) */ 
        posTorso->setRefSpeeds(torsoHomeVels.data());
        IPositionControl *posArm_;
        drvLeftArm->view(posArm_);
        posArm_->setRefSpeeds(armHomeVels.data());
        drvRightArm->view(posArm_);
        posArm_->setRefSpeeds(armHomeVels.data());
             
        
        /* we need to set reference accelerations for the velocityMove to be used later */
        /* profile, 50 degrees/sec^2 */
        int k;
        Vector tmp_acc_arm;
        tmp_acc_arm.resize(armAxes,0.0);
        for (k = 0; k < armAxes; k++) {
            tmp_acc_arm[k] = REF_ACC;
        }
        IVelocityControl2 *velArm_;
        drvLeftArm->view(velArm_);
        velArm_->setRefAccelerations(tmp_acc_arm.data());
        drvRightArm->view(velArm_);
        velArm_->setRefAccelerations(tmp_acc_arm.data());
         
        for(int j=0;j<7;j++){
            armIdx.push_back(j); 
        }
                
        int l;
        Vector tmp_acc_torso;
        tmp_acc_torso.resize(torsoAxes,0.0);
        for (l = 0; l < torsoAxes; l++) {
            tmp_acc_torso[l] = REF_ACC;
        }
        velTorso->setRefAccelerations(tmp_acc_torso.data());
        
        targetPos.resize(3,0.0);
        R=Rx=Ry=Rz=eye(3,3);

        initCartesianCtrl(torsoSwitch,torsoLimits,LEFTARM);
        initCartesianCtrl(torsoSwitch,torsoLimits,RIGHTARM);
        cartArm->getDOF(cartDOFconfig);
        cartNrDOF = cartDOFconfig.length();
        yInfo("cartArm DOFs [%s]\n",cartDOFconfig.toString().c_str());  // [0 0 0 1 1 1 1 1 1 1] will be printed out if torso is off 
        
        // steer the robot to the initial configuration
        setControlModeArmsAndTorso(VOCAB_CM_POSITION);
        steerTorsoToHome();
        steerArmToHome(LEFTARM);
        steerArmToHome(RIGHTARM);
     
        wentHome=false;
        state=STATE_IDLE;

        minJerkVelCtrl = new  minJerkVelCtrlForIdealPlant(threadPeriod,cartNrDOF); //3 torso + 7 arm
        
        //TODO can be  moved to config file, but will be eventually obtained from allostatic control
        reachingGain = 1.0; 
        avoidanceGain = 0.0; 
        
        return true;
      
  
}
Пример #3
0
void eventloopUninit() {
	threadRelease(M->thread);
	aeDeleteEventLoop(M->eventloop);
	zfree(M);
}