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
Lesezeichen