Hey! Sie scheinen aus United States zu kommen, möchten Sie auf die Englisch Webseite wechseln?
Switch to Englisch site
Skip to main content

Ihrem Roboter die Mobilitätssteuerung eines echten Mars Rover geben: Teil 3

Teil 1 hatte die Theorie hinter der PID-Steuerung zum Thema. In Teil 2 ging es um die praktischen Aspekte der Odometrie und die Verwendung von PID zur präzisen Navigation mobiler Roboter. Sehen wir uns nun weiteren Code und andere praktische Konstruktionsmerkmale eines Rovers an.

Mars_Curiosity_wheels_28d1fcd7c0159c4a35e5b47479d99c31905cbd81.png

Radschäden am Mars Curiosity Rover         Quellenangabe: NASA/JPL

Ein „Closed Loop“-System zur Steuerung der Radgeschwindigkeit

Ich habe ein System in zwei Teilen implementiert:

  • Ein Programm auf übergeordneter Ebene, in meinem Fall in FORTHdsPIC geschrieben, einem Dialekt der Forth-Sprache zur integrierten Steuerung. Dieser Code führt die höheren „Hirnfunktionen“ aus, z. B. Überwachung der Sensoreingänge und als Reaktion darauf ein entsprechender Motorenantrieb anhand eines Masterplans. Der Masterplan könnte darin bestehen, einen bestimmten Geländeabschnitt zu erforschen und zu kartografieren, ohne dabei in Löcher zu stürzen oder gegen Wände zu fahren. Das in Programmausdruck 1 zu Veranschaulichungszwecken gezeigte einfache Programm tut nicht viel, außer auf aktuelle Daten vom Radtachometer zu warten und dann einen neuen Steuerungswert für das Motorantriebssystem zu berechnen.
  • „Bare Metal“-Code auf untergeordneter Ebene, der anhand der Impulsdaten von einem Schlitzscheibentachometer die Drehgeschwindigkeit eines Rads festlegt (siehe Teil 2). Dieser Code ist Teil einer Interrupt Service Routine (ISR), die mithilfe der „Input Capture“-Hardware des dsPIC das Zeitintervall zwischen Tachoimpulsen misst. Es ist nicht notwendig, ein Zeitintervall in die entsprechende Geschwindigkeit umzurechnen – es reicht aus, den Sollwert zur Berechnung der Abweichung ebenfalls als Zeitintervall anzugeben. Die ISR berechnet darüber hinaus die neue rohe (noch ohne Anwendung der K-Faktoren) Abweichung sowie den I- und D-Wert für den Regelkreis zur Motorsteuerung und speichert diese Werte im RAM, wo das übergeordnete Programm sie ausliest. Der ISR-Code wird nur ausgeführt, wenn auf der ansteigenden Kante eines Tachoimpulses der Interrupt ausgelöst wird. Das bedeutet, dass die Rohdatenwerte im RAM nach jedem Tachoimpuls aktualisiert werden.

Die ISR des Tachometers erledigt die grobe Arbeit für den PID-Algorithmus, wodurch der Forth-Code nur noch die K-Faktoren anwenden und die Zahlen anpassen muss, um einen Steuerungswert für den Treiber des PWM-Servomotors zu ermitteln. Diese Aufteilung sorgt für maximale Flexibilität. Die ISR ist Teil der in den Flash-Speicher des Zielsystems integrierten FORTHdsPIC-Umgebung. Der Forth-Code auf übergeordneter Ebene wird vom Benutzer bereitgestellt und normalerweise als Textdatei von einem Host-PC in den RAM heruntergeladen. Der Benutzercode kann dabei die zu verwendende Kombination von P, I und D, die K-Faktoren und den Sollwert festlegen.

PID3_blog_11_201cc08b28697b30ae36b4baa4e48953ee8db7de.png

Ein genauerer Blick auf das einfache übergeordnete Programm

Die ersten fünf Zeilen in Programmausdruck 1 sind „Doppelpunktdefinitionen“ neuer Wörter, die später im Programm verwendet werden. LIMITwird verwendet, um den Wertebereich des obersten Stack-Elements einzuschränken. PROPINTL und DERV führen jeweils die kombinierte Anpassung und Multiplikation der rohen P-, I- und D-Variablen durch K-Faktoren durch und hinterlassen das verarbeitete Ergebnis auf dem Stack. PID bildet die Summe dieser drei Komponenten.

Als Nächstes kommt die Definition für das übergeordnete Programm, das den Regelkreis enthält. Dieser läuft kontinuierlich, sobald MAIN <Eingabe> in die Befehlszeile eingegeben wird. Die ersten Zeilen von MAIN werden nur einmal ausgeführt, initialisieren einige Variablen und starten den Motor, der für 60 ms läuft, bevor der Regelkreis „geschlossen“ wird. Siehe „Praktische Probleme“ weiter unten.

