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