PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linienverfolgung verbessern



James C.
22.03.2009, 21:22
Hallo liebe Roboternetz-Community!

Ich habe mir vorhin die Linientestarena zusammengebaut, und festgestellt, dass mein Asuro überhaupt nicht mit den dünnen Linien und den engen Kurven klarkommt. Ich benutze auch ein sehr simples Programm :


#include "asuro.h"

int main(void){
unsigned int data[2]; //Speicher bereitstellen
Init();
FrontLED(ON); //Beleuchtung an
MotorDir(FWD,FWD); //Beide Motoren Vorwärts
while(1){ //Endlosschleife,Asuro ollbeliebig
//lang einer Linie nachfahren
LineData(data); //aktuelle Helligkeitswerte der
//Fototransistoren auslesen
if(data[0]>data[1]) //links heller als rechts...
{MotorSpeed(150,100);} //...dann links mehr Gas geben!...
else
{MotorSpeed(100,150);} //...sonst rechts mehr Gas geben!
}
return 0;
}


Da ich noch nicht sooo gut im Programmieren bin,weiß ich jetzt nicht genau, wie ich das Programm verbessern kann. Habt ihr eine Idee?

€dit: Hier ist nochmal der Link zu dem "Linientestarenathread" : https://www.roboternetz.de/phpBB2/viewtopic.php?t=30004

Wsk8
22.03.2009, 21:35
Hallo,
dieser Code hat sich bei mir sehr gut bewährt:



int main(void)
{
int x1,x2,y1,y2,l1,l2;
unsigned int lineData[2];
Init();
MotorDir(FWD,FWD);

while(1){
FrontLED(OFF);
LineData(lineData);
x1=lineData[0];
x2=lineData[1];
FrontLED(ON);
LineData(lineData);
y1=lineData[0];
y2=lineData[1];
l1=y1-x1;
l2=y2-x2;
if (l1==l2){MotorSpeed(200,200);}
if (l1<l2){MotorSpeed(0,170),BackLED(OFF,ON);}
if (l1>l2){MotorSpeed(170,0),BackLED(ON,OFF);}
}
while(1)

return(0);
}


mfg

radbruch
22.03.2009, 21:55
Hallo

Kleine Anmerkung: Da auch LEDs nicht schlagartig ein- oder ausgeschaltet werden können (das "Nachleuchten" ist dabei schlimmer) sollte nach dem Umschalten der FrontLED eine kurze Zeit gewartet werden:

FrontLED(OFF);
Sleep(10);
LineData(lineData);

Alternativ könnte man das Umschalten der FrontLED direkt nach dem Einlesen der Werte erledigen:



...
while(1){
LineData(lineData);
FrontLED(ON);
x1=lineData[0];
x2=lineData[1];
LineData(lineData);
FrontLED(OFF);
...


Gruß

mic

James C.
23.03.2009, 19:08
Vielen Dank fürdie Antoworten!

Ich habs gleich mal ausprobiert und erstmal das Programm von wsk8 ausprobiert, jedoch fährt mein Asuro damit nur die ganze Zeit im Kreis anstatt der Linie zu folgen.

Dann habe ich den Code nochmal ungeändert, sodass die Front LED nach dem Einlesen der Wete umgeschaltet wird, doch da kommt genau das selbe bei raus.

Woran könnte das liegen?

orusa
23.03.2009, 21:53
Das liegt mit ziemlicher Sicherheit daran, dass die Bedingung:
if(l1 == l2) {....}
in der 3.letzten Zeile bei Deinem ASURO nie erfüllt ist.
Durch Bauteiltoleranzen kann es sein, dass da eben doch eine kleine Differenz entsteht.
Versuch doch mal statt der letzten drei Zeilen in der while-Schleife folgendes:


#define tol 4
if (abs(l1-l2) <= tol){MotorSpeed(200,200);}
if ((l2-l1) > tol){MotorSpeed(0,170),BackLED(OFF,ON);}
if ((l1-l2) > tol){MotorSpeed(170,0),BackLED(ON,OFF);}


Ob es so funktioniert, kann ich nicht garantieren. Möglicherweise musst Du den Toleranzwert 4 (= tol) noch etwas verändern.

James C.
26.03.2009, 19:28
Vielen Dank für die Antwort!

Ich habs ausprobiert, leider habe ich immer noch das selbe Problem, der Asuro dreht sich nur im Kreis :(