-
        

Ergebnis 1 bis 4 von 4

Thema: Asuro, Odometriedaten auswerten

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.10.2005
    Ort
    Lüdenscheid
    Alter
    31
    Beiträge
    15

    Asuro, Odometriedaten auswerten

    Anzeige

    Hallo,

    ich hab ein kleines Programm geschrieben um Asuro einfach geradeaus fahren zu lassen. Ich würde gerne wissen ob es schon bessere Methoden gibt oder was ihr von meiner haltet...

    Code:
    #include "asuro.h"
    #include "print.c"
    
    int sign(int x) {
      // Gibt eine 1 mit Vorzeichen von x zurück
      if(x < 0) 
        return -1;
      return 1;
    } 
    
    int main(void) {  
      Init();
      
      // Geschwindigkeiten
      int speedL = 120;
      int speedR = 120;
      
      // Odometriedaten
      int od[2];
      
      // alte Odometriedaten
      int odOld[2];
      
      // Maximalwerte
      unsigned int maxL = 0;
      unsigned int maxR = 0;
      unsigned int minL = 1023;
      unsigned int minR = 1023;
      
      // Durchschnitte
      unsigned int medL;
      unsigned int medR;
      
      // 1/12-Umdrehungen
      unsigned int countL = 0;
      unsigned int countR = 0;
        
      // Initialisieren
      OdometrieData(odOld);
      
      // Losfahren
      MotorDir(FWD, FWD);
      
      while(1) {    
        // Odometriedaten einlesen
        OdometrieData(od); 
        
        // Maximalwerte anpassen
        if(od[0] > maxL) maxL = od[0];
        if(od[1] > maxR) maxR = od[1];
        if(od[0] < minL) minL = od[0];
        if(od[1] < minR) minR = od[1];
        
        // Durchschnitte anpassen
        medL = (minL + maxL) / 2;
        medR = (minR + maxR) / 2;
        
        if((sign(medL - od[0]) * sign(medL - odOld[0])) < 0) {
          // Wechsel über Mittelwert, 1/12-Umdrehung
          countL++;
        }
        
        if((sign(medR - od[1]) * sign(medR - odOld[1])) < 0) {
          // Wechsel über Mittelwert, 1/12-Umdrehung
          countR++;
        }
        
        if(countL >= 12 || countR >= 12) {
          // Geschwindigkeitsausgleich
          speedL+= countR - countL;
          speedR+= countL - countR;
          MotorSpeed(speedL, speedR);
          
          PrintInt(speedL);
          PrintStr(" ");
          PrintInt(speedR);
          PrintStr("\r\n");  
                
          countL = 0;
          countR = 0;
        }
        
        // Speichern der Odometriedaten
        odOld[0] = od[0];
        odOld[1] = od[1];
      }  
    	return 0;
    }
    Gruß,
    Lucas

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    Also wenn ich dein Programm jetzt beim flüchtigen Lesen richtig interpretiere dann überprüfst du ja immer wenn eines der beiden Räder eine volle umdrehung hat.

    Also in der bisherigen erweiterten Lib wurde es ja so gelöst, dass mit der geschriebenen Encoder Funktion immer nur noch einer differenz geschaut wurde und dann wurde nachgeregelt. Und das ganze immer in einer Schleife. Das ganze ist vom Prinzip her so wie deins, nur mit dem Unterschied, dass du halt erst immer ne ganze Radumdrehung wartest.

    Muss jeder selber wissen, was ihm besser gefällt.

    Falls du den Link nicht hast: https://sourceforge.net/projects/asuro/

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    17.10.2005
    Ort
    Lüdenscheid
    Alter
    31
    Beiträge
    15
    Danke, ich werd mir die Lib mal anschauen.

    Zu der Umdrehung:

    Die volle Umdrehung bezieht sich nicht auf das Rad, sondern auf das Getrieberad mit den Aufklebern. D.h. wenn 12x ein schwarz/weiß-Unterschied festgestellt wird, dann hat sich die Scheibe 1x und ich glaube das Rad (wegen 10:50) 1/5 mal gedreht. Anders kann ich mir es auch gar nicht vorstellen, da ich ja um einen Unterschied zu bemerken auch ein Stück gefahren sein muss.

    Gruß,
    Lucas

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    Jaja, genau. Mit einer Umdrehung ist natürlich das Zahnrad gemeint.

    Also wie schon gesagt, hast du ja vom Prinzip her, das selbe wie in der Lib.
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

Berechtigungen

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