Schließlich haben wir den im Regelkreis BEGIN …..AGAIN enthaltenen PID-Steuercode. Beachten Sie, dass nur dann ein neuer Steuerungswert berechnet wird, wenn die ISR des Tachometers aktualisierte Werte ausgibt. Daher endet der Regelkreis BEGIN ….UNTIL, wenn die ISR die Markierung PULSE setzt. Diese wird dann gelöscht und das Wort PID steht für die Berechnung des neuen Steuerungswerts. Als einfache Vorsichtsmaßnahme gegen negative oder zu große Steuerungswerte wird LIMIT ausgeführt, bevor der neue Wert an die Routine CSERVO des Controllers des PWM-Servomotors mit kontinuierlicher Rotation gesendet wird. Das war's!

Verbessern der Präzision

Die relativ ungenaue Messung mit radmontierten Tachometern kann erheblich verbessert werden, wenn zwischen Motor und Rad ein Untersetzungsgetriebe verwendet wird. Wenn der Tachosensor nicht an der Radachse, sondern an der Motorabtriebswelle anliegt, dreht er sich n Mal für jede Drehung des Rads, wobei n das Übersetzungsverhältnis ist. Wenn die Tachoscheibe 20 Schlitze hat und das Übersetzungsverhältnis 100 zu 1 lautet, werden für jede Raddrehung also 2000 Impulse erzeugt. Selbstverständlich setzt dies voraus, dass der Prozessor die entsprechende Frequenz von Impuls-Interrupts bewältigen kann!

Praktische Probleme – Starten

Das Problem der falschen Tachodaten bei den ersten paar Impulsen nach einem Start aus der Ruheposition lässt sich umgehen, indem der Motor für kurze Zeit im „Open Loop“-Modus läuft. In diesem Fall bin ich zu dem Ergebnis gekommen, dass 60 ms ausreichen und dass die Tachodaten nach diesem Zeitraum verwendet werden können. Der Motorsteuerungswert, der für den Start verwendet wird, sollte derjenige sein, der vom PID-Regelkreis erzeugt wird, wenn der Motor mit der Sollgeschwindigkeit läuft. Er kann durch Ausführen eines kleinen Programms ermittelt werden, das den Motor mit bestimmten Einstellungen im „Open Loop“-Modus laufen lässt und die entsprechende Geschwindigkeit vom Tachometer in den PC einliest. Anschließend kann dann für eine Reihe von Steuereingängen eine „Kalibrierungskurve“ gezeichnet werden. Im hier zur Veranschaulichung gezeigten Programm entspricht ein Steuerungswert von 30 in etwa der Sollgeschwindigkeit von 1800. Um die Datenlücke beim Start weiter zu verringern, kann der Integralwert auf seinen Zielwert voreingestellt werden. Bei der Zielgeschwindigkeit ist ERROR = 0, sodass das Integral als einzige Komponente von P, I und D nicht gleich 0 ist. Das bedeutet in diesem Fall, dass INTL einen Wert von 30 ergibt. Wenn wir einen Ki-Faktor von 0,01 voraussetzen, sollte der Startwert der Rohdatenvariable INTEG auf 3000 gesetzt werden.

Praktische Probleme – Einsatz bei Lastbetrieb

Die in meinem zur Veranschaulichung angeführten Programm verwendeten Zahlen gelten für einen „aufgebockten“ Roboter, dessen Räder den Boden nicht berühren. Mit anderen Worten, der Motor läuft mit wenig oder ohne Last. Auf dem Boden muss der Motor viel härter arbeiten: Um die Zielgeschwindigkeit zu erreichen, wird ein größerer Steuereingang benötigt. Dies sollte kein Problem sein, wenn Sie Motoren auswählen, deren Leistungsfähigkeit um eine gewisse Spanne höher liegt, als für den vorgesehenen Verwendungszweck nötig ist. Die Anpassung der Motoren und des Antriebsstrangs an die voraussichtliche Last ist ein entscheidender Punkt und muss bereits beim ersten Entwurf gelingen (siehe „Aufbau des Antriebsstrangs“ weiter unten). Der PID-Controller muss in der Lage sein, die Motorleistung so weit zu steigern, dass das größte zu erwartende Hindernis unter Beibehaltung der maximal wählbaren Sollgeschwindigkeit überwunden wird.

Verwendung von Hobby-Servomotoren

