-         

Ergebnis 1 bis 4 von 4

Thema: Ausor mit Programm geradeaus fahren

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.02.2010
    Beiträge
    18

    Ausor mit Programm geradeaus fahren

    Anzeige

    Mein Asuro fährt leicht schräk.
    Kan ich den Asuro mit einem Programm zum geradeaus fahren bringen?
    Geht das z.B. mit den Fototransitoren? wen ja wie?

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    02.05.2010
    Ort
    München
    Beiträge
    41
    Halli Hallo,
    Erstmal solltest du dir angewöhnen zu erst die Suchfunktion zu benutzen bevor du frägst :P

    1.
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=53890

    2.
    Es gibt ein Programm (hat glaub ich Waste geschrieben einfach mal bei seinen Threads guckn) das dir die Geschwindigkeiten der Motoren so optimiert das er durchgehend geradeaus fahren sollte.. Einfach mal danach hier im Forum suchen habe den Link gerade nicht gefunden..

    MfG. mtzE

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.03.2010
    Beiträge
    161
    Zähle die Impulse der Odometrie Sensoren, während der Roboter fährt. Wenn eine Seite weniger impulse hat, als die andere, gib diesem Motor etwas mehr Power.

    Das ist eine einfache Lösung, funktioniert aber nur für geraeaus Kurs. Zum Kurven Fahren empfehle ich das Lenkrad-Modell. Bei Mittelstellung soll das Verhältnis der beiden Drehzahlen 1 sein. AUsgehend davon kann man nach links oder rechts lenken. Du misst in regelmäßigen Intervallen (z.B. 100ms) die Geschwindigkeit der beiden Räder und vergleichst sie mit dem Soll-Wert. Bei Abweichung korriegierst Du mit einem P-Regler (siehe Wissens-Sammlung zum Thema Regelungstechnik). Wenn das gut klappt, dann baue dies zu einem PD Regler aus.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Ich hab in meinem Funktionsarchiv für Asuro einen Regler gefunden, den ich damals programmiert habe.
    Der Code alleine ist so noch nicht lauffähig, aber alles schreib ich hier nicht hinein, denn selberdenken schadet nicht!


    Code:
    void fkt_geradeaus_fahren(int speed, unsigned char (*funktion)(void))
    {
    
        unsigned char mspeed_l=0,mspeed_r=0,flag_l=0,flag_r=0;
        int y=0,e=0,odata[2]={0},counter_l=0,counter_r=0;
        unsigned long int tregeln=0;
    
        if(speed>0 && speed<=255)
        {
            MotorDir(FWD,FWD);
            mspeed_l=speed;
            mspeed_r=speed;
        }
        else if(speed<0 && speed>=(-255))
        {
            MotorDir(RWD,RWD);
            mspeed_l=-speed;
            mspeed_r=-speed;
        }
        else
        {
            return;
        }
    
        while(funktion()==0)
        {
            MotorSpeed(mspeed_l,mspeed_r);
            OdometrieData(odata);
            //Stellgröße anhand Regelabweichung berechnen
    
            if(odata[0]<ODOMETRIE_L && flag_l==0)
            {
                counter_l++;
                flag_l=1;
            }
            else if(odata[0]>ODOMETRIE_L && flag_l==1)
            {
                counter_l++;
                flag_l=0;
            }
    
    
            if(odata[1]<ODOMETRIE_R && flag_r==0)
            {
                counter_r++;
                flag_r=1;
            }
            else if(odata[1]>ODOMETRIE_R && flag_r==1)
            {
                counter_r++;
                flag_r=0;
            }
    
            if(Gettime()>tregeln)
            {
                e=counter_l-counter_r;
                y=abs(e*G_KP);
    
                //Stellgröße gegen Grenzwerte prüfen
                if(y>G_KORR_MAX)
                    y=G_KORR_MAX;
    
                if(e<0)
                {
                    if((int)(mspeed_r+abs(speed)-mspeed_l-y)<0)
                    {
                        mspeed_r=0;
                        mspeed_l=abs(speed);
                    }
                    else if((int)(mspeed_r+abs(speed)-mspeed_l-y)>255)
                    {
                        mspeed_r=255;
                        mspeed_l=abs(speed);
                    }
                    else
                    {
                        mspeed_r=mspeed_r+abs(speed)-mspeed_l-y;
                        mspeed_l=abs(speed);
                    }
                }
    
                else if(e>0)
                {
                    if((int)mspeed_l+abs(speed)-mspeed_r-y<0)
                    {
                        mspeed_l=0;
                        mspeed_r=abs(speed);
                    }
                    else if((int)mspeed_l+abs(speed)-mspeed_r-y>255)
                    {
                        mspeed_l=255;
                        mspeed_r=abs(speed);
                    }
                    else
                    {
                        mspeed_l=mspeed_l+abs(speed)-mspeed_r-y;
                        mspeed_r=abs(speed);
                    }
                }
    
                tregeln=Gettime()+100;
                counter_l=counter_l*G_I_FAKTOR;
                counter_r=counter_r*G_I_FAKTOR;
            }
    
        }
    
    
        if(speed>0)
            MotorDir(RWD,RWD);
        else
            MotorDir(FWD,FWD);
        MotorSpeed(100,100);
        Msleep(100);
        MotorDir(BREAK,BREAK);
        MotorSpeed(0,0);
        return;
    }
    Grüße,
    Harri

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •