Ansatz zur Verwendung von PID, um einen Differentialroboter geradeaus fahren zu lassen


13

Stellen Sie sich einen Roboter mit Differentialantrieb vor, der über zwei motorisierte Räder mit jeweils einem Encoder verfügt, um eine Rückmeldung zu erhalten. Angenommen, es gibt eine Funktion für jeden Gleichstrommotor, die einen Schwebezustand von -1 bis 1 annimmt und die PWM-Signale so einstellt, dass dem Motor eine proportionale Leistungsmenge zugeführt wird. Leider sind nicht alle Motoren gleich, so dass der Roboter durch das Senden des gleichen PWM-Signals für jeden Motor nach links oder rechts wechselt. Ich versuche darüber nachzudenken, wie ich den Roboter mit den an jedem Motor angebrachten Encodern als Eingang für eine PID-Schleife geradeaus fahren kann.

Hier ist, wie ich es machen würde: Ich würde den Unterschied zwischen dem linken und dem rechten Encoder nehmen, den Fehler zwischen einem Bereich begrenzen, ihn auf [-1, 1] normieren und ihn dann den Motorleistungen 0 bis 1 zuordnen. Wenn also I und D Null wären und wir einen Fehler von 1 erhalten (der linke Motor hat sich also viel stärker gedreht als der rechte Motor), würde der linke Motor auf 0 und der rechte Motor auf 1 gesetzt (was einen harten Motor verursacht) links).

Gibt es irgendwelche Probleme damit? Was ist ein besserer Ansatz?

Antworten:


5

Gibt es irgendwelche Probleme damit?

Das Hauptproblem dabei ist, dass die von Ihnen vorgeschlagene Lösung zwar augenblicklich eine Nichtübereinstimmung zwischen der Leistung der Motoren korrigiert, aber keine Fehler, geschweige denn komplexere Positionsfehler wie Abbe-Fehler (siehe später) korrigiert .

Was ist ein besserer Ansatz?

Es gibt verschiedene Möglichkeiten, je nachdem, wie tolerant Sie gegenüber Fehlern sind und mit welchem ​​Aufwand Sie diese beheben möchten.

Der erste Schritt wäre, ein Paar PID-Schleifen für jedes Rad einzurichten, wodurch beide die gleiche Bedarfsposition erhalten. Wie ich in meiner Antwort auf eine ähnliche Frage vorgeschlagen habe , wird es einige Zeit dauern, bis sich genügend Fehler angesammelt haben, um eine merkliche Abweichung zu verursachen, wenn Sie beide Räder innerhalb eines sehr engen Fehlerbereichs halten, an dem Sie sie erfragen.

Es ist auch viel einfacher, zwei nominell unabhängige Motorpegel-PID-Regelkreise abzustimmen, als ein einzelnes komplexes, voneinander abhängiges kombiniertes System abzustimmen. Um einer Änderung der übergeordneten Steuerung standzuhalten, muss sich jeder Motor so lange wie möglich so ähnlich wie möglich wie der andere Motor verhalten. Dazu sind separate Servoschleifen erforderlich.

Es gibt jedoch eine Reihe weiterer Komplikationen, und es hängt davon ab, welche Genauigkeit Sie benötigen und wie viel Aufwand Sie bereit sind, um zu korrigieren, für welche Lösung Sie sich entscheiden. Es kann sein, dass Dead Reckoning ausreicht, oder dass Sie Ihrem Roboter eine relative oder absolute Positionsbestimmung hinzufügen müssen.

Ein Problem ist, dass Sie, selbst wenn Ihr linkes und rechtes Rad jeweils 1000 Encoder-Zählungen ausführen, bei zwei verschiedenen Läufen möglicherweise immer noch an einer anderen Position landen.

Angenommen, Sie haben einen maximalen Schleppfehler von 10 Geberzählern und Ihre Motoren laufen mit einer Drehzahl von beispielsweise 10 Geberzählern pro PID-Schleifeniteration. Ihr linker Motor bewegt sich möglicherweise 5,10,10,10 ... 10,5, während Ihr rechter Motor ein Profil von 4,11,10,10 ... 10,5 und sogar diesen kleinen Unterschied in der Beschleunigung beim Start aufweist von der Bewegung könnte dazu führen, dass der Roboter leicht in die falsche Richtung fährt. Nicht nur das, sondern je weiter Sie sich in diese Richtung bewegen, desto größer wird der Fehler in absoluten Zahlen. Dies ist es, worüber wir sprechen, wenn wir von einem Abbe-Fehler sprechen , und ohne ein komplexes kinematisches Modell oder eine Art externen Bezug werden Sie niemals in der Lage sein, dies zu korrigieren.

Weitere Informationen finden Sie in meiner Antwort auf eine ähnliche, aber nicht ganz identische Frage: Wie kann ich die Arduino PID-Bibliothek verwenden, um einen Roboter in einer geraden Linie zu fahren? und meine antwort auf die ebenfalls verwandte line follower optimierung


2

Ich habe einen Bot mit 2 unabhängig angetriebenen Rädern.

Ich habe mich für einen Kreisel entschieden, um den Kurs in der gewünschten Richtung zu halten. Stöße, die verrutschen und sogar das Aufheben und Wenden sind für den Kreisel unerheblich, da der Kurs nur korrigiert wird.

Ich verwende eine einzelne PID, die für jeden der beiden Motoren eine Korrektur der gewünschten Stromgeschwindigkeit entsprechend dem vom Kreisel ermittelten Fehler in der Stromrichtung addiert / subtrahiert.

Zum Beispiel habe ich die Geschwindigkeit auf 50% und die Überschrift auf 20 Grad eingestellt. Dies würde normalerweise beide Motoren mit 50% Leistung antreiben. Wenn der Steuerkurs abweicht, nimmt die PID Anpassungen vor, die einem Motor etwas Leistung zuführen und dem anderen etwas Leistung entziehen, sodass Sie möglicherweise eine Leistungsaufteilung von 45% / 55% zwischen den Motoren erzielen, wenn der Steuerkurs durch die PID korrigiert wird.

Gyros haben ihre Probleme, obwohl ich trotz einiger Zeit mit dem Kalibrieren immer noch feststelle, dass mein Gryo eine Abweichung von etwa 1 Grad pro Minute hat. Es könnte sein, dass sich die Erde um 15 Grad pro Stunde dreht, dies sollte auf lange Sicht auch berücksichtigt werden.

Wie bereits erwähnt, sind Encoder auf den Rädern eine gute Idee, um tatsächlich zu wissen, wie weit Sie gereist sind.


Ich würde gerne Ihren Code dafür sehen. Ich beginne den gleichen Weg mit einem Gyro / Beschleunigungsmesser / Magnetometer, aber ich bin noch in einem sehr frühen Stadium, nur zu versuchen, die Messwerte dieser Sensoren zu verstehen.
Ron Smith

Hier ist ein Link zu meinem Code, der leider nicht leicht zu verstehen ist. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Robert Sutton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.