Im Unterverzeichnis vorgaben stehen Programme, die von uns vorgegeben werden. Die Dateien können in ein eigenes Verzeichnis kopiert und übersetzt werden.
In adair bzw. roblib befinden sich die zur Verfügung gestellten Pakete. Diese sind schon übersetzt und können verwendet werden.
In den einzelnen Aufgabenstellungen steht, welche Pakete für welche Aufgaben gedacht sind.
Die Aufgaben bestehen im wesentlichen aus Implementierungsarbeiten. Demzufolge ist für die Abnahme der Aufgaben die Funktionsfähigkeit der erstellten Software am jeweiligen Rechnertermin vorzuführen. Dafür sind, sofern nicht explizit angegeben, geeignete Testszenarien zu entwerfen, die alle geforderten Fähigkeiten der Programme demonstrieren. Sollten in den Aufgaben zusätzliche theoretische Fragen gestellt sein, so sind die Lösungen ebenfalls zu diesem Termin zu übergeben. Die auf der semesterspezifischen Seite genannten Abgabetermine sind verbindlich.
Für die Aufgaben 1 bis 3 werden die roten Roboter vom Typ RM-501 und für Aufgabe 4 bis 6 werden die grauen Roboter vom Typ RV-M1 im Raum EN266a verwendet.
Während der Programmausführung muß der Notausschalter immer in Reichweite sein und der Roboter beobachtet werden, um ggf. sofort abschalten zu können.
Lernziel: | Ansteuerung einzelner Motoren mit Winkeln, Fehlertoleranz für verlorene Schritte, Verhinderung von abrupten Bewegungsänderungen |
Unterlagen: | Ada Language Reference Manual |
Vorgaben: | NEST_ROBOT, GELENKE, SERIAL_IO, MEINE_IO, HAND_STEUERUNG (nur wegen Typ), ROBOTER_MATHE |
Wenn ein Gelenk an den Sollwinkel 0 gefahren wird
und am Ende keine Endabschalterberührung vorliegt, muß für
das entsprechende Gelenk eine Nest-Bewegung ausgeführt werden.
Wenn während der Bewegung
auf den Endabschalter
zu der Endabschalter des Gelenks betätigt wird, muß die
Bewegung sofort abgebrochen und die entsprechende Komponente des
Vektors IST_POSITION auf 0 gesetzt werden.
Darüber hinaus soll für das in den Endabschalter
gefahrene Gelenk eine Nest-Bewegung ausgeführt werden, falls die Schalterberührung
früher als nach der
IST_POSITION zu erwarten erfolgte.
Zur sinnvollen Auswertung der Endabschalterzustände
und Benutzung der Nest-Prozedur soll eine Schalterhysterese (siehe EES)
verwendet werden.
In einer speziellen 0-Umgebungen (Interval um 0)
muß geeignet zwischen Halt und Nest unterschieden werden. Die
gewählte Lösung ist zu begründen.
Die Drehrichtung der Gelenke darf nicht geändert werden, um Verwirrungen zu vermeiden.
Zur Verhinderung von abrupten Bewegungsänderungen muß die vorgegebene Prozedur GELENKSCHRITT so aufgerufen werden, daß ein Auftrag zuerst mit von 0 konstant steigender Geschwindigkeit (a geeignet wählen!), dann mit maximaler Geschwindigkeit (geeignet wählen!) und zum Schluß mit konstant bis auf 0 sinkender Geschwindigkeit abgearbeitet wird (Rampenfunktion). Bei kürzeren Bewegungen fällt die mittlere Bewegungsphase weg, und die Rampen sind gegenüber dem Normalfall entsprechend verkürzt. Wesentliche Größen dieses Bewegungsablaufs sind die Zeit t, die aktuelle Gelenkgeschwindigkeit v, die beim Beschleunigen und Bremsen jeweils konstante Beschleunigung a und die Schrittnummer bzw. Strecke s. Zum Verzögern des Programms bzw. Roboters gibt es zwei Möglichkeiten:
Bitte beachten Sie, daß eine konstante Beschleunigung nicht durch eine lineare Änderung der Wartezeit bzw. durchlaufenen Schleifenzahl erreicht wird (siehe Bild):
Variation der Geschwindigkeit durch Variation der
Wartezeit zwischen zwei Impulsen
für eine längere und eine kürzere
Bewegung
Schreiben Sie ein Programm, das unter Verwendung der neuen Prozedur GELENKBEWEGUNG einzelne Gelenke in am Terminal eingebbare Winkel UND Gelenkschrittnummern bewegen kann. Ihr Programm muß außerdem gewährleisten, daß die mechanischen Grenzen der einzelnen Gelenke (siehe gelenke_s.ada) nicht überschritten werden (Bewegungsbeschränkung im Schritte-Bereich!); entsprechende Benutzereingaben sind zurückzuweisen. Das Programm soll mit einem Tastendruck terminiert werden können.
Wenn das Handneigegelenk aus seiner "Null-Position"
herausgefahren ist, wird der Endabschalter des Handdrehgelenks nicht mehr
betätigt. D. h., der Endabschalter EA4 kann nur betätigt werden,
wenn der Endabschalter EA3 betätigt ist.
Lernziel: | Nebenläufige Programmierung, gelenkinterpolierte Bewegung, Greifersteuerung, Anbindung einer einfachen Benutzungsoberfläche |
Unterlagen: | Ada Language Reference Manual |
Vorgaben: | TBOX, HAND_STEUERUNG, SCREEN |
Implementieren Sie eine Teachbox, mit der durch einzelnen Tastendruck Gelenke mit kleiner Schrittweite in positiver oder negativer Drehrichtung bewegt werden können. Während die Taste gedrückt ist, soll die Bewegung nicht stoppen. Sobald die Taste losgelassen wird, muß die Bewegung schnellstmöglich aufhören. Über die Tastatur soll die Hand durch einen Tastendruck geöffnet bzw. geschlossen und die Prozedur NEST ausgeführt werden können. Weiterhin sollen die aktuelle Position und der derzeitige Handzustand unter einer Nummer abgespeichert werden können. Mindestens 10 gespeicherte Positionen sollen anschließend als geteachtes »Programm« automatisch hintereinander angefahren werden können.
Geben Sie mit Hilfe der implementierten Teachbox ein Programm ein, das einen auf dem Tisch liegenden Würfel an einer anderen Position auf dem Tisch ablegt.
procedure TeachBox (Kommando : out T_TbKommando; Geschw : out T_Geschwindigkeit);die pro Aufruf ein Benutzerkommando im Ausgabeparameter Kommando zurückgibt. Schauen Sie sich dazu die Definition von T_TbKommando an. In diesem »variant record« sind die möglichen Kommandos mit ihren zugehörigen Parametern kodiert. Das Kommando KAchsenSchritt dient erst der nächsten Aufgabe und soll zunächst ignoriert werden. Die Bewegungsgeschwindigkeit beim Teachen kann innerhalb der Teachbox im Bereich von 1% bis 100% eingestellt werden, der aktuelle Wert wird Ihnen im Ausgabeparameter Geschw mitgeteilt. Es steht Ihnen natürlich auch frei, eine schönere Teachbox als die im TBOX-Paket selbst zu schreiben.
Um eine kontinuierliche und möglichst ruckfreie Bewegung zu erreichen, müssen mehrere Gelenkschritte pro Tastenabfrage ausgeführt werden. Probieren Sie aus, wie viele für das Programm am günstigsten sind.
Es ist wahrscheinlich hilfreich, GELENKBEWEGUNG in eine Task umzuwandeln, die die Bewegungsdienste per Entry bereitstellt. Dies erlaubt eine Parallelisierung mit der Ansteuerung der Hand, die am besten ebenfalls aus einer eigenen Task heraus realisiert wird.
Bedenken Sie, daß Task-Wechsel nur stattfinden, wenn eine Task
blockiert wird oder eine DELAY-Anweisung ausführt. Ggf. müssen
Sie DELAY 0.0 verwenden, um Task-Wechsel zu erzwingen.
Lernziel: | Roboterkinematik, Orientierungsanpassung |
Unterlagen: | Ada Language Reference Manual, Großübung |
Vorgaben: | ROBOTER_MATHE, RM501_KINEMATIK |
Zur Implementierung des xyz-Modus ist sowohl eine Vorwärtsrechnung wie auch eine Rückwärtsrechnung erforderlich. Die Vorgehensweise wird anhand des Fahrens entlang der z-Achse beschrieben: Der Roboter befindet sich in einer beliebigen Stellung und soll bei gleichbleibender Orientierung um 10.0 mm entlang der z-Achse des BKS bewegt werden. Mit Hilfe der Vorwärtsrechnung wird aus den aktuellen Gelenkwinkeln eine homogene 4x4-Matrix bestimmt. Bewegen entlang der z-Achse bedeutet, auf das Element (3,4) (der z-Komponente des Positionsvektors) den Verfahrweg (Dz = 10.0 mm) zu addieren. Aus dieser neuen Matrix sind mit Hilfe der Rückwärtsrechnung die neuen Gelenkwinkel zu bestimmen und gelenkinterpoliert anzufahren.
Das Vorgehen beim Bewegen entlang der x- bzw. y-Achse ist ähnlich. Allerdings muß dabei berücksichtigt werden, daß aufgrund der globalen Degeneration des RM501 eine Orientierungsanpassung erforderlich ist. D. h., es sind nicht alle Positionen mit einer beliebigen Orientierung anfahrbar. Um festzustellen, ob eine gegebene Stellung W in Form einer homogenen Matrix anfahrbar ist, muß folgende Bedingung (Degenerationsbedingung) gelten:
W (2,3) * W (1,4) = W (1,3) * W (2,4)
Die Rückwärtsrechnung akzeptiert nur Matrizen, bei denen diese Bedingung erfüllt ist (sonst wird die Ausnahme FRAMEINVALID ausgelöst). Bevor also die Rückwärtsrechnung aufgerufen werden kann, muß der Orientierungsteil der Matrix angepaßt werden, d. h., die vorgegebene Position ist mit einer möglichst geringen Orientierungsänderung anzufahren.
Lernen Sie mit Hilfe dieser veränderten Teachbox erneut ein Programm ein, das einen auf dem Tisch liegenden Würfel an einer anderen Position auf dem Tisch ablegt. Dafür sind jetzt allerdings vorrangig Bewegungen bezüglich des kartesischen Koordinatensystems zu verwenden.
Das vorgegebene Modul RM501_KINEMATIK stellt sowohl die Vorwärts- wie auch die Rückwärtsrechnung für den RM501 zur Verfügung. Dieses Modul exportiert folgende zwei Prozeduren:
RUECKWAERTSRECHNUNG - berechnet aus einer homogenen 4x4-Matrix die Gelenkwinkel
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
beschreibt eine Stellung, in der der Roboter den Arm vollständig nach oben streckt. Dies entspricht einer Gelenkwinkeleinstellung von (150.0, -13.5, 90.0 , 90.0, 112.5) Grad. Die Rückwärtsrechnung liefert nur Gelenkwinkel, die innerhalb der Bewegungsmöglichkeiten der Gelenke liegen. D. h., eine theoretisch zwar mögliche Lösung für das erste Gelenk von -90.0° wird auf den Winkelbereich [0.0°...300.0°] des ersten Gelenkes angepaßt, das Ergebnis ist also 270.0°. Eine Untersuchung der Lösung ist nur dann erforderlich, wenn zwei Lösungen geliefert werden. Von diesen zwei Lösungen ist die plausibelste auszuwählen.
Das Paket ROBOTER_MATHE enthält einige
kleine Prozeduren, die von RM501_KINEMATIK benutzt werden, beispielsweise
ATAN2
und Funktionen zur Winkelkonvertierung.
Lernziel: | Gelenkinterpolierte Bewegungsbahnen |
Unterlagen: | Ada Language Reference Manual, AdaIR-Bedienhandbuch, Beispielprogramm ellipse.ada(AdaIR-Test), Beispielprogramm bahn.ada(Vorgaben-Test) |
Vorgaben: | Paket aufgabe4_vorgaben |
Zur Steuerung des Roboters steht das Paket aufgabe4_vorgaben
zur Verfügung. Dieses Paket stellt die grundlegenden Prozeduren, entsprechend
den vorigen Aufgaben, für den RV-M1 bereit. Aus Effizienzgründen
überprüfen die vorgegeben Prozeduren nicht, ob die Grenzgeschwindigkeiten
für die einzelnen Gelenke eingehalten werden. Die per Tastatur eingebbare
Zeitvorgabe für das Abfahren der gesamten Bahn ist deshalb groß
genug (20 s) zu wählen.
Dem Beispielprogramm bahn.ada ist zu entnehmen, wie die Prozeduren
verwendet werden können. Die darin enthaltenen Start- und Zielpunkte
können als Beispiel zur schnellen Demonstration verwendet werden.
Es ist im Gelenkraum zu interpolieren!
Was passiert bei einer Bahninterpolation im kartesischen Raum?
Lernziel: | Modellierung des Konfigurationsraums; Hindernisvermeidung mit Sichtbarkeitsgraph und A*-Algorithmus |
Unterlagen: | Ada Language Reference Manual, AdaIR-Bedienhandbuch, Vorlesungskapitel Kollisionsvermeidung/Bewegungsplanung |
Vorgaben: | Paket hindernisse |
Schreiben Sie ein Programm, das z. B. mit Hilfe der Teachbox ein Start- und ein Zielpunkt innerhalb der Arena festlegen läßt. Dann soll eine kollisionsfreie Bewegungsbahn vom Start- zum Zielpunkt durch A*-Suche im Konfigurationsraum-Sichtbarkeitsgraphen geplant und anschließend ausgeführt werden. Ihr Programm soll mehrere Planungs- und Ausführungsvorgänge ohne Neustart erlauben. Beispielhafte Start/Zielpunkt-Kombinationen können zur schnellen Vorführung vorbereitet werden.
Die Arbeit bzw. der Erfolg der A*-Suche soll am Bildschirm dokumentiert werden. Damit soll nachvollzogen werden können, ob z.B. der Start- und/oder Zielpunkt in einem Hindernis liegt oder von anderen Punkten aus nicht gesehen werden kann. Ein "Nach-Teachen" des betreffenden Punktes soll damit möglich sein.
Die Beschreibung der Hindernisse in der Arena sowie eine Reihe von Hilfsroutinen sind im Paket HINDERNISSE (Datei hindernisse_s.ada) vorgegeben. Hindernisse sind dort stets aus achsenparallelen Quadern zusammengesetzt. Die Konstante ArenaO gibt den Ursprung der Arena im BKS wieder. In der HindernisListe ist das Hindernisgebirge zusammen mit 6 Quadern zur Arbeitsraumbegrenzung in BKS-Koordinaten enthalten.
Bevor Sie den Sichtbarkeitsgraphen berechnen, müssen Sie die Arbeitsraumhindernisse in Konfigurationsraumhindernisse überführen, indem Sie alle Quader geeignet vergrößern. Da das bewegte Objekt nur eine Drahtspitze ist, sind wenige Millimeter hierfür ausreichend (z.B. 5mm).
Die Knoten des Sichtbarkeitsgraphen sind bekanntlich Ecken der Konfigurationsraum-Hindernisse. Bei Ihrer Lösung sollen ausschließlich die vier oberen Ecken jedes Konfigurationsraum-Hindernisquaders als Knoten dienen, allerdings jeweils um eine feste Strecke dz nach unten verschoben, damit die Ecken der Höhe 5 nicht von der Arbeitsraumbegrenzung eliminiert werden. Wählen Sie dz passend zur Steingröße und der von Ihnen vorgenommenen Hindernisvergrößerung. Mit dieser Konvention enthält der Sichtbarkeitsgraph 4 Knoten pro Hindernisquader plus den Start- und den Zielpunkt, also 94 Knoten.
Karte des Hindernisgebirges in der Arena, Rastergröße 32mm.
Die Zahlen stehen für die Hindernishöhe.
Die Arena ist nur dadurch vollständig für den Roboter erreichbar, daß die Handneigung in Abhängigkeit von der x-Koordinate variiert wird. Verwenden Sie die vorgegebene Funktion Arena2Frame, um für eine Arenaposition (x,y,z) eine erreichbare Roboterstellung einschließlich Orientierungsanpassung zu erhalten. Arena2Frame akzeptiert nur Positionen innerhalb der Arena, anderenfalls wird die Ausnahme E_OUT_OF_ARENA ausgelöst.
Leider ist der Arbeitsraum der Roboter ein wenig "verbogen". Soll z.B. ein Rechteck abgefahren werden, das aus entsprechend berechneten Punkten besteht, wird der TCP tatsächlich auf einem Trapez bewegt. Strecken, die "nah" am Roboter abgefahren werden, scheinen so z.B. in der Realität kürzer als theoretisch ebenso lange Strecken, die aber mit ausgestrecktem Arm vollzogen werden. Die entstehenden Differenzen sind aber klein und verschwinden nahezu vollständig in der Hindernissvergrößerung.
Die Positionen für Roboter und Arena sind auf dem Labortisch markiert. Es ist aber sinnvoll, am Anfang Ihres Programms einmal die gesamte Arena in Höhe des höchsten Hindernisses zu umfahren, um insbesondere die Orientierung und Position des Roboters hinreichend exakt (besonders im Hinblick auf die o.g. Arbeitsraumverbiegung) zu machen.
Um eine weitgehend lineare Bewegung zwischen den berechneten Stützpunkten zu erreichen, kann (muss aber nicht) statt der AdaIR-Prozedur auch die 4-3-4-Bahn aus Aufgabe 4 verwendet und die Annäherungs- und Abrückstellung in Arenapositionen linear interpoliert werden (nach 1/3 bzw. 2/3 jedes Wegstücks). Damit kommt der Roboter an den Knickpunkten jeweils zur Ruhe. Die hierbei noch auftretenden Abweichungen von einer vollständig linearen Bewegung können (hoffentlich) vernachlässigt werden - zumindest schließt der Versuchsaufbau Schäden aus.
Bei der parallelen Verwendung von aufgabe4_vorgaben und der
AdaIR-Pakete, kann es zu Verwirrungen beim Kompilieren kommen. Durch explizite
Angabe des Paketes, aus dem ein Bezeichner stammt oder stammen soll, wird
das vermieden.
Lernziel: | Hindernisvermeidung mit Potentialfeldern; Bahnplanung mit Gradientenmethode |
Unterlagen: | Ada Language Reference Manual, AdaIR-Bedienhandbuch, Vorlesungskapitel Kollisionsvermeidung/Bewegungsplanung |
Vorgaben: | Paket hindernisse |
Vor dem ersten Planungsvorgang soll Ihr Programm das Potentialfeld mit Hilfe der Funktion MaleFeld aus HINDERNISSE auf dem Terminal visualisieren. Hierbei ist aber auf die Ausrichtung der Achsen zu achten, so daß der Vergleich von Bildschirm und Realität einfacher wird. Dies erfolgt am besten auf Tastendruck nacheinander für jeweils eine Ebene in den Rasterhöhen 1, 2, 3, 4 und 5. Achten Sie auf eine geeignete Übersetzung der Potentialwerte in die darstellbaren Grauwerte vom Typ T_Grauwert.
Das Potential U(p) im Punkt p setzt sich aus einem anziehenden (negativen) Potential am Zielpunkt t und einer Überlagerung abstoßender (positiver) Potentiale an den Grenzflächen der Hindernisquader zusammen und berechnet sich so:
Dabei sind dist(p,i) der Abstand von p zum i-ten Hindernisquader und
dmax eine obere Schranke für diese Entfernung, oberhalb
der das jeweilige Hindernis keinen Beitrag mehr zum Potential liefert.
dmax und die restlichen Parameter sind geeignet zu wählen.
Für dmax scheinen 5mm sinnvoll zu sein, damit Wege
auch über Hindernisse der Höhe 4 gefunden werden können.
Zur Berechnung von dist(p,i) kann die vorgegebene Funktion QuaderAbstand
benutzt werden. Sie berechnet den Abstand zwischen p und dem am nächsten
liegenden Punkt des Hindernisquaders.
Für das konstante Verhältnis zwischen anziehendem und abstoßenden
Potential empfiehlt sich 1/3000. Natürlich kann und soll experimentiert
werden!
Die Bahnplanung soll als Gradientenabstieg erfolgen. Der Gradient G(p) im Punkt p gibt die Richtung der steilsten Potentialzunahme von p aus an. Für die Aufgabe soll eine numerische Näherung der Gradientenberechnung verwendet werden:
Da der Betrag von G(p) nicht benutzt werden soll, kann die Division durch Epsilon auch entfallen. Der jeweils nächste Bewegungsschritt erfolgt nun mit fester Schrittweite dstep entgegen der Richtung des Gradienten, da das Potential am Zielpunkt minimal sein sollte:
Sie brauchen kein Verfahren zur Vermeidung lokaler Minima zu implementieren. Wählen Sie einfach eine geeignete Maximalzahl von Iterationsschritten passend zu dstep. Die Bahnplanung terminiert, wenn der Zielpunkt hinreichend gut erreicht ist.
Der Roboter soll sich gleich während der Planung mitbewegen, da der Gradientenabstieg ein lokales Verfahren (greedy) ist.
Zum Fahren der Bahn sollten Sie eine langsame Geschwindigkeit wählen.
Bei dieser Aufgabe ist es sinnvoll, wiederum die Bahnberechnung aus
Aufgabe
4 zu verwenden. Diesmal können die Stützpunkte jedoch in
der Folge Start-, Abrück-, Annäherungs- und Zielposition verwendet
werden, wobei die Zielposition jeweils der Startposition des nächsten
Bewegungssegments entspricht. Sie erhalten somit für je drei Stützpunkte
ein neues Bahnsegment, und der Bewegungsablauf stoppt nur an jedem dritten
Stützpunkt.
Letzte Änderung 4.3.2003 von Mathias
Neumann
Prozeßdatenverarbeitung