PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linienverfolgung klappt nicht besonders gut -- Verbesserung?



white_rabbit
06.12.2006, 14:20
Hallo.
Ich habe diese Version des Linien-Verfolgungsprogramms getestet und bin nur mäßig zufrieden. Zum Testen habe ich zusätzlich die "Arena" von dalmator genommen, die aus 9 DinA4-Blättern besteht und außen einen kurvigen Parcours und innen 2 große Kreise bildet. Mein Asuro folgt momentan nur einem der Kreise -- und das auch nur in eine Richtung (in der Gegenrichtung kommt er sehr schnell vom Kurs ab). Ich habe in dem Code schon den Speed runtergedreht aber mir kommt es eher so vor, als wenn die Messung des schwarzen Strichs zu fehlerhaft läuft. Der Asuro verliert die Linie sehr oft aus den "Augen" und fährt dann so lange im Kreis, bis er wieder selbst irgend etwas schwarzes gefunden hat. Daran orientiert er sich dann wieder -- aber auch das nicht sehr treffsicher. Der Code ist also irgendwie fehlerhaft oder zumindest bescheiden. Wo kann man nachbessern?
Danke f. Tipps,
W.R.



#include "asuro.h"

#define SPEED 0x5a

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
//speedLeft += 1; if (speedLeft > 0x8E)
speedLeft = 0xb6;
}

void LineRight (void)
{
//speedRight += 1; if (speedRight > 0x8E)
speedRight = 0xb6;
}

int main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
for (j = 0; j < 0xFF; j++) {
LineData(lineData);}
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
while (1) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return 0;
}

damaltor
06.12.2006, 14:44
Bitte nutze die suchfunktion. es gibt unendlich viele linienfolgeprogramme im forum.
das problem könnte evtl sein, dass die räder des asuro nicht gleich schnell drehen. der asuro fährt also immer eine kurve, auch wenn er eigentlich geradeausfahren sollte. das programm muss entsprechend angepasst werden oder so verändert werden, dass die odometriewerte mit einbezogen werden.

dem kreis wird nur in eine richtung gefolg, weil diese richtung wahrscheinlich mit dem normalen krumm-fahr-faktor des asuro leichter zu schaffen ist als die andere richtung. wenn der asuro dauernd ne rechtskurve fährt, muss nicht viel angepasst werden um einem kreis rechtsrum zu folgen. dagegen muss extrem viel angepasst werden, um dem kreis linksrum zu folgen.

also: bitte such mal im forum, am ende haben sies alle geschafft auf der linie zu bleiben...

daMALtor

Downad
06.12.2006, 15:26
wenn ich den code richtig verstehen hast du in den funktionen etwas auskommentiert

void LineLeft (void)
{
//speedLeft += 1; if (speedLeft > 0x8E) <<<---HIER
speedLeft = 0xb6;
}

void LineRight (void)
{
//speedRight += 1; if (speedRight > 0x8E) <<<---HIER
speedRight = 0xb6;
}

und das hat doch zur folge, dass du die speed NUR einmalig auf einen anderen wert setzt.
dann kann es sein, dass die kurve genau der Speed entspricht, dann läuft dein asuro um die ecke, andernfalls......

damaltor
06.12.2006, 17:41
hmmm... das ist richtig... nach zwei schrägstrichen ist die ganze Zeile auskommentiert, auch wenn ein semikolon dazwischen ist. wie siehts aus, ist das auch in dem code so der auf dem asuro läuft?

sag mal warum machst du dir eigentlich das leben unnötig schwer und schreibst in hexadezimalzahlen, wenn du auch einfach dezimalzahlen nehmen kannst? das macht den code übersichtlicher, spart dir das umrechnen und mach es für jeden anderen leichter zu lesen...