PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Algorithmus zur synchronen Motorsteuerung



Gromit
25.11.2004, 17:04
Sorry vorweg, ich glaube, ich begehe gerade ein [-X .
Vor einigen Tagen habe ich unter "Allgemeines" einen thread gestartet und bisher - für unser rn ungewöhnlich - 0 Antworten bekommen. Da es auch sehr wenige Leser gegeben hat, vermute ich, dass ich im falschen Unterforum war.
Bitte steinigt mich nicht - ich brauch' wirklich Eure Hilfe. Gromit

P.S. Wenn die Frage zu spezifisch ist -> wie synchroniziert Ihr den Gleichlauf von 2 Motoren?
===========================

Ich bin soweit die Regelung von 2 Antriebsmotoren zu programmieren.
Die Ist-Geschwindigkeit der beiden Räder messe ich mit Reflexlichtschranken und auf den Rädern aufgeklebten Segmentscheiben (36 Segmente).
Die Steuerung übernimmt mein CII mit einem PI-Regler-Algorithmus. Diesen habe dem Buch "Mobile Roboter" von Jones/Flynn S. 216ff entnommen.

Das funktioniert teilweise (saubere Geradeaus-Fahrt) schon sehr gut. Bei Kurvenfahrten oder Drehen am Platz "schwingt" der Regelkreis aber noch "chaotisch". Habt Ihr praktische Erfahrungen, wie man am besten die richtigen Reglerwerte bekommt? Mit Trial&Error bin ich noch nicht weit gekommen.

Meine momentanen Regler-Parameter:
- Regler-Zyklus: alle 1/4 sec
- Integral-Regler-Wert = 0,05
- Proportional-Regler-Wert = 0,5
Vorgabe von Sollgeschwindigkeit und Soll-Drehdifferenz in der Einheit Segmente/sec (Werte zwischen 0 und 30).

Danke im voraus an die Profi
Gromit

talentraspel_kai
03.12.2004, 17:31
Hallo.

Unter http://www.talentraspel.de/portal/index.php?id=71&type=1 habe ich ein komplettes System ohne Regelkreis dazu entwickelt.

Da du mit 2 Radencodern arbeitest, kannst du den Lösungsansatz verwenden. Allerdings musst du das Programm von der Programmiersprache C auf die in der CII verwendete Programmiersprache umsetzen. Ich weiss nicht, ob die CII dann dafür genügend Power hat.

Zu dem Algorithmus hatte ich in einem anderen Thread mal folgendes geschrieben:

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.


Ein Ansatz über einen PI-Regler halte ich für problematisch, da hier wenig Rücksicht auf Sonderfälle genommen werden kann.


Grüße,
Kai.