Ejemplo n.º 1
0
void cartesianMover::cartesian_line_click(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, cartesianMover *cm)
{

    ICartesianControl *icrt = cm->crt;
    int *i = gtk_tree_path_get_indices (path);
    //double currPos[NUMBER_OF_CARTESIAN_COORDINATES];

    Vector x;
    Vector axis;
    if(!icrt->getPose(x,axis))
        fprintf(stderr, "Troubles in getting the cartesian pose for %s", cm->partLabel);


    Matrix R = axis2dcm(axis);
    Vector eu = dcm2euler(R);
    //fprintf(stderr, "Storing euler angles: %s...", eu.toString().c_str());
    //fprintf(stderr, "...corrsponding to axis: %s", axis.toString().c_str());

    for (int k =0; k < NUMBER_OF_CARTESIAN_COORDINATES; k++)
    {
        if(k<3)
            cm->STORED_POS[*i][k] = x(k);
        else
            cm->STORED_POS[*i][k] = eu(k-3)*180/M_PI;
    }

    gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), refresh_cartesian_list_model(cm));
    gtk_widget_draw(GTK_WIDGET(tree_view), NULL);

    return;
}
Ejemplo n.º 2
0
bool cartesianMover::display_cartesian_pose(cartesianMover *cm)
{

    ICartesianControl *icrt = cm->crt;
    GtkEntry **entry = (GtkEntry **) cm->currPosArray;
    GtkWidget **sliderPosArray = (GtkWidget **) cm->sliderArray;

    //fprintf(stderr, "Trying to get the cartesian position...");
    Vector x;
    Vector axis;
    if(!icrt->getPose(x,axis))
        fprintf(stderr, "Troubles in gettin the cartesian pose for %s", cm->partLabel);
    //else
    //fprintf(stderr, "got x=%s, o=%s\n", x.toString().c_str(), o.toString().c_str());
  
    //converting to a Rotation Matrix
    Matrix R = axis2dcm(axis);
    //converting to a Euler angles
    Vector eulerAngles = dcm2euler(R, 1);
    //back to the Roation Matrix
    //Matrix Rr = euler2dcm(eulerAngles);

    //fprintf(stderr, "v: %s\n Res Matrix: %s\n", eulerAngles.toString().c_str(), (Rr-R).toString().c_str());
     
    gboolean focus = false;
    char buffer[40] = {'i', 'n', 'i', 't'};
    for (int k = 0; k < NUMBER_OF_CARTESIAN_COORDINATES; k++)
        {
            if (k<3)
                sprintf(buffer, "%.2f", x(k));  
            if (k>=3 && k<= 5)
                sprintf(buffer, "%.1f", eulerAngles(k-3)*180/M_PI);    
            gtk_entry_set_text((GtkEntry*) entry[k],  buffer);
      
            //if changing orientation do not update all the three sliders
            //if changing position update other sliders
            if(k<3)
                {
                    g_object_get((gpointer) sliderPosArray[k], "has-focus", &focus, NULL);
                    if(!focus)
                        gtk_range_set_value 			((GtkRange *) (sliderPosArray[k]),  x(k));
                }
            else
                {
                    for (int i = 3; i < NUMBER_OF_CARTESIAN_COORDINATES; i++)
                        {
                            gboolean tmp;
                            g_object_get((gpointer) sliderPosArray[i], "has-focus", &tmp, NULL);
                            focus = focus || tmp;
                        }
                    if(!focus)
                        gtk_range_set_value 			((GtkRange *) (sliderPosArray[k]),  eulerAngles(k-3) * 180/M_PI);
                }
      
        }
    return true;
}
Ejemplo n.º 3
0
Vector Solver::computeTargetUserTolerance(const Vector &xd)
{
    Matrix H=commData->get_fpFrame();
    Vector z(3,0.0); z[2]=1.0;
    Vector xdh=xd; xdh.push_back(1.0);
    xdh=SE3inv(H)*xdh;

    Vector xdh3=xdh; xdh3.pop_back();
    Vector rot=cross(xdh3,z);
    double r=norm(rot);
    if (r<IKIN_ALMOST_ZERO)
        return xd;

    rot=rot/r;
    rot.push_back(neckAngleUserTolerance*CTRL_DEG2RAD);
    rot=H*(axis2dcm(rot)*xdh);
    rot.pop_back();

    return rot;
}
Ejemplo n.º 4
0
void vtWThread::run()
{

    optFlowPos.resize(3,0.0);
    pf3dTrackerPos.resize(3,0.0);
    doubleTouchPos.resize(3,0.0);
    fgtTrackerPos.resize(3,0.0);

    bool isTarget = false;
    events.clear();

    // process the optFlow
    if (optFlowBottle = optFlowPort.read(false))
    {
        if (optFlowBottle->size()>=3)
        {
            yDebug("Computing data from the optFlowTracker %g\n",getEstUsed());
            optFlowPos.zero();
            
            optFlowPos[0]=optFlowBottle->get(0).asDouble();
            optFlowPos[1]=optFlowBottle->get(1).asDouble();
            optFlowPos[2]=optFlowBottle->get(2).asDouble();

            AWPolyElement el(optFlowPos,Time::now());
            optFlowVelEstimate=linEst_optFlow->estimate(el);

            events.push_back(IncomingEvent(optFlowPos,optFlowVelEstimate,0.05,"optFlow"));
            isTarget=true;
        }
    }

    // process the pf3dTracker
    if (pf3dTrackerBottle = pf3dTrackerPort.read(false))
    {
        if (pf3dTrackerBottle->size()>6)
        {
            if (pf3dTrackerBottle->get(6).asDouble()==1.0)
            {
                Vector fp(4);
                fp[0]=pf3dTrackerBottle->get(0).asDouble();
                fp[1]=pf3dTrackerBottle->get(1).asDouble();
                fp[2]=pf3dTrackerBottle->get(2).asDouble();
                fp[3]=1.0;

                if (!gsl_isnan(fp[0]) && !gsl_isnan(fp[1]) && !gsl_isnan(fp[2]))
                {
                    yDebug("Computing data from the pf3dTracker %g\n",getEstUsed());
                    Vector x,o;
                    igaze->getLeftEyePose(x,o);
                    
                    Matrix T=axis2dcm(o);
                    T(0,3)=x[0];
                    T(1,3)=x[1];
                    T(2,3)=x[2];

                    pf3dTrackerPos=T*fp;
                    pf3dTrackerPos.pop_back();
                    
                    AWPolyElement el(pf3dTrackerPos,Time::now());
                    pf3dTrackerVelEstimate=linEst_pf3dTracker->estimate(el);
                    
                    events.push_back(IncomingEvent(pf3dTrackerPos,pf3dTrackerVelEstimate,0.05,"pf3dTracker"));
                    isTarget=true;
                }
            }
        }
    }

    if (!rf->check("noDoubleTouch"))
    {
        // processes the fingertipTracker
        if(fgtTrackerBottle = fgtTrackerPort.read(false))
        {
            if (doubleTouchBottle = doubleTouchPort.read(false))
            {           
                if(fgtTrackerBottle != NULL && doubleTouchBottle != NULL)
                {
                    if (doubleTouchBottle->get(3).asString() != "" && fgtTrackerBottle->get(0).asInt() != 0)
                    {
                        yDebug("Computing data from the fingertipTracker %g\n",getEstUsed());
                        doubleTouchStep = doubleTouchBottle->get(0).asInt();
                        fgtTrackerPos[0] = fgtTrackerBottle->get(1).asDouble();
                        fgtTrackerPos[1] = fgtTrackerBottle->get(2).asDouble();
                        fgtTrackerPos[2] = fgtTrackerBottle->get(3).asDouble();
                        AWPolyElement el2(fgtTrackerPos,Time::now());
                        fgtTrackerVelEstimate=linEst_fgtTracker->estimate(el2);

                        if(doubleTouchStep<=1)
                        {
                            Vector ang(3,0.0);
                            igaze -> lookAtAbsAngles(ang);
                        }
                        else if(doubleTouchStep>1 && doubleTouchStep<8)
                        {
                            events.clear();
                            events.push_back(IncomingEvent(fgtTrackerPos,fgtTrackerVelEstimate,-1.0,"fingertipTracker"));
                            isTarget=true;
                        }
                    }
                }
            }
        }

        // processes the doubleTouch !rf->check("noDoubleTouch")
        if(doubleTouchBottle = doubleTouchPort.read(false))
        {
            if(doubleTouchBottle != NULL)
            {
                if (doubleTouchBottle->get(3).asString() != "")
                {
                    Matrix T = eye(4);
                    Vector fingertipPos(4,0.0);
                    doubleTouchPos.resize(4,0.0);
                    
                    currentTask = doubleTouchBottle->get(3).asString();
                    doubleTouchStep = doubleTouchBottle->get(0).asInt();
                    fingertipPos = iCub::skinDynLib::matrixFromBottle(*doubleTouchBottle,20,4,4).subcol(0,3,3); // fixed translation from the palm
                    fingertipPos.push_back(1.0);

                    if(doubleTouchStep<=1)
                    {
                        Vector ang(3,0.0);
                        igaze -> lookAtAbsAngles(ang);
                    }
                    else if(doubleTouchStep>1 && doubleTouchStep<8)
                    {
                        if(currentTask=="LtoR" || currentTask=="LHtoR") //right to left -> the right index finger will be generating events
                        { 
                            iencsR->getEncoders(encsR->data());
                            Vector qR=encsR->subVector(0,6);
                            armR -> setAng(qR*CTRL_DEG2RAD);                        
                            T = armR -> getH(3+6, true);  // torso + up to wrist
                            doubleTouchPos = T * fingertipPos; 
                            //optionally, get the finger encoders and get the fingertip position using iKin Finger based on the current joint values 
                            //http://wiki.icub.org/iCub/main/dox/html/icub_cartesian_interface.html#sec_cart_tipframe
                            doubleTouchPos.pop_back(); //take out the last dummy value from homogenous form
                        }
                        else if(currentTask=="RtoL" || currentTask=="RHtoL") //left to right -> the left index finger will be generating events
                        {   
                            iencsL->getEncoders(encsL->data());
                            Vector qL=encsL->subVector(0,6);
                            armL -> setAng(qL*CTRL_DEG2RAD);                        
                            T = armL -> getH(3+6, true);  // torso + up to wrist
                            doubleTouchPos = T * fingertipPos; 
                            //optionally, get the finger encoders and get the fingertip position using iKin Finger based on the current joint values 
                            //http://wiki.icub.org/iCub/main/dox/html/icub_cartesian_interface.html#sec_cart_tipframe
                            doubleTouchPos.pop_back(); //take out the last dummy value from homogenous form
                        } 
                        else
                        {
                            yError(" [vtWThread] Unknown task received from the double touch thread!");
                        }
                        
                        yDebug("Computing data from the doubleTouch %g\n",getEstUsed());
                        AWPolyElement el2(doubleTouchPos,Time::now());
                        doubleTouchVelEstimate=linEst_doubleTouch->estimate(el2);
                        events.push_back(IncomingEvent(doubleTouchPos,doubleTouchVelEstimate,-1.0,"doubleTouch"));
                        isTarget=true;
                    }
                }
            }
        }
    }
    
    if (pf3dTrackerPos[0]!=0.0 && pf3dTrackerPos[1]!=0.0 && pf3dTrackerPos[2]!=0.0)
        igaze -> lookAtFixationPoint(pf3dTrackerPos);
    else if (doubleTouchPos[0]!=0.0 && doubleTouchPos[1]!=0.0 && doubleTouchPos[2]!=0.0)
        igaze -> lookAtFixationPoint(doubleTouchPos);
    else if (optFlowPos[0]!=0.0 && optFlowPos[1]!=0.0 && optFlowPos[2]!=0.0)
        igaze -> lookAtFixationPoint(optFlowPos);
    
    if (isTarget)
    {        
        Bottle& eventsBottle = eventsPort.prepare();
        eventsBottle.clear();
        for (size_t i = 0; i < events.size(); i++)
        {
            eventsBottle.addList()= events[i].toBottle();
        }
        eventsPort.write();
        timeNow = yarp::os::Time::now();
        sendGuiTarget();
    }
    else if (yarp::os::Time::now() - timeNow > 1.0)
    {
        yDebug("No significant event in the last second. Resetting the velocity estimators..");
        timeNow = yarp::os::Time::now();

        linEst_optFlow     -> reset();
        linEst_pf3dTracker -> reset();
        linEst_doubleTouch -> reset();
        linEst_fgtTracker  -> reset();
        deleteGuiTarget();
    }
}
Ejemplo n.º 5
0
void EyePinvRefGen::run()
{
    if (genOn)
    {
        LockGuard guard(mutex);
        double timeStamp;

        // read encoders
        getFeedback(fbTorso,fbHead,drvTorso,drvHead,commData,&timeStamp);
        updateTorsoBlockedJoints(chainNeck,fbTorso);
        updateTorsoBlockedJoints(chainEyeL,fbTorso);
        updateTorsoBlockedJoints(chainEyeR,fbTorso);

        // get current target
        Vector xd=commData->port_xd->get_xd();

        // update neck chain
        chainNeck->setAng(nJointsTorso+0,fbHead[0]);
        chainNeck->setAng(nJointsTorso+1,fbHead[1]);
        chainNeck->setAng(nJointsTorso+2,fbHead[2]);

        // ask for saccades (if possible)
        if (commData->saccadesOn && (saccadesRxTargets!=commData->port_xd->get_rx()) &&
            !commData->saccadeUnderway && (Time::now()-saccadesClock>commData->saccadesInhibitionPeriod))
        {
            Vector fph=xd; fph.push_back(1.0);
            fph=SE3inv(chainNeck->getH())*fph; fph[3]=0.0;
            double rot=CTRL_RAD2DEG*acos(fph[2]/norm(fph)); fph[3]=1.0;

            // estimate geometrically the target tilt and pan of the eyes
            Vector ang(3,0.0);
            ang[0]=-atan2(fph[1],fabs(fph[2]));
            ang[1]=atan2(fph[0],fph[2]);

            // enforce joints bounds
            ang[0]=sat(ang[0],lim(0,0),lim(0,1));
            ang[1]=sat(ang[1],lim(1,0),lim(1,1));

            // favor the smooth-pursuit in case saccades are small
            if (rot>commData->saccadesActivationAngle)
            {
                // init vergence
                ang[2]=fbHead[5];

                // get rid of eyes tilt
                Vector axis(4);
                axis[0]=1.0; axis[1]=0.0; axis[2]=0.0; axis[3]=-ang[0];
                fph=axis2dcm(axis)*fph;

                // go on iff the point is in front of us
                if (fph[2]>0.0)
                {
                    double L,R;

                    // estimate geometrically the target vergence Vg=L-R                    
                    if (fph[0]>=eyesHalfBaseline)
                    {
                        L=M_PI/2.0-atan2(fph[2],fph[0]+eyesHalfBaseline);
                        R=M_PI/2.0-atan2(fph[2],fph[0]-eyesHalfBaseline);
                    }
                    else if (fph[0]>-eyesHalfBaseline)
                    {
                        L=M_PI/2.0-atan2(fph[2],fph[0]+eyesHalfBaseline);
                        R=-(M_PI/2.0-atan2(fph[2],eyesHalfBaseline-fph[0]));
                    }
                    else
                    {
                        L=-(M_PI/2.0-atan2(fph[2],-fph[0]-eyesHalfBaseline));
                        R=-(M_PI/2.0-atan2(fph[2],eyesHalfBaseline-fph[0]));
                    }

                    ang[2]=L-R;
                }

                // enforce joints bounds
                ang[2]=sat(ang[2],lim(2,0),lim(2,1));

                commData->set_qd(3,ang[0]);
                commData->set_qd(4,ang[1]);
                commData->set_qd(5,ang[2]);

                Vector vel(3,SACCADES_VEL);
                ctrl->doSaccade(ang,vel);
                saccadesClock=Time::now();
            }
        }

        // update eyes chains for convergence purpose
        updateNeckBlockedJoints(chainEyeL,fbHead);         updateNeckBlockedJoints(chainEyeR,fbHead);
        chainEyeL->setAng(nJointsTorso+3,qd[0]);           chainEyeR->setAng(nJointsTorso+3,qd[0]);
        chainEyeL->setAng(nJointsTorso+4,qd[1]+qd[2]/2.0); chainEyeR->setAng(nJointsTorso+4,qd[1]-qd[2]/2.0);

        // converge on target
        if (CartesianHelper::computeFixationPointData(*chainEyeL,*chainEyeR,fp,eyesJ))
        {
            Vector v=EYEPINVREFGEN_GAIN*(pinv(eyesJ)*(xd-fp));

            // update eyes chains in actual configuration for velocity compensation
            chainEyeL->setAng(nJointsTorso+3,fbHead[3]);               chainEyeR->setAng(nJointsTorso+3,fbHead[3]);
            chainEyeL->setAng(nJointsTorso+4,fbHead[4]+fbHead[5]/2.0); chainEyeR->setAng(nJointsTorso+4,fbHead[4]-fbHead[5]/2.0);

            // compensate neck rotation at eyes level
            if ((commData->eyesBoundVer>=0.0) || !CartesianHelper::computeFixationPointData(*chainEyeL,*chainEyeR,fp,eyesJ))
                commData->set_counterv(zeros(qd.length()));
            else
                commData->set_counterv(getEyesCounterVelocity(eyesJ,fp));
            
            // reset eyes controller and integral upon saccades transition on=>off
            if (saccadeUnderWayOld && !commData->saccadeUnderway)
            {
                ctrl->resetCtrlEyes();

                qd[0]=fbHead[3];
                qd[1]=fbHead[4];
                qd[2]=fbHead[5];
                I->reset(qd);
            }

            // update reference
            qd=I->integrate(v+commData->get_counterv());
        }
        else
            commData->set_counterv(zeros(qd.length()));

        // set a new target position
        commData->set_xd(xd);
        commData->set_x(fp,timeStamp);
        commData->set_fpFrame(chainNeck->getH());
        if (!commData->saccadeUnderway)
        {
            commData->set_qd(3,qd[0]);
            commData->set_qd(4,qd[1]);
            commData->set_qd(5,qd[2]);
        }

        // latch the saccades status
        saccadeUnderWayOld=commData->saccadeUnderway;
        saccadesRxTargets=commData->port_xd->get_rx();
    }
}
Ejemplo n.º 6
0
Vector Localizer::get3DPoint(const string &type, const Vector &ang)
{
    double azi=ang[0];
    double ele=ang[1];
    double ver=ang[2];

    Vector q(8,0.0);
    if (type=="rel")
    {
        Vector torso=commData->get_torso();
        Vector head=commData->get_q();

        q[0]=torso[0];
        q[1]=torso[1];
        q[2]=torso[2];
        q[3]=head[0];
        q[4]=head[1];
        q[5]=head[2];
        q[6]=head[3];
        q[7]=head[4];

        ver+=head[5];
    }
    
    // impose vergence != 0.0
    if (ver<commData->get_minAllowedVergence())
        ver=commData->get_minAllowedVergence();

    mutex.lock();

    q[7]+=ver/2.0;
    eyeL->setAng(q);

    q[7]-=ver;
    eyeR->setAng(q);

    Vector fp(4);
    fp[3]=1.0;  // impose homogeneous coordinates

    // compute new fp due to changed vergence
    CartesianHelper::computeFixationPointData(*(eyeL->asChain()),*(eyeR->asChain()),fp);

    mutex.unlock();

    // compute rotational matrix to
    // account for elevation and azimuth
    Vector x(4), y(4);
    x[0]=1.0;    y[0]=0.0;
    x[1]=0.0;    y[1]=1.0;
    x[2]=0.0;    y[2]=0.0;
    x[3]=ele;    y[3]=azi;   
    Matrix R=axis2dcm(y)*axis2dcm(x);

    Vector fph, xd;
    if (type=="rel")
    {
        Matrix frame=commData->get_fpFrame();
        fph=SE3inv(frame)*fp;       // get fp wrt relative head-centered frame
        xd=frame*(R*fph);           // apply rotation and retrieve fp wrt root frame
    }
    else
    {
        fph=invEyeCAbsFrame*fp;     // get fp wrt absolute head-centered frame
        xd=eyeCAbsFrame*(R*fph);    // apply rotation and retrieve fp wrt root frame
    }

    xd.pop_back();
    return xd;
}
Ejemplo n.º 7
0
cartesianMover::cartesianMover(GtkWidget *vbox_d, PolyDriver *partDd_d, char *partName, ResourceFinder *fnd)
{

    finder = fnd;

    if (!finder->isNull())
        fprintf(stderr, "Setting a valid finder \n");

    partLabel = partName;
    partDd = partDd_d;
    vbox = vbox_d;
    interfaceError = false;

    if (!partDd->isValid()) {
        fprintf(stderr, "Device given to the cartesian interface is not available.\n");
        interfaceError = true;
    }

    fprintf(stderr, "Opening crt interface...");
    bool ok;
    ok  = partDd->view(crt);
    if ((!ok) || (crt==0))
        fprintf(stderr, "...crt was not ok...ok=%d", ok);

    if (!partDd->isValid()) {
        fprintf(stderr, "Cartesian device driver was not valid! \n");
        dialog_severe_error(GTK_MESSAGE_ERROR,(char *) "Cartesian device not available.", (char *) "Check available devices", true);
        interfaceError = true;
    }
    else if (!ok) {
        fprintf(stderr, "Error while acquiring cartesian interfaces \n");
        dialog_severe_error(GTK_MESSAGE_ERROR,(char *) "Problems acquiring cartesian interface", (char *) "Check if cartesian interface is running", true);
        interfaceError = true;
    }

    if (interfaceError == false)
        {
            fprintf(stderr, "Allocating memory \n");

            int j,k;
            index  = new int [MAX_NUMBER_OF_JOINTS];
            entry_id = new guint [0];
            *entry_id = -1;

            frame_slider1 = new GtkWidget* [MAX_NUMBER_OF_JOINTS];
            sliderArray    = new GtkWidget* [NUMBER_OF_CARTESIAN_COORDINATES];
            currPosArray = new GtkWidget* [NUMBER_OF_CARTESIAN_COORDINATES];

            //fprintf(stderr, "sliderArray has address 0x%x\n", (unsigned int) sliderArray);

            GtkWidget *top_hbox 		 = NULL;
            GtkWidget *bottom_hbox		 = NULL;
            GtkWidget *panel_hbox		 = NULL;

            GtkWidget *inv1 			 = NULL;
            GtkWidget *invArray[NUMBER_OF_CARTESIAN_COORDINATES];

            GtkWidget *homeArray[NUMBER_OF_CARTESIAN_COORDINATES];
            GtkWidget *framesArray[NUMBER_OF_CARTESIAN_COORDINATES];

            GtkWidget *sw				 = NULL;

            //creation of the top_hbox
            top_hbox = gtk_hbox_new (FALSE, 0);
            gtk_container_set_border_width (GTK_CONTAINER (top_hbox), 10);
            gtk_container_add (GTK_CONTAINER (vbox), top_hbox);
		
            inv1 = gtk_fixed_new ();
            gtk_container_add (GTK_CONTAINER (top_hbox), inv1);
		
            Vector o;
            Vector x;
		
            while (!crt->getPose(x,o))
                Time::delay(0.001);
      
            Matrix R = axis2dcm(o);
            Vector eu = dcm2euler(R);
            //x(0) = 1;    x(1) = 1;   x(2) = 1;
            //o(0) = 1;    o(1) = 0;   o(2) = 0;   o(3) = 0;

            char buffer[40] = {'i', 'n', 'i', 't'};
		
            int numberOfRows = 3;
		
            int height, width;
            height = 100;
            width = 180;
            double min,max;

            std::string limitString=partLabel;
            limitString=limitString+"_workspace";
            Bottle bCartesianLimits;
            if (finder->check(limitString.c_str()))
                {
                    //fprintf(stderr, "There seem limits for %s", partLabel);
                    bCartesianLimits = finder->findGroup(limitString.c_str());
                    //fprintf(stderr, "...got: %s", bCartesianLimits.toString().c_str());
                }


            fprintf(stderr, "Starting embedding cartesian GUI widgets \n");
            for (k = 0; k<NUMBER_OF_CARTESIAN_COORDINATES; k++)
                {
                    //fprintf(stderr, "Adding invArray \n");
                    invArray[k] = gtk_fixed_new ();

                    index[k]=k;
                    j = k/numberOfRows;
	  
                    if (k==0)
                        {
                            sprintf(buffer, "x");
                            if (bCartesianLimits.check("xmin") && bCartesianLimits.check("xmax"))
                                {
                                    min = bCartesianLimits.find("xmin").asDouble();
                                    max = bCartesianLimits.find("xmax").asDouble();
                                }
                            else
                                {
                                    min = x(0) - 0.1 * fabs(x(0));
                                    max = x(0) + 0.1 * fabs(x(0));
                                }
                        }
                    if (k==1)
                        {
                            sprintf(buffer, "y");
                            if (bCartesianLimits.check("ymin") && bCartesianLimits.check("ymax"))
                                {
                                    min = bCartesianLimits.find("ymin").asDouble();
                                    max = bCartesianLimits.find("ymax").asDouble();
                                }
                            else
                                {
                                    min = x(1) - 0.1 * fabs(x(1));
                                    max = x(1) + 0.1 * fabs(x(1));
                                }
                        }
                    if (k==2)
                        {
                            sprintf(buffer, "z");
                            if (bCartesianLimits.check("zmin") && bCartesianLimits.check("zmax"))
                                {
                                    min = bCartesianLimits.find("zmin").asDouble();
                                    max = bCartesianLimits.find("zmax").asDouble();
                                }
                            else
                                {
                                    min = x(2) - 0.1 * fabs(x(2));
                                    max = x(2) + 0.1 * fabs(x(2));
                                }
                        }
                    if (k==3)
                        {
                            sprintf(buffer, "euler-alpha");
                            min = -180;
                            max = 180;
                        }
                    if (k==4)
                        {
                            sprintf(buffer, "euler-beta");
                            min = -180;
                            max = 180;
                        }
                    if (k==5)
                        {
                            sprintf(buffer, "euler-gamma");
                            min = -180;
                            max = 180;
                        }

                    frame_slider1[k] = gtk_frame_new ("Value:");
                    //fprintf(stderr, "Initializing sliders %d \n",k);
                    if (min<max)
                        {
                            sliderArray[k]	  =  gtk_hscale_new_with_range(min, max, 1);
                            if (k<3)
                                gtk_scale_set_digits((GtkScale*) sliderArray[k],2);
                            else
                                gtk_scale_set_digits((GtkScale*) sliderArray[k],1);
                        }
                    else
                        {
                            sliderArray[k]    =  gtk_hscale_new_with_range(1, 2, 1);
                            if (k<3)
                                gtk_scale_set_digits((GtkScale*) sliderArray[k],2);
                            else
                                gtk_scale_set_digits((GtkScale*) sliderArray[k],1);
                        }
                    currPosArray[k]   =  gtk_entry_new();

                    //fprintf(stderr, "Initializing the buttons %d \n", k);
                    homeArray[k]		= gtk_button_new_with_mnemonic ("Home");
                    //fprintf(stderr, "Initializing frames %d \n", k);
                    framesArray[k]	= gtk_frame_new (buffer);
		
                    gtk_fixed_put (GTK_FIXED(inv1), invArray[k], 0+(k%numberOfRows)*width, 0+ j*height);	
                    //Positions
                    //fprintf(stderr, "Positioning buttons %d \n", k);
                    gtk_fixed_put	(GTK_FIXED(invArray[k]), frame_slider1[k],  60, 10    );
                    gtk_fixed_put	(GTK_FIXED(invArray[k]), sliderArray[k],    65, 20    );
                    gtk_fixed_put	(GTK_FIXED(invArray[k]), currPosArray[k],   95, 70);
	  
                    int buttonDist= 24;
                    int buttonOffset = 13;
                    gtk_fixed_put	(GTK_FIXED(invArray[k]), homeArray[k],      6, buttonOffset);
                    gtk_fixed_put	(GTK_FIXED(invArray[k]), framesArray[k],    0,  0);
		
                    //Dimensions
                    //fprintf(stderr, "Dimensioning buttons %d \n", k);
                    gtk_widget_set_size_request 	(frame_slider1[k], 110, 50);
                    gtk_widget_set_size_request 	(sliderArray[k], 90, 40);
                    gtk_widget_set_size_request 	(currPosArray[k], 70, 20);
                    gtk_widget_set_size_request 	(homeArray[k], 50, 25);
                    gtk_widget_set_size_request 	(framesArray[k], width, height);
			
                    /*
                     * Positions commands
                     */
                    //fprintf(stderr, "Assinging callback %d \n", k);
                    gtk_range_set_update_policy 	((GtkRange *) (sliderArray[k]), GTK_UPDATE_DISCONTINUOUS);
                    if (k<3)
                        gtk_range_set_value 			((GtkRange *) (sliderArray[k]),  x(k));
                    if (k>=3 && k <= 5)
                        gtk_range_set_value 			((GtkRange *) (sliderArray[k]),  eu(k-3) * 180/M_PI);
	  
                    g_signal_connect (sliderArray[k], "value-changed", G_CALLBACK(position_slider_changed), this);


                }
      
            /*
             * Display current position
             */      
            *entry_id = gtk_timeout_add(UPDATE_TIME, (GtkFunction) display_cartesian_pose, this);
            for (k = 0; k<NUMBER_OF_CARTESIAN_COORDINATES; k++)
                gtk_editable_set_editable ((GtkEditable*) currPosArray[k], FALSE);

            /*
             * Common commands
             */      
            GtkWidget *frame3;
            frame3 = gtk_frame_new ("Commands:");
            gtk_fixed_put	(GTK_FIXED(inv1), frame3,       (NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         (NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_widget_set_size_request 	(frame3, 180, 240);

            //Button 0 in the panel

            GtkWidget *button0 = gtk_button_new_with_mnemonic ("Open sequence tab");
            gtk_fixed_put (GTK_FIXED (inv1), button0, 10+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         20+(NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_widget_set_size_request     (button0, 150, 25);
	    fprintf(stderr, "Initializing the table \n");
	    init_cartesian_table();
	    fprintf(stderr, "Connecting the callbacks for the table \n");
            g_signal_connect (button0, "clicked", G_CALLBACK (cartesian_table_open), this);
		      
            //Button1 in the panel
            GtkWidget *button1 = gtk_button_new_with_mnemonic ("Stop");
            gtk_fixed_put (GTK_FIXED (inv1), button1, 10+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         45+(NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_widget_set_size_request 	(button1, 150, 25);
            //g_signal_connect (button1, "clicked", G_CALLBACK (stop_motion), crt);

            //Velocity
            GtkWidget *frame7;
            frame7 = gtk_frame_new ("Time[sec]:");
            gtk_fixed_put	(GTK_FIXED(inv1), frame7,       5+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,          70 + (NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_widget_set_size_request 	(frame7, 160, 50);
            sliderVelocity = new GtkWidget;
            sliderVelocity =  gtk_hscale_new_with_range(1, 10, 1);
            gtk_scale_set_digits((GtkScale*) sliderVelocity,2);
            gtk_fixed_put	(GTK_FIXED(inv1), sliderVelocity,    60+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,          80 + (NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_widget_set_size_request 	(sliderVelocity, 90, 40);
            gtk_range_set_update_policy 	((GtkRange *) (sliderVelocity), GTK_UPDATE_DISCONTINUOUS);
            gtk_range_set_value 			((GtkRange *) (sliderVelocity),  2);


            //Diplay axis
            po = new GtkWidget*[4];
            for (int i=0; i < 4; i++)
                {
                    po[i] = gtk_entry_new();
                }
      
            //Display axis
            GtkWidget *frame5;
            frame5 = gtk_frame_new ("Axis:");
            gtk_fixed_put	(GTK_FIXED(inv1), frame5,       5+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         140 + (NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_widget_set_size_request 	(frame5, 80, 85);
            gtk_fixed_put	(GTK_FIXED(inv1), po[0],   10+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         155+(NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_fixed_put	(GTK_FIXED(inv1), po[1],   10+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         175+(NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_fixed_put	(GTK_FIXED(inv1), po[2],   10+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         195+(NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);

            //Display angle
            GtkWidget *frame6;
            frame6 = gtk_frame_new ("Angle:");
            gtk_fixed_put	(GTK_FIXED(inv1), frame6,       85+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         155 + (NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_widget_set_size_request 	(frame6, 80, 45);
            gtk_fixed_put	(GTK_FIXED(inv1), po[3],   90+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         175+(NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);

            for (int i=0; i < 4; i++)
                {
                    gtk_widget_set_size_request 	(po[i], 70, 20);
                    gtk_editable_set_editable ((GtkEditable*) po[i], FALSE);
                }

            *entry_id = gtk_timeout_add(UPDATE_TIME, (GtkFunction) display_axis_pose, this);

            //CheckButton in the panel
            GtkWidget *check= gtk_check_button_new_with_mnemonic ("Tracking Mode");
            gtk_fixed_put (GTK_FIXED (inv1), check, 10+(NUMBER_OF_CARTESIAN_COORDINATES%numberOfRows)*width,         120+(NUMBER_OF_CARTESIAN_COORDINATES/numberOfRows)*height);
            gtk_widget_set_size_request 	(check, 150, 25);
            //g_signal_connect (check, "clicked", G_CALLBACK (toggle_tracking_mode), crt);
      
        }
}