PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro, Odometriedaten auswerten



7eddi
05.02.2006, 15:58
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...



#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

Andun
05.02.2006, 19:48
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

7eddi
06.02.2006, 10:22
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

Andun
06.02.2006, 12:07
Jaja, genau. Mit einer Umdrehung ist natürlich das Zahnrad gemeint. :D

Also wie schon gesagt, hast du ja vom Prinzip her, das selbe wie in der Lib.