1 Inhaltsverzeichnis 1 EINLEITUNG........................................................................................................5 1.1 Motivation der Arbeit................................................................................................5 1.2 Ziel der Arbeit............................................................................................................6 1.3 Inhalt der folgenden Kapitel.....................................................................................6 2 BESCHREIBUNG VON GELENKEN MIT MEHREREN FREIHEITSGRADEN ...7 2.1 Denavit-Hartenberg-Parameter ...............................................................................7 2.2 Erweiterung der DH-Parameter ..............................................................................8 2.2.1 Kugelgelenke ...................................................................................................8 2.2.2 Kardangelenke .................................................................................................9 2.2.3 Eindeutige Festlegung der Parameter ............................................................10 2.3 Beispiele für die Verwendung der erweiterten DH-Parameter ...........................11 2.3.1 Beispiel 1: Rotatorisches Gelenk, Sphärisches Gelenk, Sphärisches Gelenk 11 2.3.2 Beispiel 2: Sphärisches Gelenk, Prismatisches Gelenk, Sphärisches Gelenk12 2.3.3 Beispiel 3: Kardangelenk, Prismatisches Gelenk, Sphärisches Gelenk.........13 2.4 Alternative Beschreibungen von Gelenken mehrerer Freiheitsgrade ................15 2.4.1 RPY Transformationen ..................................................................................15 2.4.2 Merlets Beschreibung ....................................................................................15 3 EINE EINHEITLICHE NOTATION FÜR UNIVERSELLE ROBOTER ................16 3.1 Elemente der Datenstruktur...................................................................................16 3.1.1 Knoten des Graphen.......................................................................................17 3.1.2 Kanten des Graphen .......................................................................................17 3.1.3 Die 3 Transformationen .................................................................................17 3.2 Algorithmus für die Knotenindizierung ................................................................18 3.3 Beispiele für die Knotenindizierung.......................................................................19 3.3.1 SCARA Roboter (serielle Roboterstruktur)...................................................19 3.3.2 Hexa Parallelroboter ......................................................................................20 3.3.3 Delta Parallelroboter ......................................................................................21 4 DIE APPLIKATION ............................................................................................22 4.1 Strukturübersicht über die Applikation................................................................22 4.2 Anwenderoberfläche................................................................................................23 4.3 Das Kinematikmodul...............................................................................................26 4.4 Lösung der Inversen Kinematik am Beispiel des Hexa Parallelroboters ...........27 2 4.4.1 Lösungsverfahren...........................................................................................27 4.4.2 Gleichungsprototyp........................................................................................29 5 ZUSAMMENFASSUNG UND AUSBLICK .........................................................31 5.1 Evaluierung mit anderen kinematischen Strukturen...........................................31 5.2 Einbinden der Vorwärtskinematik für Hexa und Delta ......................................31 5.3 Berechnung des Parameters α ................................................................................31 5.4 Integration eines Bahnplanungsverfahrens ..........................................................31 5.5 Verfahren zur universellen Lösung von IKP und DKP .......................................31 5.6 Interaktives Definieren von kinematischen Strukturen.......................................32 A IMPLEMENTIERUNG ........................................................................................33 A.1 Modulabhängigkeit..................................................................................................33 A.2 Funktionsheader ......................................................................................................34 A.2.1 Modul „parGui“ .............................................................................................34 A.2.2 Modul „parDisplay“.......................................................................................38 A.2.3 Modul „parMotion“ .......................................................................................38 A.2.4 Modul „parKinematics“ .................................................................................39 A.2.5 Modul „parMath“...........................................................................................40 A.2.6 Modul „parGraph“ .........................................................................................41 A.2.7 Modul „parRead“ ...........................................................................................43 A.2.8 Modul „parEdge“ ...........................................................................................43 A.2.9 Modul „parNode“...........................................................................................45 A.2.10 Modul „parIndexList“....................................................................................47 A.2.11 Modul „parTool“............................................................................................48 B WEITERE KINEMATIKEN UND DEREN KNOTENINDIZIERUNG....................51 B.1 Werkzeugmaschine Eclipse.....................................................................................51 B.2 Porty (unsymmetrische Parallelstruktur) .............................................................51 C BEISPIELE VON SCHNITTSTELLENDATEIEN ...............................................52 C.1 Schnittstellendatei des Hexa Parallelroboters.......................................................52 C.2 Schnittstellendatei des Delta Parallelroboters ......................................................53 LITERATURVERZEICHNIS .....................................................................................55 3 Abbildungsverzeichnis 1.1 2.1 2.2 2.3 2.4 2.5 2.6 2.7 3.1 3.2 3.3 3.4 3.5 4.1 4.2 4.3 4.4 4.5 4.6 A.1 B.1 B.2 Parallelkinematiken aus RobcadTM ..................................................................................... 6 DH-Parameter für rotatorische Gelenke ............................................................................. 8 Lage des Koordinatensystems bei einem Kugelgelenk ...................................................... 9 Lage der Koordinatensysteme bei aufeinanderfolgenden Kardangelenken ..................... 10 RSS-Kette ......................................................................................................................... 12 SPS-Kette.......................................................................................................................... 13 KPS-Kette ......................................................................................................................... 14 Kugelgelenk aus [Merl00] ................................................................................................ 15 Hexa Graph und Elemente der Datenstruktur................................................................... 16 Transformationen für eine Kante...................................................................................... 18 SCARA Roboter und korrespondierender Graph ............................................................. 20 Hexa Parallelroboter und korrespondierender Graph ....................................................... 20 Delta Parallelroboter und korrespondierender Graph....................................................... 21 Struktur der Applikation ................................................................................................... 22 Anwenderoberfläche in ROBCADTM integriert ............................................................... 23 Anwenderoberfläche......................................................................................................... 24 Komponenten des Kinematikmoduls................................................................................ 27 Lösungsverfahren für die Inverse Kinematik am Beispiel einer kinematischen Kette..... 28 Kinematische Kette des Hexa ........................................................................................... 29 Modulabhängigkeiten der Applikation ............................................................................. 33 Kinematische Struktur der Eclipse und zugehöriger Graph ............................................. 51 Porty Parallelroboter und zugehöriger Graph................................................................... 51 4 Tabellenverzeichnis 2.1 Erweiterte Parameter für die RSS-Kette........................................................................... 12 2.2 Erweiterte Parameter für die SPS-Kette ........................................................................... 13 2.3 Erweiterte Parameter für die KPS-Kette........................................................................... 14 5 1 Einleitung Größer werdende Absatzmärkte und damit steigende Verkaufsraten industrieller Produkte erfordern schnellere Taktraten bei der Fertigung. Herkömmliche, serielle Roboterstrukturen können den daraus folgenden Ansprüchen hinsichtlich Geschwindigkeit und Beschleunigung nicht gerecht werden. Parallele und hybride Roboterstrukturen erzielen durch eine geringere Eigenmasse höhere Geschwindigkeiten und Beschleunigungen bei zunehmender Genauigkeit. Sie sind also in der Lage, den steigenden Anforderungen in der Fertigungstechnik gerecht zu werden. An der Technischen Universität Braunschweig wurde der Sonderforschungsbereich SFB 562 „Robotersysteme für Handhabung und Montage“ [HeSchWa99] eingerichtet, in dem neue Roboterstrukturen für die industrielle Fertigung untersucht und geschaffen werden sollen. Hierfür sind u. a. sowohl eine Steuerung, eine Regelung als auch eine graphische Simulation für parallele und hybride Roboterstrukturen zu erstellen. Die Implementierung der graphischen Simulation hat innerhalb des industriellen Robotersimulationssystems RobcadTM zu erfolgen. Dabei soll eine universelle Schnittstelle zum Austausch der kinematischen Daten zwischen Teilprojekten des Sonderforschungsbereichs geschaffen werden. Diese soll so verwendet werden, daß ein Auswechseln der Roboterstruktur leicht möglich wird und die graphische Simulation durch das Austauschen der entsprechenden Kinematikmodule für verschiedene Strukturen ohne große Änderungen durchgeführt werden kann. 1.1 Motivation der Arbeit Bei seriellen Robotern haben sich als Notation die Denavit-Hartenberg-Parameter [DeHa55] durchgesetzt. Sie werden sowohl in der Forschung als auch in der Industrie eingesetzt und erleichtern den Austausch kinematischer Daten. Für Parallelroboter ist bisher keine einheitliche Notation vorhanden. In verschiedenen Arbeiten auf dem Gebiet der Parallelrobotik werden sehr spezielle Notationen verwendet, die jeweils an die behandelte Struktur bzw. an das entsprechende Problem angepaßt sind. Außerdem werden Gelenke mit mehreren Freiheitsgraden, wie sie oft bei Parallelrobotern vorkommen, unterschiedlich beschrieben. Dies macht den Austausch der kinematischen Daten zwischen verschiedenen, an der Entwicklung von Software für universelle Roboter beteiligten Teilprojekten äußerst schwierig. Kommerzielle Robotersimulationssysteme wie RobcadTM oder IGRIPTM sind bisher nicht in der Lage parallele kinematische Strukturen zu simulieren. In der Version 3.7.1 von RobcadTM und dem Advanced Modeling Paket lassen sich maximal Parallelkinematiken, wie sie Abbildung 1.1 zu entnehmen sind, modellieren [Rose2000]. Diese bestehen allesamt aus einzelnen rotatorischen Gelenken bzw. aus rotatorischen Gelenken und einem prismatischen Gelenk. Hierbei gibt es immer ein festes Roboterglied (fixed link) und ein aktives Gelenk, dessen nachfolgendes Glied als input_link bezeichnet wird. Die sich bewegenden Glieder sind mit coup link bzw. output link bezeichnet, wobei sich nach letzteren weitere Gelenke und Glieder definieren lassen. Diese 3 Möglichkeiten reichen jedoch für eine Simulation und somit für den Sonderforschungsbereich nicht aus, da die Möglichkeit zur Verwendung von häufig bei Parallelrobotern vorhandenen Gelenken, wie z.B. Kugel- und Kardangelenken, in geschlossenen kinematischen Ketten nicht möglich ist. Des weiteren ist es nicht möglich mehrere geschlossene kinematische Ketten wieder zusammenzuführen, z.B. an der Arbeitsplattform eines Parallelroboters. 6 Abbildung 1.1: Parallelkinematiken aus RobcadTM 1.2 Ziel der Arbeit Das Ziel dieser Arbeit ist es eine einheitliche Repräsentation universeller Roboter zu finden. Dabei müssen durch diese Repräsentation auch serielle Roboter beschrieben werden können. Zu diesem Zweck ist es nötig zunächst für Gelenke mit mehreren Freiheitsgraden eine einheitliche Darstellung zu finden. Dabei ist es wünschenswert, wenn sich diese Darstellung an bereits bekannten und bewährten Repräsentationen für Gelenke mit nur einem Freiheitsgrad, nämlich den Denavit-Hartenberg-Parametern, orientiert. Die kinematischen Daten für Parallelroboter sollen in der gefundenen Notation in einer Datei abgespeichert werden können und über diese mit anderen Teilprojekten ausgetauscht werden. Eine Simulation für die, in der Datei stehenden Struktur soll in dem Robotersimulationssystem RobcadTM implementiert werden, wobei auf eine universelle Lösung, bei der nur die Schnittstellendatei und ein Kinematikmodul ausgetauscht werden sollen, zu achten ist. Eine Anwenderoberfläche mit deren Hilfe der Roboter auf intuitiv zu bedienende Art und Weise bewegt werden kann, ist in das Simulationssystem RobcadTM zu integrieren. 1.3 Inhalt der folgenden Kapitel Das zweite Kapitel beschäftigt sich mit der Beschreibung von Gelenken mit mehreren Freiheitsgraden. Das dritte Kapitel stellt dann eine einheitliche Notation für universelle Roboter inkl. einer Datenstruktur vor. Im vierten Kapitel wird die Implementierung einer graphischen Simulation für universelle Roboter vorgestellt, in der die gefundene Notation angewendet wird. Das letzte Kapitel bietet einen Ausblick auf die Zukunft des Projektes, wobei es auch die Grenzen der Simulation aufzeigt. 7 2 Beschreibung von Gelenken mit mehreren Freiheitsgraden Für Gelenke mit einem Freiheitsgrad hat sich in der Vergangenheit eine Beschreibung mit Hilfe der DH-Parameter bewährt. Sowohl bei parallelen als auch bei hybriden Roboterstrukturen findet man jedoch sehr oft Gelenke mit mehreren Freiheitsgraden vor, z.B. Kugelgelenke oder Kardangelenke. Diese lassen sich auch mit den bekannten DH-Parametern beschreiben. Allerdings sind dazu mehrere Koordinatensystemübergänge notwendig. Um dies zu vermeiden wird im folgenden Kapitel eine Erweiterung der DH-Parameter für Gelenke mit mehreren Freiheitsgraden vorgestellt und mit Alternativen verglichen. Den Abschluß des Kapitels bilden einige Beispiele zur Verwendung der erweiterten DH-Parameter. 2.1 Denavit-Hartenberg-Parameter Die DH-Notation ist eine Möglichkeit zur Beschreibung von Gelenken mit einem Freiheitsgrad und hat sich bestens für die Beschreibung rotatorischer und prismatischer Gelenke bewährt. Ein DH-Koordinatensystemübergang wird durch die folgende Transformationsgleichung dargestellt: Ti = Rot ( zi −1 ,θ i )Trans( zi −1 ,d i )Trans( xi ,ai ) Rot ( xi ,α i ) i −1 Die einzelnen Parameter sind dabei folgendermaßen definiert: • • • • θi bezeichnet den Winkel von der Achse xi-1 zur Achse xi, gedreht um die Achse zi-1. Handelt es sich um ein rotatorisches Gelenk, so ist dieser Parameter variabel. di bezeichnet den Abstand vom Ursprung des Koordinatensystems i-1 zum Schnittpunkt der Achsen zi-1 und xi, gemessen entlang der Achse zi-1. Handelt es sich um ein prismatisches Gelenk, so ist dieser Parameter variabel. ai bezeichnet den kürzesten Abstand zwischen den Achsen zi-1 und zi. αi bezeichnet den Winkel von der Achse zi-1 zur Achse zi, gedreht um die Achse xi. Um Eindeutigkeit zu gewährleisten, gibt es außerdem die nachfolgenden Regeln für die Lage der Koordinatensysteme: 1. Die Achse zi-1 ist die Bewegungsachse des i-ten Gelenks. 2. Die Achse xi liegt entlang der Gelenknormalen und zeigt in Richtung des höher indizierten Gelenks. 3. Die Achse yi wird durch das Rechtshandkoordinatensystem eindeutig festgelegt. Abbildung 2.1 zeigt die Verwendung der DH-Parameter anhand eines Beispiels mit 2 rotatorischen Gelenken. 8 Abbildung 2.1: DH-Parameter für rotatorische Gelenke 2.2 Erweiterung der DH-Parameter Um Gelenke mit mehreren Freiheitsgraden beschreiben zu können, könnte man mehrere DHKoordinatensystemübergänge verwenden. Kugelgelenke ließen sich so z.B. mit Hilfe von drei DH-Parameterübergängen ausdrücken. Das hätte zur Folge, daß man insgesamt 12 Parameter zur Beschreibung eines einzelnen Kugelgelenks benötigen würde. Auf weitere Alternativen und die einzelnen Vor- und Nachteile bei der Beschreibung von Gelenken mehrerer Freiheitsgrade wird in Abschnitt 2.4 eingegangen. Oben genanntes Problem läßt sich lösen, indem man eine weitere Rotation um die y-Achse hinzufügt und so insgesamt nur fünf Parameter zur Beschreibung benötigt [ThoWa01]. Die zusätzliche Rotation erfolgt um die bereits um zi-1 gedrehte y-Achse. Die Transformationsgleichung ergibt sich dann wie folgt: Ti = Rot ( zi−1 ,θ i )Trans( zi−1 ,d i ) Rot ( y 'i −1,β i )Trans( xi ,ai ) Rot ( xi ,α i ) i −1 2.2.1 Kugelgelenke Will man mit Hilfe dieser Parameter Kugelgelenke beschreiben, so muß man die Lage der Koordinatensysteme eindeutig festlegen. Da es nicht nur eine Bewegungsachse bei Kugelgelenken gibt, kann man nicht mehr die Festlegung treffen, daß die z-Achse entlang der Bewegungsachse liegt. Wenn man eine Kette von aufeinanderfolgenden Kugelgelenken betrachtet, dann sind diese durch Punkte im Raum festgelegt. Verbindet man diese Punkte mittels Geraden, so erhält man die Lage der Gelenknormalen. Wie bei den herkömmlichen DH-Parametern legt man nun die x-Achse entlang dieser Geraden. Zur Festlegung der z-Achse legt man zwei Ebenen 9 so durch das Gelenk, daß die Normalen der Ebenen mit den vorherigen bzw. nachfolgenden Gelenknormalen übereinstimmen. Nun bringt man diese beiden Ebenen zum Schnitt und erhält als z-Achse den Richtungsvektor der Schnittgerade der beiden Ebenen. Die y-Achse wird dadurch eindeutig festgelegt, daß es sich um ein Rechtshandkoordinatensystem handelt. Abbildung 2.2 zeigt die Lage des Koordinatensystems im Kugelgelenk, in einer kinematischen Kette, die aus einem rotarischen Gelenk, einem Kugelgelenk und noch einem rotatorischen Gelenk besteht. Dabei entsprechen die erweiterten DH-Parameter für das rotatorische Gelenk den DH-Parametern, mit der Ausnahme, daß der zusätzliche Parameter β = 0° existiert. Abbildung 2.2: Lage des Koordinatensystems bei einem Kugelgelenk 2.2.2 Kardangelenke Auch Kardangelenke können mit der erweiterten DH-Notation beschrieben werden. In diesem Fall sind die variablen Parameter θ und β. Durch die Festlegung der Lage der x-Achse entlang der Gelenknormalen in Richtung höherer Gelenkindizes, ist dann auch eindeutig die Zuordnung der z- und y-Achse zu den beiden Gelenkachsen bestimmt. Abbildung 2.3 zeigt dies für zwei aufeinanderfolgende Kardangelenke. 10 Abbildung 2.3: Lage der Koordinatensysteme bei aufeinanderfolgenden Kardangelenken 2.2.3 Eindeutige Festlegung der Parameter Zusammenfassend sind hier noch einmal die notwendigen Vereinbarungen für eine eindeutige Festlegung der erweiterten DH-Parameter und der Koordinatensysteme aufgelistet: • Der Ursprung des Koordinatensystems des i-ten Robotergliedes liegt im i+1-ten Gelenk. • Die z-Achse des Koordinatensystems des i-ten Robotergliedes ist bei nachfolgenden rotatorischen und prismatischen Gelenken die Bewegungsachse des i+1-ten Gelenks. Ist das nachfolgende Gelenk ein Kugelgelenk so verläuft die z-Achse des Koordinatensystems des i-ten Gliedes entlang der Schnittgerade zweier Ebenen die jeweils die Gelenknormalen des i-ten und i+1-ten Gelenkes als Normalen haben. Handelt es sich um ein Kardangelenk, so verläuft die z-Achse entlang der 1. Bewegungsachse des Kardangelenks. • Die x-Achse des i-ten Koordinatensystems verläuft entlang der Gelenknormalen und zeigt in Richtung nachfolgender Gelenke. Der Parameter ai gibt dabei den Abstand der beiden Koordinatensysteme an. • Liegt ein Kugelgelenk vor, so sind die Parameter θi, βi und αi variabel. Bei einem Kardangelenk sind dies θi und βi. Bei rotatorischen und prismatischen Gelenken ist dies wie zuvor θi bzw. di. In jedem Fall gilt aber: 0° ≤ βi ≤ 180° 11 2.3 Beispiele für die Verwendung der erweiterten DH-Parameter Es folgen einige Beispiele von kinematischen Ketten und den zugehörigen Tabellen für die erweiterten DH-Parameter und eine Beschreibung wie die jeweiligen Parameter zustande kommen. Im folgenden sind die Bezeichnungen der kinematischen Ketten abgekürzt. Dabei steht R für ein rotatorisches Gelenk, P für ein prismatisches Gelenk, S für ein sphärisches Gelenk (Kugelgelenk) und K für ein Kardangelenk. Eine kinematische Kette aus rotatorischem, prismatischen und Kugelgelenk wäre demnach eine RPK-Kette. 2.3.1 Beispiel 1: Rotatorisches Gelenk, Sphärisches Gelenk, Sphärisches Gelenk Wie der Abbildung 2.4 zu entnehmen ist, handelt es sich bei dem ersten Gelenk dieser Kette um ein rotatorisches Gelenk. Da dies ein Gelenk mit nur einem Freiheitsgrad ist, erfolgt die Beschreibung analog zu den bekannten DH-Parametern. Interessant ist die Lage des i-1-ten Koordinatensystems. Da es sich bei dem i-ten Gelenk um ein Kugelgelenk handelt, läßt sich die Lage der Achse zi-1 durch die Schnittgerade von den zwei Ebenen bestimmen, die als Normale die Gelenknormale von Gelenk i-1 bzw. i haben. Die x-Achse des i-1-ten Koordinatensystems liegt entlang der Gelenknormalen von Glied i-1 und die y-Achse wird so gewählt, daß das Rechtshandsystem komplett wird. Bei dem Gelenk i-1 handelt es sich um ein rotatorisches Gelenk handelt, daher ist θi-1 variabel. Der Abstand entlang der z-Achse vom Koordinatensystem i-2 zum Koordinatensystem i1 ist durch di-1 angegeben. Der Abstand der entlang der Gelenknormalen durch ai-1. Um die zAchsen zur Deckung zu bringen ist außerdem eine Drehung um die Achse xi-1 mit αi-1 = 90° erforderlich. Man kann sehen, daß die erweiterten DH-Parameter den DH-Parametern bis auf den zusätzlichen Parameter βi-1 = 0° entsprechen. Das zweite Gelenk ist ein Kugelgelenk, daher sind θi, βi und αi variabel. Der Parameter ai gibt den Abstand der Koordinatensysteme i-1 und i entlang der Gelenknormalen zu Gelenk i an. Der Abstand entlang der Achse zi-1 wird durch di ausgedrückt und ist bei Kugelgelenken immer Null. Analog zum Gelenk i läßt sich auch das nachfolgende 2. Kugelgelenk in der Kette beschreiben. 12 Abbildung 2.4: RSS-Kette Gelenk i-1 i i+1 θ var var var d β a d i-1 0 0 0 var var a i-1 ai a i+1 α 90° var var Tabelle 2.1: Erweiterte Parameter für die RSS-Kette 2.3.2 Beispiel 2: Sphärisches Gelenk, Prismatisches Gelenk, Sphärisches Gelenk Abbildung 2.5 ist eine graphische Darstellung der SPS-Kette. Das erste Gelenk in der Kette ist ein Kugelgelenk. Demnach sind die drei Parameter θi-1, βi-1 und αi-1 variabel. Das nachfolgende Gelenk ist ein prismatisches Gelenk, was zur Folge hat, daß die Ursprünge der Koordinatensysteme i-2 und i-1 deckungsgleich sind, also sowohl di-1 und ai-1 gleich Null sein müssen. Die Parameter für das prismatische Gelenk sehen folgendermaßen aus: di ist variabel und ai gleich 0. Für die übrigen Parameter betrachtet man die Lage der Koordinatensysteme i-1 und i. Die z-Achse des Koordinatensystems i liegt entlang der Schnittgerade der Ebenen die als Normalen die Gelenknormalen von Gelenk i und Gelenk i+1 haben. Die Achse xi liegt entlang der Schubachse, also der Gelenknormalen von Gelenk i. Daraus ergibt sich dann die Lage der Achse yi. Gemäß dieser Lage ist eine Drehung um zi-1 mit θi = -90° und eine Drehung um die eben gedrehte Achse y´i-1 mit βi = 90° erforderlich. Die Parameter θi+1, βi+1 und αi+1 sind variabel, weil das 3. Gelenk wieder ein Kugelgelenk ist. Der Parameter di+1 ist gleich Null und ai+1 gibt den Abstand entlang der Gelenknormalen zum 13 nachfolgenden Gelenk an. Für den Fall, daß es sich um ein prismatisches Gelenk handelt, ist dieser Parameter wieder gleich Null, da dann die Ursprünge der Koordinatensysteme i und i+1 deckungsgleich wären. Abbildung 2.5: SPS-Kette Gelenk i-1 i i+1 θ var -90 var d β a 0 var 0 var 90° var 0 0 a i+1 α var 0° var Tabelle 2.2: Erweiterte Parameter für die SPS-Kette 2.3.3 Beispiel 3: Kardangelenk, Prismatisches Gelenk, Sphärisches Gelenk Das erste Gelenk, dieser Kette ist ein Kardangelenk (siehe Abbildung 2.6). Da die Rotationen von Links zu besetzen sind, müssen die Parameter θi-1 und βi-1 variabel sein. Aus dem gleichen Grund sind die Achsen zi-2 und yi-2 die Bewegungsachsen des Gelenks. Da das nachfolgende Gelenk ein prismatisches Gelenk ist, sind die Ursprünge der Koordinatensysteme i-2 und i-1 deckungsgleich und die Achse zi-1 verläuft entlang der Gelenknormalen von Gelenk i. Sieht man sich die Abbildung an, erkennt man, daß zunächst eine Drehung um die Achse zi-2 im Winkel von 90° erforderlich wäre. Dies wird aber schon durch die Angabe „θi-1 ist variabel“ ausgedrückt. Abschließend ist noch eine Rotation um die x-Achse mit αi-1 = 90° erforderlich. Das zweite Gelenk bildet ein prismatisches Gelenk. Der variable Parameter ist hier di. Das Koordinatensystem i läßt sich wie folgt bestimmen: Das nachfolgende Gelenk ist ein Kugelgelenk, also liegt die Achse zi entlang der Schnittgerade der Ebenen die die Gelenknormalen 14 des i-ten Gelenks bzw. des i+1 Gelenks als Normalen haben. Die Achse xi zeigt in Richtung der Gelenknormalen des i-ten Gelenks und die Achse yi wird so gelegt, daß ein Rechtshandsystem entsteht. Die Lage dieses Koordinatensystems, macht zunächst eine Rotation um zi-1 mit θi = -90° erforderlich. Anschließend erfolgt eine Rotation um die bereits gedrehte Achse y´i-1 mit βi = 90°. Da sich dann das Koordinatensystem in der gewünschten Lage befindet ist keine weitere Rotation um die x-Achse erforderlich und somit αi = 0°. Ebenso ist ai gleich Null. Das letzte Gelenk ist ein Kugelgelenk. Die Parameter für die Rotationen sind alle variabel. Der Parameter di+1 wird auf Null gesetzt, weil kein Versatz in Richtung der z-Achse vorhanden ist. Schließlich gibt ai+1 den Abstand zum Gelenk i+2 entlang der Gelenknormalen an. Wäre dieses Gelenk ein prismatisches Gelenk, so wäre ai+1 = 0. Abbildung 2.6: KPS-Kette Gelenk i-1 I i+1 θ var -90° var d β a 0 var 0 var 90° var 0 0 a i+1 α 90° 0° var Tabelle 2.3: Erweiterte Parameter für die KPS-Kette 15 2.4 Alternative Beschreibungen von Gelenken mehrerer Freiheitsgrade Dieser Abschnitt stellt alternative Möglichkeiten zur Beschreibung von Gelenken mit mehreren Freiheitsgraden vor und welche Vor- bzw. Nachteile sie gegenüber den erweiterten DHParametern haben. 2.4.1 RPY Transformationen Anstelle der erweiterten DH-Parameter könnte man Gelenke mit mehreren Freiheitsgraden auch mit Hilfe von RPY Transformationen beschreiben. Dies würde allerdings nur etwas an der Art der Transformationen ändern, aber keinen Vorteil bringen. Ein Nachteil dabei ist, daß die Art der Beschreibung nicht mehr mit den bereits vorhandenen DH-Parametern für Gelenke mit einem Freiheitsgrad konsistent wäre. 2.4.2 Merlets Beschreibung Merlet [Merl00] gibt eine Möglichkeit für die Beschreibung der 2d-Orientierung eines Vektors im Raum an, die er wie folgt festlegt: cosµi cosθ i sinα i +sinµi cosα i wi = sinµi cosθ i sinα i −cosµi cosα i sinθ i sinα i Der Vektor w für ein Kugelgelenk, daß durch 3 rotatorische Gelenke dargestellt wird, ist in Abbildung 2.7 zu sehen. Dabei schneiden sich die 3 Bewegungsachsen der rotatorischen Gelenke in einem Punkt und liegen in einer Ebene. Diese Notation hat den Nachteil, daß sich die Orientierung eines Vektors im 3D-Raum zwar festlegen läßt, jedoch nicht die Orientierung um diesen Vektor. Dies würde zu Inkonsistenzen führen, falls sich in einer kinematischen Kette z.B. sowohl Kugelgelenke als auch prismatische Gelenke befinden, da keine eindeutige Beschreibung vorläge. Abbildung 2.7: Kugelgelenk aus [Merl00] 16 3 Eine einheitliche Notation für universelle Roboter Wenn man die verschiedenen Arbeiten auf dem Gebiet der Parallelrobotik betrachtet, so findet man unterschiedliche Beschreibungsformen für verschiedene kinematische Strukturen. Jeder Autor hat eine individuelle Systematik, zugeschnitten auf das Problem, mit dem er sich gerade beschäftigt. Man möchte jedoch eine einheitliche Beschreibungsform universeller Roboter finden. Mit Hilfe der erweiterten DH-Parameter wurde die Voraussetzung dazu geschaffen. Was außerdem benötigt wird, ist eine abstrakte Repräsentation der kinematischen Struktur universeller Manipulatoren, so daß man eine geeignete Datenstruktur finden und somit die Struktur des Roboters eindeutig abspeichern kann. Die hier gefundene Lösung basiert auf einem gerichteten Graph, einem Ansatz von Belifiore und Benedetto [BeBe00]. In diesem Kapitel werden die einzelnen Elemente der Graphstruktur näher erläutert. Anschließend folgt ein Algorithmus für die Knotenindizierung im Graphen, um eine eindeutige Vergabe der Knotennummern zu gewährleisten. Schließlich endet das Kapitel mit einem Beispiel einer Schnittstellendatei, die mit Hilfe der Applikation, die in Kapitel 4 beschrieben wird, eingelesen werden kann. Sie stellt die Beschreibung eines universellen Roboters dar, wie sie vom Anwender vorgenommen werden muß. 3.1 Elemente der Datenstruktur Die Datenstruktur ist ein gerichteter Graph, wobei die Knoten die Roboterglieder repräsentieren und die Kanten die Gelenke des Roboters. Zur Übersicht ist der Graph für den Hexa Parallelroboter, die einzelnen Elemente und deren Inhalt in Abbildung 3.1 dargestellt. Abbildung 3.1: Hexa Graph und Elemente der Datenstruktur 17 3.1.1 Knoten des Graphen Die Knoten des Graphen repräsentieren die Glieder des Roboters. Für die Simulation bedeutet dies, daß sie Daten über die CAD-Entitäten enthalten. Im einzelnen sind dies: • Die Art der CAD-Entität. Hierbei kann es sich um ein einfaches Glied (S-Link), ein verzweigtes Glied (M-Link) oder eine Plattform (Base, Tool) handeln. • Der Name der CAD-Entität. Hierbei handelt es sich um den Namen eines Verzeichnisses in dem die Geometriedaten der entsprechenden CAD-Entität gespeichert sind. • Die absolute Position der CAD-Entität in Weltkoordinaten. 3.1.2 Kanten des Graphen Die Kanten des Graphen repräsentieren die Gelenke des Roboters. Sie enthalten unter anderem die erweiterten DH-Parameter. Im einzelnen sind folgende Daten in den Kanten gespeichert: • Der Nachfolgende Knoten. Da es sich um einen gerichteten Graphen handelt, muß der Nachfolger gespeichert sein. • 3 Transformationen, die die relative Lage der Gelenke zueinander beschreiben. Diese Transformationen werden in Abschnitt 3.1.3 beschrieben. • Der Gelenktyp. Hier wird festgelegt, ob es sich z.B. um ein rotatorisches, prismatisches, Kardan- oder Kugelgelenk handelt. • Die Stellbereiche des Gelenks. Hier können Einschränkungen für den Bewegungsspielraum des Gelenks vorgegeben werden. • Die Art des Gelenks. Hier steht, ob es sich um ein aktives oder passives Gelenk handelt. 3.1.3 Die 3 Transformationen In den Kanten sind 3 Transformationen gespeichert, die die Lage der Koordinatensysteme in den Gelenken zueinander beschreiben. Im folgenden sind die 3 Transformationen aufgelistet und erklärt: Tfix, 1 : Dies ist eine feste Transformation. Sie wird benötigt, um vom Basisframe zum jeweils ersten Gelenk einer kinematischen Kette zu gelangen, da dies unter Umständen nicht alleine durch die erweiterten DH-Parameter erreicht werden kann. Diese Transformation enthält 6 Variablen (x, y, z, ϕx, ϕy, ϕz) für alle 6 Freiheitsgrade. 18 Tparams : Diese Transformation enthält die erweiterten DH-Parameter θ, d, β, a, α. Die Gelenkvariablen werden während der Laufzeit vom Programm modifiziert. Tfix, 2 : Dies ist eine feste Transformation. Sie wird benötigt, um vom jeweils letzten Gelenk einer kinematischen Kette zum Toolframe zu gelangen, da auch dies nicht in jedem Fall durch die erweiterten DH-Parameter erreicht werden kann. Diese Transformation enthält ebenfalls 6 Variablen (x, y, z, ϕx, ϕy, ϕz) für alle 6 Freiheitsgrade. Die Gesamttransformationen ergibt sich für einen Übergang von Roboterglied i-1 zu Glied i aus der Verknüpfung der 3 Transformationen nach folgender Formel: i-1 Ti= Tfix, 1 Tparams Tfix, 2 In jedem Fall ist die Transformation Tparams gesetzt, denn sie beschreibt die Lage der Gelenke zueinander. Sind Tfix, 1 bzw. Tfix, 2 nicht gesetzt, so bestehen Tfix, 1 und Tfix, 2 aus Einheitsmatrizen. Abbildung 3.2 verdeutlicht diesen Zusammenhang noch einmal. Abbildung 3.2: Transformationen für eine Kante 3.2 Algorithmus für die Knotenindizierung Da eine einheitliche Repräsentation der Roboterstrukturen erreicht werden soll, muß auch die Indizierung der Knoten im Graphen für gleiche Strukturen dieselbe sein. Zu diesem Zweck wird in diesem Abschnitt ein Algorithmus zur Knotenindizierung vorgestellt. 19 Bei der Knotenindizierung wird wie folgt vorgegangen: 1. Markieren aller Knoten im Graphen als noch nicht besucht und setzen des Indexes auf 1. 2. Beginnen mit dem Knoten an dem sich der Basisframe befindet. 3. Den Index an den aktuellen Knoten vergeben. 4. Eine Liste der Nachfolgenden Knoten erstellen, diese nach der Reihenfolge ihres kürzesten geometrischen Abstandes sortieren und mit dem 1. Knoten in der Liste fortfahren. Der Abstand zwischen 2 benachbarten Knoten ξ und η ist folgendermaßen definiert: ( xξ − xη , yξ − yη , zξ − zη ) T oder falls das Ergebnis Null ist: (ϕ xξ − ϕ xη ,ϕ yξ − ϕ yη ,ϕ zξ − ϕ zη ) ξ und η repräsentieren dabei die Transformationen Tfix, 1⋅TParams⋅Tfix, 2. 5. Indexzähler um 1 erhöhen. 6. Mit 3. fortfahren bis der Toolframe erreicht ist, dann mit dem jeweils nachfolgenden Knoten in der Liste weitermachen. Solange mit 3. fortfahren, bis alle Knoten besucht sind. 7. Ende. 3.3 Beispiele für die Knotenindizierung Der folgende Abschnitt beinhaltet einige kinematische Strukturen und ihre dazu gehörenden Repräsentationen als Graph. Insbesondere wird die Indizierung der einzelnen Knoten dargestellt. Auf der linken Seite ist immer eine Abbildung der kinematischen Struktur zu sehen, gefolgt von einer schematischen Darstellung dieser Struktur in der Mitte, in der bereits den einzelnen Gliedern Knotennummern zugeordnet sind. Rechts sieht man dann letztendlich den korrespondierenden Graph zu der Roboterstruktur mit den entsprechenden Knoten und Kanten. Zwei weitere Strukturen und deren Knotenindizierung finden sich in Anhang B. 3.3.1 SCARA Roboter (serielle Roboterstruktur) Bei seriellen Roboterstrukturen liegt ein Spezialfall eines Graphen vor, eine einfache Liste. Die Indizierung der Knoten ist dementsprechend sehr einfach: Beginnend am Basisframe werden die Roboterglieder sequentiell durchnumeriert, bis der Toolframe erreicht ist. Abbildung 3.3 stellt dies dar. 20 Abbildung 3.3: SCARA Roboter und korrespondierender Graph 3.3.2 Hexa Parallelroboter Der Hexa Parallelroboter besteht aus sechs, an der Basisplattform angehefteten und symmetrisch angeordneten, kinematischen Ketten, welche sich aus 3 Gelenken, die 2 Glieder verbinden zusammensetzen. Die Indizierung der Knoten beginnt wieder am Basisframe, der den Index 1 bekommt. Danach wird das erste Glied der geometrisch nächsten Kette indiziert. Den Index 3 bekommt das 2. Glied in dieser Kette. Die Arbeitsplattform mit dem Toolframe bekommt 4 als Index zugewiesen. Jetzt behandelt man, die vom Basisframe ausgehende zweitnächste kinematische Kette und numeriert sie mit 5 und 6. Danach nimmt man wieder vom Basisframe aus gesehen die nächste noch nicht indizierte Kette. Das führt man so lange durch bis alle Knoten indiziert sind. Abbildung 3.4 zeigt die Knotenindizierung für den Hexa Parallelroboter. Abbildung 3.4: Hexa Parallelroboter und korrespondierender Graph 21 3.3.3 Delta Parallelroboter Der Delta Roboter ähnelt von seiner kinematischen Struktur her dem Hexa Parallelroboter. Anstelle von 6 aktiven rotatorischen Gelenken, die an der Arbeitsplattform angeheftet sind, hat er jedoch nur 3 aktive Gelenke. Die ersten Glieder einer jeweiligen Kette verzweigen sich dann nochmal, so daß auch hier 6 Kugelgelenke folgen (siehe Abbildung 3.5). Der Rest der Struktur entspricht der des Hexa. Der Delta Parallelroboter besitzt aufgrund dieser Struktur nur 3 Freiheitsgrade, was sich leicht mit Hilfe von Grüblers erweiterter Theorie [Cros64] überprüfen läßt. Für vollparallele Strukturen lautet der Ansatz: m = 6(l − n − 1) + n k =1 dk Dabei entspricht m der Anzahl der Freiheitsgrade. Der Anzahl der Verbindungen zwischen den Gelenken entspricht der Parameter l. Im Fall des Delta sind es 10, denn er hat 3 Hebel + 6 Schubstangen + die Basis, die immer mitgerechnet wird. Die Gesamtzahl der Gelenke n beträgt 15, da 3 rotatorische Gelenke und 12 Kugelgelenke vorhanden sind. Die Berechnung von dk ergibt sich aus den jeweiligen Freiheitsgraden des betrachteten Gelenks. Damit erhält man: m = 6(10 −15−1) + 3⋅1+12⋅3 m = 6⋅( −6) + 39 m =3 Ähnlich wie beim Hexa verläuft auch die Knotenindizierung. Begonnen wird mit dem Basisframe. Den Index 2 erhält die von hier aus nächste Verzweigung. Je nachdem wie das Koordinatensystem in dieser Verzweigung liegt, wird der Index 3 jetzt an eine der beiden folgenden Schubstangen vergeben. Den Index 4 erhält der Toolframe. Index 5 bekommt die andere Schubstange in dieser Kette. Jetzt wird gemäß dem Abstand die zweite zu indizierende Kette ausgewählt. Die Verzweigung und die beiden Schubstangen bekommen die Indizes 6-8. Das gleiche Verfahren wird dann auf die letzte Kette angewendet. Jetzt sind alle Knoten indiziert. Abbildung 3.5 zeigt die Indizierung für den Delta. Abbildung 3.5: Delta Parallelroboter und korrespondierender Graph 22 4 Die Applikation In den vorangehenden Kapiteln wurde eine einheitliche Repräsentation universeller Roboter und deren Gelenke beschrieben. Jetzt wird eine Applikation zur Simulation universeller Roboter vorgestellt, die diese Notation verwendet. Zuerst folgt eine Übersicht über die Struktur der Applikation. In den darauffolgenden Abschnitten werden die einzelnen Komponenten dieser Applikation näher erläutert. 4.1 Strukturübersicht über die Applikation Abbildung 4.1 zeigt eine schematische Darstellung der einzelnen Module der Applikation und wie sie mit ihrer Umgebung interagieren. Modul mit Inverser und Vorwärtskinematik Kinematikmodul berechnet die neuen Parameter und stellt sie der Datenstruktur zur Verfügung Applikation zur Simulation universeller Roboter Datenstruktur Anwenderoberfläche Schnittstellendatei mit Definition der Kinematischen Struktur Applikation liest Kennt die NaDatei in die Da- men der CAD tenstruktur ein Komponenten Greift auf Robcadfunktionen zur Berechnung und graphischen Darstellung zu Robcad TM Bibliothek mit CAD Komponenten z.B. mit Robcad modelliert Abbildung 4.1: Struktur der Applikation Den Kern der Applikation bildet das Hauptprogramm mit seiner Datenstruktur und seiner Anwenderoberfläche. Dieser Teil des Programms bleibt in jedem Fall gleich, auch wenn sich die zu simulierende kinematische Struktur ändert. Was der Anwender austauschen muß, falls er einen neuen Roboter simulieren möchte, ist rot eingefärbt. Wenn es sich um eine andere kinematische Struktur handelt, müssen natürlich die CAD-Komponenten ausgetauscht werden und gegebenenfalls neu modelliert werden. Dies kann mit RobcadTM geschehen oder mit einem anderen CAD-System, dessen Daten RobcadTM in der Lage ist einzulesen. Die neuen Namen der Komponenten müssen außerdem in die neue Schnittstellendatei eingetragen werden. Die Schnittstellendatei muß komplett neu geschrieben werden, da sich die Lage der Gelenke und Roboterglieder zueinander von Struktur zu Struktur unterscheidet. Da die allgemeine Inverse- und Vorwärtskinematik für Parallelroboter zum gegenwärtigen Zeitpunkt noch nicht gelöst ist, muß außerdem auch das Kinematikmodul für jeden Roboter individuell angepaßt werden. 23 In den folgenden Abschnitten werden Anwenderoberfläche und Kinematikmodul genauer erläutert. Auf die Datenstruktur mit der Schnittstellendatei wurde bereits in Kapitel 3 näher eingegangen. 4.2 Anwenderoberfläche Abbildung 4.2 zeigt die Oberfläche mit dessen Hilfe der Anwender den Roboter bewegen kann, wie sie in das Simulationssystem RobcadTM integriert ist. Die eigentliche Oberfläche befindet sich auf der rechten Seite des Bildes. Im großen Fenster, welches die CAD-Welt darstellt, ist ein modellierter Hexa-Parallelroboter zu sehen. Die restlichen Bedienelemente entstammen dem RobcadTM-Simulationssystem. Abbildung 4.3 zeigt die Anwenderoberfläche der Applikation noch einmal vergrößert. HexaParallelroboter RobcadBedienelemente Abbildung 4.2: Anwenderoberfläche in RobcadTM integriert Anwenderoberfläche 24 Schnittstellendatei einlesen Teach-Panel Position anfahren Kollisionsüberwachung Zustandsanzeigen Abbildung 4.3: Anwenderoberfläche Die Anwenderoberfläche wurde mit Hilfe von ROBUilTM, einer in RobcadTM integrierten und auf Tcl/Tk basierenden Programmierschnittstelle zum Entwurf graphischer Oberflächen, erstellt. Diese Schnittstelle ermöglicht die einfache Realisation von Buttons und Menus, sowie Anzeigeelementen. Möchte man Funktionen realisieren, so werden von der ROBUilTMOberfläche aus einzelne Callback-Funktionen aufgerufen, die sich dann in Form von CFunktionen realisieren lassen [Tec99]. Das Layout der Anwenderoberfläche ist dicht an das RobcadTM-eigene Layout zur Bewegung serieller kinematischer Strukturen angelehnt, um eine einfache Bedienung ohne umlernen zu gewährleisten. Die Funktionen die mit Hilfe der Anwenderoberfläche der Simulation ausgelöst werden können, lassen sich in 5 Teile aufgliedern, die jeweils Bedienelementen oder Gruppen von Bedienelementen entsprechen und werden im folgenden beschrieben: 1. Schnittstellendatei einlesen: • Wird der Button „Load kin. Info“ betätigt, so öffnet sich ein Dialogfenster, das die Eingabe eines Dateinamens für eine Schnittstellendatei zuläßt. Existiert die Datei, so wird diese auf Fehler überprüft. Wenn sie fehlerfrei ist, wird anschließend die Datei 25 eingelesen und die entsprechende Datenstruktur im Speicher abgelegt. Außerdem werden die einzelnen CAD-Komponenten geladen und angezeigt. 2. Teach-Panel: Hier sind eine Reihe von Buttons angebracht, die in etwa einem Teach-Panel eines realen Roboters entsprechen. Außerdem gibt es noch 2 Anzeigen. Im einzelnen haben diese Elemente folgende Funktionen: • „Reset“ ermöglicht es, den zu simulierenden Roboter in seine Homeposition zu befördern. Dies kann besonders dann nützlich sein, wenn es schwierig ist aus einer festgefahren Situation, z.B. durch Kollision wieder herauszufinden. • „Mmove“ ermöglicht die Bewegung des Roboters mit der Maus. Wenn dieser Button aktiviert ist, kann man mit der rechten Maustaste den Roboter in die positive Richtung entlang der gewählten Achse im gewählten Koordinatensystem bewegen und mit der linken Maustaste in die entgegengesetzte Richtung. Sollte keine Achse oder kein Koordinatensystem gewählt sein, so gibt die Applikation die Fehlermeldung „No Axis selected“ bzw. „No Frame selected“ aus. Während dieser Button aktiviert ist, läßt sich der Blickwinkel im CAD-Fenster nicht ändern. • „Mview“ ermöglicht es nach gewähltem „Mmove“ wieder den Blickwinkel des CADFensters zu ändern. • Die Buttons „x“, „y“, „z“, „rx“, „ry“ und „rz“ sind dazu da eine Bewegungsachse auszuwählen, entlang welcher sich der Roboter bewegen soll. „x“, „y“ und „z“ bezeichnen dabei translatorische Bewegungen, während „rx“, „ry“ und „rz“ Drehungen um die jeweiligen Achsen bewirken. Die eigentliche Bewegung des Roboters erfolgt, dann entweder durch die beiden Pfeile am unteren Rand des Teach-Panels, oder durch die Maus mit Hilfe von „Mmove“. • „World“, „Tcpf“ und „Other“ lassen den Anwender das Koordinatensystem auswählen in dem sich das Toolsystem des Roboters bewegen soll. „World“ bezeichnet dabei das Weltkoordinatensystem, „Tcpf“ läßt den Roboter sich bezüglich seines eigenen Toolframesystems bewegen, während man mit „Other“ ein beliebiges selbst erzeugtes Koordinatensystem wählen kann. • Mit „Step Size“ kann man die Schrittgröße ändern, mit der sich der Roboter bewegen soll. Dabei lassen sich im nach der Betätigung öffnenden Fenster getrennt die Schrittgröße für translatorische Bewegungen, sowie die Schrittgröße für Rotationen festlegen. Nach Bestätigung der Eingabe werden diese Werte in den beiden Anzeigefenstern direkt unter dem Button angezeigt. • Die beiden Pfeile bewirken eine Bewegung des Roboters. Der Pfeil nach links ermöglicht es den Roboter entlang der gewählten Bewegungsachse im gewählten Koordinatensystem in negativer Richtung zu bewegen. Der rechte Pfeil bewegt den Roboter entlang der gewählten Achse in positiver Richtung. Sollte keine Achse oder kein Koordinatensystem gewählt sein, so gibt die Applikation die Fehlermeldung „No Axis selected“ bzw. „No Frame selected“ aus. 26 3. Position anfahren: • Nach Betätigung des Buttons „Move absolute“ öffnet sich ein Fenster in das 6 Werte für die Lage und Orientierung des Toolframes eingegeben werden können. Anschließend bewegt sich der Roboter zu dieser in Weltkoordinaten anzugebenden Stelle, sofern dies möglich ist. 4. Kollisionsüberwachung: • In diesem Bereich befindet sich eine Schaltfläche mit der die Kollisionsüberwachung an- und ausgeschaltet werden kann. Des weiteren ist hier eine Anzeige, die Auskunft darüber gibt, ob die Kollisionsüberwachung aktiviert ist oder nicht. Die Möglichkeit zur Deaktivierung der Kollisionsüberwachung existiert vor allem aus Gründen der Performance. Bei eingeschalteter Kollisionsüberwachung bewegt sich der Roboter deutlich langsamer als ohne. Würde man die RobcadTM-eigenen Funktionen durch eigene austauschen ließe sich evtl. eine schnellere Möglichkeit zur Kollisionsüberprüfung realisieren. 5. Zustandsanzeigen: Im unteren Bereich der Anwenderoberfläche befinden sich außerdem noch einige Zustandsanzeigen, die im folgenden beschrieben werden: 4.3 • Die Anzeige „Sel. movement“ gibt Auskunft über die derzeitig gewählte Bewegungsrichtung. „x“, „y“ und „z“ bedeuten dabei Translationen entlang der jeweiligen Achse, während „rx“, „ry“ und „rz“ für die entsprechenden Rotationen stehen. Die Bezeichnungen für den Zustand sind dabei identisch mit den Bezeichnungen auf den Buttons für die Wahl der Bewegungsrichtung im Teach-Panel. Eine Bewegung kann sowohl positiv entlang der gewählten Achse als auch negativ erfolgen. • „Selected frame“ zeigt das gegenwärtig gewählt Koordinatensystem in dem sich der Roboter bewegen soll. Mögliche Werte hierfür sind „World“ für das Weltkoordinatensystem, „Tcpf“ für das Toolkoordinatensystem oder jede andere Bezeichnung für ein beliebiges Koordinatensystem, welches mit „Other“ im Teach-Panel ausgewählt werden kann. • „Position“ beinhaltet 6 Anzeigeelemente für Lage und Orientierung des Toolframes des Roboters. Diese Koordinaten sind immer relativ zum Ursprung des Weltkoordinatensystems. Das Kinematikmodul Das Kinematikmodul stellt verschiedene Funktionen zur Bewegung des Roboters zur Verfügung. Da derzeit noch keine allgemeine Lösung für die Inverse und Vorwärtskinematik bei Parallelrobotern existiert, müssen diese Funktionen für jede Roboterstruktur individuell angepaßt bzw. komplett neu geschrieben werden. Das Kinematikmodul besteht im wesentlichen aus den in der Abbildung 4.4 dargestellten Komponenten. Die einzelnen Funktionsheader befinden sich im Anhang. 27 Eingabe Funktion Ausgabe Neue Position des Toolframes Inverse Kinematik Matrizen mit neuen Parametern der aktiven und passiven Gelenke Matrix mit neuer Stellung der aktiven Gelenke Vorwärtskinematik Neue Position des Toolframes Überprüfen des Arbeitsraums Position des Toolframes Position nicht erreichbar True, falls Position nicht erreichbar, sonst false Überschreitung der Stellbereiche True bei Bereichsüberschreitung eines Gelenks, sonst false Kollision True falls es zu einer Kollision gekommen ist, sonst false Abbildung 4.4: Komponenten des Kinematikmoduls 4.4 Lösung der Inversen Kinematik am Beispiel des Hexa Parallelroboters Um zu zeigen, daß die Applikation auch funktioniert, d.h. eine Schnittstellendatei eingelesen werden und ein Roboter bewegt werden kann, wurde die Inverse Kinematik am Beispiel des Hexa Parallelroboters gelöst. In den folgenden 2 Abschnitten wird zunächst ein Verfahren zur Lösung der Inversen Kinematik für den Hexa Parallelroboter vorgestellt und anschließend die Herleitung eines benötigten Gleichungsprototyps in Anlehnung an [Ries92] gezeigt. 4.4.1 Lösungsverfahren Eine Möglichkeit zur Bestimmung der Position der Gelenke besteht darin, sich die neue Sollposition des Toolframes anzusehen und für jede kinematische Kette die Position des letzten Gelenks zu berechnen, welche relativ zum Toolframe immer konstant bleibt, da das Gelenk an der Arbeitsplattform befestigt ist. Um dieses Gelenk läßt sich jetzt eine Kugel mit dem Radius des Abstandes der beiden Kugelgelenke einer Kette, also der Länge des Robotergliedes zwischen den beiden Kugelgelenken, legen, so daß sich das mittlere Gelenk theoretisch auf einer dieser Kugeloberfläche bewegen könnte. 28 Außerdem kann man einen Kreis um das aktive Gelenk einer Kette legen. Dieser Kreis hat genau den Radius des Robotergliedes, daß sich zwischen dem aktivem Gelenk und dem ersten passiven Kugelgelenk befindet. Das mittlere Gelenk könnte sich theoretisch auf dieser Kreisbahn bewegen. Bringt man den Kreis und die Kugel zum Schnitt [Bron91] so ergeben sich entweder 2 Schnittpunkte, falls zwei mögliche Lösungen für die Position des mittleren Gelenks existieren, 1 Schnittpunkt, falls sich der Roboter am Rande des Arbeitsbereichs befindet oder gar kein Schnittpunkt für den Fall, daß der Roboter aufgrund seiner kinematischen Struktur die entsprechende Position nicht erreichen kann. Im Falle von zwei möglichen Schnittpunkten wählt die Applikation den, der sich näher an der vorherigen Position des mittleren Gelenks befindet. Dieses Verfahren wird in Abbildung 4.5 noch einmal graphisch dargestellt. Was man nun kennt, ist die Position des letzten Gelenks, aber nicht die Orientierung dessen Koordinatensystems. Dies wird mittels einer Gleichung berechnet, die im nachfolgenden Abschnitt hergeleitet wird. Rotatorisches Gelenk (aktiv) Erstes Kugelgelenk (passiv) Möglicher Schnittpunkt zwischen Kreis und Kugel Möglicher Schnittpunkt zwischen Kreis und Kugel Kreis um aktives, rotatorisches Gelenk Letztes Kugelgelenk Kugel um letztes Kugelgelenk in der Kette Abbildung 4.5: Lösungsverfahren für die Inverse Kinematik am Beispiel einer kinematischen Kette 29 4.4.2 Gleichungsprototyp Für die Simulation ist es wichtig, daß auch die Orientierung der Koordinatensysteme der aktiven und passiven Roboterglieder berechnet werden kann, um diese entsprechend bewegen zu können. Wie man die Positionen der einzelnen Gelenke herausbekommt wurde bereits in Abschnitt 4.4.1 erläutert. Auf dieser Basis kann man die Orientierung der Koordinatensysteme berechnen. Dabei sei bereits vorweg angemerkt, daß es das Kinematikmodul für den Hexa Parallelroboter, das hier vorgestellt wird, noch nicht ermöglicht den Winkel α, also die Drehung der Schubstange um die x-Achse zu berechnen. Zur Bestimmung der Orientierung der Schubstange kann man die Winkel θ und β berechnen. p =( p x , p y , p z )T Abbildung 4.6: kinematische Kette des Hexa Abbildung 4.6 zeigt eine schematische Darstellung einer kinematischen Kette des Hexa Parallelroboters, bestehend aus dem aktiven rotatorischen Gelenk und den zwei darauf folgenden passiven Kugelgelenken. Da die Positionen der Gelenke bekannt sind, läßt sich durch deren Subtraktion leicht der Vektor p berechnen. Außerdem ist noch die Gleichung für die Transformationen zwischen den Gelenken bekannt (siehe Kapitel 2): Ai = Rot ( zi −1 ,θ i )Trans( zi −1 ,d i ) Rot ( y 'i −1 ,β i )Trans( xi ,ai ) Rot ( xi ,α ) Den Positionsanteil aus der resultierenden Matrix kann man jetzt gleich dem Vektor p setzen, so daß man folgende drei Gleichungen erhält: p x = cos(θ )⋅cos( β )⋅a p y = sin(θ )⋅cos( β )⋅a p z = −sin( β )⋅a + d Dabei erkennt man, daß der Parameter α nicht enthalten ist und somit die Rotation um die xAchse als Freiheitsgrad erhalten bleibt. Faßt man zur Übersicht die Konstanten zu neuen Konstanten zusammen, ergeben sich die Gleichungen: (1) A= cos(θ )⋅cos( β ) py px d − pz (2) B = sin(θ )⋅cos( β ) mit A= , B = , C = a a a (3) C =sin( β ) 30 Die folgenden Schritte führen auf zwei Lösungen für β. Durch Quadrieren der Gleichungen (1) und (2) und anschließendes Addieren erhält man zunächst die Gleichung: cos 2 (θ )⋅cos 2 ( β ) + sin 2 (θ )⋅cos 2 ( β ) = A2 + B 2 cos 2 ( β )⋅(sin 2 (θ ) + cos 2 (θ )) = A2 + B 2 ⇔ cos( β ) = ± A2 + B 2 ⇔ Zusammen mit Gleichung 3 folgt: β1, 2 = a tan2(C ,± A2 + B 2 ) bzw. nach ersetzten der Konstanten A, B und C: β1, 2 = a tan2( p d − pz p ,± ( x ) 2 + ( y ) 2 ) a a a Die beiden Lösungen für β werden verglichen mit dem Wert, den der Winkel in der vorherigen Position des Roboters hatte. Die Lösung, die näher am alten Wert für den Winkel liegt, wird für die weitere Berechnung übernommen. Liegt eine Lösung für β nicht zwischen 0° und 180° wird sie gleich verworfen. cos(θ ) = sin(θ ) = px cos( β )⋅a py cos( β )⋅a aus Gleichung (1) aus Gleichung (2) Da β jetzt bekannt ist, kann man, um θ zu berechnen, die Gleichungen (1) und (2) nach cos(θ) bzw. sin(θ) auflösen, so daß sich ergibt: Man erhält für θ: θ =atan2( py px ) cos( β )⋅a cos( β )⋅a , Für den Fall, daß β=90° sein sollte befindet sich der Roboter in einer singulären Stellung. Damit sind die Variablen θi und βi des ersten passiven Gelenks einer kinematischen Kette bestimmt. Das Verfahren muß auf jede kinematische Kette angewendet werden, damit man die Lösung der inversen Kinematik für den Hexa Parallelroboter erhält. 31 5 Zusammenfassung und Ausblick Im Rahmen dieser Studienarbeit wurde eine graphische Simulation für universelle Roboter entwickelt. Mit einer Möglichkeit zur einheitlichen Repräsentation von Gelenken mehrerer Freiheitsgrade und der universellen Notation für serielle, parallele und hybride Roboterstrukturen wurde die Voraussetzung geschaffen, Daten über kinematische Strukturen leicht auszutauschen [ThoWa01]. Dies ermöglichte die Entwicklung einer Schnittstelle für die graphische Simulation, so daß die Applikation durch einfachen Austausch der Schnittstellendatei und des Kinematikmoduls an neue Strukturen angepaßt werden kann. In den folgenden Abschnitten wird auf mögliche Erweiterungen der Applikation eingegangen und auf bekannte noch nicht gelöste Probleme hingewiesen. 5.1 Evaluierung mit anderen kinematischen Strukturen Erstes Objekt zur Simulation während der Entwicklungsphase der Applikation war der Hexa Parallelroboter. Diesen kann man bereits in der graphischen Simulation sehen. Mittlerweile kann auch der Delta Parallelroboter mit Austausch des Kinematikmoduls und der Schnittstellendatei simuliert werden. Um die Robustheit der gefundenen Notation und der Datenstruktur zu bestätigen, wird die Applikation mit weiteren kinematischen Strukturen getestet werden. 5.2 Einbinden der Vorwärtskinematik für Hexa und Delta Bisher ist nur die Inverse Kinematik für die Parallelroboter Hexa und Delta implementiert. Die für die Simulation weniger interessante und schwieriger zu lösende Vorwärtskinematik muß noch eingebaut werden. 5.3 Berechnung des Parameters α Wie bereits in Kapitel 4 erwähnt, ist derzeit das Problem der Orientierung der Schubstange um die Gelenknormale noch nicht gelöst, was bedeutet, daß der Roboter bei eingeschalteter Kollisionsüberwachung bestimmte Positionen nicht anfahren kann, obwohl er es theoretisch könnte, wenn die Schubstange um die x-Achse rotieren könnte. 5.4 Integration eines Bahnplanungsverfahrens Ein Bahnplanungsverfahren ist zu integrieren. Damit läßt sich das automatische Anfahren bestimmter Positionen graphisch simulieren. Dabei ist darauf zu achten, daß der gefundene Weg kollisionsfrei bleibt. 5.5 Verfahren zur universellen Lösung von IKP und DKP Sobald es gelungen ist, ein Verfahren zum Generieren von universellen Lösungen für Inverse- und Vorwärtskinematik zu finden, sollte dies in die Applikation integriert werden. Der Vorteil wäre, daß man auf den Austausch des Kinematikmoduls verzichten könnte und so die 32 Simulation durch alleinigen Austausch der Schnittstellendatei an neue Strukturen an passen könnte. 5.6 Interaktives Definieren von kinematischen Strukturen Eine weitere Möglichkeit zur Erweiterung der Applikation wäre das Interaktive Definieren kinematischer Strukturen. Dabei würde man zunächst die einzelnen CAD-Komponenten der betreffenden Struktur mit RobcadTM oder einem anderen CAD-System modellieren und sie anschließend zu einem Modell einer kinematischen Struktur zusammensetzen. Interaktiv könnte man dann, wie es bereits in RobcadTM für serielle Strukturen möglich ist, einzelne Gelenke z.B. durch Festlegung der Achsen, definieren. Die Applikation würde dann auf Basis der erstellten Struktur die Schnittstellendatei von selbst generieren. Sollte die Inverse- bzw. Vorwärtskinematik lösbar sein, würden auch gleich die entsprechenden Gleichungen generiert. 33 A Implementierung Dieser Teil des Anhangs verschafft einen Überblick über die Implementierung der Applikation. Im ersten Abschnitt erfolgt eine Übersicht über die einzelnen Module der Simulation und deren Abhängigkeit untereinander. In den darauf folgenden Abschnitten sind die einzelnen Header-Dateien der Applikation und jeweils eine kurze Beschreibung der einzelnen Funktionen aufgeführt. Die RobcadTM Programmierschnittstelle Robcad RoseTM [Tec99] läßt derzeit nur die Implementierung in C zu, weswegen auch die Applikation in dieser Programmiersprache geschrieben ist [KeRi83]. Die graphische Anwenderoberfläche wurde mit Hilfe von ROBUilTM, einer in RobcadTM integrierten Sprache, die auf Tcl/Tk basiert, erstellt. A.1 Modulabhängigkeit Die Abhängigkeit der einzelnen Module ist Abbildung A.1 zu entnehmen. Der Übersicht halber sind 3 Module weggelassen. Dies ist zum einen „parConst“, welches nur Konstanten für u.a. Stringlängen enthält, von verschiedenen Modulen benötigt wird und nur aus einer Header-Datei besteht. Das zweite „parBool“ besteht auch nur aus einer Header-Datei und vereinfacht die Verwendung boolescher Variablen, da sie nicht explizit in C realisiert sind. Das dritte nicht aufgeführte Modul „parTool“ wird von fast jedem anderen Modul benötigt und beinhaltet z.B. Funktionen zur Erzeugung von Frames, oder verschiedene Zeichenkettenoperationen. Aus welchen Funktionen die Module im einzelnen bestehen, steht in Abschnitt A.2. parMotion parGui parKinematics parMath parDisplay parGraph parEdge parNode parRead parIndexList Abbildung A.1: Modulabhängigkeiten der Applikation Das Modul „parGui“ enthält die Callback-Funktionen die durch das betätigen der Buttons in der Anwenderschnittstelle ausgelöst werden. Das Modul aktualisiert über „parDisplay“ das 34 Positionsdisplay des Roboters. Wird der Roboter bewegt, so wird eine Funktion in „parMotion“ aufgerufen, die wiederum die Inverse Kinematik von „parKinematics“ aufruft. Diese kann durch das direkte Anfahren einer Position auch direkt aus „parGui“ aufgerufen werden. Soll eine neue Schnittstellendatei über die Anwenderschnittstelle geladen werden, so wird eine Funktion zum einlesen in „parGraph“ aufgerufen, die wiederum die eigentliche Funktion zum einlesen der Datei in „parRead“ aufruft. Beide Funktionen müssen dabei auf die beiden Module „parNode“ und „parEdge“ zugreifen, die Funktionen zum Einlesen der Elemente der Datenstruktur enthalten. Des Weiteren greift „parKinematics“ auf „parGraph“ zu, da sich dort u.a. die Funktion zur Aktualisierung der Positionsdaten der CAD Entitäten befindet. „parMath“ stellt hierbei mathematische Funktionen zur Berechnung von Schnitten von Kugeln oder Kreis und Gerade zur Verfügung, die zur Berechnung der Inversen Kinematik benötigt werden. Auch „parKinematics“ muß die Module der Graphelemente kennen. Schließlich muß „parNode“ die Struktur der Kanten aus „parEdge“ bekannt sein. „parNode“ benutzt außerdem noch „parIndexList“ um die Indizes der einzelnen Knoten zu verwalten. Details zu den einzelnen Funktionen können dem nächsten Abschnitt entnommen werden. A.2 Funktionsheader In diesem Abschnitt des Anhangs werden die Funktionsheader, sortiert nach Modulen, einzeln aufgelistet. Für jede Funktion sind die Ein- und Ausgabeparameter und eine kurze Beschreibung angegeben. Da alle Funktionen boolesche Werte zurückgeben, die anzeigen ob in der Funktion ein Fehler aufgetreten ist, wird dies im folgenden nicht explizit erwähnt. Bei Ausnahmen wird dies angegeben. A.2.1 Modul „parGui“ Dieses Modul enthält die Callback-Funktionen die von der Anwenderoberfläche aufgerufen werden, sobald einer der Buttons durch den Anwender betätigt wird. Beim Aufruf der Funktionen wird das Display der Anwenderoberfläche, z.B. für die Positionsdaten mit Hilfe von Funktionen aus „parDisplay“ entsprechend gesetzt. Die Funktionen im Modul „parGui“ sind im Einzelnen: tBool FormSelectMech (tParam p); p: Die Benutzereingaben werden im RobcadTM Datentyp tParam gespeichert, was einer Liste von Eingabewerten entspricht. In diesem Fall ist die Bezeichnung des zu bewegenden Roboters einzugeben. Ausgabeparameter: Funktionsbeschreibung: Für den Fall, daß einmal mehrere Roboter gleichzeitig simuliert werden sollen, läßt sich mit dieser Funktion und dem entsprechenden Button in der Anwenderschnittstelle der zu bewegende Roboter auswählen. Die Verwendung von mehr als einem Roboter zur gleichen Zeit ist noch nicht implementiert. Eingabeparameter: 35 tBool FormLoadKinInfo (tparam p); p: Der Name der Schnittstellendatei, die Informationen über die kinematische Struktur des Roboters enthält. Ausgabeparameter: Funktionsbeschreibung: Diese Funktion liest die Schnittstellendatei für den Roboter ein. Dabei wird die Funktion „ReadData“ im Modul „parEdge“ aufgerufen. Eingabeparameter: tBool PBReset(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Wird der entsprechende Button in der Anwenderschnittstelle betätigt, so springt der Roboter zurück in seine Home-Position. tBool PBMiddleMMove(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Diese Funktion ruft die Funktion „MoveMech“ im Modul „parMotion“ auf und übergibt, dabei die Funktion, daß sich der Roboter entlang der gewählten Achse in negativer Richtung bewegen soll. tBool PBRightMMove(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Diese Funktion ruft die Funktion „MoveMech“ im Modul „parMotion“ auf und übergibt, dabei die Funktion, daß sich der Roboter entlang der gewählten Achse in positiver Richtung bewegen soll. tbool PBMoveX(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt die Bewegungsrichtung auf Translation entlang der x-Achse fest. 36 tbool PBMoveY(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt die Bewegungsrichtung auf Translation entlang der y-Achse fest. tbool PBMoveZ(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt die Bewegungsrichtung auf Translation entlang der z-Achse fest. tbool PBMoveRX(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt die Bewegungsrichtung auf Rotation um die x-Achse fest. tbool PBMoveRY(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt die Bewegungsrichtung auf Rotation um die y-Achse fest. tbool PBMoveRZ(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt die Bewegungsrichtung auf Rotation um die z-Achse fest. tBool PBWorld(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt das Koordinatensystem in dem sich der Roboter bewegen soll auf das Weltkoordinatensystem fest. tBool PBTCPF(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt das Koordinatensystem in dem sich der Roboter bewegen soll auf das Toolkoordinatensystem fest. 37 tBool FormOther(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Legt das Koordinatensystem in dem sich der Roboter bewegen soll auf ein vom Anwender anzugebendes Koordinatensystem fest. tBool PBLeft(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Ruft die Funktion „MoveMech“ im Modul „parMotion“ auf. Dieser Funktion wird mitgeteilt, daß sich der Roboter entlang der gewählten Achse in negativer Richtung bewegen soll. tBool PBRight(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Ruft die Funktion „MoveMech“ im Modul „parMotion“ auf. Dieser Funktion wird mitgeteilt, daß sich der Roboter entlang der gewählten Achse in positiver Richtung bewegen soll. tBool FormStepSize(tParam p); Eingabeparameter: p: Die Schrittweiten für translatorische und rotatorische Bewegungen als Werte im Format tParam. Ausgabeparameter: Funktionsbeschreibung: Diese Funktion setzt die Schrittweite in der Bewegungen des Roboters ausgeführt werden sollen auf den vom Anwender eingegebenen Wert. Dies erfolgt getrennt für translatorische und rotatorische Schrittweiten. tBool FormMoveAbsolute(tParam p); Eingabeparameter: p: Eine Position im Weltsystem an Hand von 6 Eingabewerten für Lage- und Orientierung des Toolframes. Ausgabeparameter: Funktionsbeschreibung: Der Roboter springt an die angegebene Position. Diese Funktion ruft „InverseKinematics“ im Modul „parKinematics“ auf. An dieser Stelle kann später ein Bahnplanungsverfahren eingesetzt werden. 38 tBool PBCollision(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Hiermit läßt sich die Kollisionsüberwachung für den Roboter entweder ein- oder ausschalten. A.2.2 Modul „parDisplay“ Die Funktionen dieses Moduls dienen dazu die Displaydaten in der Anwenderoberfläche zu aktualisieren. tBool SetPosDisplay(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Diese Funktion stellt die aktuellen Werte für die Position des Roboters im Positionsdisplay der Anwenderoberfläche dar. tBool SetStepDisplay(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Die aktuellen Werte der Schrittweite für die Bewegung des Roboters werden im entsprechenden Display der Anwenderoberfläche dargestellt. A.2.3 Modul „parMotion“ Die einzige Funktion dieses Modul berechnet nach Eingabe einer Bewegung die neue Position des Toolframes. tBool MoveMech(int dir); Eingabeparameter: dir: Nimmt entweder den Wert –1 oder 1 an, je nachdem ob die gewünschte Bewegung des Toolframes in positiver (1) oder negativer (-1) Richtung entlang der gewählten Achse erfolgen soll. Ausgabeparameter: Funktionsbeschreibung: Berechnet die neue Position des Toolframes, ruft dann die Funktion „InverseKinematics“ aus dem Modul „parKinematics“ auf und übergibt ihr diesen Frame. 39 A.2.4 Modul „parKinematics“ Dieses Modul enthält diverse Funktionen zur Berechnung der Inversen- und Vorwärtskinematik. Die meisten Funktionen müssen für jede Roboterstruktur neu geschrieben werden, so lange es noch nicht möglich ist automatische Gleichungen für Inverse- und Vorwärtskinematik zu generieren. Zu Anfang dieses Abschnitts ist der Datentyp JMatrix angegeben, so wie er in der Header-Datei definiert ist. Dieser Datentyp stellt eine Matrix dar und wird verwendet um die erweiterten DH-Parameter für aktive und passive Gelenke abzuspeichern. typedef struct JMatrix { float matrix [MAX_JOINTS][DOF]; }JMatrix; BOOL InverseKinematics(tFrame position, JMatrix * active, JMatrix * passive); Eingabeparameter: Ausgabeparameter: position: Die neue Position des Toolframes. active: Eine Matrix mit den neuen Werten der Gelenkvariablen der aktiven Gelenke. passive: Eine Matrix mit den neuen Werte der Gelenkvariablen der passiven Gelenke. Funktionsbeschreibung: Berechnet die neue Konfiguration des zu simulierenden Roboters und aktualisiert die Matrizen, die die Gelenkvariablen für aktive und passive Gelenke enthalten. Diese Funktion muß individuell an die zu simulierende Roboterstruktur angepaßt werden. BOOL DirectKinematics(JMatrix * active, JMatrix * passive, tFrame position); Eingabeparameter: active: Eine Matrix mit den neuen Werten der Gelenkvariablen der aktiven Gelenke. Ausgabeparameter: passive: Eine Matrix mit den neuen Werte der Gelenkvariablen der passiven Gelenke. position: Die neue Position des Toolframes. Funktionsbeschreibung: Berechnet die neue Konfiguration des Roboters und die neue Position des Toolframes auf Basis der neuen Stellung der aktiven Gelenke. Bisher wurde diese Funktion noch für keine Struktur implementiert. BOOL OutofWorkspace(tFrame position); Eingabeparameter: Ausgabeparameter: position: Die Position des Toolframes. Ein boolescher Rückgabewert, der anzeigt ob sich der Roboter außerhalb seines Arbeitsbereichs (TRUE) befindet. Funktionsbeschreibung: Überprüft ob sich eine anzufahrende Position außerhalb des Arbeitsbereichs des Roboters befindet. Diese Funktion muß an die zu simulierende Roboterstruktur angepaßt sein. 40 BOOL OutOfRange(); Ein boolescher Rückgabewert, der anzeigt ob sich Gelenke außerhalb ihrer definierten Stellbereiche befinden. Funktionsbeschreibung: Es wird überprüft, ob sich Gelenke außerhalb ihres definierten Stellbereichs befinden. Eingabeparameter: Ausgabeparameter: BOOL SelfCollision(tFrame new_toolframe); Eingabeparameter: Ausgabeparameter: new_toolframe: Die neue Position des Toolframes. Ein boolescher Rückgabewert, der anzeigt, ob sich der Roboter in Eigenkollision befindet. Funktionsbeschreibung: Führt eine Eigenkollisionsüberprüfung durch. Dies geschieht derzeit mit Hilfe von Funktionen die RobcadTM zur Verfügung stellt. A.2.5 Modul „parMath“ Dieses Modul enthält mathematische Funktionen zur Berechnung der Inversen Kinematik. Die hier beschriebenen Funktionen finden bei der Berechnung der Inversen Kinematik für den Hexa Parallelroboter Anwendung. BOOL GetCirclePlane(tFrame circle_fr, double circle_r, tVec3 plane_pos, tVec3 plane_dir1, tVec3 plane_dir2); circle_fr: Lage und Orientierung des Mittelpunkts eines Kreises. circle_r: Radius eines Kreises. Ausgabeparameter: plane_pos: Der Ortsvektor der zu berechnenden Ebene. plane_dir1: Der erste Richtungsvektor der zu berechnenden Ebene. plane_dir2: Der zweite Richtungsvektor der zu berechnenden Ebene. Funktionsbeschreibung: Berechnet zu einer Kreisgleichung die in Mittelpunktsform gegeben ist, eine Ebenengleichung in Parameterform, so daß der Kreis in dieser Ebene liegt. Eingabeparameter: BOOL SphereIntersection(tFrame mf_sphere1, double r_sphere1, tFrame mf_sphere2, double r_sphere2, tVec3 plane_ne, double * plane_d); Eingabeparameter: mf_sphere1: Mittelpunkt der ersten Kugel. r_sphere1: Radius der ersten Kugel. mf_sphere2: Mittelpunkt der zweiten Kugel. r_sphere2: Radius der zweiten Kugel. plane_ne: Normaleneinheitsvektor der Schnittebene. Ausgabeparameter: plane_d: Abstand der Schnittebene vom Ursprung des Koordinatensystems. Funktionsbeschreibung: Berechnet die Schnittebene zweier Kugeln. Dabei sind die Kugeln in Mittelpunktsform und die Schnittebene in Normalenform gegeben. 41 BOOL PlaneIntersection(tVec3 p_plane_pos, tVec3 p_plane_dir1, tVec3 p_plane_dir2, tVec3 n_plane_n, double n_plane_c, tVec3 line_pos, tVec3 line_dir); p_plane_pos: Ortsvektor der ersten Ebene. p_plane_dir1: Erster Richtungsvektor der ersten Ebene. p_plane_dir2: Zweiter Richtungsvektor der ersten Ebene. n_plane_n: Normalenvektor der zweiten Ebene. n_plane_c: Abstand der zweiten Ebene vom Ursprung des Koordinatensystems. line_pos: Ortsvektor der Schnittgerade. Ausgabeparameter: line_dir: Richtungsvektor der Schnittgerade. Funktionsbeschreibung: Berechnet die Schnittgerade zweier Ebenen und gibt sie in Parameterform zurück. Die erste Ebene ist in Parameterform gegeben, die zweite in Normalenform. Eingabeparameter: BOOL CircleLineIntersection(tVec3 c_plane_pos, double r_circle1, tVec3 line_pos, tVec3 line_dir, tFrame s1, tFrame s2); Eingabeparameter: c_plane_pos: Ortsvektor des Kreismittelpunkts. r_circle1: Radius des Kreises. line_pos: Ortsvektor der Geraden. line_dir: Richtungsvektor der Geraden. s1: Erster Schnittpunkt. Ausgabeparameter: s2: Zweiter Schnittpunkt. Funktionsbeschreibung: Berechnet, falls vorhanden, die beiden Schnittpunkte einer Geraden mit einem Kreis. Der Kreis ist in Mittelpunktsform gegeben, die Gerade in Parameterform. BOOL CalculateTTS(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Berechnet die von der Inversen Kinematik benötigten Transformation von Toolframe zum letzten passive Kugelgelenk aller Ketten des Hexa Parallelroboters und speichert diese in einer globalen Variable. A.2.6 Modul „parGraph“ In diesem Modul finden sich Funktionen, die die Verwaltung des Graphen betreffen. Es macht Gebrauch von verschiedenen Funktionen in den Modulen der einzelnen Graphelemente „parNode“ und „parEdge“ sowie Funktionen im Modul „parRead“ zum Einlesen der Schnittstellendatei. Der Graph ist als Adjazenzliste implementiert. 42 BOOL ReadData(char filename[FILENAMESIZE]); filename: Der Dateiname der einzulesenden Schnittstellendatei. Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Eine Schnittstellendatei mit dem angegebenen Dateinamen wird eingelesen, auf Korrektheit überprüft und eine GraphRepräsentation des Roboters generiert. BOOL DestroyGraph(struct node * act_node); Eingabeparameter: act_node: Ein Knoten des Graphen. Üblicherweise der erste Knoten. Ausgabeparameter: Funktionsbeschreibung: Löscht den Graphen ausgehend vom übergebenen Knoten. Dabei werden alle folgenden Knoten und Kanten mit Hilfe der entsprechenden Funktionen in den Modulen „parNode“ und „parEdge“ gelöscht und ihr reservierter Speicher freigegeben. Üblicherweise wird der erste Knoten angegeben um den gesamten Graph zu löschen. BOOL UpdateRobotCAD(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Übergibt der rekursiven Funktion „UpdateRobotCADrec“ einige Werte und ruft diese auf. Außerdem wird die Position der CADEntität aktualisiert, an der sich der Toolframe befindet. BOOL UpdateRobotCADrec(struct node * act_node, tFrame curr_frame, tFrame trans_frame); Eingabeparameter: act_node: Aktueller Knoten an dem die Rekursion fortgesetzt wird. curr_frame: Aktuelle Position, zu der die nachfolgenden Objektpositionen relativ berechnet werden. trans_frame: Translation der Vorgängerkante. Ausgabeparameter: Funktionsbeschreibung: Diese rekursive Funktion ist für die Aktualisierung der CADObjektpositionen zuständig. Um eine aktuelle Anzeige zur erhalten muß nach dem Aufruf der Funktion noch die RobcadTM-Funktion „apDisplayCell“ aufgerufen werden. Beim ersten Aufruf der Funktion durch „UpdateRobotCAD“ entspricht act_node dem ersten Knoten der Knotenliste, curr_frame ist der Roboterbasisframe und trans_frame entspricht der Einheitsmatrix. Dadurch, daß die Lage der CAD-Objekte relativ zueinander durch die erweiterten DHParameter gespeichert ist, ist es erforderlich, daß die Rekursion die aktuelle Position (curr_frame) auf der die nachfolgenden Berechnungen beruhen, sowie den translatorischen Anteil der Vorgängerkante (trans_frame) mit übergeben bekommt. 43 A.2.7 Modul „parRead“ Dieses Modul stellt einige Funktionen bereit, die zum Einlesen der Schnittstellendatei benötigt werden. Die Funktionen werden allesamt von „ReadData“ aus dem Modul „parGraph“ aufgerufen. BOOL ReadLine(char * line, FILE * file); file: Ein Zeiger auf die einzulesende Schnittstellendatei. Eingabeparameter: Ausgabeparameter: line: Eine Textzeile aus der Schnittstellendatei. Funktionsbeschreibung: Liest eine Zeile aus der Schnittstellendatei ein. Zurückgegeben wird die nächste nicht leere Zeile, die keinen Kommentar enthält. BOOL ReadCoords(tCoords coords, char * line); Eingabeparameter: Ausgabeparameter: line: Ein Teil einer Zeile der Schnittstellendatei. coords: 6 Parameter aus denen ein Frame generiert werden kann, der Lage und Orientierung eines Koordinatensystems beschreibt. Funktionsbeschreibung: Liest aus einem Teil einer Zeile der Schnittstellendatei 6 Parameter ein. Dies ist erforderlich beim einlesen der Transformationen Tfix, 1, Tfix, 2 bzw. Tparams. Wird die Transformation Tparams eingelesen so wird der fehlende Parameter durch den Wert Null ersetzt. BOOL ReadFrame(tFrame frame, char * line); line: Ein Teil einer Zeile der Schnittstellendatei. frame: Eine Transformation, die entweder Tfix, 1, Tfix, 2 oder Tparams entspricht. Funktionsbeschreibung: Ruft „ReadCoords“ auf um aus einem Teil einer Zeile der Schnittstellendatei Parameter auszulesen und generiert aus diesen Parametern eine Transformation. Eingabeparameter: Ausgabeparameter: A.2.8 Modul „parEdge“ Dieses Modul enthält Funktionen, die beim Arbeiten mit Kanten benötigt werden. Zu Anfang dieses Abschnitts ist die Datenstruktur einer Kante im Graph, so wie sie in der Header-Datei für dieses Modul definiert ist, angegeben. struct edge { struct edge * next_edge; int connect; tFrame frop1; tCoords params; tFrame frop2; char joint; // Zeiger auf die nächste Kante // Index des Nachfolgerknotens // Transformation Tfix, 1 // erweiterte DH-Parameter zur Berechnung von Tparams // Transformation Tfix, 2 // Gelenktyp: R = rotatorisches Gelenk, P = prismatisches Gelenk, // K = Kardangelenk, S = Kugelgelenk 44 float range[3][2]; BOOL active; }; // Stellbereiche des Gelenks // aktives Gelenk = TRUE, passives Gelenk = FALSE BOOL NewEdge(int connect, tFrame frop1, tCoords params, tFrame frop2, char joint, float range[3][2], BOOL active, struct edge ** res_edge); Eingabeparameter: connect: Zeiger auf die nächste Kante der zu erzeugenden Kante. frop1: Transformation Tfix, 1. params: erweiterte DH-Parameter Tparams. frop2: Transformation Tfix, 2. joint: Gelenktyp der neuen Kante. range[3][2]: Stellbereiche des Gelenks, das durch die zu erzeugende Kante repräsentiert wird. active: Flag, ob Gelenk aktiv oder passiv. res_edge: Ein Zeiger auf die erzeugte neue Kante. Ausgabeparameter: Funktionsbeschreibung: Anhand der übergebenen Eingabewerte erzeugt diese Funktion eine neue Kante im Graphen. Eine Einsortierung in die Adjazenzliste wird durch diese Funktion nicht vorgenommen. BOOL InsertEdgeInList(struct edge * new_edge, struct edge * act_edge); Eingabeparameter: new_edge: Die einzufügende Kante. act_edge: Die erste Kante der Kantenliste, in die die neue Kante eingefügt werden soll. Ausgabeparameter: Funktionsbeschreibung: Fügt die übergebene neue Kante in die Kantenliste ein, in der act_edge die erste Kante ist. Diese Funktion wird von der Funktion „InsertEdge“ im Modul „parNode“ aus aufgerufen. Ist die Kantenliste leer, so sorgt die aufrufende Funktion dafür, daß die Kante direkt hinter dem Knoten eingefügt wird. BOOL DestroyEdge(struct edge * act_edge); Die zu löschende Kante. Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Entfernt die übergebene Kante aus dem Graph und gibt den reservierten Speicher frei. Die nachfolgenden Kanten der Kantenliste werden ans neue Ende der Liste wieder angefügt. Gibt es keine Nachfolger wird der letzte Zeiger der Liste auf Null gesetzt. 45 BOOL ReadEdge(char * line, char * connect1_str, struct edge ** res_edge); line: Eine Zeile der Schnittstellendatei, die eine Kante definiert. connect1_str: Die Nummer des Knotens von der die Kante wegführt als String. res_edge: Die eingelesene Kante. Funktionsbeschreibung: Liest eine Zeile, die eine Kante definiert, aus der Schnittstellendatei ein. Hierbei wird die Funktion „new_edge“ verwendet um die Kante zu erzeugen. Eingabeparameter: Ausgabeparameter: A.2.9 Modul „parNode“ Dieses Modul enthält Funktionen, die beim Arbeiten mit Knoten benötigt werden. Zu Anfang dieses Abschnitts ist die Datenstruktur eines Knotens im Graph, so wie sie in der HeaderDatei für dieses Modul definiert ist, angegeben. struct node { struct edge * next_edge; // Zeiger auf die Kantenliste des Knotens struct node * next_node; // Zeiger auf den nächsten Knoten in der Knotenliste int index; // Index des Knotens char * link; // Typ des Links (Tool, Base, S-Link oder M-Link) tName csg_name; // Name der entsprechenden CAD-Entität tFrame csg_pos; // Position der Entität in der CAD-Welt }; BOOL CreateFirstNode(char * link, int index, tName csg_name, tFrame csg_pos); link: Typ des Links des ersten Knotens. Üblicherweise Base. index: Index des ersten Knotens. Üblicherweise Eins. csg_name: Name der CAD-Entität des ersten Knotens. csg_pos: Position der CAD-Entität. Ausgabeparameter: Funktionsbeschreibung: Der erste Knoten des Graphen wird anhand der übergebenen Parameter erzeugt. Der Zeiger hierauf ist global definiert. Eingabeparameter: BOOL NewNode(struct node * act_node, char * link, int index, tName csg_name, tFrame csg_pos); link: Typ des links des neuen Knotens. index: Index des neuen Knotens. csg_name: Name der Entität des neuen Knotens in der CADUmgebung. csg_pos: Position der CAD-Entität. act_node: Zeiger auf den neuen Knoten. Ausgabeparameter: Funktionsbeschreibung: Anhand der übergebenen Parameter wird ein neuer Knoten im Graphen erzeugt. Er wird ans Ende der Knotenliste angehängt. Eingabeparameter: 46 BOOL InsertEdge(struct edge * new_edge, struct node * act_node); new_edge: Die einzusortierende Kante. act_node: Der Knoten an dem die Kante eingefügt werden soll. Ausgabeparameter: Funktionsbeschreibung: Fügt die übergebene Kante direkt nach dem übergebenen Knoten ein, falls sich dort noch keiner befindet. Ist die Stelle bereits besetzt, so wird die Kante der Funktion „InsertEdgeInList“ in „parEdge“ übergeben, wo sie ans Ende der Kantenliste eingefügt wird. Eingabeparameter: BOOL InsertNode(struct node * act_node); Eingabeparameter: act_node: Der einzusortierende Knoten. Ausgabeparameter: Funktionsbeschreibung: Fügt den übergebenen Knoten ans Ende der Knotenliste an. BOOL DestroyNode(struct node * act_node); Eingabeparameter: act_node: Der zu löschende Knoten. Ausgabeparameter: Funktionsbeschreibung: Entfernt den übergebenen Knoten aus der Knotenliste des Graphen. Dabei werden Kanten die zu diesem und von diesem Knoten weg führen mit Hilfe der Funktion „DestroyEdge“ im Modul „parEdge“ mit gelöscht. Dabei wird sämtlicher reservierter Speicher freigegeben. BOOL SearchPrevEdge(struct node * act_node, int connect, struct edge ** res_edge); Eingabeparameter: act_node: Knoten bei dem die Suche beginnen soll. connect: Index, den der Knoten haben soll, auf den die nachfolgende Kante zeigt. Ausgabeparameter: res_edge: Die gefundene Kante. Funktionsbeschreibung: Sucht die Vorgängerkante zur ersten Kante raus, deren Nachfolgerknoten den zu übergebenden Index hat. Die Suche beginnt dabei mit der Kantenliste die dem übergebenen Knoten nachfolgt. Ist der Vorgänger ein Knoten, so wird eine Kante erzeugt deren Wert für den Nachfolgeknoten dem negativen Index des gefundenen Knoten entspricht. 47 BOOL SearchPrevNode(struct node * act_node, int index, struct node ** return_node); act_node: Knoten bei dem die Suche beginnen soll. index: Index den der Knoten haben soll, auf den der Nachfolgerknoten zeigt. Ausgabeparameter: return_node: gefundene Knoten. Funktionsbeschreibung: Sucht den Vorgängerknoten zum Knoten mit dem übergebenen Index. Ist der Index der des ersten Knotens in der Knotenliste, so wird Null zurückgegeben. Eingabeparameter: BOOL ReadNode(char * line); Eingabeparameter: line: Eine Zeile aus der Schnittstellendatei, die die Definition für einen Knoten enthält. Ausgabeparameter: Funktionsbeschreibung: Liest aus der übergebenen Zeile die Definition eines Knotens ein und erzeugt diesen mit Hilfe von „NewNode“ oder „CreateFirstNode“, wenn es der erste Knoten ist. Dabei wird der Knoten mit Hilfe von „InsertNode“ in die Liste eingefügt. A.2.10 Modul „parIndexList“ Dieses Modul verwaltet zu vergebende Indizes für die Knoten des Graphen. Es stellt sicher, daß kein Index doppelt vergeben wird. BOOL InitIndexList(); Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Initialisiert ein Array von booleschen Werten. Die Indizes des Arrays entsprechen dabei den Indizes der Knoten minus eins. Jedem Element des Arrays ist dabei ein boolescher Wert zugeordnet, der angibt ob ein Index bereits vergeben ist oder nicht. BOOL RegisterIndex(int index); Eingabeparameter: Zu vergebender Index. Ausgabeparameter: Funktionsbeschreibung: Versucht einen Index als vergeben zu markieren. War er bereits vergeben, liefert die Funktion FALSE zurück. 48 BOOL FreeIndex(int index); Verfügbar zu machender Index. Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Versucht einen Index als frei zu markieren. War er bereits frei, liefert die Funktion FALSE zurück. BOOL GetFreeIndex(int * i); Eingabeparameter: Ausgabeparameter: Freier Index. Funktionsbeschreibung: Sucht den nächsten freien Index, beginnend bei 1 aus der Indexliste. Ist die maximale Anzahl an Knoten erreicht wird FALSE zurückgegeben. A.2.11 Modul „parTool“ Dieses Modul stellt verschiedene Werkzeuge zur Verfügung auf die fast alle Module einmal zugreifen. BOOL GetStrToken(char * token, char * line); line: Eine Textzeile. token: Ein von line abgeschnittener Teil. line: Der Rest der Zeile. Funktionsbeschreibung: Schneidet alle Zeichen bis zum ersten Leerzeichen von der übergebenen Zeile ab und gibt diese, sowie den abgeschnittenen Teil zurück. Eingabeparameter: Ausgabeparameter: BOOL RemoveChar(char * str, char c); str: Zu durchsuchender String. c: Herauszufilterndes Zeichen. str: Gefilterte Zeile. Ausgabeparameter: Funktionsbeschreibung: Entfernt aus dem übergebenen String alle Zeichen die dem übergebenen Zeichen entsprechen. Eingabeparameter: BOOL MakeIdentityFrame(tFrame frame); Eingabeparameter: Ausgabeparameter: frame: Einheitsmatrix. Funktionsbeschreibung: Erzeugt eine Einheitsmatrix und gibt diese zurück. 49 BOOL MakeFrameByCoords(tCoords coords, tFrame frame); coords: 6 Parameter, die Translationen und Rotationen in alle 6 Richtungen definieren. Ausgabeparameter: frame: Resultierende Transformationsmatrix. Funktionsbeschreibung: Auf der Basis von 6 Parametern, die im RobcadTM Datentyp tCoords gespeichert sind, wird eine Transformationsmatrix erzeugt. Eingabeparameter: BOOL MakeFrameByParams(double rz, double z, double ry, double y, double rx, double x, tFrame frame); Eingabeparameter: rz: Rotation um die z-Achse. z: Translation entlang der z-Achse. ry: Rotation um die y-Achse. y: Translation entlang der y-Achse. rx: Rotation um die x-Achse. x: Translation entlang der x-Achse. frame: Resultierende Transformationsmatrix. Ausgabeparameter: Funktionsbeschreibung: Auf der Basis von 6 Parametern, die alle als einzelne double Werte vorliegen, wird eine Transformationsmatrix erzeugt. BOOL StrToUpper(char * str); str: Zu konvertierender String. Eingabeparameter: Ausgabeparameter: str: Konvertierter String. Funktionsbeschreibung: Wandelt einen String so um, daß alle Buchstaben zu Großbuchstaben werden. BOOL WriteLineError(char * error_msg); error_msg: Eine Fehlermeldung. Eingabeparameter: Ausgabeparameter: Funktionsbeschreibung: Gibt im RobcadTM Textfenster eine Fehlermeldung inklusive Zeilennummer der Schnittstellendatei aus. Diese Funktion wird von „ReadData“ aus dem Modul „parGraph“ verwendet. BOOL IsRealNumber(char * str); str: Zu überprüfender String. Eingabeparameter: Ausgabeparameter: Ein boolescher Rückgabewert. Funktionsbeschreibung: Überprüft einen String darauf, ob er in einen float oder double Wert konvertiert werden kann. 50 BOOL IsPosInt(char * str); str: Zu überprüfender String. Eingabeparameter: Ausgabeparameter: Ein boolescher Rückgabewert. Funktionsbeschreibung: Überprüft einen String darauf, ob er eine positive ganze Zahl darstellt. BOOL Graph2JMatrix(JMatrix * active_m, JMatrix * passive_m); active_m: Matrix mit Gelenkvariablen der aktiven Gelenke. passive_m: Matrix mit Gelenkvariablen der passiven Gelenke. Funktionsbeschreibung: Kopiert die Gelenkvariablen der aktiven und passiven Gelenken aus dem Graph in zwei Matrizen vom Typ JMartrix in dem die Funktion die rekursive Funktion „Graph2JMatrixrec“ aufruft. Eingabeparameter: Ausgabeparameter: BOOL Graph2JMatrixrec(struct node * act_node, JMatrix * active_m, JMatrix * passive_m); Eingabeparameter: Ausgabeparameter: act_node: Aktuelle Position im Graphen. active_m: Matrix mit Gelenkvariablen der aktiven Gelenke. passive_m: Matrix mit Gelenkvariablen der passiven Gelenke. Funktionsbeschreibung: Rekursive Funktion, die die Gelenkvariablen aus den Kanten des Graphen in die Matrizen active_m und passive_m kopiert. BOOL JMatrix2Graph(JMatrix * active_m, JMatrix * passive_m); active_m: Matrix mit Gelenkvariablen der aktiven Gelenke. passive_m: Matrix mit Gelenkvariablen der passive Gelenke. Ausgabeparameter: Funktionsbeschreibung: Kopiert die Gelenkvariablen der aktiven und passiven Gelenke aus dem beiden Matrizen in die entsprechenden Kanten im Graph, in dem die Funktion die rekursive Funktion „JMatrix2Graphrec“ aufruft. Eingabeparameter: BOOL JMatrix2Graphrec(struct node * active_node, JMatrix * active_m, JMatrix * passive_m); Eingabeparameter: act_node: Aktuelle Position im Graphen. active_m: Matrix mit Gelenkvariablen der aktiven Gelenke. passive_m: Matrix mit Gelenkvariablen der passiven Gelenke. Ausgabeparameter: Funktionsbeschreibung: Rekursive Funktion, die die Gelenkvariablen aus den Matrizen active_m und passive_m in die entsprechenden Kanten des Graphen kopiert. 51 B Weitere Kinematiken und deren Knotenindizierung In diesem Teil des Anhangs finden sich zwei weitere Roboterstrukturen als Beispiele für die Anwendung des Knotenindizierungsalgorithmus aus Kapitel 3. B.1 Werkzeugmaschine Eclipse In Abbildung B.1 ist die Eclipse [KiByCho01] einmal als schematische Zeichnung und mit der entsprechenden Knotenindizierung zu sehen. Abbildung B.1: Kinematische Struktur der Eclipse und zugehöriger Graph B.2 Porty (unsymmetrische Parallelstruktur) Abbildung B.2 zeigt eine einen unsymmetrischen Parallelroboter, den Porty [HeSchWa99] mit seinem zugehörigen Graph und Knotenindizierung. Abbildung B.2: Porty Parallelroboter und zugehöriger Graph 52 C Beispiele von Schnittstellendateien In diesem Teil des Anhangs sind 2 Beispiele für Schnittstellendateien angeführt, wie sie von der Applikation eingelesen werden. Die erste Datei enthält kinematische Informationen über den Hexa Parallelroboter, die zweite über den Delta Roboter. C.1 Schnittstellendatei des Hexa Parallelroboters ! "#$#$%###$#$#$#&$ ' () ! "#$#$+(#%,-./,0/$#$#$#&$ ' * 2 1) 3 * - 2 3 - 4 5' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ! (16 (! $" $ 5#$#$#$#$#$#6&) 7! 8+4 $ " 9 $ 5+,1:-1#7:$+(..-/(.0$+7##$,#$7(#$#6&) 0! 8+4 $ " $ 5+(1/:-.%0,$+%::-7,1($+7##$,#$7(#$+(1/-%6&) 1! * $ " $ 5#$#$+(#%,-./,0/$#$#$#6&) %! 8+4 $ " 9 $ 5+.(:-0,7($+/0:-7,77$+7##$+,#$(%#$#6&) .! 8+4 $ " $ 5+(71:-.(1/$+,:.-/(10$+7##$,#$7(#$+(1/-%6&) /! 8+4 $ " 9 $ 5.(:-0,/%$+/0:-#:0($+7##$,#$00#$#6&) :! 8+4 $ " $ 5(71:-.7#7$+,:.-%#%7$+7##$,#$00#$+(1/-%6&) ,! 8+4 $ " 9 $ 5,1:-0,/%$+(..-%#.1$+7##$+,#$0#$#6&) (#! 8+4 $ " $ 5(1/:-.1::$+%::-#:1($+7##$,#$00#$+(1/-%6&) ((! 8+4 $ " 9 $ 500#$,#1-%:,%$+7##$,#$,#$#6&) (7! 8+4 $ " $ 570#-#7:.$(%/1-%:,1$+7##$,#$,#$+(1/-%6&) (0! 8+4 $ " 9 $ 5+00#$,#1-%:,%$+7##$+,#$7/#$#6&) (1! 8+4 $ " $ 5+70#-#7:.$(%/1-%:,1$+7##$,#$,#$+(1/-%6&) 4 ; 5 $ $ ---6 $ <= +> 5> > > > > > > > > > > ! (:6 !' !' !' !' !' !' !' !' !' !' ( ( ( ( ( ( 7 0 % . ' ' ' ' ' ' ' ' ' ' 7$ 5+,1:-1#7:$+(..-/(.0$+7##$,#$7(#$#6$ 5#$+,,-,/%$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5+(:#$#6$ ? ) %$ 5+.(:-0,7($+/0:-7,77$+7##$+,#$(%#$#6$ 5#$+,,-,/%$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5#$(:#6$ ? ) /$ 5.(:-0,/%$+/0:-#:0($+7##$,#$00#$#6$ 5#$+,,-,/%$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5+(:#$#6$ ? ) ,$ 5,1:-0,/%$+(..-%#.1$+7##$+,#$0#$#6$ 5#$+,,-,/%$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5#$(:#6$ ? ) (($ 500#$,#1-%:,%$+7##$,#$,#$#6$ 5#$+,,-,/%$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5+(:#$#6$ ? ) (0$ 5+00#$,#1-%:,%$+7##$+,#$7/#$#6$ 5#$+,,-,/%$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5#$(:#6$ ? ) 0$ 5+(1/-%$#$#$(.##$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 507-%$#$1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) .$ 5(1/-%$#$#$(.##$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 5+07-%$#$1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 53 > > > > > > > > !' !' !' !' !' !' !' !' C.2 / : , (# (( (7 (0 (1 ' ' ' ' ' ' ' ' :$ 5+(1/-%$#$#$(.##$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 507-%$#$1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ (#$ 5(1/-%$#$#$(.##$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 5+07-%$#$1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ (7$ 5+(1/-%$#$#$(.##$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 507-%$#$1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ (1$ 5(1/-%$#$#$(.##$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 5+07-%$#$1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) ? ) ? ) Schnittstellendatei des Delta Parallelroboters ! "#$#$71##$#$#$#&$ ' ! () ! "#$#$+(#%,-./,0/$#$#$#&$ ' * ? ) 2 1) 3 * - 2 3 - 4 5' ' ' ' ' ' ' ' ' ' ' ' ! ((6 (! $" 9 $ 5#$#$#$#$#$#6&) 7! @+4 $ " 9 $ 5+/:0-0,/%$+1%7-7,1/$+7##$+,#$(%#$#6&) 0! 8+4 $ " $ 5+(1/:-.0%/$+%::-(#.:$+7##$,#$7(#$+(1/-%6&) 1! * $ " $ 5#$#$+(#%,-./,0/$#$#$#6&) %! 8+4 $ " $ 5+(71:-.000$+,:.-1:7:$+7##$,#$7(#$+(1/-%6&) .! @+4 $ " 9 $ 5/:0-0,/%$+1%7-7,1/$+7##$+,#$0#$#6&) /! 8+4 $ " $ 5(71:-.000$+,:.-1:7/$+7##$,#$00#$+(1/-%6&) :! 8+4 $ " $ 5(1/:-.0%/$+%::-(#./$+7##$,#$00#$+(1/-%6&) ,! @+4 $ " 9 $ 5#$,#1-%:,%$+7##$+,#$+,#$#6&) (#! 8+4 $ " $ 570#-##7%$(%/1-%:,%$+7##$,#$,#$+(1/-%6&) ((! 8+4 $ " $ 5+70#-##7%$(%/1-%:,%$+7##$,#$,#$+(1/-%6&) 4 ; 5 $ $ ---6 $ <= +> 5> > > > > > > > > > > > > > ! (%6 !' !' !' !' !' !' !' !' !' !' !' !' !' ( ( ( 7 7 0 % . . / : , , ' ' ' ' ' ' ' ' ' ' ' ' ' 7$ 5+/:0-0,/%$+1%7-7,1/$+7##$+,#$(%#$#6$ 5#$#$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5#$(:#6$ ? ) .$ 5/:0-0,/%$+1%7-7,1/$+7##$+,#$0#$#6$ 5#$#$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5#$(:#6$ ? ) ,$ 5#$,#1-%:,%$+7##$+,#$+,#$#6$ 5#$#$#$..,-,:.,$#6$ 5#$#$#$#$#$#6$ $ 5#$(:#6$ ? ) 0$ 5#$#$+70#-#7%$#$#$#6$ 5(1/-%$#$#$(.##$#6$ 5#$#$#$#$#$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) %$ 5#$#$70#-#7%$#$#$#6$ 5(1/-%$#$#$(.##$#6$ 5#$#$#$#$#$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 507-%$#$+1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 507-%$#$1%-.7,.$07(-/%70$+1:-7,77(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) /$ 5#$#$+70#-#7%$#$#$#6$ 5(1/-%$#$#$(.##$#6$ 5#$#$#$#$#$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) :$ 5#$#$70#-#7%$#$#$#6$ 5(1/-%$#$#$(.##$#6$ 5#$#$#$#$#$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 507-%$#$+1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 1$ 507-%$#$1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) (#$ 5#$#$+70#-#7%$#$#$#6$ 5(1/-%$#$#$(.##$#6$ 5#$#$#$#$#$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) (($ 5#$#$70#-#7%$#$#$#6$ 5(1/-%$#$#$(.##$#6$ 5#$#$#$#$#$#6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) 54 > > !' !' (# ' (( ' 1$ 507-%$#$+1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ 1$ 507-%$#$1%-.7,.$07(-/%70$+1:-7,7(6$ 8$ 5+(:#$(:#$+(:#$(:#$+(:#$(:#6$ ? ) ? ) 55 Literaturverzeichnis [HeSchWa99] J. Hesselbach, W. Schuhmacher und F. Wahl. Teilprojekte A2, B2, B3 und B4: SFB-Antrag 562: Robotersysteme für Handhabung und Montage. Technische Universität Braunschweig, 1999 [DeHa55] J. Denavit und R. S. Hartenberg: A Kinematic Notation for Lower Pair Mechanisms Based on Matrices. ASME Journal of Applied Mechanics Vol. 22, 1955, pp. 215-221 [Rose00] Andreas Rose: Einweisung in ROBCAD Version 3.7.1. Modellierung und Simulation von Robotern. Studienarbeit, Institut für Robotik und Prozeßinformatik, Technische Universität Braunschweig, 2000 [ThoWa01] U. Thomas und F. Wahl: Eine universelle Schnittstelle für serielle, parallele und hybride kinematische Strukturen. Techn. Bericht, Technische Universität Braunschweig, April 2001 [Merl00] J. P. Merlet: Parallel Robots. Kluwer Academic Publishers, Dordrecht, Bosten, London 2000 [BeBe00] N. P. Belifiore und A. Di Benedetto: Connectivity and Redundancy in Spatial Robots. The International Journal of Robotics Research Vol. 19, No. 12, Dezember 2000, pp. 1245-1261 [Cros64] F. R. E. Crossley: A Contribution to Gruebler’s Theory in the Number Synthesis of Plane Mechanisms. Journal of Engineering for Industry. Transactions of the ASME, Februar 1964 [Tec99] Tecnomatix: Reference Manuals for ROBCADTM. Firma Tecnomatix, Juni 1999. [Ries92] H. Rieseler: Roboterkinematik – Grundlagen, Invertierung und Symbolische Berechnung. Dissertation. F. Vieweg & Sohn Verlagsgesellschaft mbH, Braunschweig/Wiesbaden 1992. [Bron91] Bronstein-Semedjajew: Taschenbuch der Mathematik. B.G. Verlag Teubner, Stuttgart, Leipzig und Nauka, Moskau 1991 [KeRi83] Kernighan/Ritchie: Programmieren in C. C. Hanser Verlag, München, Wien 1983. [KiByCho01] W. K. Kim, Y. K. Byun und H. S. Cho: Closed Forward Position Solution for a 6-DoF 3-PPSP Parallel Mechanism and Its Implementation. The International Journal of Robotics Research Vol. 20, No. 1, Januar 2001, pp. 85-99 [Wahl98] F. Wahl: Vorlesung Robotik I WS 1998/1999. Institut für Robotik und Prozeßinformatik, Technische Universität Braunschweig, 1998. 56 [Wahl99] F. Wahl: Vorlesung Robotik II SS 1999. Institut für Robotik und Prozeßinformatik, Technische Universität Braunschweig, 1999.