Mein Roboter ist winzig und wird dementsprechend von kleinen Motoren angetrieben. Hierbei handelt es sich um Hobby-Servomotoren, die im Hinblick auf den Betrieb mit kontinuierlicher Rotation modifiziert und durch ein PWM-Signal (Pulse Width Modulated) mit 50 Hz gesteuert werden. Ein Servomotor besteht aus einem sehr kleinen, mit Gleichstrom betriebenen Bürstenmotor (Permanent Magnet DC, PMDC), einem umfangreichen Getriebe und Antriebselektronik. Vielleicht möchten Sie einwenden: „Ist bei einem Servomotor nicht normalerweise bereits ein Steuerungsregelkreis mit eingebaut?“ Die Antwort lautet: Ja, aber nur um die Position der Abtriebswelle auf einen Wert zwischen 0 und 180 Grad festzulegen. Hobby-Servomotoren wurden ursprünglich entwickelt, um die Steuerflächen (Höhenruder, Seitenruder usw.) von funkgesteuerten Modellflugzeugen um kleine Winkel zu verschieben, nicht um Räder immer weiter voran zu drehen. Dieses Video-Tutorial gibt Ihnen eine gute Einführung in den Hobby-Servomotor und seinen Antrieb:

Vor einigen Jahren wurde die Entdeckung gemacht, dass sich das im Positionierungsregelkreis enthaltene Potentiometer durch ein manuelles Potentiometer ersetzen lässt und durch Abbrechen einer Kunststoffarretierung, die eine vollständige Drehung der Abtriebswelle verhindert, ein „Servo“ mit kontinuierlicher Rotation entsteht. Das Standard-PWM-Signal steuert jetzt die Drehzahl der Wellenrotation von maximaler Rückwärtsbewegung mit Impulsen von 1 ms über Stillstand bei 1,5 ms bis hin zur Vorwärtsbewegung mit voller Kraft bei 2 ms. Aber, und das ist ein großes Aber, dabei geht der eingebaute Regelkreis verloren. Das manuelle Potentiometer sorgt für die „Nulleinstellung“, d. h. dafür, dass keine Drehung erfolgt, wenn 1,5-ms-Impulse auf den Steuereingang angewendet werden. Der Vorteil besteht darin, dass der Motor mit dem Mikrocontroller direkt über einen GPIO-Pin verbunden und über die integrierte PWM-Hardware des Chips „digital“ gesteuert werden kann. Die meisten Mikrocontroller verfügen über mehrere PWM-Kanäle und benötigen nur wenig Code, um sie in Betrieb zu nehmen. Es wird noch besser: Servomotoren mit kontinuierlicher Rotation werden oft bereits „gebrauchsfertig“ zum Kauf angeboten.

Verwendung von größeren Motoren

Bei Verwendung eines leistungsfähigeren PMDC-Motors wird für die Verbindung zum Mikrocontroller eine spezielle Treiberschnittstelle benötigt. Mit Gleichstrom betriebene Bürstenmotoren mit Stillstandsströmen zwischen 1 und 2 A sind allgemein erhältlich und kosten nicht viel. Diese Motorgröße ist ideal für Lehrzwecke und Prototypenentwürfe, bevor dann später ein höherer Energie- und Kostenaufwand betrieben wird. Aufgrund ihrer linearen Eigenschaften sind PMDC-Motoren einfach zu bedienen (Abb. 1).

PID3_blog_2_ede91f3b3455db3d88bca2c56eeafd1d691fcdac.png

Wie Sie sehen, ist die Drehzahl des lastfreien Motors proportional zur angelegten Spannung. Das Drehmoment oder die Drehkraft des Motors ist umgekehrt proportional zur Drehzahl. Dies ist eine sehr praktische Eigenschaft, denn dadurch steht sofort das volle Drehmoment zur Verfügung, wenn der Motor mit Strom versorgt wird. Der Motorstrom verhält sich ähnlich und fällt auf ein Minimum (nicht ganz Null), wenn der Motor ohne Last seine maximale Drehzahl erreicht.

