예제 #1
0
// Call simulation gomne
void MainWindow::on_ButtonGOMNE_clicked()
{
    if (first_simu == false){
        QMessageBox::warning(this,"Abort process",
        "To run the alogrithm at a given time, first you need to run a simulation.\nYou can stop it before the end by holding the STOP button.\nYour current simulation will end.");
        Simu(2);
    }
    QElapsedTimer tgomne;
    tgomne.start();
    RobotTraj();
    Init();

    par->isinside=0;
    par->q = ui->BeaconSpinBox->value();

    par->nb_beacon = ui->BeaconSpinBox->value();
    //cout<<"q"<<par->q<<endl;
    ui->EpsilonSpinBox->setValue(1);
    for (uint i=0;i<100;i++){
       par->err[i] = 0.2;
    }
    ui->ErrSpinBox_1->setValue(par->err[0]);
    ui->ErrSpinBox_2->setValue(par->err[1]);
    ui->ErrSpinBox_3->setValue(par->err[2]);
    ui->ErrSpinBox_4->setValue(par->err[3]);
    ui->ErrSpinBox_5->setValue(par->err[4]);

    //epsilon<0.01 check is just to stop the algorithm when it doesnt find a solution to not freeze the window and block the algorithm.
    while(par->isinside!=1 && par->epsilon_sivia>0.01){
        if(par->in_perhaps==0){
            par->q--;
            ui->InterSpinBox->setValue(par->q);
            Sivia sivia(*R,par);
            //cout<<"q--"<<endl;
        }
        if(par->in_perhaps==1){
            par->epsilon_sivia/=2;
            Sivia sivia(*R,par);
            ui->EpsilonSpinBox->setValue(par->epsilon_sivia);
        }
    }
    repaint();

    if (timeinfo){
        QString mess = "Execution time : ";
        mess.append(QString::number(tgomne.elapsed()));mess.append(" ms");
        QMessageBox::information(this,"Info",mess);
    }
    ui->InterSpinBox->setValue(par->q);
}
예제 #2
0
void MainWindow::GOMNE_fixed_q()
{
    QElapsedTimer tgomne;
    tgomne.start();
    RobotTraj();
    Init();

    par->isinside=0;

    par->nb_beacon = ui->BeaconSpinBox->value();
    //cout<<"q"<<par->q<<endl;
    ui->EpsilonSpinBox->setValue(1);
    for (uint i=0;i<100;i++){
       par->err[i] = 0.2;
    }
    ui->ErrSpinBox_1->setValue(par->err[0]);
    ui->ErrSpinBox_2->setValue(par->err[1]);
    ui->ErrSpinBox_3->setValue(par->err[2]);
    ui->ErrSpinBox_4->setValue(par->err[3]);
    ui->ErrSpinBox_5->setValue(par->err[4]);

    //epsilon<0.01 check is just to stop the algorithm when it doesnt find a solution to not freeze the window
    while(par->isinside!=1 && par->epsilon_sivia>0.01){
        if(par->in_perhaps==0){
            par->q--;
            ui->InterSpinBox->setValue(par->q);
            Sivia sivia(*R,par);
            //cout<<"q--"<<endl;
        }
        if(par->in_perhaps==1){
            par->epsilon_sivia/=2;
            Sivia sivia(*R,par);
            ui->EpsilonSpinBox->setValue(par->epsilon_sivia);
        }
    }
    SLAM(step);
    repaint();

    if (timeinfo){
        QString mess = "Execution time : ";
        mess.append(QString::number(tgomne.elapsed()));mess.append(" ms");
        QMessageBox::information(this,"Info",mess);
    }
    ui->InterSpinBox->setValue(par->q);
}
예제 #3
0
void MainWindow::on_ZoomReset_clicked()
{
    xmin = -25;
    xmax = 25;
    ymin = -25;
    ymax = 25;
    repaint();
    R = new repere(this,ui->graphicsView,xmin,xmax,ymin,ymax);
    Sivia sivia(*R,par);
    repaint();
}
예제 #4
0
void MainWindow::on_ZoomZone_clicked()
{
    xmin = par->robot_position[0]-5;
    xmax = par->robot_position[0]+5;
    ymin = par->robot_position[1]-5;
    ymax = par->robot_position[1]+5;
    repaint();
    R = new repere(this,ui->graphicsView,xmin,xmax,ymin,ymax);
    Sivia sivia(*R,par);
    repaint();
}
예제 #5
0
void MainWindow::on_Zoomminus_clicked()
{
    xmin *= 2;
    xmax *= 2;
    ymin *= 2;
    ymax *= 2;
    repaint();
    R = new repere(this,ui->graphicsView,xmin,xmax,ymin,ymax);
    Sivia sivia(*R,par);
    repaint();
}
void MainWindow::on_ButtonStart_clicked()
{

    Init();

    // Build the frame
    double xmin=-10;
    double xmax=10;
    double ymin=-10;
    double ymax=10;

    Frame* frame = new Frame(this,ui->graphicsView,xmin,xmax,ymin,ymax);

    // run SIVIA
    Sivia sivia(*frame,epsilon);
}
예제 #7
0
// Call SIVIA with the current parameters on the GUI
void MainWindow::on_ButtonStartParam_clicked()
{
    QElapsedTimer timer;
    timer.start();
    RobotTraj();
    Init();
    Sivia sivia(*R,par);
    R->DrawRobot(par->robot_position[0],par->robot_position[1],par->robot_position[3]);
    repaint();
    if (timeinfo){
        QString mess = "Execution time : ";
        mess.append(QString::number(timer.elapsed()));mess.append(" ms");
        QMessageBox::information(this,"Info",mess);
    }

}
예제 #8
0
// Call simulation 'Soft Constraints'
void MainWindow::on_ButtonFindSol_clicked()
{
    if (first_simu == false){
        QMessageBox::warning(this,"Abort process",
        "To run the alogrithm at a given time, first you need to run a simulation.\nYou can stop it before the end by holding the STOP button.\nYour current simulation will end.");
        Simu(1);
    }
    QElapsedTimer timer;
    timer.start();
    RobotTraj();
    Init();
    ui->EpsilonSpinBox->setValue(0.5);
    if(ui->BeaconSpinBox->value()!=5)
        QMessageBox::warning(this,"Attention","This method only works with 5 beacons. Now running simulation with 5 beacons.\n Press Ok to continue...");
    ui->BeaconSpinBox->setValue(5);
    ui->InterSpinBox->setValue(par->nb_beacon);

    for (uint i=0;i<(sizeof(par->err)/sizeof(*par->err));i++){
       par->err[i] = 0.00;
    }
    Sivia sivia(*R,par);
    uint i=0;
    //double startstep=0.05+floor(10*par->epsilon_sivia)/10-floor(10*par->epsilon_sivia)/20;
    double startstep=1;
    double pas = 0.5*(1+par->erroutlier/10);
    int nstep = 2;
    int stepctr=0;

    while(pas>0.05){
        int forw=0;
        int back=0;

        while(par->isinside==1){
            for (uint j=0;j<par->nb_beacon;j++){
                par->err[j]=startstep;
                if(i==j) par->err[j]=startstep-((stepctr+1))*pas;
            }

            Sivia sivia(*R,par);
            stepctr=(stepctr+1)%nstep;
            if (stepctr==0){
                i++;
                i = i % par->nb_beacon;
                if(i==0)    startstep=startstep-pas;
            }
            back++;
        }
       // qDebug()<<"err back: "<<"is "<<par->err[0]<<";"<<par->err[1]<<";"<<par->err[2]<<";"<<par->err[3]<<";"<<par->err[4]<<endl;

        while(par->isinside==0){

            for (uint j=0;j<par->nb_beacon;j++){
                par->err[j]=startstep;
                if(i==j) par->err[j]=startstep+((stepctr+1))*pas;
            }

            Sivia sivia(*R,par);
            stepctr=(stepctr+1)%nstep;
            if (stepctr==0){
                i++;
                i = i % par->nb_beacon;
                if(i==0)    startstep=startstep+pas;
            }
            forw++;
        }
        //qDebug()<<"par->err for: "<<"is "<<par->err[0]<<";"<<par->err[1]<<";"<<par->err[2]<<";"<<par->err[3]<<";"<<par->err[4]<<endl;
        if(back>forw)
            startstep/=0.5;
        else
            startstep*=0.5;
        //cout<<"pas "<<pas<<endl;
        pas/=2;

    }
    ui->ErrSpinBox_1->setValue(par->err[0]);
    ui->ErrSpinBox_2->setValue(par->err[1]);
    ui->ErrSpinBox_3->setValue(par->err[2]);
    ui->ErrSpinBox_4->setValue(par->err[3]);
    ui->ErrSpinBox_5->setValue(par->err[4]);
    repaint();

    if (timeinfo){
        QString mess = "Execution time : ";
        mess.append(QString::number(timer.elapsed()));mess.append(" ms");
        QMessageBox::information(this,"Info",mess);
    }
}