//********************************************
    bool close()
    {
        yInfo("[demoAvoidance] Closing module..");

        dataPort.close();

        if (useLeftArm)
        {
            if (driverCartL.isValid())
            {
                data["left"].iarm->stopControl();
                data["left"].iarm->restoreContext(contextL);
                driverCartL.close();
            }

            if (driverJointL.isValid())
            {
                IInteractionMode *imode;
                driverJointL.view(imode);
                for (int j=0; j<5; j++)
                    imode->setInteractionMode(j,VOCAB_IM_STIFF);

                driverJointL.close();
            }
        }

        if (useRightArm)
        {
            if (driverCartR.isValid())
            {
                data["right"].iarm->stopControl();
                data["right"].iarm->restoreContext(contextR);
                driverCartR.close();
            }

            if (driverJointR.isValid())
            {
                IInteractionMode *imode;
                driverJointR.view(imode);
                for (int j=0; j<5; j++)
                    imode->setInteractionMode(j,VOCAB_IM_STIFF);

                driverJointR.close();
            }
        }

        return true;
    }
    //********************************************
    bool close()
    {
        dataPort.close();

        if (driverCartL.isValid())
        {
            data["left"].iarm->stopControl();
            data["left"].iarm->restoreContext(contextL);
            driverCartL.close(); 
        }

        if (driverCartR.isValid())
        {
            data["right"].iarm->stopControl();
            data["right"].iarm->restoreContext(contextR);
            driverCartR.close();
        }

        if (driverJointL.isValid())
        {
            IInteractionMode *imode;
            driverJointL.view(imode);
            for (int j=0; j<5; j++)
                imode->setInteractionMode(j,VOCAB_IM_STIFF);

            driverJointL.close();
        }

        if (driverJointR.isValid())
        {
            IInteractionMode *imode;
            driverJointR.view(imode);
            for (int j=0; j<5; j++)
                imode->setInteractionMode(j,VOCAB_IM_STIFF);

            driverJointR.close();
        }

        return true;
    }
示例#3
0
    bool close()
    {
        // Terminate model
        Controller_terminate(Controller_M);

        imod->setControlMode(joint,VOCAB_CM_POSITION);
        if (compliant)
            iint->setInteractionMode(joint,VOCAB_IM_STIFF);
        
        rpc.close();
        dataOut.close();
        dataIn.close();        
        drv.close();

        return true;
    }
    //********************************************
    bool configure(ResourceFinder &rf)
    {
        if (rf.check("noLeftArm") && rf.check("noRightArm"))
        {
            yError("[demoAvoidance] no arm has been selected. Closing.");
            return false;
        }

        useLeftArm  = false;
        useRightArm = false;

        string  name=rf.check("name",Value("avoidance")).asString().c_str();
        string robot=rf.check("robot",Value("icub")).asString().c_str();
        motionGain = -1.0;
        if (rf.check("catching"))
        {
            motionGain = 1.0;
        }
        if (motionGain!=-1.0)
        {
            yWarning("[demoAvoidance] motionGain set to catching");
        }

        bool autoConnect=rf.check("autoConnect");
        if (autoConnect)
        {
            yWarning("[demoAvoidance] Autoconnect mode set to ON");
        }

        bool stiff=rf.check("stiff");
        if (stiff)
        {
            yInfo("[demoAvoidance] Stiff Mode enabled.");
        }

        Matrix R(4,4);
        R(0,0)=-1.0; R(2,1)=-1.0; R(1,2)=-1.0; R(3,3)=1.0;

        if (!rf.check("noLeftArm"))
        {
            useLeftArm=true;

            data["left"]=Data();
            data["left"].home_x[0]=-0.30;
            data["left"].home_x[1]=-0.20;
            data["left"].home_x[2]=+0.05;
            data["left"].home_o=dcm2axis(R);

            Property optionCartL;
            optionCartL.put("device","cartesiancontrollerclient");
            optionCartL.put("remote","/"+robot+"/cartesianController/left_arm");
            optionCartL.put("local",("/"+name+"/cart/left_arm").c_str());
            if (!driverCartL.open(optionCartL))
            {
                close();
                return false;
            }

            Property optionJointL;
            optionJointL.put("device","remote_controlboard");
            optionJointL.put("remote","/"+robot+"/left_arm");
            optionJointL.put("local",("/"+name+"/joint/left_arm").c_str());
            if (!driverJointL.open(optionJointL))
            {
                close();
                return false;
            }

            driverCartL.view(data["left"].iarm);
            data["left"].iarm->storeContext(&contextL);

            Vector dof;
            data["left"].iarm->getDOF(dof);
            dof=0.0; dof[3]=dof[4]=dof[5]=dof[6]=1.0;
            data["left"].iarm->setDOF(dof,dof);
            data["left"].iarm->setTrajTime(0.9);

            data["left"].iarm->goToPoseSync(data["left"].home_x,data["left"].home_o);
            data["left"].iarm->waitMotionDone();

            IInteractionMode  *imode; driverJointL.view(imode);
            IImpedanceControl *iimp;  driverJointL.view(iimp);

            if (!stiff)
            {
                imode->setInteractionMode(0,VOCAB_IM_COMPLIANT); iimp->setImpedance(0,0.4,0.03);
                imode->setInteractionMode(1,VOCAB_IM_COMPLIANT); iimp->setImpedance(1,0.4,0.03);
                imode->setInteractionMode(2,VOCAB_IM_COMPLIANT); iimp->setImpedance(2,0.4,0.03);
                imode->setInteractionMode(3,VOCAB_IM_COMPLIANT); iimp->setImpedance(3,0.2,0.01);
                imode->setInteractionMode(4,VOCAB_IM_COMPLIANT); iimp->setImpedance(4,0.2,0.0);
            }
        }

        if (!rf.check("noRightArm"))
        {
            useRightArm = true;

            data["right"]=Data();
            data["right"].home_x[0]=-0.30;
            data["right"].home_x[1]=+0.20;
            data["right"].home_x[2]=+0.05;
            data["right"].home_o=dcm2axis(R);

            Property optionCartR;
            optionCartR.put("device","cartesiancontrollerclient");
            optionCartR.put("remote","/"+robot+"/cartesianController/right_arm");
            optionCartR.put("local",("/"+name+"/cart/right_arm").c_str());
            if (!driverCartR.open(optionCartR))
            {
                close();
                return false;
            }

            Property optionJointR;
            optionJointR.put("device","remote_controlboard");
            optionJointR.put("remote","/"+robot+"/right_arm");
            optionJointR.put("local",("/"+name+"/joint/right_arm").c_str());
            if (!driverJointR.open(optionJointR))
            {
                close();
                return false;
            }

            driverCartR.view(data["right"].iarm);
            data["right"].iarm->storeContext(&contextR);

            Vector dof;
            data["right"].iarm->getDOF(dof);
            dof=0.0; dof[3]=dof[4]=dof[5]=dof[6]=1.0;
            data["right"].iarm->setDOF(dof,dof);
            data["right"].iarm->setTrajTime(0.9);

            data["right"].iarm->goToPoseSync(data["right"].home_x,data["right"].home_o);
            data["right"].iarm->waitMotionDone();


            IInteractionMode  *imode; driverJointR.view(imode);
            IImpedanceControl *iimp;  driverJointR.view(iimp);

            if (!stiff)
            {
                imode->setInteractionMode(0,VOCAB_IM_COMPLIANT); iimp->setImpedance(0,0.4,0.03);
                imode->setInteractionMode(1,VOCAB_IM_COMPLIANT); iimp->setImpedance(1,0.4,0.03);
                imode->setInteractionMode(2,VOCAB_IM_COMPLIANT); iimp->setImpedance(2,0.4,0.03);
                imode->setInteractionMode(3,VOCAB_IM_COMPLIANT); iimp->setImpedance(3,0.2,0.01);
                imode->setInteractionMode(4,VOCAB_IM_COMPLIANT); iimp->setImpedance(4,0.2,0.0);
            }
        }

        dataPort.open(("/"+name+"/data:i").c_str());
        dataPort.setReader(*this);

        if (autoConnect)
        {
            Network::connect("/visuoTactileRF/skin_events:o",("/"+name+"/data:i").c_str());
        }

        rpcSrvr.open(("/"+name+"/rpc:i").c_str());
        attach(rpcSrvr);
        return true;
    }
