Schau Dir mal das Video an. Da fährt der Roboter im Hauptprogramm folgende Kommandosequenz:
move_absolute( 50, 50);
move_absolute(-50, 50);
move_absolute(-50,-50);
move_absolute( 50,-50);
move_absolute( 50, 50);
move_absolute(-50,-50);
move_absolute( 0, 0);
Den Rest erledigt die Interruptsteuerung komplett im Hintergrund.
Allerdings war ein bischen Trickserei nötig. Hier der Algorithmus:
1. Roboter weiss wo er ist und wohin er schaut
2. Roboter bekommt Befehl wohin er soll
3. Roboter errechnet Drehwinkel und ermittelt daraus Schritte
für Drehung auf der Stelle
4. Roboter dreht, zieht aber VORHER den Nachlauf ab
5. Roboter wartet 1/5 Sekunde, dann ist der Nachlauf vorbei.
6. Roboter addiert die gefahrenen und nachgelaufenen Schritte
und bestimmt dann den tatsächlich gedrehten Winkel.
7. Nun bestimmt der Roboter das zu fahrende Streckensegment
8. Roboter fährt, zieht aber VORHER den Nachlauf ab
9. Roboter wartet 1/5 Sekunde, dann ist der Nachlauf vorbei.
10. Roboter addiert die gefahrenen und nachgelaufenen Schritte
und bestimmt dann die tatsächlich gefahrene Stecke.
11. Roboter ist ziemlich genau da wo her hin soll
=> Der Roboter weiss immer wo er ist und wo er hinschaut, kleine Fahrfehler durch Nachlauf kriegt er mit und kompensiert sie automatisch
beim nächsten Fahrbefehl.
Und ganz wichtig: Der Roboter fährt jede Bewegung langsam an und bremst auch langsam wieder ab (Ramp Up udn Ramp Down). Damit gibt es keinen Schlupf beim Fahren.
Das Programm liegt auf meiner WebSite, wenn Du Dir das mal ansehen willst. PWM, Schritte zählen und Navigation sind in der Interruptroutine. Das müsste sich eigentlich nachvollziehen lassen.
Ich habe bewußt zunächt keine
Sensoren ausser den
Sensoren in den Rädern verwendet. Am nächsten Wochenende will ich dann Abstandssensoren anbringen, über die der Roboter seine Umgebung wahrnimmt und sich dann immer wieder auf einer internen Karte justiert. Er driftet ja doch nach einer Weile ab und muss mal wieder einen absoluten Bezugspunkt finden.
Beim Linienfolgen benutze ich nur den Sensor unter dem Roboter. Das sind 8xCNY70, die ich über einen A/D-Wandler abfrage. Da schreibe ich gerade einen neuen Algorithmus.
Der alte Algorithmus, mit dem ich im April auf der RoboChallenge bei "Finde den Weg" gewonnen habe, war auch gut. Aber ich will einfach die Aufgabe noch mal aus einem anderen Blickwinkel lösen.
Beim alten Algorithmus hatte ich ein Modul für den Liniensensor gebaut, das mir einfach auf einer Skala von 0-14 mir einer Auflösung von 0.25 die Position der Linie am Sensor zurckgab. Wenn sich die Linie geteilt hat, kamen zwei Werte zurück. Die Breite der Linie wurde dadurch gefiltert.
Zum auf der Linien bleiben musst ich eigentlich nur anhand der Abweichung von der Mitte (7) gegensteuern, bei Abzweigungen halt die rechte oder linke Linien zur Mitte erklären. Knifflig wurde es bei spitzen Abzweigungen, Winkeln und dem T-Stück. Da musste noch etwas zusätzliche Logik in die Erkennung. Alles zusammen hat dann ein Zustandautomat gesteuert.
Lesezeichen