omniVehicle: Plattform mit omnidirektionalem Antrieb PDF Drucken E-Mail
Geschrieben von: Malte   
Samstag, den 25. Mai 2013 um 18:49 Uhr

Hintergrund | Mir schwirrt seit langem im Hinterkopf herum, die Basis meines humanoiden Roboters mit einem omnidirektionalen Antrieb auszustatten. Damit könnte er sich "aus dem Stand" sowohl drehen als auch beliebig in zwei Raumdimensionen bewegen, z. B. auch seitwärts (ohne sich zuvor drehen zu müssen). Ein solcher Antrieb würde also das "Problem parallelen Einparkens" lösen und dem menschlichen Gehen damit zumindest näher kommen, als der differentielle Zweiradantrieb, den ich aktuell verwende. Als kleine Vorstudie in diese Richtung habe ich mir billige omnidirektionale Räder  - "omni wheels" - über ebay besorgt und damit mal eine kleine Roboterplattform aufgebaut.

 

Omni wheels | Omnidirektionaler Räder können nicht nur wie jedes andere Rad in ihrer Hauptdrehrichtung Kräfte auf einen Untergrund ausüben und ein Fahrzeug somit bewegen. Dadurch dass sie über passive Rollen verfügen, deren Drehrichtung - meist - senkrecht zur Hauptdrehrichtung des Rades orientiert ist, können sie Bewegungen in andere Richtungen reibungsarm aufnehmen. Es gibt verschiedene Bauformen omnidirektionaler Räder. Diejenigen die ich mir beschafft habe, bestehen aus sechs in zwei nebeneinanderliegenden Ebenen angeordneten tonnenförmigen Rollen. Pro Ebene sind drei Rollen vorhanden,pic_omniwheel die Rollen der beiden Ebenen sind um 60° gegeneinander versetzt. Dadurch und durch die Form der Walzen ergibt sich insgesamt eine kreisförmige Kontur, die kontinuierliches "rundes" Abrollen ermöglichen soll. Die Räder haben ein sechskant Durchgangsloch, allerdings mit einem abstrusen Maß von knapp 7.4 mm (von Fläche zu Fläche). Vielleicht ist es etwas zölliges, ich habe mir nicht die Mühe gemacht, das weiter zu verfolgen. Ein Alu Sechkant mit Schlüsselweite 7 passt mit etwas Luft in das Loch. Die Achsen für den Anschluss der Räder an die Motoren wurden aus diesem Material hergestellt, zwei Lagen Tesafilm auf dem Sechskant machen ihn dann letztlich satt passend für das Loch. Der Abtrieb der verwendeten Getriebemotoren hat einen Durchmesser von fünf Millimeter, die Sechskantachse wird daruf geklemmt.

 

Aufbau | Als Basis für den Aufbau dient eine 2 mm starke Aluplatte, die mit den nötigen Ausschnitten und Löchern versehen wurde. Weil ich zu faul war den Teilapparat auf die Fräsmaschine zu montieren, habe ich alle Löcher in kartesischen Koordinaten berechnet und gebohrt. Weil das Lochbild um die Ausschnitte für die Motoren herum natürlich gleich ist, konnte ich diese Löcher verwenden, um die Platte zum Fräsen in drei Stellungen für die Ausschnitte aufzuspannen. Nach dem Fräsen wurde die Platte auf einen Durchmesser von 120 mm abgedreht.

basisplattebasis

basisspacermotor

Zur Motorisierung kommen Schrittmotoren mit Getriebe zum Einsatz. Diese haben hier den Vorteil, dass man auf eine Drehzahlregelung verzichten kann, wie sie bei DC Motoren unerlässlich wäre. Dabei würde garnichtmal die Regelung selbst übermäßig Aufwand machen, sondern eher die Tatsache, dass man Drehratensensoren zum Messen der Ist-Geschwindigkeit bräuchte. Die Geschwindigkeit der Schrittmotoren ergit sich einfach aus der Zahl der Schritte pro Zeit, solange man im Arbeitsbereich der Motoren bleibt, kann man sie gut ohne Schritttverluste open-loop betreiben. Ich habe die hier verwendeten Motoren bei Pollin gefunden, mittlerweile sind sie dort ausverkauft. Das Getriebe untersetzt etwas zu stark, sodass das Vehikel bei dem gegebenen Raddurchmesser recht lahm ist. Auch ist der Abtrieb nicht optimal gelagert. Weil ich für diese Bastelei nicht viel Geld ausgeben wollte, habe ich über diese kleinen Mängel  hinweggesehen.

 

