Hallo MSSputnik,
elegante Lösung!
Wie erkennst du eine Kreuzung? Beide Fototransistoren dunkel? Könntest du bitte diesen Teil deines Programms posten?
Vielen Dank Red Baron
Hallo MSSputnik,
elegante Lösung!
Wie erkennst du eine Kreuzung? Beide Fototransistoren dunkel? Könntest du bitte diesen Teil deines Programms posten?
Vielen Dank Red Baron
Hallo,
hier ist meine Funktion, die die Regelung und auch das Kreuzungserkennen erledigt.
Prinzipiell erkenne ich eine Kreuzung daran, das beide LEDs dunkel werden. Eine beendete Line erkenne ich daran das beide LEDs hell werden.
Hoffe das hilft.Code:/* Schwellwerte für die Linienerkennung * Achtung stark Lichtabhängig. */ #define LIGHT_HIGH_MID 0x55 #define LIGHT_MID_LOW 0x28 char golinie(int left, int right, unsigned char settings, int speeddif) { unsigned char status=0; int fehler=0; unsigned int speedleft; unsigned int speedright; if (autoencode != ADC_RUN) RunADC(ADC_RUN); encoder[ODLEFT] = 0; encoder[ODRIGHT] = 0; MotorDir(left>0?FWD:RWD,right>0?FWD:RWD); while (run && (!gotSwitch || !(settings&RETURN_ON_SWITCH)) && encoder[ODLEFT] < abs(left) && encoder[ODRIGHT] < abs(right) && status != GREEN && (status!= RED || !(settings&GO_STOP_ON_CROSS))) { if (count72kHz > 18) { // regelung in definierten Zeitabschnitten ausführen !!! Sleep in dieser Schleife verboten!!! count72kHz = 0; fehler = line[0] - line[1]; fehler *= LKP; speedleft = BASESPEEDLEFT+speeddif+fehler; speedright = BASESPEEDRIGHT+speeddif-fehler; if (speedleft > 255) speedleft = 255; if (speedleft < 65) speedleft = 65; if (speedright > 255) speedright = 255; if (speedright < 65) speedright = 65; MotorSpeed(speedleft,speedright); status = 0; if (line[ODLEFT] < LIGHT_MID_LOW && line[ODRIGHT] < LIGHT_MID_LOW) status = RED; if (line[ODLEFT] > LIGHT_HIGH_MID && line[ODRIGHT] > LIGHT_HIGH_MID) status = GREEN; if (line[ODLEFT] >= LIGHT_MID_LOW && line[ODRIGHT] >= LIGHT_MID_LOW && line[ODLEFT] <= LIGHT_HIGH_MID && line[ODRIGHT] <= LIGHT_HIGH_MID) status = YELLOW; StatusLED(status); } } if (settings & GO_STOP) MotorSpeed(0,0); if (!run) return STOP_RUN; if (gotSwitch && (settings&RETURN_ON_SWITCH)) return STOP_SWITCH; if (status == GREEN) return LINE_LOST; if (status== RED && (settings&GO_STOP_ON_CROSS)) return LINE_CROSS; return GO_SUCCESS; }
Martin
Hi,
vielen Dank. Du (bzw. dein ASURO) erkennst eine Kreuzung bzw. ein Ende schon durch eine einzelne Messung. Ich habe irgendann einmal etwas ähnliches probiert (Linienende). Habe aber damals Mittelwerte über die Helligkeit gebildet und Mehrfachmessungen zum Erkennen einen Linienendes gemacht. War wohl ein bisschen kompliziert ...
Gruß Red Baron
@Martin: ich muß mir das Video erst anschaun (Player..), aber Gratulation, daß es funktioniert.
Leider war ich jetzt ziemlich im Diplomstreß, aber die Woche geht sich wieder ein Programmiernachmittag aus.
lg Melitta
Hm - Linienfolge, Kreuzung erkennen und Ziel erkennen funktionieren.
Aber ich steh grad ganz arg auf der Leitung - wie hast du die Kreuzungsliniensuche realisiert, also das Drehen zb. um maximal 50 Grad und gleichzeitiges Liniensuchen? Bitte um gedankliche Trittleiter.
Danke, lg Melitta
Hallo,
ich versuche es mal zu erklären und gehe von 2 vorasusetzungen aus: Sollte das nicht der Fall sein, einfach die Punkte überspringen, die nicht zutreffen.
1. Du verwendest die originalen asuro libraries
2. Du hast sonst keine erweiterten selber geschrieben
Zuerst habe ich die erweiterten Asuro Libraries verwendet bzw. z.T. auch selber geschrieben um ein paar anpassungen zu machen. Wenn du diese Libraries verwendest, kannst du den Zustand der Odometrie Zähler und der Linienverfolgung gleichzeitig abrufen. Zu finden sind die Libraries auf Sourceforge oder hier im Forum.
Dann habe ich mir 3 Funktionen geschrieben, die die Programmierung total vereinfacht haben (War bei mir ein aHa Erlebnis \/ )
1. Fahre eine Linie. Dabei werden nur die Liniensenoren benutzt. (Habe ich oben glaube ich gepostet.)
2. Fahre nach Vorgabe. Dabei werden nur die Odometriezähler benutzt.
3. Suche Linie. Dabei werden die Odometriezähler benutzt um eine vorgegebene Bewegung (Geradeaus oder Kurve oder eben drehen) durchzuführen. Dabei werden aber gleichzeitig die Liniensenoren abegfragt und eben wie in der obigen Funktion Fahre Linie ausgewertet.
Aufgrund der Rückgabewerde der Funktionen kann ich erkennen, was passiert ist und dann entsprechend darauf reagieren.
Was ich auch noch gemacht habe ist natürlich beim Drehen nach Links. Ich drehe mich erst um 45° ohne auf eine Linie zu achten und dann um weitere 50° wo ich wieder auf die Linie achte. Ansonsten würde ich mich nicht drehen, wenn die Linie geradeaus weiter geht.
Ich hoffe, das hilft.
Martin
@RedBaron
Das mit der Erkennung einer Linie auf das erste mal und nicht so wie du das gemacht hat hat natürlich den Vorteil, das es einfach ist. Hat aber auch den Nachteil, das es schon bei einer Falschmessung zu einem Fehler kommt.
Kannst auch im Video beobachten. Wenn der Asuro ganz Links auf dem Strich ist, macht er einmal den Fehler das er sich zu früh zurück dreht und damit den linken Teil zwiemal durchsucht.
Ausserdem habe ich festgestellt, das die Linienerkennung natürlich sehr stark vom Umgebungslicht abhängt. Es hat erst mal gar nix funktioniert als ich für das Video mehr Lampen aufgestellt habe um es heller zu machen. Da mußte ich dann erst die Linienerkennung neu Kalibrieren, was bei mir nicht automatisch geschieht.
Martin
@Martin: ja, danke das alles hilft mir sehr. Ich hab mir gestern noch gedacht, daß es eigentlich fast nur mit Hilfe der Odometrie gehen kann, codetechnisch ist mir dann aber nichts mehr Produktives eingefallen. Wenn du sagst, du hast gepimpte Libraries verwendet, die einen Odometrie und Linienmessung gleichzeitig kontrollieren lassen, dann werde ich mir die mal heraussuchen.
Eine Frage hab ich aber noch: hast du deine Odometrieeinheit geschirmt? Das war am Video nicht wirklich zu erkennen
Nach den Erfahrungen, die ich mit den Photosensoren gemacht habe, ist das Umgebungslicht ein arger Störfaktor...
Danke, lg Melitta
Hallo,
ich habe meine Odometrie Sensorik so wie Arexx sie schuf
aber ich habe die Schwellwerte deutlich anders gewählt als sie in den dortigen Funktionen angegeben sind.
Vorallem gibt es bei mir einen Unterschied zwischen Links und Rechts.
Irgendwo habe ich das schon mal gepostet (glaube ich). Ich werde es heute abend mal hier einstellen wie ich es realisiert habe (meine komplette ADC Funktion).
Ich habe allerdings meine Linieneinheit abgeschirmt. Ich habe einen Kartonstreifen genommen und den um alle 3 LED/Transitoren gewickelt. Damit erhalte ich eine bessere Ausleuchtung und eine Abschirmung vom Umgebungslicht.
Werde heute abend davon auch noch ein Bild einstellen.
Martin
Lesezeichen