Mecanum Räder | An zweien meiner Roboter habe ich bisher Allseitenräder verwendet. Das omniVehicle verwendet drei kleine Omniwheels mit einem Durchmesser von etwa 48 mm. Dieser Roboter war im Wesentlichen ein Vorversuch für den omnidierektionalen Antrieb der Basis meines humanoiden Roboters, dort verwende ich 125 mm große und höher belastbare rotacaster Omniwheels. Bei den Allseitenrädern, die bei diesen beiden Robotern zum Einsatz kommen, sind die passiven Rollen senkrecht zur angetriebenen Drehachse der Räder orientiert. Es gibt noch einen weiteren Typ eines Allseitenrades, der eine andere Struktur hat: das Mecanum Rad. Es geht auf ein Patent des Schweden Bengt Erland Ilon aus dem Jahre 1972 zurück (weshalb es manchmal auch als Ilon Rad bezeichnet wird). In diesem Falle sind die passiven Rollen in einem Winkel von 45° zur angetriebenen Drehachse orientiert. Diese Konstruktion erlaubt es, dass die Räder im Rechteck - also wie bei einem gewöhnlichen Auto - angeordnet werden können, und dabei trotzdem die Omnidirektionalität des Antriebes erhalten bleibt. Genau das ist beim erstgenannten Radtyp nicht der Fall.
Vor kurzem bin ich auf die Mecanum Räder des chinesischen Herstellers nexusrobot aufmerksam geworden. Ich habe den Hersteller kontaktiert um einen Satz Räder erwerben. Ich habe mich für einen Satz 100 mm Räder 14094 entschieden. nexusrobot hat mir die Räder zu einem vergünstigten Preis für meine Versuche zur Verfügung gestellt, sodass ich sie direkt dort bestellt habe. Es gibt auch verschiedene internationale nexusrobot Distributoren, die Räder werden außerdem auf AliExpress angeboten.
Eigenschaften | Ich habe Räder von 100 mm Durchmesser für meine Basis ausgewählt. Jedes Rad verfügt über neun tonnenförmige passive Rollen von knapp 48 mm Länge und etwas mehr 19 mm Durchnesser. Das Rad hat eine Gesamtbreite von etwas über 50 mm. Jede Rolle ist zweifach kugelgelagert. Die Räder bestehen aus einem Nylon Grundkörper, mit dem Seitenteile aus Aluminiumblech verschraubt sind. Die Seitenteile tragen über eine durchgehende Achse die passiven Rollen. Zu den Seite hin befindet sich auf der Achse jeweils eine Anlaufscheibe. Die Achse ist mittels Stoppmuttern mit den Seitenteilen verschraubt. In dem Nylon Gundkörper befindet sich ein zentrales Durchgangsloch, das nach außen zu beiden Seiten 20.8 mm Durchmesser hat, sich nach innen aber noch auf 18 mm verjüngt. Die folgende Zeichnung (Quelle) zeigt die wichtigsten Maße eines (rechten) Rades.
Die Qualität der Räder macht einen hervoragenden Eindruck, die Verarbeitung ist einwandfrei und hochwertig.
Die passiven Rollen fühlen sich an, als hätten sie ausreichend Bodenhaftung, das muss sich aber noch konkret in einem praktischen Test zeigen.
Motoren | Ich hatte noch vier 12 V DC Getriebemotoren rumliegen, die mir einigermaßen geeignet für die Mecanum Räder erschienen. Unbelastet machen die Motoren etwa 33 Umdrehungen pro Minute, d. h. die Basis würde nicht schneller als etwa 0.3 m/s sein können - vermutlich bleibt unter Last weniger als die Hälfte davon übrig. Im Leerlauf nehmen die Motoren 100 mA auf, bei Blockierung ziehen sie etwa 1.8 A. Insgesamt sind sie damit wohl ausreichend für den Zweck, vielleicht ein wenig unterdimensioniert. Die Motoren haben eine 8 mm Abtriebswelle, die nur etwa 16 mm aus dem Getriebekasten ragt. Die Kürze der Welle ist für die Zwecke hier eher ungünstig, das Rad selbst ist ja immerhin 50 mm breit. Die Welle hat ein Querloch, das für die Verbindung mit dem Rad verwendet werden kann. Die Abtriebswelle des Getriebes läuft auf zwei Seiten in Sinterbronzelagern und ist somit gut in der Lage, radiale Kräfte aufzunehmen. Die bei Mecanum Rädern deutlich auftretenden axialen Kräfte werden dadurch aufgenommen, dass das letzte Getriebezahnrad über eine Anlaufscheibe rechts oder links gegen die Sinterbuchsen läuft. Die Lagerung ist insgesamt sicherlich nicht perfekt für diesen Zweck, da das Ganze nicht für den Dauereinsatz konzipiert ist, erwarte ich in der Praxis keine Probleme an dieser Stelle.
Motoranschluss an die Räder | Es wurde eine Adapternabe angefertigt, die einerseits eine (möglichst) exakte Passung für den kurzen Motorabtrieb hat, und auf der anderen Seite präzise zentriert mit dem Rad verbunden werden kann. Die Naben wurden aus einem Alu-Rundstab gedreht. Ein Spannstift sorgt für den Kraftschluss zwischen Motorwelle und Nabe.
Das Chassis der Basis wurde aus 20 x 20 mm Aluminium Strangprofilen hergestellt. Über ihre Nuten können die Stangen mehr oder weniger beliebig verbunden werden. Ich habe mir aus 3 mm Aluminiumblech Verbindungsstücke und Nutsteine hergestellt, die ihren Zweck soweit ganz gut erfüllen. Die vier Motoren können mit Hilfe von Adapterplatten ebenfalls sehr einfach mit dem Profilsystem verbunden werden.
Insgesamt konnte somit auf recht einfache Art eine relativ solide Grundstruktur für die Mecanum Wheel Basis aufgebaut werden. Ob das Ganze dann in der Praxis wie erwartet funktioniert, muss sich im Weiteren zeigen.
Auch wenn es kein echtes Problem war, gefiel mir die offene Motorrückseite an meinen Antriebsmodulen nicht sonderlich. Zwischenzeitlich habe ich mir deshalb einfache Kappen dafür gedreht. Der Motor hat 36 mm Durchmesser, der Innendurchmesser eines 40x2 mm PVC Rohrs passt also praktischerweise ohne weitere Bearbeitung auf den Motor. Vier solcher Rohrabschnitte wurden also auf einer Seite mit einem Deckel versehen, soweit abgedreht, dass sich eine homogene Oberfläche ergibt und dann auf die passende Länge gebracht. Damit das Anschlusskabel herausgeführt werden kann, gibt es ein entprechendes Loch in der Kappe. Damit die Kappe über den Gehäuselötpunkt der Entstörkondensatoren passt, wurde eine Nut eingefräst.
Leider habe ich das Rohr nur in grauem PVC bekommen, wie man sieht hat das Material für den Deckel dann auch noch eine leicht andere Farbe. Wenn ich ein solches Rohr nochmal in schwarz finde, werde ich die Kappen vielleicht nochmal neu machen. Schwarz lackieren möchte ich sie nur ungern, weil in das Fahrzeug in dem Bereich ja durchaus mal gegen Dinge stoßen kann, Stellen mit angestoßenem Lack sehen noch weniger schön aus.
Motorelektronik | Praktisch an dem verwendeten Getriebemotor ist, dass der Abtrieb auf der Rückseite des Getriebekastens offen liegt. Hier kann man also gut die Drehung der Welle für eine Drehzahl- oder auch Positionsregelung abnehmen. Besonders einfach gestaltet sich dieses bei Verwendung eines magnetischen Drehencoders. Man braucht nur einen geeigneten Magneten auf der Motorwelle befestigen, ein Encoder-IC darüber kann dann die Position dann auswerten. Als Encoder verwende ich einen AS5048A von Austria Microsystems. Dabei handelt es sich um einen Absolutencoder mit 14 Bit Auflösung, der per SPI auszulesen ist. Der AS5048A befindet sich auf der Unterseite der Platine, auf der die gesamte Elektronik für einen Motor aufgebaut ist. Zur Befestigung und genauen Ausrichtung der Platine habe ich die Verschraubung der Rückseite des Getriebekastens verwendet.
Die Platinen habe ich diesmal bei Elecrow in Shenzhen/China machen lassen. Mit der Qualität bin ich zufrieden, zumal mich zehn Exemplare (tatsächlich habe ich sagar elf bekommen) inklusive Versand und PayPal-Gebühren nur etwa 22.50€ gekostet haben. Sehr nervig ist nur die Versanddauer. Elecrow hat die Platinen sechs Tage nach Bestelleingang verschickt - was sehr zügig ist -, sie waren dann aber immerhin noch 27 Tage unterwegs. Durch den Zoll ist die Lierferung so durchgerutscht, auch wenn ich eigentlich 50 Cent über dem Freibetrag für die Einfuhrumsatzsteuer liege.
Jede Motorelektronik hat ihren eigenen Mikrocontroller, es kommt ein Atmel AVR mega168 zum Einsatz. Das wäre an dieser Stelle nicht unbedingt erforderlich gewesen, macht das System aber sehr schön modular. Außerdem ist die Einheit aus Platine und Motor somit auch für andere Zwecke einsetzbar. Die Motormodule werden über I2C mit der Hauptplatine verbunden. Ich habe mir die Möglichkeit offen gehalten, den I2C Bus entweder "nackt" oder über einen PCA9600 gebuffert zu verwenden. Erfahrungsgemäß funktioniert der nackte I2C Bus hinreichend gut, ich habe aber Interesse, mal mit dem PCA9600 zu spielen.
Als Motortreiber verwende ich einen DRV8801 von TI. Es war von vorn herein klar, dass der mit 2.8 A Peak eigentlich unterdimensioniert für den verwendeten Motor ist. Ich hatte davon noch ein paar in der Schublade und habe es deshalb einfach mal drauf ankommen lassen. In den ersten Testläufen wird der Treiber deutlich warm (~70°C), thermal shutdown ist laut Datenblatt bei 175°C, also noch ein gutes Stück weit weg. Ich habe kleine Kühlkörper bestellt, die ich auf den Treiber kleben werde, ein wenig wird das auch noch helfen. Aber ggf. muss man das System an dieser Stelle nochmal überarbeiten.
Ich habe zwei kleine Bugs auf der Platine, einen kleinen Fehler im Bestückungsdruck und eine fehlende Verbindung zur Motorversorgungsspannung. Letzteres war ohne Probleme mit einem Stückchen Fädeldraht zu beheben. Somit funktioniert das Modul einwandfrei.
Ein paar weitere Exemplare vom AS5048A mit passenden Magneten und DRV8801 habe ich als Samples bei AMS bzw. TI gerordert. Nachdem diese eingetroffen waren, konnte ich die Platienen für die verbliebenen drei Motoren bestücken. Die Samples von AMS sind übrigens schöner verpackt als ein durchschnittliches Schmuckstück ...
Drehzahlregelung | Um die Drehzahlregelung umzusetzen, habe ich begonnen, das Modul zu chrakterisieren. Dazu bin ich mit der 8 Bit Motor PWM (Timer2 des AVR) in 16er Schritten von 15 auf 255, und mit -16er Schritten wieder zurück auf 15 gesprungen. Auf jedem Niveau habe ich den Motor etwa 1 Sekunde drehen lassen. Währenddessen wurde die Motordrehzahl alle 2.048 ms (= 1 "Tick") registriert. Die gesamte Treppe wurde viele Male wiederholt und die gemessenen Drehzahlwerte gemittelt.
Zusammengefasst ergibt sich dabei das in den folgenden Diagrammen dargestellte Verhalten des Antriebssystems. Das obere Diagramm zeigt die Drehzahl (in einer arbiträren Einheit) über der Zeit, so wie sie aus den PWM Stufen resultiert. In der Zeile darunter wurde jeweils eine Sprungantwort für einen zunehmenden und abnehmenden PWM-Sprung beispielhaft herausgefriffen, um das zeitliche Verhalten genauer darzustellen. In die gemessenen Daten wurde ein PT1-Glied als Modell für den Ausgleichsvorgang gefittet (roter Graph). Darunter sind über den getesteten PWM Bereich die stationären Drehzahlniveaus nach einem Sprung gegen den korrespondierenden PWM Wert aufgetragen. Die letzte Zeile der Abbildung gibt die gemessenen Zeitkonstanten des Ausgleichsvorganges für die PWM Werte wieder, wie sie aus den PT1-Fits für alle Niveaus gewonnen wurden.
Die Drehzahlerhöhung nach einem PWM Sprung folgt augenscheinlich gut dem Verhalten eines PT1-Gliedes, d.h. der Funktion
f(t) = k*(1-e-t/τ)
für einen Aufwärstsprung, bzw.
f(t) = k*(e-t/τ)
für einen Abwärtssprung, wobei k die Verstärkung des PT1-Gliedes ist und τ die Zeitkonstante, die die Verzögerung bestimmt.
Die steady-state Motordrehzahl, d.h. die Drehzahl nachdem sich ein neues Niveau stabil eingestellt hat, hängt sehr linear von der PWM ab. Deutlich nichtlineare Effekte gibt es nur bei sehr geringen Drehzahlen. Die Zeitkonstanten der Sprungantworten bleiben auch einigermaßen konstant über (fast) den gesamten Arbeitsbereich, allerdings ergeben sich etwas größere Zeitkonstanten für das Abbremsen, d.h. für einen Sprung von einem höheren zu einem niedrigeren PWM Wert. Außerdem ist die Zeitkonstante beim Anlaufen deutlich höher. Insgesamt verhält sich das System also recht linear, was sich günstig für die Regelbarkeit mit einem einfachen PID-Regler auswirken dürfte.
Ich habe den Regelkreis jetzt mal als ganz simples zeitdiskretes Modell in MATLAB nachgebaut. Die Abhängigkeit der Drehzahl von der PWM wurde als PT1 angenommen, für Zeitkonstante und Streckenverstärkung wurden die empirisch ermittelten Werte verwendet. Um mit der Nichtlinearität durch die Schwelle umzugehen, habe ich den PWM Wert einfach verschoben, die tatsächliche Aktivierung von 47 bis 255 sieht der Regler als 0 bis 208. Ich habe dann per Hand mit den Parametern gespielt, bis das Regelverhalten gut aussah. Es stellte sich schnell heraus, dass der D-Anteil keine wesentliche Verbesserung bringt, ich habe ihn auf Null gesetzt. Hier zwei Bilder des Regelverhaltens, einmal Sollwertsprünge, einmal Rampen:
Es war wohl nicht anders zu erwarten, als dass der PID Regler sehr gut mit einer perfekt linearen Regelstrecke funktioniert.
Am realen Objekt funktioniert die Drehzahlregelung für die Antriebsmodule auch schon einigermaßen. Der Regler ist bisher ein reiner PI. Ich habe noch einen deutlichen Ist-Wert-Overshoot bei einem Sollwertsprung, dem werde ich mich zu einem späteren Zeitpunkt noch mal verstärkt zuwenden. Bei Drehzahlrampen - die der typischen Anwendung der Antriebe ja näher sind - fällt der Overshoot erstmal nicht so ins Gewicht.
Auch wenn ein wenig Feintuning bei der Drehzahlregelung durchaus noch angebracht ist, habe ich erstmal weiter gemacht, ich war neugierig wie der Antrieb als Ganzer läuft. Bei Zeiten wird es einen zentralen Master geben, der die Antriebe als Slaves kontrolliert. Die Platine dafür ist in Auftrag gegeben und aus China auf dem Weg zu mir. Einstweilen habe ich einfach eines der Antriebsmodule als Master verwendet, der mit den anderen Antrieben per I2C redet. Das funktioniert so weit ganz gut. Die inverse Kinematik steht auch, die rechnet der Master. Das folgende Video zeigt die koordinierte Ansteuerung der Antriebesmodule - und das Chaos an meinem Arbeitsplatz.
Jungfernfahrt | Im folgenden Video wird jede Fahrt der Plattform in eine Richtung durch eine gleiche Fahrt in Gegenrichtung kompensiert. Wenn man ein paar von diesen Bewegungen aneinanderhängt und dann Start- und Endpunkt vergleicht, bekommt man also einen qualitativen Eindruck von der Spurtreue des Vehikels.
Im Ergebnis sieht man durchaus eine deutliche Abweichung von Start- und Endpunkt, katastrophal ist es aber nicht.
Master | Die Fahrantriebe sollen per I2C von einem übergeordneten Master kontrolliert werden. Die Slaves sollen sich nur um die Drehzahlregelung der Antriebe kümmern, während der Master alle "höheren" Steuerfunktionen, wie z. B. die inverse Kinematik übernimmt. Das Mastermodul basiert so wie die Slaves auf einem AVR mega168. Zusätzlich verfügt es über ein einfaches alphanumerisches LCD, eine IMU (MPU6050), ein Bluetoothmodul (HC-05) und eine USB Bridge (FT232). Über das Bluetoothmodul kann die Plattform ferngesteuert werden und Telemetriedaten versenden. Das USB Interface habe ich mit auf die Platine genommen, weil ich im Hinterkopf habe, ein Raspberry Pi 2 mit an Board zu nehmen um ROS darauf auszuführen. Das ist aber noch Zukunftsmusik. Immerhin: die Platinen für das Mastermodul sind heute nach 21 Tagen Versandzeit aus China bei mir eingetroffen. Damit kann es also als nächstes weitergehen.
Zuletzt aktualisiert am Montag, den 13. April 2015 um 22:45 Uhr
Kommentare
Schönes Projekt.
Wenn Sie Material von uns zum "Spielen" brauchen, sagen Sie mir Bescheid.
Salut
Schmitt
Motedis.com
tHANK YOU
Alle Kommentare dieses Beitrages als RSS-Feed.