-         

Ergebnis 1 bis 6 von 6

Thema: Linienverfolgung verbessern

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.12.2008
    Beiträge
    31

    Linienverfolgung verbessern

    Anzeige

    Hallo liebe Roboternetz-Community!

    Ich habe mir vorhin die Linientestarena zusammengebaut, und festgestellt, dass mein Asuro überhaupt nicht mit den dünnen Linien und den engen Kurven klarkommt. Ich benutze auch ein sehr simples Programm :
    Code:
     
    #include "asuro.h"
    
    int main(void){
      unsigned int data[2];       //Speicher bereitstellen
      Init();
      FrontLED(ON);               //Beleuchtung an
      MotorDir(FWD,FWD);          //Beide Motoren Vorwärts
      while(1){                   //Endlosschleife,Asuro ollbeliebig
                                  //lang einer Linie nachfahren
        LineData(data);           //aktuelle Helligkeitswerte der
                                  //Fototransistoren auslesen
    if(data[0]>data[1])          //links heller als rechts...
    {MotorSpeed(150,100);}       //...dann links mehr Gas geben!...
       else
       {MotorSpeed(100,150);}    //...sonst rechts mehr Gas geben!
    }
    return 0;
    }
    Da ich noch nicht sooo gut im Programmieren bin,weiß ich jetzt nicht genau, wie ich das Programm verbessern kann. Habt ihr eine Idee?

    €dit: Hier ist nochmal der Link zu dem "Linientestarenathread" : http://www.roboternetz.de/phpBB2/viewtopic.php?t=30004

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Hallo,
    dieser Code hat sich bei mir sehr gut bewährt:

    Code:
    int main(void)
     {
     int x1,x2,y1,y2,l1,l2;
     unsigned int lineData[2];
      Init();
        MotorDir(FWD,FWD);
    
      while(1){
        FrontLED(OFF);
        LineData(lineData);
        x1=lineData[0];
        x2=lineData[1];
        FrontLED(ON);
        LineData(lineData);
        y1=lineData[0];
        y2=lineData[1];
        l1=y1-x1;
        l2=y2-x2;
        if (l1==l2){MotorSpeed(200,200);}
        if (l1<l2){MotorSpeed(0,170),BackLED(OFF,ON);}
        if (l1>l2){MotorSpeed(170,0),BackLED(ON,OFF);}
       }
      while(1)
    
      return(0);
    }
    mfg

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Kleine Anmerkung: Da auch LEDs nicht schlagartig ein- oder ausgeschaltet werden können (das "Nachleuchten" ist dabei schlimmer) sollte nach dem Umschalten der FrontLED eine kurze Zeit gewartet werden:

    FrontLED(OFF);
    Sleep(10);
    LineData(lineData);

    Alternativ könnte man das Umschalten der FrontLED direkt nach dem Einlesen der Werte erledigen:

    Code:
    ...
      while(1){ 
        LineData(lineData); 
        FrontLED(ON); 
        x1=lineData[0]; 
        x2=lineData[1]; 
        LineData(lineData); 
        FrontLED(OFF); 
    ...
    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    07.12.2008
    Beiträge
    31
    Vielen Dank fürdie Antoworten!

    Ich habs gleich mal ausprobiert und erstmal das Programm von wsk8 ausprobiert, jedoch fährt mein Asuro damit nur die ganze Zeit im Kreis anstatt der Linie zu folgen.

    Dann habe ich den Code nochmal ungeändert, sodass die Front LED nach dem Einlesen der Wete umgeschaltet wird, doch da kommt genau das selbe bei raus.

    Woran könnte das liegen?

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    16.01.2009
    Ort
    Rosenfeld
    Beiträge
    57
    Das liegt mit ziemlicher Sicherheit daran, dass die Bedingung:
    if(l1 == l2) {....}
    in der 3.letzten Zeile bei Deinem ASURO nie erfüllt ist.
    Durch Bauteiltoleranzen kann es sein, dass da eben doch eine kleine Differenz entsteht.
    Versuch doch mal statt der letzten drei Zeilen in der while-Schleife folgendes:
    Code:
    #define tol 4
    if (abs(l1-l2) <= tol){MotorSpeed(200,200);} 
    if ((l2-l1) > tol){MotorSpeed(0,170),BackLED(OFF,ON);} 
    if ((l1-l2) > tol){MotorSpeed(170,0),BackLED(ON,OFF);}
    Ob es so funktioniert, kann ich nicht garantieren. Möglicherweise musst Du den Toleranzwert 4 (= tol) noch etwas verändern.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.12.2008
    Beiträge
    31
    Vielen Dank für die Antwort!

    Ich habs ausprobiert, leider habe ich immer noch das selbe Problem, der Asuro dreht sich nur im Kreis

Berechtigungen

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