s.frings
14.04.2010, 16:03
Da ich an dem Fahr-Programm nicht mehr weiter arbeite, beschreibe ich nun wie versprochen meine Erkenntnisse zusammengefasst:
Mein Roboter hat einen Motor für das linke Rad und einen für das rechte Rad. Als drittes Standbein dient ein Gleitfuß in der Mitte. Folgende Erkenntnisse beziehen sich auf diese Bauart:
Beide Motoren beginnen die Rotation erst bei etwa 20% PWM. Wenn sie sich erstmal drehen, kann man wieder viel langsamer werden, ohne daß die Motoren ungewollt blockieren.
Startet man mit zu gringem PWM Wert, neigen die Motoren sporadisch dazu, fest zu stecken und erst bei stark erhöhten Werten (z.B. 500) plötzlioch los zu schießen.
Die Motoren drehen sich links/rechts herum unterschieldich performant. Da sie entgegen gerichtet eingebaut sind, fährt der Roboter also zwangsläufig eine deutliche Kurve, wenn man mit gleichen PWM Werten vorwärts oder rückwärts fährt. Die Abweichung lag bei mir im Bereich von +/-1%.
Weiterhin sind linker und rechter Motor auch bei gleicher Laufrichtung nicht gleich performant. Wenn das dritte Bein nicht exakt zentriert ist, führt auch dies zu unsymmetrischem Verhalten. Die Abweichung lag bei mir ebenfalls im Bereich von +/-1%.
Der Motor darf nicht zu schnell beschleunigen, sonst rutschen die Räder durch. Gleiches gilt für das Bremsen. Ich habe herausgefunden, daß ein I-Regler für diesen Faktor am besten geeignet ist.
Man braucht also folgende Konstanten für die Berechnung der PWM Ansteuerung:
- Minimaler PWM Wert beim Start
- Performance-Verhältnis zwischen links- und rechts-Lauf
- Performance-Verhältnis zwischen linkem und rechtem Motor
- Maximale Beschleunigung bzw. Bremsung (I-Regler).
Für eine ordentliche Regelung ist ein Regel-Intervall im Bereich 100-200ms gut geeignet.
Der Odometrie Sensor liefert nur 20 Impulse pro Radumdrehung. Bei niedrigen Drehzahlen sind das pro Regel-Intervall 0-2 Impulse! Aufgrund dessen ist es keine gute Idee, den Regler wie in der Wiki beschrieben zu programmieren (Fehler pro Intervall ermitteln und diese Fehler über längere Zeit addieren). Wenn wir z.B. nur 5cm pro Sekunde fahren, was der Roboter durchaus präzise kann, dann haben wir manchmal einen Impuls pro Intervall und manchmal 0 Impulse. Beide Werte sind völlig falsch.
Besser ist es, die insgesamt gefahrene Strecke durch die insgesamt gefahrene Zeit zu teilen, das Ergbnis mit einem konstanten Faktor zu multiplizieren und dann zum aktuellen PWM-Wert zu addieren. Letztendlich ist das vom Prinzip her immer noch ein integraler Regler, aber mit etwas anderer Charakteristik, als die Formel im Wiki.
Wer vorhat, einen P-Anteil hinzuzufügen, sollte entsprechend nicht nur die Abweichung im aktuellen Intervall berücksichtigen, sondern die Abweichung aus mehreren Intervallen (z.B der letzten 1000ms) verwenden und Odometrie Werte < 4 überhaupt nicht zur Regelung heran ziehen.
Nun zur Lenkung:
Nach einigem herum probieren bin ich zu dem Schluß gekommen, daß das Lenkrad-Modell am besten geeignet ist. Denn wenn ich jeden Motor für sich regele und dann kurven fahren will, wirds insbesondere beim Wechseln von einer Rechtskurve in eine Linkskurve ohne Zwischenstopp problematisch. Der Roboter fährt solche Manöver am besten, wenn sich seine mittlere Fahrgeschwindigkeit bei einem solchen Kurvenwechsel nicht verändert, sondern nur die Fahrtrichtung. Dies lässt sich am einfachsten durch ein Lenkrad-Modell auf eine Geschwindigkeits-Steuerung drauf bauen.
Zum Geradeausfahren steht das Lenkrad in der Mitte (Wert 1.00). Ich kann nun das Lenkrad (also den Soll-Wert) nach links oder nach rechts drehen. 0,5 bedeutet, das linke Rad dreht sich halb so schnell, wie das rechte. 2.0 bedeutet, das rechte Rad dreht sich halb so schnell, wie das linke.
Ein Arbeitskollege war so nett, die Formel zu erarbeiten, die mir sagt, um wie viel die PWM für links und rechts verändert werden müssen, um einem bestimmten Lenker-Einschlag zu entsprechen:
PWM_Offset=PWM * (-1-Lenkrad)/(1-Lenkrad)
PWM_Links=PWM+PWM_Offset
PWM_Rechts=PWM-PWM_Offset
Dabei ist PWM der PWM Wert aus der Geschwindigkeitsregelung (für Geradeausfahrt), PWM_Links und PWM_Rechts sind die Werte, mit denen die Motoren angesteuert werden müssen.
Jetzt muß noch jemand das Lenkrad drehen. Ich habe dies mit einem PI Regler am besten hinbekommen. Wie oben beschrieben, habe ich auch hier einen etwas anderen Algorithmus angewendet.
Ich messe die Differenz der beiden Odometrie-Sensoren (seit Beginn der Kurve), vergleiche sie mit dem Soll (per Division!) und multipliziere die Differenz mit einem I-Faktor. Das ist dann mein Lenk-Einschlag, der im Idealfall 1 beträgt und im Fehlerfall etwas mehr oder weniger als 1.
Ein P-Faktor kann hinzugefügt werden, um den Wechsel von einer Rechtskurve in eine Linkskurve erheblich zu beschleunigen. Für die Berechnung des P-Faktor verwende ich nur die Abweichung vom Soll aus dem aktuellen Zeitintervall, und das auch nur, wenn die Odometrie Sensoren beide mindestens 4 Takte geliefert haben. Bei sehr niedrigen Geschwindigkeiten habe ich daher keinen P-Anteil.
Das Ergebnis dieser Logik kann man hier begutachten: http://www.youtube.com/watch?v=9EFK7XmfD08
Man beachte, daß der Roboter mehrfach (beinahe exakt) zum Ausgangspunkt zurück kehrt, also sowohl Strecke als auch Fahrtrichtung recht gut einhält.
Mein Roboter hat einen Motor für das linke Rad und einen für das rechte Rad. Als drittes Standbein dient ein Gleitfuß in der Mitte. Folgende Erkenntnisse beziehen sich auf diese Bauart:
Beide Motoren beginnen die Rotation erst bei etwa 20% PWM. Wenn sie sich erstmal drehen, kann man wieder viel langsamer werden, ohne daß die Motoren ungewollt blockieren.
Startet man mit zu gringem PWM Wert, neigen die Motoren sporadisch dazu, fest zu stecken und erst bei stark erhöhten Werten (z.B. 500) plötzlioch los zu schießen.
Die Motoren drehen sich links/rechts herum unterschieldich performant. Da sie entgegen gerichtet eingebaut sind, fährt der Roboter also zwangsläufig eine deutliche Kurve, wenn man mit gleichen PWM Werten vorwärts oder rückwärts fährt. Die Abweichung lag bei mir im Bereich von +/-1%.
Weiterhin sind linker und rechter Motor auch bei gleicher Laufrichtung nicht gleich performant. Wenn das dritte Bein nicht exakt zentriert ist, führt auch dies zu unsymmetrischem Verhalten. Die Abweichung lag bei mir ebenfalls im Bereich von +/-1%.
Der Motor darf nicht zu schnell beschleunigen, sonst rutschen die Räder durch. Gleiches gilt für das Bremsen. Ich habe herausgefunden, daß ein I-Regler für diesen Faktor am besten geeignet ist.
Man braucht also folgende Konstanten für die Berechnung der PWM Ansteuerung:
- Minimaler PWM Wert beim Start
- Performance-Verhältnis zwischen links- und rechts-Lauf
- Performance-Verhältnis zwischen linkem und rechtem Motor
- Maximale Beschleunigung bzw. Bremsung (I-Regler).
Für eine ordentliche Regelung ist ein Regel-Intervall im Bereich 100-200ms gut geeignet.
Der Odometrie Sensor liefert nur 20 Impulse pro Radumdrehung. Bei niedrigen Drehzahlen sind das pro Regel-Intervall 0-2 Impulse! Aufgrund dessen ist es keine gute Idee, den Regler wie in der Wiki beschrieben zu programmieren (Fehler pro Intervall ermitteln und diese Fehler über längere Zeit addieren). Wenn wir z.B. nur 5cm pro Sekunde fahren, was der Roboter durchaus präzise kann, dann haben wir manchmal einen Impuls pro Intervall und manchmal 0 Impulse. Beide Werte sind völlig falsch.
Besser ist es, die insgesamt gefahrene Strecke durch die insgesamt gefahrene Zeit zu teilen, das Ergbnis mit einem konstanten Faktor zu multiplizieren und dann zum aktuellen PWM-Wert zu addieren. Letztendlich ist das vom Prinzip her immer noch ein integraler Regler, aber mit etwas anderer Charakteristik, als die Formel im Wiki.
Wer vorhat, einen P-Anteil hinzuzufügen, sollte entsprechend nicht nur die Abweichung im aktuellen Intervall berücksichtigen, sondern die Abweichung aus mehreren Intervallen (z.B der letzten 1000ms) verwenden und Odometrie Werte < 4 überhaupt nicht zur Regelung heran ziehen.
Nun zur Lenkung:
Nach einigem herum probieren bin ich zu dem Schluß gekommen, daß das Lenkrad-Modell am besten geeignet ist. Denn wenn ich jeden Motor für sich regele und dann kurven fahren will, wirds insbesondere beim Wechseln von einer Rechtskurve in eine Linkskurve ohne Zwischenstopp problematisch. Der Roboter fährt solche Manöver am besten, wenn sich seine mittlere Fahrgeschwindigkeit bei einem solchen Kurvenwechsel nicht verändert, sondern nur die Fahrtrichtung. Dies lässt sich am einfachsten durch ein Lenkrad-Modell auf eine Geschwindigkeits-Steuerung drauf bauen.
Zum Geradeausfahren steht das Lenkrad in der Mitte (Wert 1.00). Ich kann nun das Lenkrad (also den Soll-Wert) nach links oder nach rechts drehen. 0,5 bedeutet, das linke Rad dreht sich halb so schnell, wie das rechte. 2.0 bedeutet, das rechte Rad dreht sich halb so schnell, wie das linke.
Ein Arbeitskollege war so nett, die Formel zu erarbeiten, die mir sagt, um wie viel die PWM für links und rechts verändert werden müssen, um einem bestimmten Lenker-Einschlag zu entsprechen:
PWM_Offset=PWM * (-1-Lenkrad)/(1-Lenkrad)
PWM_Links=PWM+PWM_Offset
PWM_Rechts=PWM-PWM_Offset
Dabei ist PWM der PWM Wert aus der Geschwindigkeitsregelung (für Geradeausfahrt), PWM_Links und PWM_Rechts sind die Werte, mit denen die Motoren angesteuert werden müssen.
Jetzt muß noch jemand das Lenkrad drehen. Ich habe dies mit einem PI Regler am besten hinbekommen. Wie oben beschrieben, habe ich auch hier einen etwas anderen Algorithmus angewendet.
Ich messe die Differenz der beiden Odometrie-Sensoren (seit Beginn der Kurve), vergleiche sie mit dem Soll (per Division!) und multipliziere die Differenz mit einem I-Faktor. Das ist dann mein Lenk-Einschlag, der im Idealfall 1 beträgt und im Fehlerfall etwas mehr oder weniger als 1.
Ein P-Faktor kann hinzugefügt werden, um den Wechsel von einer Rechtskurve in eine Linkskurve erheblich zu beschleunigen. Für die Berechnung des P-Faktor verwende ich nur die Abweichung vom Soll aus dem aktuellen Zeitintervall, und das auch nur, wenn die Odometrie Sensoren beide mindestens 4 Takte geliefert haben. Bei sehr niedrigen Geschwindigkeiten habe ich daher keinen P-Anteil.
Das Ergebnis dieser Logik kann man hier begutachten: http://www.youtube.com/watch?v=9EFK7XmfD08
Man beachte, daß der Roboter mehrfach (beinahe exakt) zum Ausgangspunkt zurück kehrt, also sowohl Strecke als auch Fahrtrichtung recht gut einhält.