示例#5
0
    bool configure(ResourceFinder &rf)
    {
        Time::turboBoost();
        string name=rf.check("name",Value("yarpMinJerk")).asString().c_str();
        string robot=rf.check("robot",Value("icubSim")).asString().c_str();
        string part=rf.check("part",Value("left_arm")).asString().c_str();
        joint=rf.check("joint",Value(3)).asInt();
        compliant=rf.check("compliant");

        Property option;
        option.put("device","remote_controlboard");
        option.put("remote",("/"+robot+"/"+part).c_str());
        option.put("local",("/"+name+"/"+part).c_str());
        if (!drv.open(option))
            return false;

        drv.view(imod);
        drv.view(iint);
        drv.view(ienc);
        drv.view(ivel);

        imod->setControlMode(joint,VOCAB_CM_VELOCITY);
        if (compliant)
            iint->setInteractionMode(joint,VOCAB_IM_COMPLIANT);

        IControlLimits *ilim; drv.view(ilim);
        double min_joint,max_joint;
        ilim->getLimits(joint,&min_joint,&max_joint);

        double enc;
        while (!ienc->getEncoder(joint,&enc))
            Time::delay(0.1);
        
        Controller_P.Plant_IC=enc;
        Controller_P.Plant_Max=max_joint;
        Controller_P.Plant_Min=min_joint;
        Controller_P.AutoCompensator_ThresHystMax=0.5;
        Controller_P.AutoCompensator_ThresHystMin=0.1;

        yInfo("enc=%g in [%g, %g] deg",enc,min_joint,max_joint);

        // Pack model data into RTM
        Controller_M->ModelData.defaultParam = &Controller_P;
        Controller_M->ModelData.blockIO = &Controller_B;
        Controller_M->ModelData.dwork = &Controller_DW;

        // Initialize model
        Controller_initialize(Controller_M, &Controller_U_reference,
                            &Controller_U_compensator_state,
                            &Controller_U_plant_output,
                            &Controller_Y_controller_output,
                            &Controller_Y_controller_reference,
                            &Controller_Y_plant_reference,
                            &Controller_Y_error_statistics,
                            &Controller_Y_enable_compensation);

        Controller_U_reference=enc;
        Controller_U_compensator_state=CompensatorState::Off;
        Controller_U_plant_output=enc;        
        
        dataIn.open(("/"+name+"/data:i").c_str());
        dataOut.open(("/"+name+"/data:o").c_str());
        rpc.open(("/"+name+"/rpc").c_str());
        attach(rpc);
        
        return true;
    }