Elektronik | Ich verwende hier fertige Schrittmotortreibermodule, die auf dem A4983 von Allegro basieren. Auf ebay bekommt man die Treibermodule für relativ wenig Geld aus Hong Kong. Der A4983 beitet bis 1/16tel Microstepping, ich betreibe den Motor der Einfachheit halber im Moment aber durchgängig im Halbschritt-Modus. Die Treiber haben ein Step/Dir Interface, d. h. bei einer Flanke auf dem Step-Eingang macht der Motor einen Schritt, wobei der Dir-Eingang die Schrittrichtung vorgibt. Angesteuert werden die Treiber von einem AVR mega168. Der AVR steht über einen MAX232 per RS232 mit einem Windows PC in Verbindung, über den die Richtungs- und Rotationsinformationen an die Plattform übertragen werden.

Die Schaltung hält keine Überraschungen bereit. Die Eingangsspannung der Schaltung liegt an den Motoren (VM), für die Versorgung der Logik (VDD) wird sie über einen 7805 zusätzlich auf 5V herabgeregelt. Die Schrittmotoren werden an K1 - K3 angeschlossen. Über S1 wird der Mikroschrittmodus manuell eingestellt (ist also nicht über den Controller steuerbar). Das ISP Interface zur Programmierung des AVR ist an K4 zugänglich, die RS232 an K5. Die Reset-Eingänge der A4983 Module müssen extern hochgezogen werden, weil sich auf dem Modul kein Pull-Up-Widerstand dafür befindet.

 

Funktionsprinzip | Das Omniwheel kann nur in seiner (motorisierten) Hauptdrehrichtung einen Beitrag zur Bewegung der Plattform leisten. Durch seine passiven Rollen kann es aber gleichzeitig auch in andere Richtungen rollen ohne zu blockieren. Die Bewegungskomponenten der verschiedenen Räder können sich also überlagern und bestimmen somit in der Summe Richtung und Geschwindigkeit der Gesamtbewegung.

In der folgenden Abbildung wird die gewünschte Geschwindigkeit der Plattform durch den Vektor im Zentrum der Plattform repräsentiert (schwarzer Pfeil). Er hat die Komponenten vx (hellbalu) und vy (gelb), dieses sind die beiden Eingabewerte für die Berechnung der drei Motorgeschwindigkeiten v1, v2 und v3. Weil die Plattform starr aufgebaut ist, bewegen sich alle Punkte auf der Plattform gleichartig, so natürlich auch die Mitten der Räder (dunkelgraue Rechtecke). Zur Verdeutlichung ist der Geschwindigkeitsvektor der Plattform in grün für die Räder eingezeichnet.

Man kann jedem Rad ein eigenes Koordinatensystem (hellgraue Achsen) so zuordnen, dass sich das Rad immer um dessen y-Achse dreht, also eine Bewegungskomponente in Richtung der x-Achse erzeugt. Für die Berechnung der Geschwindigkeiten der Motoren stellt sich nun einfach die Frage, wie groß die x-Komponente für den Geschwindigkeitsvektor (grün) im Koordinatensystem des jeweiligen Rades ist.

So wie Abbildung angelegt ist, ist das Koordinatensystem von Rad 1 zum Koordinatensystem der gesamten Plattform verschoben, aber nicht rotiert. Rad 1 kann zur Bewegung der Plattform nur in x-Richtung beitragen. Da diese mit der x-Richtung des Rad-1-Koordinatensystems übereinstimmt, entspricht der Beitrag vx direkt v1:

v1 = vx

Da die Räder kreisförmig mit 120° Abstand zueinander angeordnet sind, können die Koordinatensysteme von Rad 2 und Rad 3 durch eine Rotation um -120 bzw. +120° zur Deckung mit dem von Rad 1 gebracht werden (unterer Teil der Abbildung). Dadurch erkennt man, dass die Vektoren, die die Geschwindigkeit der Plattform repräsentieren (grün) für Rad 2 und 3 aus dem Vektor für Rad 1 durch eine Rotation um +120 bzw. -120° hervorgehen. Man muss also rechnerisch diese Rotation nachvollziehen, um die gesuchten Komponenten v2 und v3 zu bestimmen. Die Formeln für eine Rotation eines Vektors mit den Komponenten x und y um den Winkel θ um Ursprung eines Koordinatensystems lauten (wen eine Herleitung interessiert gucke z. B. hier):