Viele geben der Versuchung nach, den Motor direkt mit dem Rad zu verbinden und über eine feste niedrige Motorspannung ohne Steuerungsregelkreis eine niedrige Drehzahl zu erreichen. Die Drehmomentkurven zeigen, was in diesem Fall passiert. Es gibt tatsächlich eine unendliche Anzahl dieser blauen Drehmomentlinien, eine für jede mögliche Spannung. Wenn Sie sich für einen Betrieb bei Leerlaufdrehzahl S1 und dementsprechend der Spannung V1 entscheiden, ist das maximale Drehmoment T1 – ein Bruchteil der Motorleistung bei voller Drehzahl. Der Roboter beginnt wahrscheinlich nicht einmal, sich zu bewegen, weil das Stillstandsdrehmoment nicht einmal ausreicht, um die „Haftreibung“ zu überwinden. Es ist besser, mit einer höheren Leerlaufdrehzahl S2 und einem Untersetzungsgetriebe zu arbeiten, um die gewünschte Fahrgeschwindigkeit zu erreichen. Beachten Sie, dass die Drehzahl des Motors jetzt S1 U/min beträgt, weil er mit Last läuft. Dies ist eine Win-Win-Situation: Das Getriebe verringert die Drehzahlvervielfacht aber gleichzeitig das am Rad verfügbare Drehmoment um denselben Faktor.

Arbeiten ohne PID-Steuerung

Wenn die Drehzahl nicht an einen Steuerungsregelkreis angeschlossen wird, bleibt die Motorspannung V konstant. Wenn der Roboter einen Anstieg in Angriff nimmt, steigt das am Rad benötigte Drehmoment, und der Betriebspunkt steigt auf der Linie, die das Drehmoment für Spannung V kennzeichnet, nach oben. Die Motordrehzahl sinkt daher. Wenn die Steigung steiler wird, fällt die Drehzahl so lange, bis der Motor „abwürgt“, wenn das maximale Drehmoment für diese Spannung erreicht wird. Würden wir V erhöhen, könnten wir offensichtlich ein höheres Drehmoment erhalten, solange wir die maximale Nennspannung nicht überschreiten. Diese lastabhängige Änderung der Drehzahl ist allerdings unerwünscht.

Hinzufügen der PID-Steuerung

Die PID-Steuerung ermöglicht eine automatische Änderung von V in Reaktion auf schwankende Lasten, indem die Drehzahl mit einem Tachometer erfasst und konstant gehalten wird. Wenn jetzt der Anstieg der Last durch Messung der sinkenden Drehzahl erkannt wird, erhöht der Regelkreis zum Ausgleich V. Mit Blick auf das Diagramm kann man sagen, dass der Betriebspunkt auf die nächste Kurve für den höheren Wert von V wechselt. Diese neue Kurve rechts neben der alten hat für die gleiche Drehzahl höhere Drehmomentwerte. Auf diese Weise lässt sich per Rückkopplung die volle Leistung eines Motors ausnutzen.

Wir können auch weiterhin problemlos ein PWM-Signal verwenden, wenn auch in einem anderen Format als bei Hobby-Servomotoren: mit einer Hochstromschnittstelle zur Steuerung der PMDC-Motordrehzahl. In diesem Fall liegt die Impulsfrequenz im kHz-Bereich und das Tastverhältnis kann zwischen beinahe 0 und 100 % variieren. Dies ist möglich, weil die durchschnittliche Gleichspannung eines PWM-Signals proportional zum Impulstastverhältnis ist. Das nun folgende Video veranschaulicht den Betrieb eines L298 H-bridge IC mit PWM:

Aufbau des Antriebsstrangs

Das Prinzip eines PWM, wie im obigen Video beschrieben, besteht darin, dass der Motor während des Impulses mit Strom versorgt und für den Rest des Zyklus vom Strom getrennt wird. Wenn das PWM komplett ausgeschaltet wird, läuft der Motor kontinuierlich weiter, bis er durch Reibung und andere Energieverluste zum Stillstand kommt.

Betrachten wir nun den Antriebsstrang. Ein Planeten-Rover fährt nicht sehr schnell und er darf keinen großen, schweren Motor haben. Der Antriebsstrang muss jedoch den Rädern ein hohes Drehmoment zur Verfügung stellen, damit der Rover Steigungen und Hindernisse überwinden kann. Die Erkundung von unbekanntem Gelände erfordert eine langsame, aber präzise Bewegung.

Wir können beispielsweise die Verwendung eines Bürstenmotors mit Gleichstromversorgung und einer Drehzahl (ohne Last) von ca. 6000 U/min empfehlen. Er muss bei minimaler Last und einer Drehzahl von etwa 1500 U/min auf flachem Gelände ein ausreichend hohes Drehmoment haben. Die Raddrehzahl sollte auf eine langsamere Geschwindigkeit gebracht werden, z. B. 10 U/min. Hierfür muss das Getriebe eine Übersetzung von 150:1 haben. Dadurch kann das PWM-Signal bei minimaler Last ein Tastverhältnis von ca. 50 % haben. Der PID-Regelkreis enthält einen eingebauten „Zuschlag“, um Steigungen und Hindernisse zu bewältigen, ohne dabei langsamer zu werden. Er sorgt außerdem dafür, dass beim Anfahren aus dem Ruhezustand mindestens die Hälfte des maximalen Stillstandsdrehmoments zur Überwindung der Reibung bzw. Haftreibung zur Verfügung steht. Natürlich muss das an den Rädern des fertigen Rover erforderliche Drehmoment vor der Auswahl des Motors geschätzt werden, um die genannten Werte auf jeden Fall zu erreichen.

