-         

Seite 1 von 8 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 72

Thema: RobotChallenge-Linienfolgeprogramm von "myIrAsuro"

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.12.2006
    Ort
    Eberbach
    Beiträge
    199

    RobotChallenge-Linienfolgeprogramm von "myIrAsuro"

    Anzeige

    Hallo,

    anbei das Programm, mit welchem myIrAsuro im Qualifying der RobotChallenge letztes Wochenende in Wien die 354cm lange Strecke in 10.1s (mit 35.05cm/s) schaffte (12. Platz, der erste Robby schaffte 60.00cm/s).
    Mit diesem Programm schaffte Robertor, als er noch ein Standard-Asuro war (mit roter LED, bei völliger Dunkelheit im Raum) 9.22s auf 357cm der Strecke Qualifying 2006, also 38.72cm/s (siehe folgenden Beitrag), bei einer Maximalgeschwindigkeit von 45cm/s (geradeaus).

    Das Programm ist recht einfach, ohne PID-Regler oder ähnliches. Bis zur Standard-Asuro-Geschwindigkeit von 45cm/s war dies auch ausreichend; jetzt mit Endgeschwindigkeiten von 1.1m/s (myIrAsuro) und 1.8m/s (Robertor, siehe Beitrag Asuro "upside down") werde ich mich wohl doch mit dem Thema (PID-)Regelung auseinandersetzen müssen ...

    Das ganze Programm ist als state-machine realisiert -- der Asuro weiß zu jedem Zeitpunkt, ob er auf der Linie ist (ON_LINE), links daneben (OFF_LEFT) oder rechts daneben (OFF_RIGHT).

    Auf der Linie fährt er einfach voll geradeaus, wenn er links daneben ist, fährt er einen Kreis nach rechts, und wenn er rechts daneben ist, fährt er einen Kreis nach links -- das war's!

    Dieses Programm hat die Eigenschaft, daß "normalerweise" der Asuro beim Verlassen am Ende der Linie er diese wieder mittels eines Kreises nach rechts oder links sucht, und dann dieselbe Strecke wieder zurückfährt ...
    Code:
    //
    // Program used by "myIrAsuro" in qualifying for competition 
    // "Parallel Slalom" of RobotChallenge 2007 in Vienna (24th march):
    // http://www.robotchallenge.at
    //
    // Time 10.1s for 354cm, that is speed 35.05cm/s (best was 60.00 cm/s).
    //
    // myIrAsuro has reduction of 1:12.5 (Asuro standard is 1:25), see:
    // http://www.roboternetz.de/phpBB2/viewtopic.php?t=28876
    //
    // The entries 0xFF for both SPEED values below will work on 
    // a standard Asuro with speed < 0.5m/s.
    //
    // The value for THRESHOLD must be changed if no IR-FrontLED 
    // with white shield is used, see:
    // http://www.roboternetz.de/phpBB2/viewtopic.php?t=29109
    //
    //
    // Robot will have to be placed on the line for starting!
    //
    // After starting the StatusLED of Asuro will blink [ready].
    // After (any) switch is pressed both BackLED's turn on [steady].
    // Releasing the switch will start the Robot [go].
    //
    #include <asuro.h>
    
    #define OFF_LEFT  -1 
    #define ON_LINE   0
    #define OFF_RIGHT +1
    
    #define SPEED  0xdF // 0xFF
    #define SPEED1 0xbF // 0xFF
    #define SPEED2 0x00 
    
    #define THRESHOLD  1100 
    
    void RaceStart(void); // blink until any switch is pressed, 
                          // then wait until switch is released
    
    
    int main(void)
    {
      unsigned int sum,data[2];
    
      int position = ON_LINE;
    
      Init();
    
      RaceStart();
      
      FrontLED(ON);   
      MotorDir(FWD,FWD);
      MotorSpeed(SPEED,SPEED);
    
      while (1)                  // state machine: position on/off the line
      {
        LineData(data);
        sum = data[LEFT] + data[RIGHT];
    
    
    	 if (sum>=THRESHOLD)      // not on the line
        {
    	   if (position==ON_LINE) // switch state if previously on the line
          {
     	    position = (data[LEFT]<data[RIGHT]) ? OFF_RIGHT : OFF_LEFT;
    
            BackLED( (position==OFF_LEFT)?ON:OFF, (position==OFF_RIGHT)?ON:OFF );
          }
    	 } 
        else                     // on the line
        {
    	   if (position!=ON_LINE) // switch state if previously not on the line
          {
    	     position = ON_LINE;
    
            BackLED(OFF,OFF);
          }
        }
    	  
    
    	      if (position==ON_LINE)   { MotorSpeed(SPEED,SPEED);   } // full FWD
        else if (position==OFF_RIGHT) { MotorSpeed(SPEED2,SPEED1); } // turn left
        else if (position==OFF_LEFT)  { MotorSpeed(SPEED1,SPEED2); } // turn right
      }
    
    
      while (1);                 // code unreachable
    
      return 0;
    }
    
    
    void RaceStart(void)    // blink until any switch is pressed,
    {                       // then wait until switch is released
      uint8_t t1, t2;
      unsigned int col=OFF;
    
      while (1)             // blinking StatusLED until any switch is pressed
      {
        t1 = PollSwitch();
        t2 = PollSwitch();
        if (t1==t2)
        {
          if (t1)
          {
            break;
          }
          else
          {
            col ^= GREEN;
            StatusLED(col);
          }
        }
        Msleep(50);
      }
    
      StatusLED(OFF);       // turn off StatusLED and ...
      BackLED(ON,ON);       // ... turn on both BackLED's
    
      while (1)             // wait until switch is released
      {
        t1 = PollSwitch();
        t2 = PollSwitch();
        if (t1==t2)
        {
          if (!t1)
          {
            break;
          }
        }
        Msleep(50);
      }
    
      BackLED(OFF,OFF);     // turn off BackLED's indication start of race
    }
    Vielleicht schaut Ihr ja mal, ob das Programm bei Euch auch funktioniert (Anpassen von THRESHOLD nicht vergessen), viel Spaß!

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    30
    Beiträge
    3.899
    hmm, als state-machine ist eigentlich ne schöne idee. besser als immer nur zickzack zu fahren bis die linie "gesehen" wird =) das war mein letzter versuch vor dem umbau. ich seh schon, ich muss mir ne erweiterungsplatine mit loniensensor bauen... =)
    kleinschreibung ist cool!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.12.2006
    Ort
    Eberbach
    Beiträge
    199
    Hallo,
    Zitat Zitat von damaltor
    ... ich seh schon, ich muss mir ne erweiterungsplatine mit loniensensor bauen... =)
    schau doch mal die vorletze Bilderreihe im folgenden Beitrag an, da ist genau so eine Erweiterungsplatine dargestellt.

    Diese könntest Du nutzen, wenn Du Deinen Asuro auch umdrehst [daß das von der Motorhöhe her paßt, kannst Du den Bildern in folgendem Beitrag entnehmen (dort ist allerdings alles falschherum), allerdings wäre die Platine bei den 38er-Rädern dann vorne höher als hinten] -- die (einfachen) notwendigen softwareseitigen Maßnahmen sind in dem Beitrag dargestellt ...

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    30
    Beiträge
    3.899
    hmm... ich glaub ich hab nicht den elan das alles umzubauen =) aber ich hab mir shon was überlegt, wenn ich mal wieder etwas mehr zeit hab für den kleinen dann werd ich mal was basteln.
    kleinschreibung ist cool!

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    69
    Beiträge
    1.334

    schwellenwert

    hi hermann,

    ich habe noch nicht so ganz genau verstanden wie der wert von 11oo zustande kam.
    Ist es die summe der werte der linienfolgesensoren (die höchsten werte) oder ist das was anderes?
    Ich verwende eine "normale" rote LED, da ist der asuro nur geradeaus gefahren. Beim einsetzen von einer IR diode )ich habe mir steckbare module gemacht) drehte er sich nur im kreis.
    Als ich den wert auf 400 gesetzt habe (bei IR) fuhr er auf der linie, allerdings auf einer breiteren (ca. 1,5cm breit) recht flott herum, auf der dünnen linie von der testarena fährt er mit dem gleichen wetr und IR nur sinnlos in der gegend herum

    gruß georg
    gruß inka

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    30
    Beiträge
    3.899
    ich denke mal der wert muss je nach asuro und linie und diode angepasst werden... muss man halt etwas austesten.
    kleinschreibung ist cool!

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    69
    Beiträge
    1.334
    naja, was ich meine ist ob es sowas wie "deutungen" der veränderung und den auswirkungen dieser gibt, z.b. von 200 rauf= schmalere linie, IR-werte irgendwo bei ...?, der schwellenwert bei 1000 und darunter= dickere linie, schlechter diode o.ä...


    also mehr oder weniger ein paar erfahrungswerte bei änderungen des wertes. So langsam habe ich nämlich bedenken wegen der anzahl der flashvorgänge, die der prozessor mitmacht

    gruß georg
    gruß inka

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    18.03.2007
    Beiträge
    62
    Also was mir dazu einfällt:
    Die Taster haben doch sogesehen keine Funktion.

    Du kannst halt je zwei Taster verwenden um die Werte zu modifizieren.
    zB Taster1 schwellenwert um 50 erhöhen, taster2: schwellenwert um 50 verringern usw.
    nach jeder Änderung am besten noch über IR die Daten zurück an den PC schicken. So kannst du rumexperementieren ohne zu flashen. Sobald du dann die besten Werte hast, kannst draus ein festes Programm bauen.
    18.März '07- mein erster ASURO

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.12.2006
    Ort
    Eberbach
    Beiträge
    199

    Re: schwellenwert

    Hallo Georg,
    Zitat Zitat von inka
    hi hermann,

    ich habe noch nicht so ganz genau verstanden wie der wert von 11oo zustande kam.
    Ist es die summe der werte der linienfolgesensoren (die höchsten werte) oder ist das was anderes?
    es ist der Schwellwert zur Unterscheidung, ob der Asuro noch auf den Linie (mehr oder weniger) drauf ist (ON_LINE, wenn sum<THRESHOLD), oder nicht mehr auf der Linie ist (OFF_LEFT oder OFF_RIGHT, wenn sum>=THRESHHOLD), wobei sum die Summe der Werte des linken und des rechten Fototransistors ist -- siehe auch folgenden Code-Ausschnitt:
    Code:
    ...
      while (1)                  // state machine: position on/off the line 
      { 
        LineData(data); 
        sum = data[LEFT] + data[RIGHT]; 
    
    
        if (sum>=THRESHOLD)      // not on the line 
        { 
    ...
        } 
        else                     // on the line 
        { 
    ...
        } 
    ...
      } 
    ...
    Ich verwende eine "normale" rote LED, da ist der asuro nur geradeaus gefahren. Beim einsetzen von einer IR diode )ich habe mir steckbare module gemacht) drehte er sich nur im kreis.
    Als ich den wert auf 400 gesetzt habe (bei IR) fuhr er auf der linie, allerdings auf einer breiteren (ca. 1,5cm breit) recht flott herum, auf der dünnen linie von der testarena fährt er mit dem gleichen wetr und IR nur sinnlos in der gegend herum
    Schön, daß Du "einfach mal probiert hast, die richtigen Werte zu finden", und natürlich ist es auch richtig hier zu fragen [besonders freut micht die Formulierung fuhr er auf der linie, allerdings auf einer breiteren (ca. 1,5cm breit) recht flott herum ].

    In folgendem Beitrag im Thread Vollausschlag für die Fotosensoren kannst Du sehen, daß die Summenmesswerte von myIrAsuro zwischen 500 (auf der Linie) und 1950 (auf weißem Untergrund) liegen, da war 1100 eine pragmatische Wahl des Schwellwertes.

    Man kann den Schwellwert aber auch einfach experimentell Bestimmen (z.B. für die beiden Setups von Dir mit 1,5cm breiten und mit schmalen Linien)!
    • Flashe dazu einfach ein Programm, welches die LineData()-Werte des Asuro in einem Terminalprogramm auf dem PC ausgibt, auf den Asuro (falls keines zur Hand, dann findest Du eines in diesem Beitrag).
    • Setze den Asuro auf die Linie und bewege ihn dann soweit nach links oder rechts, bis Du möchtest, daß er den Zustand als nicht mehr auf der Linie ansehen soll.
    • Verwende die Summe der LineData()-Werte an dieser Stelle als Wert für die Konstante THRESHOLD.
    naja, was ich meine ist ob es sowas wie "deutungen" der veränderung und den auswirkungen dieser gibt, z.b. von 200 rauf= schmalere linie, IR-werte irgendwo bei ...?, der schwellenwert bei 1000 und darunter= dickere linie, schlechter diode o.ä...
    Ich hoffe, das obige Rezept zur Festlegung von THRESHOLD ist hilfreich.

    ... auf der dünnen linie von der testarena ...
    Welche Testarena? Die Linien auf der RobotChallenge sind 1.5cm breit, siehe hier.

    So langsam habe ich nämlich bedenken wegen der anzahl der flashvorgänge, die der prozessor mitmacht
    Ich glaube irgendwo gelesen zu haben, daß man den Asuro mindestens 10000 mal Flashen kann, da brauchst Du wohl erst mal keine Bedenken haben ...

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    69
    Beiträge
    1.334
    hi hermann,

    nun habe ich die osterntour mit ihren über 2000km hinter mir und kann mich wieder etwas um den asuro kümmern

    danke erstmal für die erklärungen zum THREESHOLD, damit blicke ich durch und werde den experimentelen weg versuchen...

    Welche Testarena?
    diese hier, habe ich von damaltor zugeschickt bekommen. Besteht aus 9 blättern, die aneinander geklebt werden, allerdings muss der (mein) asuro schon seehhr langsam sein um nicht rauszufliegen...
    edit/
    was die anzahl der flashvorgänge betrifft, ich glaube eine zahl 10x kleiner mal gelesen zu haben ???
    /edit
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken linefollowing-arena_488.jpg  
    gruß inka

Seite 1 von 8 123 ... LetzteLetzte

Berechtigungen

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