x' = x cos(θ) – y sin (θ)

y' = x sin(θ) + y cos (θ)

Da sich das Rad aber tatsächlich nur in der x-Dimension drehen kann, wird hier nur die Berechnung der x-Komponente benötigt, man verwendet also nur die erste der eben genannten Formeln und setzt vx für x ein und vy für y. Die fraglichen Motorgeschwindigkeiten sind dann:

v2 = vx cos (120°) – vy sin (120°)

v3 = vx cos (-120°) – vy sin (-120°)

Nun kann man sich noch fragen, wie sich ein gleicher Geschwindigkeitsaufschlag ω auf alle drei Räder auswirkt. Natürlich führt das zu einer Rotation der Plattform mit einer Geschwindigkeit, die umso kleiner ist, je größer der Abstand r der Räder zum Mittelpunkt der Plattform ist. Man kann deshalb die Rotationsgeschwindigkeit mit dem Abstand gewichtet in alle drei Formeln einfließen lassen. Somit ergibt sich dann für die drei Motoren:

v1 = vx + ω r

v2 = vx cos (120°) – vy sin (120°) + ω r

v3 = vx cos (-120°) – vy sin (-120°) + ω r

cos(±120°) und sin(±120°) sind hier natürlich Konstanten, die man im Programmcode nicht jedes Mal wieder neu berechnen muss. Damit ist die Bestimmung der Motorgeschwindigkeiten rechnerisch relativ unaufwendig.

Die eben genannten Gleichungen beschreiben den "rückwärtigen" Weg von einer gewünschten Bewegung zu den dafür erforderlichen Aktivierungen v1, v2 und v3 der drei Räder. Man kann das Problem aber natürlich auch von der anderen Seite - "vorwärts" - betrachten und aus gegebenen Werten für v1, v2 und v3 den Geschwindigkeitsvektor (vx/vy) und die Rotation ω errechnen wollen. Man muss dazu das Gleichungssystem so umformen, dass man jene Werte hineingibt und diese Werte erhält. Wenn man das tut kommt man auf:

vx = (-v1 + ½v2 + ½v3) / (cos(120°) - 1)

vy = (v3 - v2) / (2sin(120°))

ω = v1 - vx

 

Implementierung | Die Firmware für den AVR µC des Vehikels wurde in Bascom implementiert. Das Vehikel ist über eine RS232 Schnittstelle mit einem Steuer-PC verbunden, der einen Joystick ausliest und die entsprechenden Daten für Bewegungsgeschwindigkeit und -richtung (Vx, Vy) und Drehung (Vrot) an das Vehikel sendet. Diese Funktion wird von einem kleinen Matlab Script erledigt.

Ein Test ergab, dass der hier verwendete Motor bei einem Strom von ca. 300 mA  im Halbschrittmodus bis ca. 1.65 kHz, entsprechend ca. 819 Vollschritte/Sekunde angesteuert werden kann. Da der Motor 48 Schritte/360° macht, bedeutet dies eine Geschwindigkeit von 360°/48 Schritte * 805 Schritte/Sekunde ≈ 6142.5°/Sekunde ≈ 17 U/Sekunde ≈ 1020 U/Minute. Das Getriebe auf dem Motor untersetzt mit 1:35.4, sodass für ein Rad eine maximale Geschwindigkeit von ca. 0.48 U/Sekunde bzw 28.8 U/min resultiert.

Die Ansteuerung des Motors wurde simpel gestaltet. Im "Ernstfall" kann und sollte man das besser machen. Er wird hier durchgehend im Halbschrittmodus betrieben, wodurch es bei sehr niedrigen Drehzahlen zu einem etwas unruhigen Lauf kommt.

