PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO dreht bei Odometrie durch!



Lunarman
29.01.2006, 12:47
Habs jetzt endlich mal geschafft, die Odometrie zu programmieren - und ASURO dreht durch!
Das läuft ungefähr so: Ein Rad läuft vorwärts- wird langsamer - andres rad läuft - wird langsamer - aus - bumm - alle laufen - es surrt - es fängt an zu "puckern" (Wie bei Starwars Epi 1 die Podracer) - Die Räder werden immer schneller - sie wackeln ordentlich - ich mach aus, weil ich Angst habe, dass das Ding sich durch Hyperaktivität aufhängt. Was ist hier los?



int Rmin=1023;
int Rmax=0;
int Rhell=0;
int Rdunkel=0;
int RZaehler;
int UebergaengeR=0;
int RSpeed=100;

int Lmin=1023;
int Lmax=0;
int Lhell=0;
int Ldunkel=0;
int MittelwertR;
int MittelwertL;
int LZaehler;
int UebergaengeL=0;
int LSpeed=100;


long Zaehler=0;

BackLED(ON,ON);

while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(LSpeed,RSpeed);

for (Zaehler=0; Zaehler<100;Zaehler++)
{
unsigned int data[2];

OdometrieData(data);

if (data[0] > Lmax)
Lmax=data[0];

if (data[0] < Lmin)
Lmin=data[0];

if (data[1] > Rmax)
Rmax=data[1];

if (data[1] < Rmin)
Rmin=data[1];


MittelwertL=(Lmin+Lmax)/2;
MittelwertR=(Rmin+Rmax)/2;

LongSleep(1);

}

unsigned int data[2];

OdometrieData(data);

if (data[0] < MittelwertL)
{
Lhell = data[0];
LZaehler = HELL;
}
else
{
Ldunkel = data[0];
LZaehler = DUNKEL;
}
if (data[1] < MittelwertR)
{
Rhell = data[1];
RZaehler = HELL;
}
else
{
Rdunkel = data[1];
RZaehler = DUNKEL;
}

int i;

for (i = 0; i< 100; i++)
{
OdometrieData(data);

if (data[0] < MittelwertL && LZaehler == DUNKEL)
UebergaengeL = UebergaengeL + 1;
else if (data[0] > MittelwertL && LZaehler == HELL)
UebergaengeL = UebergaengeL + 1;

if (data[1] < MittelwertR && RZaehler == DUNKEL)
UebergaengeR = UebergaengeR + 1;
else if (data[1] > MittelwertR && RZaehler == HELL)
UebergaengeR = UebergaengeR + 1;
}

if (UebergaengeR < UebergaengeL)
{
RSpeed = RSpeed + 1;
LSpeed = LSpeed - 1;
StatusLED(RED);
}
else if (UebergaengeR > UebergaengeL)
{
RSpeed = RSpeed - 1;
LSpeed = LSpeed + 1;
StatusLED(GREEN);
}
else if (UebergaengeR == UebergaengeL)
StatusLED(YELLOW);
}


Ich hab keine Ahnung, was das soll!

Tschüß,
Lunarman

MSSputnik
29.01.2006, 22:58
Hi,

das liegt vielleicht daran, das du deinem Asuro nicht deutlich genug sagst, was er eigentlich tun soll :-)

Sorry aber dein Programm tut alles mögliche nur nicht, das der Asuro gerade aus fährt.

Ich verstehe so einige passagen in deinem Programm nicht.
1. Warum zählst du bei jedem Funktionsabschnitt immer von 0-100?
2. Du wiederhost das gesamte Programm immer (while-schleife). Ich vermute jedoch, du willst das gar nicht, da mir der erste Funktionsblock eher wie eine Kalibrierung deiner Odometrie aussieht.
3. Am Ende erhöhst bzw. erniedrigst du die Laufgeschwindigkeit deiner Motoren bei einem Farbwechsel der Odometriescheiben. Wodzu? Möchtest du nicht lieber die Motoren so regeln, das links und rechts in der gleichen Zeitieinheit gleich viele Übergänge stattfinden. Dann fährt er nämlich gerade aus.

Kurz gesagt. Suche noch mal im Forum, wie man das mit der Odometrie macht.

Martin

Lunarman
30.01.2006, 18:10
Okay, hab es jetzt mal ein bisschen abgeändert. So fährt er geradeaus. Okay, ein bisschen lenkt er hin und her - aber egal.



int RZaehler;
int UebergaengeR=0;

int MittelwertR;
int MittelwertL;

int LZaehler;
int UebergaengeL=0;

long Zaehler=0;

int Lmin=1023;
int Lmax=0;

int Rmin=1023;
int Rmax=0;

MotorDir(FWD,FWD);
MotorSpeed(LSpeed,RSpeed);

for (Zaehler=0; Zaehler<100; Zaehler++)
{
unsigned int data[2];

OdometrieData(data);

if (data[0] > Lmax)
Lmax=data[0];

if (data[0] < Lmin)
Lmin=data[0];

if (data[1] > Rmax)
Rmax=data[1];

if (data[1] < Rmin)
Rmin=data[1];

LongSleep(1);
}

MittelwertL=(Lmin+Lmax)/2;
MittelwertR=(Rmin+Rmax)/2;

int i;

UebergaengeL = UebergaengeR = 0;

LZaehler = HELL;
RZaehler = HELL;

for (i = 0; i< 500; i++)
{
unsigned int data[2];

OdometrieData(data);

if (data[0] < MittelwertL && LZaehler == DUNKEL)
{
UebergaengeL = UebergaengeL + 1;
LZaehler = HELL;
}
else if (data[0] > MittelwertL && LZaehler == HELL)
{
UebergaengeL = UebergaengeL + 1;
LZaehler = DUNKEL;
}

if (data[1] < MittelwertR && RZaehler == DUNKEL)
{
UebergaengeR = UebergaengeR + 1;
RZaehler = HELL;
}
else if (data[1] > MittelwertR && RZaehler == HELL)
{
UebergaengeR = UebergaengeR + 1;
RZaehler = DUNKEL;
}

LongSleep(1);
}

if (UebergaengeR < UebergaengeL)
{
RSpeed = RSpeed + 1;
LSpeed = LSpeed - 1;
StatusLED(RED);
}
else if (UebergaengeR > UebergaengeL)
{
RSpeed = RSpeed - 1;
LSpeed = LSpeed + 1;
StatusLED(GREEN);
}
else if (UebergaengeR == UebergaengeL)
{
StatusLED(YELLOW);
}


Übrigens: Die Kalibrierung wiederhol ich, falls plötzlich ne Lampe angeht und dann die gesamten Daten falsch sind.