PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linienfolger Problem



Double_A
10.05.2010, 12:38
Hallo,

Weiss jemand warum mein Code nicht richtig funktioniert?

Asuro soll einer schwarzen Linie mit Ecken und Gabelungen folgen.
Beide Lichtsensoren sind bestenfalls ausserhalb der Linie.



#include <asuro.h>
#include <stdbool.h>

//Prototyp
bool isBlack(int seite);

//Variable für Vergleichswerte der Lichtsensoren
unsigned int black [2];

unsigned int lineData [2];



int main(void) {
Init ();
FrontLED (ON);
MotorDir(FWD,FWD);

unsigned int speed [2];

unsigned int i;
//255 Messungen auf schwarzem Untergrund
for (i = 0; i < 255; i++) {
LineData(black);
}

GoTurn (30, 0, 150); // Zum Start der Linie fahren

while (1) {
speed[0] = 150;
speed[1] = 150;

//Solange nicht beide Sensoren auf der Linie sind, also auf keiner Gabelung...
while (isBlack(0) == false && isBlack(1) == false) {
MotorSpeed(speed[0], speed[1]);

if (isBlack(0)) {
speed[0] = 100;
speed[1] = 200;
} else if (isBlack(1)) {
speed[0] = 200;
speed[1] = 100;
} else {
speed[0] = 150;
speed[1] = 150;
}
}

//Bei einer Gabelung solange nach rechts drehen bis Asuro gerade auf dem rechten "Ast" steht
if (isBlack(0) && isBlack(1)) {
while (isBlack(0)){
MotorSpeed(250, 0);
}
}
}

return 0;
}


//Wenn Messung dunkler als Anfangsmessung + 10 als Toleranz
bool isBlack(int seite) {
LineData(lineData);

if (lineData[seite] < black[seite] + 10) {
return true;
} else {
return false;
}
}
}

Der Asuro fährt einfach immer gerade aus. Was ist das Problem?

Valen
10.05.2010, 17:43
Ich wundere mich wie du das Program kompiliert bekommen habst. Weil du einer Variabele oder Konstante benutzt das noch nicht definiert oder deklariert ist in deiner code. Ein C-Compiler muss immer gesagt werden was es machen soll.


for (i = 0; i < 255; i++) {
LineData(noLine);

Gab es keine kompilier warnungen/fehler in dem make ausgabe?

Aber das vermutliche Problem ist black[]. Du verwendest es in dem function isBlack, wo du die helligkeit der Linie verglichts mit den black werten. Aber die sind nirgends in deine code mit einer wert definiert. Es könnte jeder mögliche wert bekommen haben bei das anschalten von Asuro. Nie darauf verlassen das es 0, oder 1, oder was auch ist.



unsigned int black [2];

...

if (lineData[seite] < black[seite] + 10) {
...

Double_A
10.05.2010, 17:53
Sorry das noLine sollte black sein...
Hatte vorher noch eine Funktion die eine Sackgasse entdecken sollte drin, aber die hab ich wieder gelöscht. Und hab dabei nen fehler gemacht...


Hab jetzt den Code oben angepasst.

Valen
10.05.2010, 18:33
...
Hab jetzt den Code oben angepasst.Ok, aber keine werten gegeben an den array black. Ohne das hat den vergleichung in isBlack keinen sinn.

Double_A
10.05.2010, 18:50
Was meinst du?

black fülle ich doch hiermit

//255 Messungen auf schwarzem Untergrund
for (i = 0; i < 255; i++) {
LineData(black);
}

black ist ja auch global, und sollte auch in der Funktion zur Verfügung stehen, oder nicht?
Oder hab ich was wichtiges vergessen? Das ist nähmlich mein erstes Asuro-Programm....

Valen
10.05.2010, 22:05
Du hast recht. Ich habe das völlig ubersehen das es diese werten setzt. Ich hatte warscheinlich noch deine alte code im kopf.

Nun den frage, macht er nun etwas anderes als gerade aus fahren?

Double_A
10.05.2010, 22:42
Also die FrontLED schaltet sich schonmal ein und ich glaube die Messungen werden gemacht (das dauert ja fast nix oder?)

Danach als es zur Linie fährt, fährt er einfach immer gerade aus...
Am GoTurn sollte es eigentlich nicht liegen, hab die myasuro.h schon angepasst...

Von der Logik her müsste ja eigentlich auch alles passen.
Kannst du mal das Programm auf deinen Asuro laden und schauen was der macht? Vllt ist meiner ja defekt oder so...

Die Strecke ist einfach eine Linie mit einem schwarzen Kasten am Anfang, indem sich die Sensoren beim Start befinden.


Wenns trotzallem doch nicht klappen sollte, hab ich mir eine andere Logik überlegt und zwar dass ein Sensor immer auf der Linie sein soll und der andere immer z.B. Links von der Linie. Meinst du das könnte klappen?

Valen
10.05.2010, 23:07
Mein Asuro ist noch in die Garage. Ich arbeite an eine funk-verbindung mit Xbee modulen. Ich muss das ganze erst gut testen. Vielleicht kan jemand anders dein program ausprobieren. Ich kan leider nur theoretisch helfen.

Ob das geht ist von mir aus nicht einfach zu sagen. Das ist einer schwarze linie auf weissen untergrund? Und wie dick ist der linie? Im vergleich mit den liniensensor abstand. Beim fahren verursachen die motoren schwankungen in die messe ergebnissen. Vielleicht ist dein 10 wert zu wenig dammit er reagiert.

Habst du schon ein program geschrieben das den beide linie helligkeiten zum rechner schikt. Dann kannst du besser be-urteilen wie er reagiert auf der rand einer linie. Und weisst du auch gleich wie gross die störungen sein. Den motoren drehen lassen wan er mit den rädern ein bisschen von den tisch aufgeheben ist (sondern rutscht er weg), und unter den sensoren eine kurze linie strecke. ;)

radbruch
10.05.2010, 23:09
Hallo

Ich habe mir bisher nur den isBlack-Teil deines Programms angeschaut und ich verstehe nicht ganz, was du damit bezwecken willst. Zuerst liest du zig mal die Werte der Liniensensoren ein und letztlich wird doch eh nur der zuletzt gelesene Wert verwendet. Und wie kommst du eigentlich auf die +10-Toleranz bei der hell/dunkel-Entscheidung?

Um eine halbwegs verlässliche Referenz für Dunkel zu erhalten würden ein paar Lesungen mit Mittelwertbildung ausreichen:

LineData(black);
LineData(black); // sicher ist sicher ;)
for (i = 0; i < 5; i++) {
Sleep(50);
LineData(lineData);
black[0]=(black[0]+lineData[0])/2;
black[1]=(black[1]+lineData[1])/2;
}

Gruß

mic

Double_A
10.05.2010, 23:41
Die 10 Toleranz hab ich einfach mal so genommen...

Die 255 Messungen habe ich gemacht weil ich irgendwo mal gelesen hab, dass die Sensoren am Anfang nicht gleich dir richtigen werte liefern...

Aber danke für die Idee mit den Durchschnitt. Werd ich mal probieren wenn ich mal wieder einen Asuro hab...
Die sind in der Schule >.<

Und meinst du sollte ich statt der 10 einen prozenturalen Wert als Toleranz nehmen, 5% oder so...