Die Interrupt Service Routine (ISR), die den Takt für die drei Motoren erzeugt, wurde für kurze Ausführungszeit in Assembler implementiert. Durch leichte Ungenauigkeiten der verwendeten AVR-internen Taktquelle ergibt sich ein Aufrufintervall von etwa 101.8 µs für die ISR (bei angestrebten 100 µs). Die Abarbeitung der ISR braucht im Mittel etwa 6.68 µs (bei 8 MHz µC-Takt). Die ISR vergleicht bei jedem Aufruf einen Zähler mit einer Schwelle für jeden Motor. Ist die Schwelle nicht erreicht, wird der Zähler inkrementiert, ist sie erreicht, wird der entsprechende Pin auf high gesetzt und der Zähler gelöscht. Beim nächsten Aufruf der Routine wird der Pin wieder auf low gesetzt. Über den Schwellenwert th wird somit der Abstand zwischen den Pulsen eingestellt. Der Nachteil dieser Methode ist, dass sich das Schrittintervall nur relativ grob in ganzzahligen Vielfachen von 101.8 µs variieren lässt.

Da die ISR alle 101.8 µs aufgerufen wird, ergeben sich für mögliche Abstandswerte th = 0 bis 255 (th ist vom Typ Byte) Abstände zwischen den Schritten von t = (th+1) * 101.8 µs. Da die Halbschritt-Geschwindigkeit des Motors v = 1/t ist, ist für einen Wert th die Halbschritt-Geschwindigkeit v = 1/(th+1) * 101.8 µs. Da hier der für eine gewünschte Geschwindigkeit v erforderliche Wert th von Interesse ist, ist dieser Zusammenhang nach th umzustellen, um auf

th = 1/(v * 101.8 µs) - 1

zu kommen. Mit einem Geschwindigkeitswert von 1600 erreicht man somit in etwa die mögliche Maximalgeschwindigkeit.

Die Geschwindigkeitswerte werden hexadezimal dargestellt im ASCII Format über die serielle Schnittstelle übertragen. Dieses hat den Vorteil, dass – anders als bei einer Klartext-Übertragung – die Werte eine feste Breite haben, diese Kodierung etwas "kompakter" ist als Klartext (mehr Information pro Zeichen) und die normalen ASCII Steuerzeichen, insbesondere CR und LF aber trotzdem verwendet werden können.

Quellcode Bascom: Ansicht (html) / Download

Quellcode Matlab: Ansicht (html) / Download

 

AddThis Social Bookmark Button
Zuletzt aktualisiert am Freitag, den 21. Juni 2013 um 10:12 Uhr
 

Kommentare  

 
#7 malte 2014-07-09 19:57
Hi! The axes were self-made from a standard hexagonal aluminium bar sold by the meter. The bar had width across flats of 7 mm.
Zitieren
 
 
#6 Kiran Kumar 2014-07-07 09:07
Hello,

Where did you find the hexagonal axes for omni wheel?
Zitieren
 
 
#5 Smithb452 2014-05-12 18:52
I loved your blog article. Really Cool.
Zitieren
 
 
#4 Malte 2013-07-27 19:48
Hallo Jonas! Ich heiße zwar nicht David, aber ich denke mal du meinst mich ... :-) Eine Empfehlung für Komponenten, die "einfach so" zusammenpassen kann ich dir leider nicht geben. Ich habe mir den Kram auch zusammengesucht (google, ebay & co). Ein Problem wird es sein, die Getriebewelle mit dem Rad zu verbinden, oft ist da irgendeine Eigenkonstrukti on nötig. Frag gerne wenn konkrete Probleme auftreten, so allgemein kann ich dir leider nicht wirklich weiterhelfen. Gruß, Malte
Zitieren
 
 
#3 Jonas 2013-07-25 08:10
Hallo David,

kannst Du mir bitte einen Aufbau empfehlen, der Komponenten verwendet, die zurzeit im Internet verkauft werden? Ein Schrittmotor mit Getriebe soll es sein und als Omniwheels wäre auch die ASR 60 mm OK.

Danke!
Zitieren
 
 
#2 Malte 2013-06-14 16:36
Hi David! I bought the wheels on ebay. This link is hidden in the text above. Here it is again: http://www.ebay.de/itm/Omniwheel-Flexiwheel-RS01QA-Robot-conveyor-omni-wheel-caster-/221090007414?pt=LH_DefaultDomain_0&hash=item3379fdc976
Zitieren
 
 
#1 David Grindel 2013-06-13 01:40
Where did you find the omni wheels and how much did they cost ?
Zitieren
 

Kommentar schreiben

Sicherheitscode
Aktualisieren

 

Suche

Benutzer

Wir haben 8 Gäste online

unterstützt von

batronix logo

spacer

rotacaster logo

spacer

spacer

spacer

Meine Tweets

Extern

youtube logo twitter logo email logo

spacer

spacer

spacer

Reklame