Beim Getriebe kommen drei Arten in Betracht: das vertraute Parallelachsformat, Umlaufrädergetriebe (auch als Planetengetriebe bezeichnet) und der Harmonic Drive (auch Spannungswellengetriebe genannt). Wenn Sie wirklich einen Mars Rover bauen, dann ist die letzte Option, möglicherweise durch ein Umlaufrädergetriebe ergänzt, Ihre erste Wahl. Der Harmonic Drive ist eine relativ neue Erfindung und bietet bei kompakter Größe eine hervorragende Leistung, aber Sie müssen möglicherweise für eine Raumfahrtbehörde arbeiten, damit die Kosten sich rechnen. Für Roboter in kleinen Laboren sind zahlreiche Getriebemotor-Bausätze zu günstigen Preisen auf dem Markt.

Bremsen

Wie sieht es mit den Bremsen aus? Im Allgemeinen sollte es ausreichen, das PWM auszuschalten, um den Rover zum Stillstand zu bringen, es sei denn, er wird möglicherweise sehr steile Abhänge hinabfahren. Wenn die Wirkung der Schwerkraft zu stark wird und der Roboter anfängt, unkontrolliert davonzurollen, kann bei einem PMDC-Motor die elektromotorische Bremse verwendet werden. Bitte beachten Sie, dass ich „davonrollen“ und nicht „davonrutschen“ sagte. In letzterem Fall hoffen Sie einfach auf eine weiche Landung. Manche Motorsteuerchips mit H-Bridge, z. B. der L298, verfügen über eine dynamische Bremsfunktion. Wenn man sie einsetzt, wird das PWM getrennt und die Motorklemmen werden miteinander kurzgeschlossen. Der Motor wird zum Generator und ein sehr großer Strom fließt in umgekehrter Richtung durch die Wicklungen. Dadurch, dass der magnetische Fluss plötzlich in umgekehrter Richtung fließt, kommt der Anker sehr schnell zum Stillstand. Diese Bremse kann nicht als Feststellbremse eingesetzt werden, aber solange der Kurzschluss fortbesteht, wird die weitere Bewegung bis zu einem gewissem Maße gehemmt. Wenn das nicht ausreicht, wird eine mechanische Bremse benötigt – wie beim Curiosity Rover.

Es gibt eine weitere Option: Verwenden Sie einen Schneckenantrieb in Ihrem Untersetzungsgetriebe. Er beruht auf einem nicht umschaltbaren Schnecken-/Ritzelsatz. Wenn die Schnecke an der Motorwelle anliegt, wird der Antrieb blockiert, sobald der Motor stoppt.

Zum Schluss:

Das Bild oben ist ein „Selfie“, das der Curiosity Rover der NASA an Sol (Marstag) 1315 aufgenommen hat. Die ausgefransten Löcher im „Reifen“ des mittleren Rades sind Zeichen einer schweren Beschädigung. Vor dem Start auf der Erde durchgeführte Tests hatten ergeben, dass diese Räder auch über die schärfsten und härtesten Felsen fahren können, ohne durchstochen zu werden. Nach vielen Analysen wurde festgestellt, dass im Mobilitätssystem ein unvorhergesehener Fehler aufgetreten war. Hier ist die Geschichte.

Das nächste Mal in Teil 4...

Es wird um verschiedene Mobilitätssysteme gehen: einige, die sich leicht steuern lassen, und andere mit einfacher „Panzerlenkung“ durch unterschiedliche Drehzahlen auf beiden Seiten. Warum haben die NASA-Rover alle eine „Rocker-Bogie-Federung“? Außerdem können Sie mithilfe der PID-Steuerung einen „Photovore“ bauen (einen mobilen Roboter, der von Licht angezogen wird).

Wenn Sie mögen, folgen Sie mir auf Twitter. Ich verweise auf interessante Artikel über neue Elektronik und verwandte Technologien, und leite von mir entdeckte Tweets über Roboter, Weltraumforschung und andere Themen weiter.

Engineer, PhD, lecturer, freelance technical writer, blogger & tweeter interested in robots, AI, planetary explorers and all things electronic. STEM ambassador. Designed, built and programmed my first microcomputer in 1976. Still learning, still building, still coding today.
DesignSpark Electrical Logolinkedin