Studienarbeit von Jendrik Bertram
Transcrição
Studienarbeit von Jendrik Bertram
Universität Paderborn Fakultät für Elektrotechnik, Informatik und Mathematik Bachelorarbeit Re-Engineering eines LEGO Hochregallagers und Konzeption der Steuerung mit Hilfe von Mindstorms NXT-Modulen Jendrik Bertram 13. Dezember 2007 betreut von Michael Dohmen vorgelegt bei Prof. Dr. Johannes Magenheim Prof. Dr. Stefan Böttcher Erklärung Ich versichere, dass ich die vorliegende Arbeit selbstständig und ohne unerlaubte Hilfe Dritter angefertigt habe. Alle Stellen, die inhaltlich oder wörtlich aus anderen Veröffentlichungen stammen, sind kenntlich gemacht. Diese Arbeit lag in gleicher oder ähnlicher Weise noch keiner Prüfungsbehörde vor und wurde bisher noch nicht veröffentlicht. Jendrik Bertram Paderborn, 13. Dezember 2007 i Zusammenfassung In Hochregallagern sind oft viele tausende Palettenstellplätze vorhanden, welche durch schienengeführte Regalbediengeräte beladen werden. Diese Regalbediengeräte werden über Förderbandsysteme oder autonome Transportfahrzeuge mit den Paletten beliefert. Im Rahmen des MuSoft Projekts ist ein Model solch eines Hochregallagers mit Hilfe der LEGO Mindstorms entstanden, dessen Steuerung durch das Robotics Invention System (RIS) umgesetzt wurde. Hierbei wurde nicht auf die von LEGO entwickelte Mindstorms Programmierumgebung zurückgegriffen, sondern auf das OpenSource Projekt leJOS. Mit leJOS ist es möglich die programmierbaren Bausteine mit Hilfe von Java zu programmieren. Dafür wurde eine Java Virtual Machine entwickelt, die auf diesen Bausteinen funktioniert. Außerdem wurde eine Bibliothek zur Verfügung gestellt, die es ermöglicht, die Aktoren und Sensoren anzusprechen. Zusätzlich stellt leJOS Funktionen bereit, die es vereinfacht, oft benutzte Konzepte der Robotik umzusetzen. Die LEGO Mindstorms RCX Serie wurde mittlerweile von der LEGO Mindstorms NXT Serie abgelöst. Das leJOS Projekt hat mit der Arbeit begonnen, die Virtual Machine und die Bibliothek zu portieren und zu erweitern, um von den neu hinzu gekommenen Funktionalitäten Gebrauch machen zu können. Diese Bachelorarbeit stellt die Neuerungen der Mindstorms NXT vor und zieht einen Vergleich zu den Mindstorms RCX. Dabei wird neben der grundsätzlich unterschiedlichen Konstruktion, auf die neuen Sensoren und Aktoren, aber auch die Änderungen in der Programmierung eingegangen. Alle Elemente des bestehenden Hochregallagers werden mit den neuen NXT Bausteinen in der stud-less Bauweise neu aufgebaut, wobei versucht wird von den Neuerungen so weit wie möglich Gebrauch zu machen und Schwachstellen des alten Systems so weit wie möglich zu umgehen. Der Schwerpunkt liegt darin die störanfällige und langsame Infrarot-Kommunikation gegen eine Bluetooth-Kommunikation einzutauschen und die Steuerung mit Hilfe eines einfachen Menüsystems auf einem der programmierbaren NXT Bausteine umzusetzen. Zusätzlich werden Ansätze dargestellt, wie sich das System mit weiterer Funktionalität ausbauen lässt. Diese sind hauptsächlich darauf angesetzt, zu versuchen das Model einem wirklichen Hochregallager von der Funktionalität her ähnlicher zu machen. ii Inhaltsverzeichnis 1 Einleitung 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Ziele der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Aufbau der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 3 2 Definitionen 4 3 RCX und NXT 3.1 Die programmierbaren Bausteine . 3.2 Die Aktoren . . . . . . . . . . . . . 3.2.1 Der RCX Motor . . . . . . 3.2.2 Der NXT Motor . . . . . . 3.3 Die Sensoren . . . . . . . . . . . . 3.3.1 Der Drucktaster . . . . . . 3.3.2 Der Licht Sensor . . . . . . 3.3.3 Der Sound Sensor . . . . . 3.3.4 Der Ultrasonic Sensor . . . 3.3.5 Der Rotations Sensor . . . 3.3.6 Produkte anderer Hersteller 3.4 Programmierung . . . . . . . . . . 3.4.1 NXT-G . . . . . . . . . . . 3.4.2 leJOS . . . . . . . . . . . . 4 Konstruktion 4.1 Das Hochregal . . . . . . . . . . . 4.2 Das Regalbediengerät . . . . . . . 4.2.1 Die Fahreinheit . . . . . . . 4.2.2 Die Hubeinheit . . . . . . . 4.2.3 Die Lastaufnahmeeinheit . 4.3 Die Übergabestation . . . . . . . . 4.4 Das Autonome Transportfahrzeug 4.5 Die Fahrbahn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 9 10 10 11 12 12 13 15 15 16 17 19 19 20 . . . . . . . . 24 26 27 27 28 29 30 31 33 5 Implementierung 35 5.1 Kommunikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.1.1 Die Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.2 Der Master Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 iii Inhaltsverzeichnis Inhaltsverzeichnis . . . . . . . . . 41 42 43 45 46 46 47 48 51 6 Erweiterungsmölichkeiten 6.1 ATF Erweiterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 UEG Erweiterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Lagerverwaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 54 55 56 7 Fazit und Ausblick 57 5.3 5.4 5.5 5.2.1 Das Menüsystem . . . . . . . 5.2.2 Das Lagerverwaltungssystem Das Regalbediengerät . . . . . . . . Die Übergabestation . . . . . . . . . Das Transportfahrzeug . . . . . . . . 5.5.1 Initialisierung . . . . . . . . . 5.5.2 Linienverfolgung . . . . . . . 5.5.3 Positionsbestimmung . . . . . 5.5.4 Anfahrt der Zielpositionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A UML Diagramme 58 A.1 Klassendiagramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 A.2 Sequenzdiagramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 B Konstruktionsabbildungen 61 B.1 Anschlussbelegung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 C Inhalt der beiliegenden CD 65 D Inbetriebnahme 66 Literaturverzeichnis 67 iv Abbildungsverzeichnis 2.1 Ein Hochregallager mit Regalbediengerät . . . . . . . . . . . . . . . . . . 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 Der RCX Baustein . . . . . . . . . . Der NXT Intelligent Brick . . . . . . Der RCX Motor . . . . . . . . . . . Der NXT Motor . . . . . . . . . . . Der RCX Drucktaster . . . . . . . . Der NXT Drucktaster . . . . . . . . Der RCX Licht Sensor . . . . . . . . Der NXT Licht Sensor . . . . . . . . Der NXT Sound Sensor . . . . . . . Der NXT Abstands Sensor . . . . . Der RCX Rotations Sensor . . . . . Der HiTechnic Kompass Sensor . . . Die NXT-G Entwicklungsumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8 10 11 12 13 13 14 15 16 16 17 19 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 Das RCX Hochregallager . . . . . . . . Das Hochregal . . . . . . . . . . . . . . Die Fahreinheit . . . . . . . . . . . . . . Die Hubeinheit . . . . . . . . . . . . . . Die Übergabestation . . . . . . . . . . . Das Autonome Transportfahrzeug . . . Der Initialisierungsbereich für das ATF Die Fahrbahn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 26 28 29 30 31 33 34 5.1 5.2 5.3 5.4 5.5 5.6 5.7 Sequenzdiagramm Einlagern . . . . . . . . Die Command Hierarchie . . . . . . . . . Klassendiagramm des Master Controllers Klassendiagramm des Regalbediengerätes Klassendiagramm der Übergabestation . . Schema einer Positionsveränderung . . . . Anfahrt der Zielposition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 38 42 44 45 49 51 . . . . . . . . . . . . . 4 A.1 Klassendiagramm upb.hrl.comm . . . . . . . . . . . . . . . . . . . . . . . 58 A.2 Klassendiagramm des Autonomen Transportfahrzeuges . . . . . . . . . . . 59 A.3 Sequenzdiagramm Auslagern . . . . . . . . . . . . . . . . . . . . . . . . . 60 v Abbildungsverzeichnis Abbildungsverzeichnis B.1 Das Regalbediengerät mit Hochregal . . . . . . . . . . . . . . . . . . . . . 61 B.2 Das Regalbediengerät . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 B.3 Die Lastaufnahmeeinheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 vi 1 Einleitung 1.1 Motivation Im Rahmen des MuSoft Projekts1 ist ein Hochregallager auf Basis des LEGO2 Mindstorms3 Robotics Invention System (RIS) entstanden, welches ein Modell des Avarto4 Hochregallagers von Bertelsmann in Bielefeld darstellt. Das System wird von insgesamt 10 RCX Bausteinen gesteuert, die auf autonome Transportfahrzeuge, Übergabestationen und Regalbediensysteme verteilt sind. Die RCX Module kommunizieren dabei über die eingebaute Infrarotschnittstelle mit einem speziell entwickelten Protokoll, welches einen Tokenmanager einsetzt. Obwohl LEGO eine grafische Programmierumgebung zur Erstellung von Programmen mitliefert, wurde sich dafür entschieden die Programmierung mit Hilfe der frei verfügbaren, auf Java basierenden, leJOS5 Bibliothek durchzuführen. Dadurch konnten einige elementare Einschränkungen umgangen werden. Im Jahr 2006 wurde von LEGO eine neue Generation der programmierbaren Bausteine, welche das Robotics Invention System ablösen, in das Sortiment aufgenommen. Die neuen Mindstorms NXT Module sind deutlich leistungsfähiger als die alten RCX Module, aber leider nicht kompatibel. Die Programmierbausteine, sowie die Motoren und Sensoren, haben andere Dimensionen und werden mit Hilfe der neuen studd-less Technik zusammen gebaut. Außerdem unterscheiden sich die Komponenten teilweise deutlich in ihrer Funktionalität. Auch die alten leJOS Bibliotheken sind in der Form nicht weiter benutzbar. Das OpenSource Projekt arbeitet jedoch daran die Java Virtual Machine auf die neuen Bausteine zu portieren und die dazugehörige Bibliothek anzupassen, um von den neuen Möglichkeiten, wie Bluetooth und neuartigen Sensoren, Gebrauch machen zu können. Zum aktuellen Zeitpunkt steht leJOS NXJ in der frühen beta Version 0.4 zur Verfügung. Somit bietet sich LEGO Mindstorms NXT, in Verbindung mit leJOS NXJ, dazu an, das Model des Hochregallagers umzurüsten und dessen Funktionalität zu erweitern. 1 http://www.musoft.org http://www.lego.de 3 http://www.legomindstorms.com 4 http://www.arvato-systems.de 5 http://www.lejos.org 2 1 1.2. ZIELE DER ARBEIT KAPITEL 1. EINLEITUNG 1.2 Ziele der Arbeit In dieser Bachelorarbeit wird das bestehende LEGO Mindstorms RIS Hochregallager der FG Didaktik6 mit Hilfe der LEGO Mindstorms NXT neu aufgebaut. Die Steuerung soll von leJOS RCX nach leJOS NXJ portiert und alle Elemente mit Hilfe der stud-less Technik neu konstruiert werden. Dieses ist nötig, da weder die leJOS Bibliotheken, noch die Konstruktion der beiden Systeme miteinander kompatibel ist. Für die Konstruktion der überarbeiteten Elemente ist es notwendig die Möglichkeiten der mitgelieferten, aber auch anderweitig erhältlichen, Aktoren und Sensoren genauer zu betrachten, um diese bestmöglich einsetzen zu können. Es muss ein Regalbediengerät, eine Übergabestation und ein autonomes Transportfahrzeug konstruiert werden. Zusätzlich muss die vorhandene Fahrbahn angepasst werden. Die in Java implementierte Steuerung muss komplett überarbeitet werden, um von den neuen Möglichkeiten, vor allem der Motoren, Gebrauch machen zu können. Zusätzlich kann auf neue Funktionen der leJOS NXJ Bibliothek zurückgegriffen werden. Ein besonderes Augenmerk wird auf die neuen Möglichkeiten der Kommunikation zwischen den NXT Programmierbausteinen gelegt. Diese verfügen nicht mehr über die bisher eingesetzte Infrarot Schnittstelle. Dafür steht aber Bluetooth Unterstützung zur Verfügung. Dementsprechend muss die Kommunikation mit dessen Hilfe, so weit es der aktuelle Entwicklungsstand von leJOS zulässt, neu implementiert werden. Die Steuerung des Gesamtsystems soll über ein dediziertes NXT Modul realisiert werden. Dieses soll die Möglichkeit bieten, grundlegende Tests des Systems durchzuführen und neue Aufträge zum Ein- und Auslagern von Paletten auszuführen. Dieses Modul soll auch die grundlegenden Aufgaben eines Lagerverwaltungssystems übernehmen. Ein zusätzliches Ziel der Arbeit ist es, mögliche Erweiterungen für das System herauszuarbeiten und zu erläutern. Die Erweiterungen sollen darstellen, wie einzelne Komponenten des Hochregallagers verbessert werden können, aber auch wie das gesamte System einem reellem Hochregallager, von dem Aufbau und der Funktion her, ähnlicher umgesetzt werden kann. Die Programmierung wird in Java 1.57 von Sun durchgeführt. Des weiteren soll die leJOS NXJ Bibliothek genutzt werden. Diese steht zum aktuellen Zeitpunkt in der Version 0.4 zur Verfügung, welche jedoch nicht alle benötigten Features, besonders die für die Bluetooth Kommunikation, unterstützt. Daher muss auf eine aktuellere Version aus dem Subversion8 Repository des Projektes zurückgegriffen werden. 6 http://ddi.uni-paderborn.de http://java.sun.com 8 http://subversion.tigris.org 7 2 1.3. AUFBAU DER ARBEIT KAPITEL 1. EINLEITUNG 1.3 Aufbau der Arbeit Diese Bachelorarbeit versucht den Aufbau des Hochregallagers von Grund auf darzustellen. Dazu wird in Kapitel 2 ein Überblick über den Aufbau eines Hochregallagers geschaffen und Definitionen der grundlegenden Begriffe, die im Verlauf der Arbeit häufig verwendet werden, gegeben. Dabei werden insbesondere die Funktionen der einzelnen Komponenten eines Hochregallagers veranschaulicht. Das darauf folgende Kapitel 3 beschreibt, welche Änderungen sich durch die Umstellung von RCX auf NXT Bausteine ergeben und wie diese sich auf den Aufbau und die Programmierung des Hochregallagers auswirken. Dabei wird sowohl auf die Programmierung als auch die mechanische Konstruktion eigegangen. Ein besonderes Augenmerk wird auf die von LEGO, und anderen Herstellern, verfügbaren Sensoren und deren Anwendungsmöglichkeiten gelegt. Es wird dabei besonders versucht Bezug darauf zu nehmen, wie die Sensoren in den Komponenten des Hochregallagers zum Tragen kommen. In Kapitel 4 wird für die einzelnen Elemente des Hochregallagers die neue Konstruktion beschrieben. Dazu wird der Aufbau der Komponenten beschrieben und darauf eingegangen, welche Techniken und welche der, im vorherigen Kapitel beschriebenen, Sensoren zum Einsatz kommen. Die detaillierten Aufbauanleitungen sind mit Hilfe entsprechender CAD Programme umgesetzt und auf der beiliegenden CD gesammelt. Das anschließende Kapitel 5 beschreibt die neu entstandene Implementierung der Steuerung. Es wird damit begonnen den Aufbau der neu entstandenen Kommunikation darzustellen, da diese von allen Elementen gemeinsam benutzt wird. Daraufhin wird die Implementierung des zur Steuerung und als Lagerverwaltungssystem benutzen NXT Bausteins vorgestellt. Im Weiteren wird auf die Umsetzung der Steuerung der restlichen Komponenten des Hochregallagers eingegangen. In Kapitel 6 werden mögliche Erweiterungen des Hochregallagers und deren Nutzen vorgestellt. Es wird darauf eingegangen wie zusätzliche, von dritten Herstellern vertriebenen, Sensoren dazu beitragen können, einzelne Komponenten des Hochregallagers weiter auszubauen. Desweiteren wird dargestellt, wie das Hochregallager mit einem komplexeren Lagerverwaltungssystem kombiniert werden kann, um so realistischer zu arbeiten. Das abschließende Kapitel 7 fasst die Ergebnisse der Arbeit und den erreichten Entwicklungsstand des Hochregallagers zusammen. 3 2 Definitionen Dieses Kapitel gibt einen Überblick über die grundlegenden Begriffe, die im Verlauf der Arbeit häufig verwendet werden. In Abbildung 2.1 ist der Aufbau eines Hochregallagers schematisch gezeigt. Es ist ein Regalbediengerät dargestellt, welches sich in einer Gasse zwischen zwei Regalen bewegt und gerade dabei ist eine Lagereinheit mit einer beladenen Palette zu bestücken. Abbildung 2.1: Ein Hochregallager mit Regalbediengerät Lagersysteme können anhand verschiedener Kriterien aufgeteilt werden. Darunter fallen: • Art der Ladeeinheiten (Paletten, Gitterboxen, etc.). • Zum Einsatz kommende Regalkonstruktion. 4 KAPITEL 2. DEFINITIONEN • Zur Lagerbedienung verwendete Hilfsmittel. Das Hochregallager ist ein automatisiertes Palettenlager mit wahlfreiem Zugriff auf das Lagergut. In einem solchen Zeilenlager wird die Bedienung durch Regalförderzeuge (auch Regalbediengerät genannt) oder automatische Regalstapler durchgeführt. Dadurch, dass ein Hochregallager wahlfreien Zugriff auf das Lagergut gestattet, wird dieses hauptsächlich zur Lagerung von großen Artikelzahlen mit geringem bis mittleren Bestand pro Artikel eingesetzt [lag83, SJ91]. Das in dieser Arbeit umgesetzte Lager entspricht einem Hochregallager mit Bedienung durch automatische Regalbediengeräte. Solche Lager werden seit den sechziger Jahren gebaut und haben die folgenden charakteristischen Merkmale: • Die Ladeeinheiten (meist Paletten oder Gitterboxen) sind für die Aufbewahrungsdauer ortsfest, da Hochregallager zu den statischen Lagersystemen zählen. • Die Regale sind meist zeilenförmig angeordnet und haben eine Höhe von mindestens 8m. • Auf die Lagereinheiten kann wahlfrei zugegriffen werden. • Die Lagerbedienung erfolgt mit Hilfe der automatischen Regalbediengeräte, welche sich in der Regel in den Gassen zwischen den Regalzeilen bewegen. Die für die Bestückung des Lagers zuständigen Regalbediengeräte können sich entlang drei Achsen bewegen: • x-Achse: Ganglängsrichtung (Fahreinheit) • y-Achse: vertikale Richtung (Hubeinheit) • z-Achse: Gangquerrichung (Lastaufnahmeeinheit) Die Bestückung der Lagereinheiten kann durch unterschiedliche Konstruktionen geschehen, meist wird jedoch auf eine Gabel, ähnlich der eines Gabelstaplers zurückgegriffen. Die Regalbediengeräte sind mit ausschlaggebend für die Umschlagleistung eines Hochregallagers. Von Wichtigkeit ist dabei deren mittlere Spielzeit für Einzel- und Doppelspiel. Das Einzelspiel beschreibt die Summe aller Zeiten für eine Ein- oder Auslagerung. Das Doppelspiel beschreibt eine kombinierte Ein- und Auslagerung. Bevor die Paletten von dem Regalbediengerät eingelagert werden können, müssen sich diese in einer Position befinden, auf die das Regalbediengerät zugreifen kann. Dieser Bereich wird im Allgemeinen Ein- und Auslagerungsbereich genannt, wobei die beiden Bereiche nicht zwangsläufig miteinander übereinstimmen müssen. 5 KAPITEL 2. DEFINITIONEN Die Anlieferung zu diesem Bereich kann je nach externen Gegebenheiten unterschiedlich geschehen. Dieses kann z.B. von Kettenförderern, Rollenbahnen, Hub- und Drehtischen, Vertikalförderern oder fahrerlosen Transportfahrzeugen übernommen werden. In dem vorhandenen System wird dieses mit der Hilfe von autonomen Transportfahrzeugen (ATF) bewerkstelligt. Diese sind dafür zuständig die Ladeeinheiten in eine für die Regalbediengeräte erreichbare Position zu befördern. Ein ATF ist ein Fahrzeug mit Ladefläche für ein oder mehrere Ladeeinheiten, welches auf Befehle des Lagerverwaltungssystems reagiert und selbstständig vorgegebene Positionen anfahren kann. Die Wegfindung wird dabei von dem ATF selbst vorgenommen und kann mit Hilfe unterschiedlicher Systeme umgesetzt werden. Dieses kann zum Beispiel mit Hilfe einfacher Schienenführungen oder Induktionsführungen geschehen, bei welchen ein Leitdraht im Fußboden verbaut ist [hrl01]. Das ATF selbst bekommt die Ladeeinheiten von einer Übergabestation (UEG) aufgeladen. Der Aufbau einer solchen Übergabestation kann, entsprechend der benötigten Funktionen, unterschiedlich ausfallen. Die Hauptaufgabe liegt darin das ATF zu be- und entladen und die Ladeeinheiten, im Normalfall, auf einem anderen Transportmedium abzusetzen. Gesteuert wird ein solches Hochregallagersystem durch ein Lagerverwaltungssystem (LVS), und bei komplexeren Systemen zusätzlich einem Materialflussrechner (MFR), wobei diese Aufgabe auch von dem LVS übernommen werden kann. Die Lagerung erfolgt normalerweise nach dem Prinzip der Chaotischen Lagerhaltung. Dieses bedeutet, dass sich das System selbstständig einen freien Lagerplatz sucht, an welchem die Ladeeinheit eingelagert wird. Das Lagerverwaltungssystem ist dafür zuständig diese Positionen zu speichern [lvs07]. 6 3 RCX und NXT Die Portierung des Hochregallagers von RCX zu NXT Bausteinen bringt eine Reihe von neuen Möglichkeiten mit sich, birgt aber auch eine Menge Probleme. In diesem Kapitel wird einen Vergleich der beiden Mindstorms Serien angestellt und darauf eingegangen, wie die, für die Automatisierung notwendigen, Sensoren und Aktoren benutzt werden. Im Jahr 1987 begann am MIT Media Laboratory1 die von LEGO gesponsorte Entwicklung eines programmierbaren Bausteines. Als Hauptentwickler entwarf Fred G. Martin2 zwischen 1987 und 1998 mehrere Versionen des programmierbaren Bausteines. Aus der endgültigen Version, einem roten Baustein mit 4 Eingängen und 6 Ausgängen, wurde das Robotics Invention System (RIS) entwickelt. Das Herz davon bildet der in Abbildung 3.1 dargestellte gelbe RCX Baustein, welcher allerdings nur 3 Eingänge (1-3) und 3 Ausgänge (A-C) besitzt. Abbildung 3.1: Der RCX Baustein 2004 begann LEGO, unter der Leitung von Søren Lund, mit der Entwicklung des Mindstorms NXT Kit. Dabei wurde darauf geachtet, möglichst geläufige Standards zu 1 2 http://www.media.mit.edu http://www.cs.uml.edu/∼fredm/ 7 KAPITEL 3. RCX UND NXT verwenden. So kam es, dass der NXT Intelligent Brick über Bluetooth3 kommunizieren kann und die Sensoranschlüsse den Inter-Integrated Circuit4 Bus benutzen. Als die Entwicklung begann hing Lund ein Schild, mit dem Satz We will do for robotics what iPod did for music.“ ” in dem Entwicklungslabor auf. Der entstandene NXT Intelligent Brick (siehe Abbildung 3.2) hat tatsächlich von der Farbe und Menüführung Ähnlichkeiten mit dem iPod [Bag07]. Abbildung 3.2: Der NXT Intelligent Brick Die Mindstorms Komponenten werden, dank ihrer Einfachheit, Robustheit und Flexibilität, in vielen Schulen eingesetzt, um den Schülern Technologie näher zu bringen. Die Produkte werden aber auch, wie bei diesem Hochregallager, von vielen Universitäten genutzt, um komplexere Projekte umzusetzen. 3 4 http://www.bluetooth.com http://www.i2c-bus.org 8 3.1. DIE PROGRAMMIERBAREN BAUSTEINE KAPITEL 3. RCX UND NXT 3.1 Die programmierbaren Bausteine Während die technische Ausstattung der programmierbaren RCX Bausteine noch relativ spartanisch war, hat sich dieses bei denen der NXT Generation deutlich geändert. Um die Leistungsmerkmale in Perspektive zu rücken, kann gesagt werden, dass die NXT Bausteine mehr als zehn mal so viel Speicher haben und dank der Co-Prozessoren ungefähr sechs mal so schnell sind wie die RCX Bausteine. Ein genauer Vergleich der technischen Daten ist in Tabelle 3.1 aufgeführt [Bag02, Bag07, rcx07]. Prozessor Flash Memory RAM Co-Prozessor Display USB Infrarot Bluetooth Sensoren Aktoren NXT 32-bit ARM7 48 MHz 256 KB 64 KB 8-bit AVR 100 x 64 Pixel LCD Matrix 12 MBit/s mit optionalem Zubehör Bluetooth Class II V2.0 compliant 4 3 RCX 8-bit 16 MHz 16 KB 32 KB 1-zeiliges Text Display ja 3 3 Tabelle 3.1: Leistungsmerkmale der programmierbaren Bausteine. Der NXT benutzt für die vier Eingänge das standarisierte, von Philips entwickelte Inter-Integrated Circuit (I2 C) Protokoll. Dieses ermöglicht es, dass, mit Hilfe eines Expanders, mehr als nur vier Sensoren benutzt werden können. Diese müssen dafür lediglich die Autodetecting Parallel Architecture (ADPA) benutzen. Besonders hervorzuheben ist der Klasse 2 Bluetooth Chip (IEEE 802.15.1) der NXT Bausteine. Dieser hat eine Reichweite von ungefähr 10m und ermöglicht es, dass zwei oder mehr Geräte mit Bluetooth Unterstützung auch ohne direkten Sichtkontakt, miteinander kommunizieren können. Dieses ist ein großer Vorteil gegenüber der Infrarotschnittstelle der RCX Bausteine. Trotzt einer, im Gegensatz zu USB und WiFi, relativ langsamen Geschwindigkeit ist Bluetooth für die meisten Anwendungsgebiete völlig ausreichend. Ein weiteres Highlight ist das, mit 26,0mm ∗ 40,6mm, deutlich größere LCD Display. Dieses ermöglicht es jetzt auch Menüs und sogar Icons darzustellen, während man vorher nur an die Darstellung von wenigen Zeichen gebunden war. Dieses hat es ermöglicht ein intuitives und einfach zu bedienendes Menüsystem für die Steuerung des Systems zu implementieren (siehe Kapitel 5.2). Da das Display eine Refresh Rate von fast 60 Hz hat, geht es so weit, dass sogar schon Spiele wie Tetris und Centipede auf den NXT Baustein portiert wurden [BDD+ 07]. 9 3.2. DIE AKTOREN KAPITEL 3. RCX UND NXT 3.2 Die Aktoren Die Motoren sind die einzigen in den Baukästen enthaltenen Aktoren. Für die neueren NXT Baukästen wird es jedoch in Zukunft noch andere Motoren geben, welche zur Zeit allerdings noch nicht verfügbar sind. Da es zwischen den beiden Generationen einige signifikante Unterschiede gibt, werden diese hier darstellt. 3.2.1 Der RCX Motor Der RCX Motor (siehe Abbildung 3.3) ist ein einfacher Motor, ohne besondere zusätzliche Funktionen. Zur Steuerung des Motors kann nur die Drehrichtung angegeben werden. Die Geschwindigkeit muss über eine entsprechende Umsetzung mit Hilfe von Zahnrädern geregelt werden. Die wirkliche Drehgeschwindigkeit hängt jedoch sehr stark von Typ und Ladezustand der benutzten Stromversorgung ab. Abbildung 3.3: Der RCX Motor Um genauere Informationen darüber zu erlangen, wie viele Umdrehungen der Motor durchgeführt hat, muss der, wie in Kapitel 3.3.5 beschriebene, Rotations Sensor zur Hilfe genommen werden. Der große Nachteil dabei ist jedoch, dass bei der Benutzung von drei Motoren, in vielen Fällen, auch drei Rotations Sensoren verwendet werden müssen. Dadurch werden somit auch gleich alle Sensoreingänge verwendet und es bleibt keine Möglichkeit noch weitere Sensoren an den selben RCX Baustein anzuschließen, wodurch die Funktionalität der entstandenen Modelle oft deutlich eingeschränkt wird. 10 3.2. DIE AKTOREN KAPITEL 3. RCX UND NXT 3.2.2 Der NXT Motor Der neue NXT Motor (siehe Abbildung 3.4) hebt sich durch seine neuen Funktionen deutlich von der alten Version ab. Die neue Form mag zwar etwas ungewöhnlich aussehen, aber der Motor bringt, trotz einer deutlichen Vergrößerung, einige entscheidende Vorteile mit sich. Abbildung 3.4: Der NXT Motor Der Motor hat einen Tachometer, welcher mit Hilfe eines optischen Encoders umgesetzt wurde, und ein Getriebe für mehrere Geschwindigkeiten direkt eingebaut. Dieses ermöglicht es zum Einen, den Motor viele Umdrehungen in unterschiedliche Richtungen durchführen zu lassen, und trotzdem zu der exakten Ausgangsposition zurückzukehren. Die jeweils gewünschte Position kann auf das Grad genau angesteuert werden. Zum Anderen ist es möglich eine bestimmte Drehgeschwindigkeit in Grad pro Sekunde vorzugeben, wodurch oft auf komplizierte Kostruktionen mit vielen Zahnrädern verzichtet werden kann. Wird beispielsweise eine Geschwindigkeit von 720 festgelegt, so entspricht dieses 2 Umdrehungen pro Sekunde. Die maximale Geschwindigkeit liegt bei ungefähr 900 (2, 5 Umdrehungen pro Sekunde), ist aber stark abhängig von dem Ladezustand der benutzten Batterien [Bag07]. Auf Basis der neuen Funktionen des Motors lassen sich beispielsweise Fahrzeuge mit Odometrie zur Positionsbestimmung umsetzten. Das autonome Transportfahrzeug macht von diesem Verfahren intensiven Gebrauch. In Kapitel 5.5.3 ist dieses Verfahren erläutert. Dadurch, dass es mit Hilfe der neuen Features möglich ist die wirkliche Drehgeschwindigkeit des Motors zu ermitteln, kann dieses in vielen Fällen als zusätzlicher Sensor benutzt werden. Weicht die wirkliche Drehgeschwindigkeit von der Gewünschten nach unten hin ab, kann davon ausgegangen werden, dass der Roboter gegen ein Hindernis gefahren ist. 11 3.3. DIE SENSOREN KAPITEL 3. RCX UND NXT 3.3 Die Sensoren Die Sensoren dienen dazu Informationen aus der Umwelt für die Roboter erfassbar zu machen. Die Sensoren haben innerhalb der Baureihen alle die selben Ausmaße, lediglich der Ultrasonic Senor (siehe Abschnitt 3.3.4) weicht davon ab. Dadurch, dass auch die Befestigungsmöglichkeiten aller Sensoren übereinstimmen, lassen sich die Sensoren in den Modellen auch leicht gegeneinander austauschen. So ist es z.B. manchmal hilfreich den Licht Sensor (siehe Abschnitt 3.3.2) gegen einen Farb Sensor von HiTechnic (siehe Abschnitt 3.3.6) auszutauschen, um Erweiterungen wie in Kapitel 6.3 beschrieben, zu ermöglichen. 3.3.1 Der Drucktaster Die Drucktaster (oder Touch Sensoren) sind in den Abbildungen 3.5 (RCX Drucktaster) und 3.6 (NXT Drucktaster) dargestellt. Sie sind die einfachsten, der in den Baukästen enthaltenen, Sensoren. Sie bieten lediglich eine Abfragemöglichkeit, ob der Taster aktiviert ist, oder nicht. Abbildung 3.5: Der RCX Drucktaster Außer einer Anpassung der Bauform auf das neue Format und der damit verbundenen Zunahme der Größe, sind diese beiden Sensoren weitgehend identisch. Der NXT Sensor bietet nur die zusätzliche Möglichkeit an dem orangenen Taster eine Achse zu befestigen, um andere Bauteile direkt mit dem Taster des Sensors zu verbinden. Die Drucktaster sind eine einfache Möglichkeit um zu erkennen, wann eine bestimmte Position eines beweglichen Bauteils erreicht wurde. Dieses wurde in dem Aufbau des neuen Hochregallagers zum Beispiel dazu benutzt, mit dem Regalbediengerät und der Übergabestation sicher eine Ausgangsposition für alle Achsen anfahren zu können. 12 3.3. DIE SENSOREN KAPITEL 3. RCX UND NXT Abbildung 3.6: Der NXT Drucktaster 3.3.2 Der Licht Sensor Die Licht Sensoren (siehe Abbildungen 3.7 und 3.8) messen die Intensität des Lichts, welches durch eine kleine Öffnung an der Vorderseite eintritt. Die Sensoren sind zusätzlich mit einer roten LED ausgestattet, welche dazu benutzt werden kann, den Bereich vor dem Sensor auszuleuchten. Es ist mit den Sensoren auch möglich Licht, in für Menschen unsichtbaren Bereichen, wie zum Beispiel Infrarot, wahrzunehmen. Auch diese Sensoren wurden, außer der Anpassung der Bauform, keinen weiteren funktionalen Änderungen unterzogen. Abbildung 3.7: Der RCX Licht Sensor Die Sensoren können für viele verschiedene Bereiche eingesetzt werden. Besonders geläufig sind dabei die Folgenden: • Wenn man den Sensor auf den Untergrund richtet, kann er dazu benutzt werden dunklen Linien zu folgen. Dieses wurde bei dem Aufbau des ATF (siehe Kapitel 4.4) umgesetzt. • Der Sensor kann dazu benutzt werden Abgründe zu erkennen. Lässt man einen Roboter auf einer Tischplatte umherfahren, kann ein auf den Boden gerichteter 13 3.3. DIE SENSOREN KAPITEL 3. RCX UND NXT Licht Sensor diesen vor dem Abstürzen bewahren. Wenn der Roboter dem Rand des Tisches zu nahe kommt und der Licht Sensor schon über die Kante schaut, so ändert sich die, von dem Sensor wahrgenommene Helligkeit merklich. • Hellen Lichtquellen, wie etwa der Bewegung einer Taschenlampe, kann gefolgt werden. • Es kann die hellste bzw. dunkelste Stelle im Raum gefunden werden. Hierdurch lassen sich einfache Verhaltensweisen von Insekten nachbilden. • Unterschiedliche Objekte können anhand ihrer Farbintensität (nicht Farbe) erkannt werden. Dieses ist möglich, da dunkle Objekte weniger Licht reflektieren als hellere. Abbildung 3.8: Der NXT Licht Sensor Je nach Anwendungsbereich kann der Licht Sensor in zwei verschiedenen Modi betrieben werden: • Aktiver Modus - Die LED ist eingeschaltet. Dieser Modus wird benutzt, um Linien zu folgen und Objekte zu unterscheiden. • Passiver Modus - Die LED ist ausgeschaltet. Dieser Modus kann benutzt werden, um Umgebungslicht zu erkennen, aber auch wenn eine externe Lichtquelle zum Einsatz kommt. Die Licht Sensoren können einen Wert zwischen 0 und 1023 zurückgeben, die Werte schwanken aber normalerweise zwischen 145 (Dunkelheit) und 890 (Sonnenlicht). Zum einfacheren Umgang gibt es noch eine Methode, die Werte in einem normalisierten Bereich von 0 bis 100 zurückliefert. Dafür ist es jedoch sinnvoll, den Sensor zuerst für den aktuellen Einsatz und die Umgebungsverhältnisse zu kalibrieren. Dieses geschieht durch einfache Aufrufe je einer Methode für den minimalen und maximalen Wert. Diese Technik wurde bei dem autonomen Transportfahrzeug umgesetzt, so dass dieses, unabhängig vom Umgebungslicht, sicher den Führungslinien folgen kann. 14 3.3. DIE SENSOREN KAPITEL 3. RCX UND NXT 3.3.3 Der Sound Sensor Der Sound Sensor (siehe Abbildung 3.9) ist einer der neuen Sensoren in den NXT Mindstorms Baukästen. Obwohl dieser Sensor aussieht wie ein Mikrofon, wird nur die Lautstärke in Dezibel (dB) gemessen, deshalb ist es nicht möglich damit Tonaufnahmen zu machen. Der Sensor kann in zwei verschiedenen Modi betrieben werden. Im Standardmodus wird die Lautstärke in dB zurückgegeben. Im Zweiten wird sie als A-Bewerteter Schalldruckpegel (dBA) zurückgegeben, welcher den Frequenzgang des menschlichen Gehörs berücksichtigt. Abbildung 3.9: Der NXT Sound Sensor Der Sensor kann beispielsweise dazu benutzt werden Geräuschquellen zu finden oder auf Klatschen zu reagieren. 3.3.4 Der Ultrasonic Sensor Der Ultrasonic Sensor (siehe Abbildung 3.10) ist ein weiterer neuer Sensor in der NXT Mindstorm Serie, der viele interessante Anwendungen ermöglicht. Dieser Sensor wird dazu benutzt Entfernungen zu messen. Dazu wird ein, für Menschen nicht wahrnehmbarer Ton ausgesandt und dann gemessen, wie lange es dauert bis dessen Reflexion wieder empfangen wird. Da die Ausbreitungsgeschwindigkeit bekannt ist, kann daraus die zurückgelegte Distanz berechnet werden. Der Sensor ist dazu in der Lage Entfernungen bis zu 255 Zentimeter zu messen, die Werte sind jedoch in dieser Entfernung relativ ungenau. Die besten Ergebnisse werden zwischen 6cm und 180cm erlangt. Die Entfernung wird in einem kegelförmigen Bereich gemessen. Der Kegel öffnet sich in einem Winkel von ungefähr 30◦ , somit hat er bei einer Entfernung von 180cm einen Durchmesser von ca. 90cm. 15 3.3. DIE SENSOREN KAPITEL 3. RCX UND NXT Abbildung 3.10: Der NXT Abstands Sensor Eingesetzt wird dieser Sensor an der Front des Transportfahrzeuges, um den Bereich vor diesem auf Hindernisse zu überprüfen. Wird ein Hindernis in einem zu geringen Abstand zu einem ATF wahrgenommen, hat dieses so die Möglichkeit vor diesem zu stoppen. 3.3.5 Der Rotations Sensor Der Rotations Sensor (siehe Abbildung 3.11) ist einer der Sensoren, die in den NXT Baukästen nicht mehr vorhanden sind und auch nicht mehr benötigt werden, da die Funktionalität direkt in den neuen NXT Motoren integriert ist (siehe 3.2.2). Abbildung 3.11: Der RCX Rotations Sensor Eingesetzt wurde dieser Sensor, um Umdrehungen, der an diesen angeschlossenen Achsen, zu zählen. Die Auslösung beträgt 16 Schritte pro Umdrehung. Somit ist die Genauigkeit dieses Sensors deutlich geringer, als die des direkt in den NXT Motor eingebauten[Hur06]. 16 3.3. DIE SENSOREN KAPITEL 3. RCX UND NXT 3.3.6 Produkte anderer Hersteller HiTechnic HiTechnic5 war die erste Firma, die mit LEGO einen Vertrag zur Vermarktung weiterer Sensoren hatte. LEGO beliefert HiTechnic mit den Plastik Gehäusen, damit die Sensoren aussehen wie die eigenen, und verkauft diese auch über die LEGO Webseite. Durch das selbe Aussehen sind diese die beliebtesten Sensoren von externen Herstellern. Um Verwechslungen mit den Original Sensoren zu vermeiden, haben diese ein leicht anderes Farbschema und sind an der Unterseite beschriftet. Abbildung 3.12: Der HiTechnic Kompass Sensor Zur Zeit umfasst die Palette der angebotenen Produkte: • Kompass Sensor (siehe Abbildung 3.12) • Color Sensor • Tilt Sensor • RCX Adapter Kabel • IR Link mit RCX • Infrarot Sucher • Port Expander • Motor Multiplexer • NXT Prototype Board Mindsensors Mindsensors6 bietet eine breite Palette an Sensoren an. Diese sind allerdings nicht in den üblichen Plastikformen, werden dafür aber mit extra Kabeln geliefert. 5 6 http://www.hitechnic.com http://www.mindsensors.com 17 3.3. DIE SENSOREN KAPITEL 3. RCX UND NXT Mindsensors liefert zur Zeit die folgenden Produkte: • RCX zu NXT Kommunikations Adapter • Neigungs Sensor • RCX Motor Multiplexer • Kompass Sensor • Sony PS2 Controller Interface • Pneumatics Pressure Sensor • Infrarot Abstands Sensor • RCX zu NXT Anschluss Adapter • NXT Motor Multiplexer Vernier Vernier7 stellt Sensoren nicht speziell für Mindstorms her, bietet aber einen Adapter, um die Sensoren mit den NXT Bausteinen zu verbinden. Vernier vertreibt einige, für die Benutzung mit LEGO Mindstorms Produkten einzigartige, dafür aber oft recht teuere Sensoren. Es werden weit über 40 verschiedene Sensoren angeboten, darunter: • pH Probe • Low-g Accelerometer • Conductivity Probe • Dissolved Oxygen Sensor • UV Sensor • Temperature Probe • Magnetic Field Sensor 7 http://www.vernier.com/nxt/ 18 3.4. PROGRAMMIERUNG KAPITEL 3. RCX UND NXT 3.4 Programmierung Zur Programmierung der LEGO Mindstorms Module gibt es eine Reihe verschiedener Möglichkeiten. Die sicherlich Einfachste ist die Benutzung der mitgelieferten grafischen Entwicklungsumgebung NXT-G (siehe 3.4.1). Für fortgeschrittene Projekte ist es jedoch oftmals sinnvoll auf eine der vielen anderen Möglichkeiten, wie z.B leJOS (siehe 3.4.2) oder RobotC8 zurückzugreifen. 3.4.1 NXT-G Die texanische Firma National Instruments hat in Zusammenarbeit mit LEGO eine Entwicklungsumgebung für die LEGO Mindstorms NXT geschaffen, die auf der grafischen Entwicklungsplatform LabVIEW9 (Laboratory Virtual Instrumentation Engineering Workbench) basiert. Abbildung 3.13: Die NXT-G Entwicklungsumgebung 8 9 http://www.robotc.net http://www.ni.com/labview/ 19 3.4. PROGRAMMIERUNG KAPITEL 3. RCX UND NXT Die NXT-G genannte Software wird in zwei verschiedenen Versionen ausgeliefert. Es gibt die normale Verkaufsversion und die in Abbildung 3.13 dargestellte Educational Version, welche speziell für den Gebrauch in Schulen angepasst ist. Die von LabVIEW benutzte grafische Programmiersprache wird ‘G’ genannt und ermöglicht es, Programme in Form von Datenflussgraphen darzustellen. Die Programmierung geschieht über das Ziehen von vorgefertigten Programmblöcken in den Programmierbereich. Jeder dieser Blöcke ist prinzipiell eine Funktion, für die der Benutzer mehrere Parameter mit Hilfe von Schiebereglern und Eingabefeldern festlegen kann. Außerdem können so selbst komplexere Blöcke mit Hilfe der Software erstellt werden, wodurch es möglich ist viel Programmcode in einem kleinen grafischen Fenster darzustellen. Da die Software durchgängig gewartet wird, können neue Blöcke aus dem Internet heruntergeladen und importiert werden, wenn neue Sensoren und Aktoren für die LEGO Mindstorms zur Verfügung stehen. Die grafische Programmierung ist relativ einfach zu verstehen und somit gut geeignet für Personen mit wenig Programmiererfahrung. Wenn man jedoch Programmiersprachen wie Java gewöhnt ist, sind einige der Paradigmen der Programmierumgebung schwer zu verstehen. Außerdem ist es problematisch mit Hilfe der grafischen Oberfläche Programme zu erstellen, die eine gewisse Größe überschreiten. 3.4.2 leJOS leJOS ermöglicht es, Programme für die RCX und NXT Bausteine in Java zu entwickeln. Dafür stehen unterschiedliche verschiedene Versionen der zu leJOS gehörenden Java Virtual Machine (JVM) und Bibliothek zur Verfügung. Zum Einen gibt es das, mittlerweile sehr ausgereifte, leJOS RXJ, welches aktuell in der Version 3.0 zur Verfügung steht und für die RCX Module bestimmt ist. Zum Anderen gibt es leJOS NXJ für die NXT Module, welches relativ neu ist und noch nicht alle Features der programmierbaren NXT Bausteine unterstützt. Dieses steht im Moment erst in der frühen Beta Version 0.4 zur Verfügung. Die Java Virtual Machine Die leJOS Java Virtual Machine basiert auf der in C geschriebenen TinyVM10 , bei der darauf geachtet wurde, die Codebasis möglichst plattformunabhängig zu halten. Dieses ermöglicht es der VM auf den RCX und NXT Bausteinen, so wie dem Nintendo GameBoy Advance11 zu laufen. 10 11 http://tinyvm.sourceforge.net http://www.gameboy.com 20 3.4. PROGRAMMIERUNG KAPITEL 3. RCX UND NXT Die leJOS NXJ Plattform ist essenziell eine Erweiterung derer für RCX. leJOS NXJ wird als eigenständiges Projekt weiterentwickelt, um nicht auf Kompatibilität für die RCX Bausteine achten zu müssen. Auf den RCX Bausteinen verbraucht die VM alleine ungefähr 16KB des Speichers, was nur noch 16KB für eigenen Programmcode übrig lässt. Dank des großzügigeren Speicherausbaus bleiben auf den NXT Bausteinen noch ungefähr 229KB verfügbar, obwohl die VM dort ganze 27KB Speicherplatz benötigt. Die leJOS VM unterstützt viele Features einer gewöhnlichen Java Virtual Machine, wie z.B. der von Sun12 . Darin enthalten sind: • Preemptive Threads - Die leJOS VM ermöglicht die Benutzung von Threads mit Unterstützung für Synchronisierung und Interrupts. Der dazugehörige Scheduler arbeitet auf eine denkbar einfache Weise und lässt jeden Thread 128 Instruktionen ausführen, bevor zum nächsten Thread gewechselt wird. Theoretisch können bis zu 255 Threads gleichzeitig benutzt werden, allerdings ist dafür der verfügbare Speicher nicht ausreichend groß genug. • Arrays - Es werden sogar multdimensionale Arrays. Macht man jedoch einen zu umfangreichen Gebrauch von multidimensionallen Arrays, dann verbrauchen diese zu viel Speicher und die VM stürzt ab. • Rekursion - Wie die meisten Programmiersprachen unterstützt auch Java Rekursionen. Die leJOS VM kann zur Zeit allerdings nur Rekursionen bis zu einer Tiefe von 10 ausführen. • Exceptions - leJOS unterstützt, wie jede andere JVM auch, den Gebrauch von Exceptions. • Event Model - Das Event Model von Java wird auch von leJOS unterstützt. Dieses ermöglicht es auf, von Sensoren oder den Knöpfen an den NXT Bausteinen, ausgelöste Events zu reagieren. • float, long, String - leJOS unterstützt viele Java Typen. Um Speicher zu sparen wird jedoch darauf verzichtet, 64bit Typen wie double und long vollständig zu unterstützten. Die beiden Typen können benutzt werden, die VM verwaltet diese aber intern als 32bit floats. Allerdings hat die leJOS VM einige wichtige Einschränkungen, die umfangreichere Probleme noch deutlich verkomplizieren oder den Code einfach nur schwerer lesbar machen: 12 http://java.sun.com 21 3.4. PROGRAMMIERUNG KAPITEL 3. RCX UND NXT • Garbage Collector - Eine JVM entfernt normalerweise Objekte aus dem Speicher, die nicht mehr benötigt werden. Dieses geschieht durch einen automatischen Garbage Collector. In der aktuellen VM von leJOS ist dieses noch nicht der Fall und führt, besonders bei längerer Programmausführung, zu Abstürzen. Dieser Punkt hat eine hohe Priorität auf der Liste der leJOS Entwickler und es kann davon ausgegangen werden, dass diese Funktion in einer der nächsten Versionen enthalten sein wird. • switch-Statements - die leJOS VM unterstützt keine switch Statements. Diese Unzulänglichkeit kann durch den Gebrauch von if und else if umgangen werden, führt aber zu einer deutlich schlechteren Lesbarkeit des Programmcodes. • Klassen Größe - Java Klassen können zur Zeit eine maximale Größe von 64Kb haben. Diese Grenze ist sehr schnell erreicht und nicht immer elegant zu umgehen und hat vor allem bei der Entwicklung eines Menüsystems für die NXT Bausteine Probleme verursacht. Trifft man auf eine der angedeuteten Einschränkungen, wird man davon meist schon, bei dem vor der Übertragung des Programmcodes auf den NXT Baustein notwendigen, linking Vorgang mit der folgenden Meldung darauf hingewiesen: leJOS NXJ> Linking... The following features/conditions are currently unsupported: - Switch statements. - Integer increment constant too large. (If > 255, declare it). - Arithmetic or logical operations on variables of type long. - Remainder operations on floats or doubles. - Too many constants or locals ( > 255). - Method code too long ( > 64 Kb!). Die Java Bibliothek Die, in den beiden Versionen des leJOS Paketes enthaltenen Java Bibliotheken sind, zumindest größtenteils, gut dokumentiert und bieten einen großen Umfang an Funktionen an. Die Robotik APIs der RCX und NXJ Versionen sind jedoch vom Aufbau her unterschiedlich und nicht miteinander kompatibel. Dieses kommt zum Einen daher, dass die neuen Sensoren und Aktoren teilweise einen andern Funktionsumfang haben, aber auch daher, dass die Kommunikationsmöglichkeiten grundlegend verschieden sind. Da es möglich ist, mit der Hilfe von Adaptern, die RCX Motoren und Sensoren an den NXT Bausteinen zu verwenden, stehen für diese Elemente spezielle RCX Klassen zur Verfügung. 22 3.4. PROGRAMMIERUNG KAPITEL 3. RCX UND NXT An sich ist die Robotik API von leJOS NXJ relativ komplett und ermöglicht es, die meisten Funktionen der Sensoren in vollem Umfang zu nutzen. Viele Probleme gibt es jedoch noch in dem Bereich der Kommunikation, insbesondere mit Bluetooth. Einige dieser Probleme stammen daher, dass der in den NXT verbaute BC4 Chip zwei Modi hat, zwischen denen umgeschaltet werden muss: • Command Mode - In diesem Modus können neue Verbindungen hergestellt werden und nach anderen Bluetooth Geräten gesucht werden. • Data Mode - Dieser Modus ermöglicht das Senden und Empfangen von Daten an bereits verbundene Bluetooth Geräte. Die Umschaltung zwischen den beiden Modi funktioniert in der Version 0.4 noch nicht sicher und führt zu vielen Abstürzen des NXT Bausteines. Daher ist es mit dieser Version auch nur möglich eine Bluetooth Verbindung zu einem anderen Gerät aufzubauen. In aktuellen Versionen aus dem Subversion Repository ist es möglich, Verbindungen zu mehreren Geräten herzustellen. Da aber die Umschaltung zwischen den beiden Modi auch dort noch nicht richtig funktioniert, ist es danach nicht immer möglich zu allen verbundenen Geräten Daten zu senden. In der kommenden Version 0.5 von leJOS NXJ soll dieses Problem aber voraussichtlich behoben sein. Die Packages lejos.navigation und lejos.subsumption bieten einige Klassen an, die häufig benutzte Konzepte der Robotik zusammenfassen. So ist es möglich viele Modelle ohne großen Programmieraufwand zu sinnvollen Aktionen zu überreden. Leider sind auch hier noch einige Bugs enthalten, welche besonders bei dem ATF aufgefallen sind und umgangen werden mussten. Zusätzlich sind einige Komponenten des standardisierten javax.microedition Packages in leJOS enthalten. In diesem Packet ist vor allem die Ansteuerung des LCD-Displays und der vier Buttons der NXT Bausteine umgesetzt. 23 4 Konstruktion Die Portierung des Gesamtsystems besteht im wesentlichen aus zwei Blöcken. Im Ersten muss die Konstruktion der Komponenten des Hochregallagers auf die neue Bauweise übertragen werden. Der Zweite besteht daraus, die Steuerung entsprechend der neuen Gegebenheiten anzupassen. Begonnen wird damit die bestehenden Komponenten des alten Hochregallagers zu erläutern und darauf einzugehen, welche Änderungen für den Neuaufbau umgesetzt werden. Daraufhin wird die Konstruktion und der Einsatz der dabei benutzten Motoren und Sensoren im Einzelnen geschildert. Durch die nötige Änderung der Konstruktionsweise der LEGO Modelle auf die neue studd-less Bauweise der Mindstorms NXT, müssen alle Komponenten des Systems von Grund auf neu aufgebaut werden. Dieses ist notwendig, damit die neuen NXT Motoren, Sensoren und programmierbaren Bausteine benutzt werden können. Es wird dabei versucht die in Kapitel 3 beschrieben Sensoren bestmöglich einzusetzen, um von der neuen Funktionalität Gebrauch machen zu können und Probleme zu vermeiden, die der bestehende Aufbau in sich birgt. Der Aufbau in der studd-less Bauweise ermöglicht es einige Komponenten der Modelle sehr kompakt, aber trotzdem funktional und stabil zu konstruieren [Mar95]. Ein besonders gutes Beispiel dafür ist die in Abschnitt 4.2.2 beschriebene Hubeinheit. Das bestehende Hochregallagersystem (siehe Abbildung 4.1) ist aus mehreren Transportfahrzeugen, Regalbediengeräten und Übergabestationen zusammengesetzt. Pro ATF und Übergabestation wurde je ein programmierbarer RCX Baustein und je Hochregal (Regalbediengerät und die dazugehörige Übergabestation) zwei programmierbare RCX Bausteine verwendet. Dieses stammt daher, dass das Regalbediengerät für jede der drei Bewegungsrichtungen einen Motor benötigt und die Übergabestation zusätzlich einen. Somit wurden zwei RCX Programmierbausteine benötigt, da jeder dieser Bausteine nur drei Motoren ansteuern kann. Da die NXT Bausteine auch nur Anschlussmöglichkeiten für drei Motoren haben, wurde versucht die Paletten direkt mit Hilfe des Regalbediengerätes von der Ladefläche zu entnehmen. Auf diese Weise kann auf einen NXT Baustein und den damit verbundenen zusätzlichen Kommunikationsaufwand verzichtet werden. 24 KAPITEL 4. KONSTRUKTION Abbildung 4.1: Das RCX Hochregallager Durch diese Schritte war es möglich bei den Transportfahrzeugen auch auf einen der Motoren zu verzichten, da die Ladefläche so ohne bewegliche Teile umgesetzt werden konnte und keinen Motor benötigt, der das Förderband der Ladefläche antreibt. Zudem wird, durch den Verzicht auf einen weiteren Motor, die Bauweise des ATF relativ kompakt gehalten. Die Übergabestation wurde komplett überarbeitet und dem Regalbediengerät vom Aufbau her angeglichen. Außerdem wurden alle Komponenten noch mit zusätzlichen Sensoren, vor allem Drucktastern, ausgestattet. Die genauen Hintergründe dafür werden in den jeweiligen Abschnitten der Komponenten verdeutlicht. Auf der beigelegten CD sind alle Konstruktionsanleitungen und Stücklisten, in detaillierter Form, als pdf und ldraw -Datei abgelegt. Kapitel B.1 beinhaltet eine Liste der benutzen Anschlussbelegungen der einzelnen Modelle. Die Konstruktionsanleitungen wurden mit Hilfe der LDraw1 Biblothek und den darauf basierenden CAD Programmen Bricksmith2 und MLCad3 erstellt. 1 http://www.ldraw.org http://bricksmith.sourceforge.net 3 http://www.lm-software.com/mlcad/ 2 25 4.1. DAS HOCHREGAL KAPITEL 4. KONSTRUKTION 4.1 Das Hochregal Das Hochregal (siehe Abbildung 4.2) ist der eigentliche Lagerort für die Paletten und stellt eine einfache Konstruktion ohne bewegliche Teile dar. In der aktuellen Ausbaustufe stehen insgesamt 16 Lagerplätze für Paletten in 4 Zeilen und 4 Spalten zur Verfügung. Dieses ist die einzige Komponente, deren Aufbau größtenteils von dem bestehenden Aufbau übernommen werden konnte. Das Regalgerüst entspricht dem des alten Hochregallagers (vgl. Abbildung 4.1). Es wurden nur die Führungsschienen für das neue Regalbediengerät angepasst. Die Paletten wurden unverändert von dem bestehenden Modell übernommen. Abbildung 4.2: Das Hochregal Das Regal ist durch den simplen, aber trotzdem robusten, Aufbau sehr einfach in der Größe veränderbar. Wichtig ist, dass alle Lagerplätze eine einheitliche Größe und Abstand zu einander haben. Bei einer Änderung der Anzahl der Ladeeinheiten muss der Steuerung somit lediglich mitgeteilt werden, wie viele Zeilen und Spalten zur Lagerung von Paletten zur Verfügung stehen. 26 4.2. DAS REGALBEDIENGERÄT KAPITEL 4. KONSTRUKTION 4.2 Das Regalbediengerät Das alte Regalbediengerät benutzt drei Motoren, einen für jede der drei nötigen Bewegungsrichtungen. Damit der Steuerung die aktuelle Position bekannt ist, sind zusätzlich drei Rotationssensoren verbaut und somit alle Anschlüsse des RCX Bausteins belegt. Das RCX RBG arbeitet mit einer Übergabestation zusammen, welche als Ein- und Auslagerungsbereich dient. Die UEG benötigt zusätzlich noch einen Motor und einen RCX Baustein. Wie schon früher erwähnt, soll das neue RBG in der Lage sein die Paletten direkt von der Ladefläche des ATF, ohne den Umweg über eine UEG, entnehmen zu können. Dieses ist möglich, da das neue RBG deutlich stabiler konstruiert ist und so eine längere Lastaufnahmeeinheit benutzen kann. Als weitere Verbesserung wurde das Regalbediengerät für alle drei Bewegungsrichtungen mit einem Drucktaster (siehe Kapitel 3.3.1) ausgestattet, um zu ermöglichen in eine, zur Initialisierung dienende, Grundposition zu fahren. Von dieser Position aus sind die Wege zu allen anderen anfahrbaren Positionen bekannt, bzw. leicht errechenbar. Der Einsatz der Taster ist möglich geworden, da die NXT Motoren über den eingebauten Tacho verfügen und somit nicht mehr, auf den zusätzlichen Rotations Sensor zurückgreifen müssen. Hierdurch sind die benötigten Sensoranschlüsse an den NXT Bausteinen frei geworden. Das Regalbediengerät (siehe Abbildung B.2) besitzt die komplizierteste mechanische Konstruktion aller Komponenten. Es besteht im Wesentlichen aus drei zusammenarbeitenden Teilen, welche jeweils für eine der drei Bewegungsrichtungen zuständig sind. 4.2.1 Die Fahreinheit Die Fahreinheit (siehe Abbildung 4.3) ist dafür zuständig das Regalbediengerät in die gewünschte Position in der x -Richtung zu bewegen. Dadurch lässt sich eine Position für das ATF und jede Spalte des Regals anfahren. Auf der Bodenplatte des Hochregals (siehe Abbildung 4.2) sind Führungsschienen montiert, welche für einen sicheren Halt der Fahreinheit garantieren. Zur Fortbewegung benutzt die Fahreinheit vier 40-zähnige Zahnräder, welche alle über einen gemeinsamen Motor angetrieben werden. Die Zahnräder sind an einer Bodenplatte befestigt, auf welcher der Mast aufgesetzt ist. Der Mast besteht aus vier Säulen, wobei, an den beiden zum Regal zeigenden Säulen, auf der Innenseite verzahne Bausteine angebracht sind. An der Fahreinheit ist ein Drucktaster befestigt, welcher erkennt, wann die Ausgangsposition erreicht ist. Die Ausgangsposition ist zugleich die Position, von der aus das Transportfahrzeug be- und entladen wird. 27 4.2. DAS REGALBEDIENGERÄT KAPITEL 4. KONSTRUKTION Abbildung 4.3: Die Fahreinheit 4.2.2 Die Hubeinheit Die Hubeinheit (siehe Abbildung 4.4) ist dafür zuständig die Lastaufnahmeeinheit auf die gewünschte Höhe (y-Richtung) zu bewegen. Üblicherweise wird die Bewegung in y-Richtung durch einen auf Bodenebene montierten Motor vollzogen, der ein Stahlseil auf einer Winde auf oder ab wickelt. An dem Stahlseil ist wiederum die Hubeinheit befestigt. Etwas ähnliches wurde versucht in dem alten Model umzusetzen. Die Positionierung war dadurch jedoch auf Grund der Bauweise relativ ungenau und die Lastaufnahmeeinheit sehr wackelig in der Positionierung. Um dieses Problem zu umgehen, wurden Bausteine mit Zähnen vertikal an den Masten des Regalbediengerätes angebracht. Entlang dieser können sich dann Zahnräder auf beiden Seiten auf und ab arbeiten. Durch diese Methode ließ sich ein kompakter, aber trotzdem mechanisch stabiler Aufbau realisieren. Entlang des Mastes wird die Hubeinheit sicher geführt, da der Mast vollständig umschlossen wird. Zusätzlich verfügt die Hubeinheit über zwei Drucktaster, so wie eine Führung und den Antrieb für die Lastaufnahmeeinheit. Der an der Unterseite der Hubeinheit befestigte 28 4.2. DAS REGALBEDIENGERÄT KAPITEL 4. KONSTRUKTION Abbildung 4.4: Die Hubeinheit Drucktaster ist dafür zuständig, zu erkennen, wann die Lastaufnahmeeinheit vollständig eingefahren ist. Der an dem, für den Hub zuständigen, Motor befestigte Drucktaster erkennt, wann die Hubeinheit ganz nach unten gefahren ist. 4.2.3 Die Lastaufnahmeeinheit Die Lastaufnahmeeinheit (siehe Abbildung B.3) ist für die Bewegung in die z -Richtung zuständig. Der Aufbau erinnert sehr an den der Gabel eines Gabelstaplers und auch die Funktion entspricht diesem. Primär ist die Lastaufnahmeeinheit so weit wie möglich eingefahren. Denn nur wenn die Lastaufnahmeeinheit sich in dieser Position befindet, kann sich das Regal ungehindert auch in x und/oder y-Richtung bewegen. Zusätzlich gibt es eine Position zum bedienen des Hochregals und eine weitere zum bedienen des Autonomen Transportfahrzeugs. Ähnlich der Bauweise der Hubeinheit wird die Kraft des an der Hubeinheit angebrachten Motors der Lastaufnahmeeinheit mittels eines Zahnrades auf die Bausteine mit Zähnen übertragen. Der Unterschied besteht jedoch hier darin, dass in diesem Fall das Zahnrad fest positioniert ist und dadurch die Lastaufnahmeeinheit, an der die bezahnten Bausteine befestigt sind, vor und zurück schiebt. Der Aufbau der Lastaufnahmeeinheit wird so durchgeführt, dass diese genau in die dafür vorgesehene Führung der Hubeinheit passt, sich aber trotzdem leicht bewegen lässt. 29 4.3. DIE ÜBERGABESTATION KAPITEL 4. KONSTRUKTION 4.3 Die Übergabestation Der Aufbau der neuen Übergabestation (siehe Abbildung 4.5) unterscheidet sich signifikant von dem in dem bestehenden RCX Model. Zuvor wurde die Übergabe der Paletten zwischen der Übergabestation und dem Transportfahrzeug mit Hilfe einer Art Förderband vollzogen. Zwischen der Übergabestation und dem ATF war jedoch immer eine Lücke, über die die Paletten befördert werden mussten, wodurch die Paletten unsicheren Halt hatten, bzw. sich leicht verkannten konnten. Zusätzlich wurde auch auf dem ATF ein Förderband benötigt, um das Be- und Entladen zu bewerkstelligen. Aus diesen Gründen wurde die Bauweise des Regalbediengerätes, in einer etwas abgeänderten Form, für die Übergabestationen verwendet. Die Übergabestation benötigt nur die Bewegungsfreiheit in y und z -Richtung, womit auf eine Fahreinheit verzichtet werden kann. Somit konnten die in Kapitel 4.2.2 und 4.2.3 beschriebenen Hub- und Lastaufnahmeeinheiten des Regalbediengerätes übernommen werden. Der Mast der Fahreinheit wurde direkt auf einer Bodenplatte stationär befestigt. Abbildung 4.5: Die Übergabestation 30 4.4. DAS AUTONOME TRANSPORTFAHRZEUG KAPITEL 4. KONSTRUKTION 4.4 Das Autonome Transportfahrzeug Die alten RCX Transportfahrzeuge benutzen zur Steuerung einen RCX Baustein, drei RCX Motoren, so wie zwei RCX Lichtsensoren. Von zwei der Motoren wird der Antrieb bewerkstelligt, der Dritte ist für die Steuerung der Ladefläche zuständig. Von den Lichtsensoren ist einer für die Erkennung der Fahrbahnline, der Andere zur Erkennung von zusätzlichen Markern auf der Fahrbahn im Einsatz. Abbildung 4.6: Das Autonome Transportfahrzeug Die alten ATFs sind aufgrund der kleinen Bauteile sehr kompakt und ließen sich daher leider nicht in dieser Form mit Hilfe der Mindstorms NXT Bausteine umsetzten. Wie bei dem vorherigen Modell wurde auf eine dreirädrige Bauweise mit automatisch einlenkendem Hinterrad umgesetzt. Dieses hat den Vorteil, dass wenig Reibung bei der Kurvenfahrt auftritt und dadurch die Odometrie bei der Positionsbestimmung zu Hilfe genommen werden kann. Da der Antrieb durch die, unabhängig von einander steuerbaren, Vorderräder geschieht, ist es mit dem ATF (siehe Abbildung 4.6) sogar möglich auf 31 4.4. DAS AUTONOME TRANSPORTFAHRZEUG KAPITEL 4. KONSTRUKTION der Stellte zu wenden. Dank der Bauweise der Übergabestationen und Regalbediengeräte konnte auf den dritten Motor zum übergeben der Paletten verzichtet werden. Dieses hat gerade bei den deutlich größer gewordenen Motoren Vorteile und spart eine Menge an der Größe des Transportfahrzeuges ein. An der Front besitzt das ATF, genau wie das alte Modell, zwei Lichtsensoren. Zusätzlich wurde zwischen den beiden Lichtsensoren ein Ultraschallsensor zur Abstandsmessung verbaut. Dieser wird dazu benutzt um Hindernisse zu erkennen und dadurch Unfälle zu vermeiden. Für das alte Modell war vorgesehen, dass ein ATF, bevor ein bestimmter Streckenabschnitt befahren werden konnte, nach einer Genehmigung von der Steuerung dafür fragt. Der Code bestand jedoch nur aus Platzhaltern und wurde nie implementiert. Um den Nachrichtenverkehr möglichst gering und die Implementierung simpel zu halten, wurde auf derartige Abfragen komplett verzichtet und dieses Problem durch den neuartigen Sensor gelöst. 32 4.5. DIE FAHRBAHN KAPITEL 4. KONSTRUKTION 4.5 Die Fahrbahn An der Fahrbahn (siehe Abbildung 4.8) wurde vom Layout her keine wesentlichen Veränderungen vorgenommen. Die Strecke besteht weiterhin aus einem Oval mit mehreren Abzweigungen zu Parkplätzen, Übergabestationen und Regalbediengeräten. Die die Orientierung für das ATF benötigten Führungslinien bestehen auch weiterhin aus einem Farbverlauf von hellgrau bis schwarz und es gibt auch weiterhin schwarze Marker, die dem ATF genaue Informationen über den aktuellen Standpunkt geben. Abbildung 4.7: Der Initialisierungsbereich für das ATF Neu hinzugekommen ist ein Initialisierungsbereich (siehe Abbildung 4.7), an der unteren rechten Ecke der Fahrbahn. Dieser wird dazu benutzt die Lichtsensoren des ATF auf die benutzen Markierungsfarben und aktuellen Umgebungsbeleuchtungen zu justieren. So wird eine genauere Positionierung und sicherere Linienerkennung gewährleistet. Der Initialisierungsbereich besteht prinzipiell aus drei großen Rechtecken in verschiedenen Farben. Zur Initialiserung wird ein ATF mit den beiden Licht Sensoren mittig zu dem Initialisierungsbereich, mit den Licht Sensoren auf der schwarzen Umrandungslinie platziert. Das ATF fährt dann selbstständig über den weißen Bereich speichert den dort ermittelten Wert dann als Maximalwert (100%), da der weiße Untergrund am meisten Licht reflektiert. Daraufhin fährt das ATF mit den Sensoren in den schwarzen Bereich und benutzt den dort ermittelten Wert wird als Minimalwert (0%) kalibriert. Als letztes wird der Wert des grauen Rechteckes eingelesen. Dieses ist der Wert entspricht dem der Führungslinie, der gefolgt werden soll. Dieser Wert liegt bei etwa 60% − 65%. Eine weitere Änderung der Fahrbahn ist, dass über die gesamte Karte ein Koordinaten System gelegt wurde. Je nach Größe des Ausdruckes, im Idealfall 100cm ∗ 200cm, 33 4.5. DIE FAHRBAHN KAPITEL 4. KONSTRUKTION entspricht eine Einheit des Koordinatensystems 1cm. Alle 10cm ist eine dünnes graues Raster eingezeichnet und alle 50cm ein Raster aus dicken schwarzen Linien, welche als Marker genutzt werden. Die Richtung der Achsen des Koordinatensystems und die von dem ATF genutzten Winkel für die Fahrtrichtungen sind in einer Legende in der unteren linken Ecke der Fahrbahn eingezeichnet. Das schwarze Raster wird von dem ATF, zusätzlich zu der Odometrie, zur genauen Positionsbestimmung genutzt. Durch diese Kombination ist es möglich, ein ATF direkt an eine beliebige Position durch die Angabe von x und y-Koordinate und einen Winkel zu senden. 0◦ x −90◦ 90◦ y 180◦ Abbildung 4.8: Die Fahrbahn Zur Erstellung der alten Fahrbahnen wurde der Roads Untergrundeditor4 von Jörg Schmalzbauer und Olaf Scheel entwickelt. Versuche, diesen für die Erstellung der neuen Fahrbahn zu benutzen, schlugen leider fehl, da der Editor leider nicht stabil gearbeitet hat und reproduzierbar abgestürzt ist. Aus diesem Grund wurde die neue Fahrbahn mit Hilfe von LATEX5 und dem Packet PSTricks6 erstellt. Dieses funktioniert problemlos und man erhält den Untergrund als verlustfrei skalierbare pdf -Datei, die deutlich weniger Speicher verbraucht als etwa eine png-Datei mit den selben Ausmaßen. 4 http://ddi.uni-paderborn.de/software/roads-untergrundeditor.html http://www.latex-project.org 6 http://tug.org/PSTricks/ 5 34 5 Implementierung Eine der Hauptaufgaben dieser Arbeit ist es, die Steuerung des Hochregallagersystems von leJOS RCX nach leJOS NXJ zu portieren. Dieser Arbeitsschritt wird in diesem Kapitel ausführlich beschrieben. Dadurch, dass die Elemente des Hochregallagers, durch die neu eingesetzten Bauteile, größtenteils anders funktionieren als die RCX Modelle und auch die leJOS Bibliothek sich grundlegend geändert hat, macht es nicht viel Sinn große Teile des bestehenden Quellcodes zu übernehmen. Der Großteil des bestehenden Quellcodes, für das RCX Hochregallager, ist für die umständliche Kommunikation über die Infrarotschnittstelle zuständig. Für diese Kommunikation wurde ein eigenständiges Protokoll mit einem Tokenmanager implementiert. Da die Kommunikation zwischen den NXT Bausteienen auf Bluetooth basiert, musste dieser Teil vollständig verworfen werden. Auch die Implementierung des ATF hat sich grundlegend geändert, da auf, in der leJOS NXJ Bibliothek, vorhandene Klassen zur Navigation zurückgegriffen werden konnte. Diese machen intensiven Gebrauch von den Möglichkeiten der neuen NXT Motoren. Ähnlich verhält es sich mit dem Aufbau des Regalbediengerätes und der Übergabestation. Da diese beiden Geräte ohne die zusätzlichen Rotatoinssensoren auskommen, dafür aber Drucktaster einsetzen, musste die Steuerung komplett anders aufgebaut werden. Zusätzlich wurde eine Steuerungssoftware entwickelt, mit deren Hilfe über einen NXT Baustein die Aktionen des Hochregallagers steuerbar sind. In Abschnitt 5.1 wird der Aufbau der, mit Hilfe von Bluetooth, umgesetzten Kommunikation dargestellt. Dazu werden die zum Ein- und Auslagerung benötigten Befehle und deren genaue Aufgabe erläutert. Zusätzlich wird auf die Problematik, die Bluetooth, in Verbindung mit dem frühen Entwicklungsstand von leJOS NXJ, mit sich bringt eingegangen. Für die Verwaltung des Hochregallagers ist ein in Abschnitt 5.2 beschriebener NXT Baustein zuständig, welcher auch Aufgaben eines Lagerverwaltungssystems übernimmt. Abschnitt 5.3 geht auf die Implementierung des Regalbediengerätes, Abschnitt 5.4 die der Übergabestation und letztendlich Abschnitt 5.5 auf die des autonomen Transportfahrzeuges ein. 35 5.1. KOMMUNIKATION KAPITEL 5. IMPLEMENTIERUNG 5.1 Kommunikation Die Kommunikation zwischen den NXT Bausteinen dient, im aktuellen Ausbauzustand des Hochregallagers, in erster Linie der Koordinierung der Ein- und Auslagerungen. Es wäre jedoch denkbar die Kommunikation auszubauen um z.B. Status Meldungen und weitere Informationen von den einzelnen Komponenten zu sammeln. Eine Einlagerung besteht grundsätzlich aus den folgenden Schritten: 1. Das Transportfahrzeug fährt zu der Übergabestation. 2. Die Übergabestation lädt eine Palette auf die Ladefläche des ATF. 3. Das ATF fährt zu dem Regalbediengerät. 4. Das Regalbediengerät entnimmt die Palette von dem ATF und lagert diese an einer freien Position im Regal ein. 5. Das ATF begibt sich zu dem Parkplatz. Die Auslagerung erfolgt analog dazu, jedoch wird dabei als erstes von dem Transportfahrzeug ein Regalbediengerät angesteuert. Das Sequenzdiagramm 5.1 gibt anschaulich wieder, welche Befehle (Commands) für die Einlagerung benötigt werden. Das Diagramm A.3 stellt den entsprechenden Ablauf einer Auslagerung dar. Es lässt sich aus den Diagrammen schon erkennen, dass die Kommunikation durch eine Master-Slave Architektur umgesetzt wurde. Den Master bildet der in Abschnitt 5.2 beschriebene Master Controller, welcher auch die Funktion des LVS übernimmt. Nur dieser hat auch die Möglichkeit direkt mit allen anderen NXT Bausteinen zu kommunizieren. Die gesamte Kommunikation wurde in dem Paket upb.hrl.comm umgesetzt. In der Abbildung A.1 ist das entsprechende Klassendiagramm dargestellt. Die Klasse Kommunikation ermöglicht es Befehle (siehe Abschnitt 5.1.1) zu senden und empfangen. Somit ist dieses die einzige Stelle im Quellcode an der der genaue Aufbau und der Typ der einzelnen Parameter bekannt sein muss. Von der Klasse Kommunikation wurde die Klasse ClientKommunikation, speziell für die Kommunikation auf der Client Seite abgeleitet. Diese wird von dem Regalbediengerät, ATF und der Übergabestation verwendet. Die ebenfalls von der Klasse Kommunikation abgeleitete Klasse MasterKommunikation wird von dem Steuerungs Modul verwendet. Der Unterschied der beiden abgeleiteten Klassen besteht darin, wie die Bluetooth Verbindungen zu dem jeweiligen Kommunikationspartner aufgebaut werden. 36 5.1. KOMMUNIKATION KAPITEL 5. IMPLEMENTIERUNG RC : RC ATF1 : ATF UEG1 : UEG Benutzer Einlagern GoToUEGCommand InUEGPositionCommand UnloadUEGCommand UnloadedUEGCommand GoToRBGCommand InRBGPositionCommand LoadRBGCommand LoadedRBGCommand Abbildung 5.1: Sequenzdiagramm Einlagern 37 RBG1 : RBG 5.1. KOMMUNIKATION KAPITEL 5. IMPLEMENTIERUNG 5.1.1 Die Commands Die zwischen den verschiedenen Modulen ausgetauschten Nachrichten werden als Commands definiert. Ein Command ist eine einfache Java Klasse, die das Inteface Command implementiert und der ein eindeutiger Identifier zugeordnet ist. Der Identifier besteht, auf Grund der relativ geringen Anzahl an Commands, aus nur einem Byte. Alle Identifier sind in dem Interface upb.hrl.comm.Protocol definiert. Zusätzlich kann ein Command mehrere Parameter enthalten. Diese sind im Moment von dem Typ int oder float, mögliche Erweiterungen können aber auch einfach Daten vom Typ String oder byte übertragen. Dieser Aufbau wurde gewählt, um die Kommunikation und somit auch die Funktionalität des Systems leicht erweitern zu können. Außerdem ist es so möglich den Sourcecode gut lesbar und vor allem wartbar zu halten. Der Aufbau der Command Hierarchie ist in Abbildung 5.2 dargestellt. Auch wenn zwei Commands die selben Parameter enthalten, aber an unterschiedliche Komponenten gesendet werden, wurde dieses durch zwei separate Klassen umgesetzt, die von der selben Oberklasse geerbt haben. Dieses ist nötig, da aus den Nachrichten sonst nicht abgeleitet werden kann, welche Aktion im Anschluss ausgeführt werden muss. LoadUEGCommand UnloadUEGCommand UnloadedUEGCommand UnloadedRBGCommand LoadedRBGCommand LoadedUEGCommand «interface » Command GoToCommand PositionCommand # angle #x #x #y #y InPositionCommand - GoToCommand() - PositionCommand() + getAngle() + getX() + getX() + getY() + getY() GoToUEGCommand GoToRBGCommand + GoToUEGCommand() + GoToRBGCommand() InRBGPositionCommand UnloadRBGCommand LoadRBGCommand + UnloadRBGCommand() - LoadRBGCommand() InUEGPositionCommand Abbildung 5.2: Die Command Hierarchie Im Folgenden sind die Aufgaben der einzelnen Commands erklärt. Die Auflistung wurde danach gegliedert, welche Komponenten des Systems die Commands verarbeiten. Außer dem Master Controller sendet keines der Komponenten selbstständig einen Command, sonder antwortet nur auf vorher erhaltenen Commands. 38 5.1. KOMMUNIKATION KAPITEL 5. IMPLEMENTIERUNG Die RBG Commands Das Regalbediengerät reagiert auf zwei Commands und sendet nach erfolgreicher Verarbeitung zur Antwort jeweils einen Command: • Der LoadRBGCommand teilt einem RBG mit, dass sich ein ATF direkt vor diesem befindet und dass die, auf dessen Ladefläche befindliche, Palette eingelagert werden soll. Dieser Command enthält zwei int Parameter, welche die x und y Koordinate des Lagerfaches angeben in dem die Palette eingeordnet werden soll. Wenn die Einlagerung vollzogen wurde, quitiert das RBG dieses dem Master mit einem LoadedRBGCommand. • Das Gegenstück zu dem LoadRBGCommand ist der UnloadRBGCommand. Dieser teilt dem Regalbediengerät mit, aus welchem Lagerfach eine Palette ausgelagert werden soll. Das RBG legt die Palette dann auf der Ladefläche des ATF ab und antwortet mit einem UnloadedRBGCommand. Die UEG Commands Ähnlich wie das Regalbediengerät verarbeitet die Übergabestation zwei Commands, die dieser mitteilen, entweder eine Palette von der Ladefläche des ATF zu entnehmen, bzw. eine darauf abzulegen. Dieses wird durch die zwei Commands LoadUEGCommand und UnloadUEGCommand bewerkstelligt. Im Unterschied zu den RBG Varianten benötigen diese jedoch keine weiteren Parameter. Die Antwort auf diese Commands sind wiederum, entsprechend derer des RBG, die LoadedUEGCommand bzw. UnloadedUEGCommand Commands. Die ATF Commands Das autonome Transportfahrzeug reagiert auf mehrere unterschiedliche GoTo Commands, die alle in ihrem Aufbau gleich sind und von der Klasse upb.hrl.comm.GoToCommand abgeleitet sind. Diese Commands enthalten alle drei float Werte für die x und y Koordinaten und einen Winkel. Durch diese Werte wird dem ATF mitgeteilt, welche Position angesteuert werden soll und ich welche Richtung es dabei zeigen soll. Abgeleitet von der Klasse GoToCommand sind GoToRBGCommand und GoToUEGCommand. Die beiden Commands werden mit einem InRBGPositionCommand bzw. InUEGPositionCommand bestätigt, wenn das ATF die entsprechende Position erreicht hat. Empfängt ein ATF einen Command der Klasse GoToCommand, fährt es auch zu der gewünschten Position, quittiert dieses aber nicht. 39 5.2. DER MASTER CONTROLLER KAPITEL 5. IMPLEMENTIERUNG 5.2 Der Master Controller Der Master Controller, im Weiteren auch RC (Remote Control) gennant, ist das Lagerverwaltungssystem des Models. Dieser ist dafür zuständig die Kommunikation zwischen alle Modulen zu verwalten, aber auch die Ein- und Auslagerungsvörgänge zu koordinieren. Somit bildet dieser NXT Baustein das Herzstück des ganzen Systems. Bei der Implementierung des Masters sind besonders viele der Einschränkungen von leJOS bemerkbar geworden. Am meisten Aufwand musste investiert werden, dass es möglich wurde Bluetooth Verbindungen mit mehreren Geräten gleichzeitig aufzubauen. leJOS NXJ ermöglicht es seit der Version 0.4, Verbindungen zwischen NXT Bausteinen aufzubauen, allerdings immer nur eine einzige. Auch wenn diese Verbindung wieder beendet wurde, war es nicht möglich eine neue Verbindung herzustellen. Mit Hilfe der leJOS NXJ Revisionen 1082 bis 1133 aus dem leJOS NXJ Subversion Repository1 ist es möglich Verbindungen zu mehreren NXT Bausteinen gleichzeitig aufzubauen. Leider werden dabei bestehende Verbindungen oft unterbrochen und sind daraufhin nicht mehr weiter benutzbar. Ab Revision 1134 wurde die Möglichkeit zur Verbindung von mehreren NXT Bausteinen, wegen des geschilderten Problems, wieder entfernt. Die leJOS Entwickler gehen jedoch davon aus mit der leJOS NXJ Version 0.5 eine stabile Unterstützung für mehrere gleichzeitige Bluetoothverbindungen bereitstellen zu können. Ein weiteres, nicht ganz so einschränkendes, Problem trat bei der Implementierung des Menüsystems auf. Da die maximale Länge einer Klasse überschritten wurde, mussten einige Methoden in die Klasse upb.hrl.rc.RCHelper ausgelagert werden. Bevor der Master zur Steuerung des Systems benutzt werden kann, müssen alle Bluetooth Verbindungen hergestellt werden. Dazu müssen alle NXT Bausteine eingeschaltet und das, der Funktion entsprechende, Programm gestartet werden. Alle Clients (ATF, RBG und UEG) sollten Warten auf RC... auf dem Display anzeigen. Nun lässt sich über den Menüpunkt Verbindung auf dem Master eine Verbindung mit den einzelnen Komponenten herstellen. Der genaue Ablauf dazu ist in Abschnitt 5.2.1 beschrieben. Der Verbindungsaufbau auf der Master Seite ist in der Klasse MasterKommunikation umgesetzt. Diese bietet die benötigten Funktionen an, um die Verbindung mit den Clients herzustellen. Dazu benutzt der Master, je nach Modul mit dem eine Verbindung aufgebaut werden soll, eine der Klassen ATFKommunikation, RBGKommunikation bzw. UEGKommunikation (siehe Klasendiagramm A.1), die alle von MasterKommunikation abgeleitet sind und für jedes der drei Module spezifische zusätzliche Methoden implementieren. 1 http://lejos.svn.sourceforge.net/viewvc/lejos/ 40 5.2. DER MASTER CONTROLLER KAPITEL 5. IMPLEMENTIERUNG Da der Master Controller auch die Funktion des Lagerverwaltungssystems übernimmt, benötigt dieser Angaben über die Anzahl der im Hochregal verfügbaren Lagerplätze. Die Anzahl der Zeilen und Spalten wird durch die Konstanten RACK ROWS und RACK COLUMNS in der Klasse upb.hrl.rc.RC (siehe Klassendiagramm 5.3) festgelegt. 5.2.1 Das Menüsystem Der Master Controller verfügt über ein simples Menüsystem über welches sich das Hochregallager steuern lässt. Die Steuerung funktioniert über die vier Tasten unterhalb des Displays der NXT Bausteine. Mit den beiden hellgrauen Pfeiltasten lässt sich in dem Menü auf- und ab navigieren. Mit der großen, quadratischen, orangenen Taste bestätigt man die aktuelle Auswahl und mit der rechteckigen, dunkelgrauen Taste kehrt man in das vorherige Menü zurück bzw. beendet das Programm. Dieses Menüsystem ist in drei Punkte unterteilt: • Verbindung - Unter diesem Menüpunkt lassen sich Verbindungen zu den drei Modulen herstellen. Dazu müssen diese zuvor eingeschaltet werden. Daraufhin warten diese auf eine eingehende Verbindung. In dem Menü Verbindungen lässt sich auswählen, zu welchem Modul eine Verbindung aufgebaut werden soll. Nach der Auswahl einer der Punkte ATF, RBG, oder UEG wird nach anderen NXT Bausteinen gesucht und die Liste der gefundenen Ergebnisse angezeigt. Aus dieser Liste kann die entsprechende Auswahl getroffen werden, woraufhin die Verbindung aufgebaut wird. Dieser Schritt muss für alle drei Module durchgeführt werden, um mit diesen kommunizieren zu können. • Test - Der Test-Menüpunkt ist dazu gedacht, einzelne Aktionen der Objekte auszuführen. Dazu muss erst eine Verbindung zu dem gewünschten Modul (über das Verbindungs-Menü) aufgebaut werden. Daraufhin können über das Test-Menü einzelne Befehle gesendet werden. So lässt sich hierüber z.B. das ATF an eine der drei Haltestellen navigieren oder mit Paletten beladen. • Betrieb - Das Betrieb-Menü bietet die Möglichkeit Paletten ein- und auszulagern. Bei Auswahl des Menüpunktes einlagern wird eine, sich auf der Gabel des UEG befindlichen, Palette eingelagert. Hierfür sind keine weiteren Eingaben notwendig, da automatisch ein verfügbarer Lagerplatz, mit Hilfe des LVS, ermittelt wird. Bei Auswahl des Punktes auslagern, wird eine Liste aller sich im Lager befindlichen Paletten angezeigt und es kann eine Gewünschte ausgewählt werden, welche daraufhin ausgelagert wird. 41 5.2. DER MASTER CONTROLLER KAPITEL 5. IMPLEMENTIERUNG 5.2.2 Das Lagerverwaltungssystem Das eigentliche Lagerverwaltungssystem ist in der Klasse upb.hrl.rbg.LVS umgesetzt. Diese Klasse behält den Überblick über die im Hochregallager gelagerten Paletten und weist einzulagernden Paletten, nach dem Prinzip der chaotischen Lagerhaltung, Lagerplätze zu. Umgesetzt wird dieses, da alle Paletten als einheitlich gelten und nicht voneinander unterschieden werden können, durch ein zweidimensionales boolean Array. Während der Initialisierung des LVS werden alle Elemente des Arrays auf false gesetzt, da davon ausgegangen wird, dass das Regal komplett leer ist. Wird die Methode einlagern über das Menüsystem aufgerufen, so ermittelt das LVS die erste freie Position in dem Hochregal und stößt den Ablauf aus Sequenzdiagramm 5.1 an. Entsprechend wird der Ablauf aus Sequenzdiagramm A.3 von dem LVS durchgeführt, wobei zuvor eine Liste der verfügbaren Paletten zur Auswahl angeboten wird. RC upb::hrl::comm::RBGKommunikation - BACK_COMMAND - CMDID_BACK_TO_MAIN - CMDID_EXIT_APP - EXIT_COMMAND - RACK_COLUMNS - RACK_ROWS - rbg + RBGKommunikation() 1 - atf - connectMenu - display - exitAlert - helper - lvs - menu + load() + unload() upb::hrl::comm::ATFKommunikation upb::hrl::comm::MasterKommunikation + ATFKommunikation() - atf 1 - rbg - testMenu - ueg - workMenu + goTo() + goToRBG() + goToUEG() - FRIENDLY_NAME + MasterKommunikation() + RC() upb::hrl::comm::UEGKommunikation + commandAction() + connectMenuAction() + main() - ueg 1 + startMenu() + workMenuAction() LVS 1 - lvs 1 + UEGKommunikation() - helper + load() + unload() - columns - helper - rows - space + + + + + RCHelper 1 + buildMenu() + displayString() + displayString() + findDevices() - helper LVS() auslagern() countStock() einlagern() freeSpace() + setInUse() + testMenuAction() Abbildung 5.3: Klassendiagramm des Master Controllers 42 5.3. DAS REGALBEDIENGERÄT KAPITEL 5. IMPLEMENTIERUNG 5.3 Das Regalbediengerät Das Regalbediengerät ist mit drei Motoren und drei Drucktastern ausgestattet. Für jede der drei Bewegungsrichtungen ist jeweils ein Paar aus Motor und Drucktaster zuständig. Solch ein Paar wurde in der Klasse upb.hrl.rbg.Antriebseinheit zusammengefasst, welche die Methoden isMoving() und goToInitialPosition() implementiert. isMoving() erlaubt es zu überprüfen, ob eine Bewegung durchgeführt wird und mit goToInitialPosition() kann zu einer initialen Ausgangsposition gefahren werden. Dazu wird die entsprechende Antriebseinheit so lange bewegt, bis der Drucktaster aktiviert ist. Ist diese Position erreicht wird der Zähler für die durchgeführten Umdrehungen des Motors auf 0 zurück gesetzt. Von der Klasse Antriebseinheit sind die drei Klassen Fahreinheit, Hubeinheit und Lastaufnahmeeinheit abgeleitet. Diese setzen für die in der jeweiligen Richtung notwendigen Funktionen zur Positionierung um. Damit die Positionierung leicht an Änderungen der Lagerpositionen und anderer Änderungen in der Konstruktion angepasst werden kann, wurden diese über Konstanten anpassbar gemacht. Für jede der Klassen ist es möglich über die Konstante SPEED die Bewegungsgeschwindigkeit anzupassen. Dadurch können die unterschiedlichen Übersetzungsverhältnisse ausgeglichen werden. Die Klasse Fahreinheit hat eine Methode goToPosition(int x), welche es ermöglicht jede Spalte des Hochregals anzufahren. Über die geerbte Funktion goToInitialPosition() wird die Position zur Bedienung des ATF angefahren. Um die Spalten des Regals genau anfahren zu können, sind zwei Werte notwendig: RACK START und BOX WIDTH. RACK START ist die Anzahl der gemessenen Pulse des Tachometers des Motors bis, von der initialen Position aus, die Mitte der ersten Spalte des Hochregals erreicht ist. BOX WIDTH ist die Anzahl der Impulse, die der Tachometer von der Mitte einer Spalte zu der Mitter der benachbarten Spalte misst. Die für die Bewegung in y-Richtung zuständige Klasse Hubeinheit hat die Methoden goToPosition(int y), so wie box up() box down(), up() und down(). Die Funktion goToPosition(int y) ist zum Anfahren der einzelnen Zeilen des Hochregals zuständig. Ähnlich wie bei der Fahreinheit wird dieses durch zwei Konstanten RACK BOTTOM und BOX HEIGHT konfiguriert. Die Funktionen up() und down() sind nötig, um eine Palette auf dem ATF ablegen zu können, die Funktionen box up() und box down() sind nötig, um eine Palette in einem Lagerfach ablegen zu können. Dazu muss sich die Hubeinheit jeweils um ein kleines Stück anheben bzw. absenken können. Die Höhe um die dieses geschieht wird durch die Konstante LIFT bzw. BOX LIFT definiert. Etwas einfacher ist die Positionierung der Klasse Lastaufnahmeeinheit. Diese muss nur drei Positionen kennen. Die initiale Position, die Position der Hochregals und die des ATF. Die initiale Position wird mit Hilfe des Drucktasters angefahren. Nur in dieser 43 5.3. DAS REGALBEDIENGERÄT KAPITEL 5. IMPLEMENTIERUNG Position kann sich das Regalbediengerät frei bewegen, ohne mit der Lastaufnahmeeinheit an dem Regal hängen zu bleiben. Die anzufahrenden Positionen des Hochregals und des ATF werden durch die Konstanten RACK POSITION, so wie ATF POSITION festgelegt und können durch Aufrufe der Funktionen goToRack() bzw. goToATF() angefahren werden. Die gerade beschriebenen Klassen können somit jede benötigte Position in jeweils einer Richtung anfahren. Die, um Ein- und Auslagerungen durchführen zu können, benötigten Abläufe sind in der Klasse Steuerung umgesetzt. Genauer gesagt wird dieses von den Funktionen einlagern(int x, int y) und auslagern(int x, int y) durchgeführt. Die Parameter x und y geben jeweils das Lagerfach an in dem eine Palette eingelagert, bzw. aus dem eine Palette entnommen werden soll. Die Klasse RBG enthält die main Methode für das Regalbediengerät. In dieser wird eine Initialisierung durchgeführt und daraufhin auf eine Verbindung zu dem Master gewartet. Ist die Verbindung aufgebaut, werden mit Hilfe der ClientKommunikation Befehle empfangen, welche an die Steuerung weitergeleitet werden. Ein kompletter Überblick über das Packet upb.hrl.rbg ist in dem Klassendiagramm 5.4 dargestellt. RBG Hubeinheit - FRIENDLY_NAME - kommunikation upb::hrl::comm::ClientKommunikation - kommunikation - steuerung 1 - BOX_HEIGHT - BOX_LIFT - LIFT - RACK_BOTTOM - SPEED + ClientKommunikation() - connectToMaster() + RBG() - main() - steuerung + Hubeinheit() Fahreinheit + + + + + - BOX_WIDTH - RACK_START - SPEED - Fahreinheit() + goToPosition() + goToPosition() 1 - fahreinheit Steuerung - fahreinheit - hubeinheit - lastaufnahmeeinheit box_down() box_up() down() goToPosition() goToPosition() + up() 1 - hubeinheit + + + + Steuerung() auslagern() einlagern() goToInitialPosition() goToPosition() + + + - isMoving() placeOnATF() placeOnRack() takeFromATF() takeFromRack() Lastaufnahmeeinheit 1 - lastaufnahmeeinheit Antriebseinheit - ATF_POSITION - RACK_POSITION - SPEED # motor + Lastaufnahmeeinheit() + goToATF() + goToInitialPosition() + Antriebseinheit() + goToInitialPosition() + goToInitialPosition() # sensor + goToRack() + isMoving() 1 Abbildung 5.4: Klassendiagramm des Regalbediengerätes 44 5.4. DIE ÜBERGABESTATION KAPITEL 5. IMPLEMENTIERUNG 5.4 Die Übergabestation Die Übergabestation ist in dem Packet upb.hrl.ueg (siehe Abbildung 5.5) umgesetzt und ähnlich aufgebaut wie das Regalbediengerät. Die Klasse UEG enthält wiederum die main Methode und ist für die Initialisierung, Verbindungsaufbau und den Empfang der Befehle zuständig. Die Aufgabe der Klasse Steuerung ist das in den Funktionen laden() und entladen() umgesetzte Be- und Entladen des ATF. Um die beiden Vorgänge durchzuführen, wird, wie bei dem Regalbediengerät, auf eine Hubeinheit so wie eine Lastaufnahmeeinheit zurückgriffen, welche auch von der Klasse upb.hrl.rbg.Antriebseinheit abgeleitet sind. Analog zu dem RBG, lassen sich für die Klassen Hubeinheit und Lastaufnahmeeinheit die Drehgeschwindigkeiten des Motors über die Konstante SPEED regeln. Die anzufahrenden Positionen der Hubeinheit können durch die beiden Konstanten ATF HEIGHT und LIFT bestimmt werden. ATF HEIGHT ist die Höhe der Ladefläche des ATF. LIFT hat die selbe Funktion wie bei dem RBG. Die Lastaufnahmeeinheit funktioniert analog zu der des RBG, hier ist jedoch nur die durch ATF POSITION festzulegende Position des ATF notwendig. UEG - FRIENDLY_NAME - kommunikation upb::hrl::comm::ClientKommunikation - kommunikation - steuerung 1 + ClientKommunikation() - connectToMaster() + UEG() + main() Lastaufnahmeeinheit - steuerung - ATF_POSITION - SPEED + Lastaufnahmeeinheit() + goToATF() + goToInitialPosition() 1 1 Steuerung - hubeinheit - teleskopgabel - Steuerung() + entladen() + goToInitialPosition() + laden() upb::hrl::rbg::Antriebseinheit - teleskopgabel # motor # sensor Hubeinheit + Antriebseinheit() + goToInitialPosition() + goToInitialPosition() - hubeinheit 1 - ATF_HEIGHT - LIFT - SPEED + isMoving() + Hubeinheit() + down() + goToATF() + up() Abbildung 5.5: Klassendiagramm der Übergabestation 45 5.5. DAS TRANSPORTFAHRZEUG KAPITEL 5. IMPLEMENTIERUNG 5.5 Das Transportfahrzeug Das Autonome Transportfahrzeug besitzt zwei Motoren die zur Fortbewegung verwendet werden. Jeder der Motoren treibt eines der beiden Vorderräder an, welche dadurch unabhängig voneinander steuerbar sind. Für derartig aufgebaute Roboter bietet die leJOS NXJ Bibliothek in dem Packet lejos.navigaton vorgefertigte Klassen an, die die Steuerung solcher Roboter vereinfachen. Die einfachste dieser Klassen ist die Pilot Klasse. Diese bietet Funktionen an um, einen solchen Roboter vorwärts und rückwärts fahren zu lassen, sich um einen bestimmten Winkel zu drehen und anzuhalten. Darauf aufbauend gibt es weitere Klassen, die teilweise mit Hilfe weiterer Sensoren, wie z.B. einem Kompass, die Navigation des Roboters ermöglichen und die aktuelle Position, relativ zu der Startposition, bestimmen können. Für das autonome Transportfahrzeug wurde der TachoNavigator, der zur Positionsbestimmung die Odometrie verwendet, benutzt. Diese wurde mit einer Linienerkennung und einer Markererkennung, für welche die beiden auf den Boden gerichteten Lichtsensoren verwendet werden, kombiniert, um möglichst genaue Positionsdaten zu erhalten. Zusätzlich wird der Ultraschallsensor an der Front genutzt um nicht auf Hindernisse aufzufahren. Umgesetzt wurde dieses in der Klasse upb.hrl.atf.TrackNavigator. Für die Steuerung mit Hilfe dieser Klassen werden zusätzliche Parameter benötigt, die die physikalischen Eigenschaften des ATF beschreiben. Dieses sind, die in der Klasse TrackNavigator definierten Konstanten WHEEL DIAMETER und TRACK WIDTH so wie FRONT DIFF und SIDE DIFF. Die beiden Ersten beschreiben den Raddurchmesser und die Spurbreite des ATF in Zentimetern, während die beiden Letzteren den Abstand des Lichtsensors zur Linienverfolgung zum Mittelpunkt der Antriebsachse des ATFs angeben. Zusätzlich wird dort in den Konstanten SPEED und DISTANCE festgelegt wie schnell das ATF fahren soll und wie viel Abstand, in Zentimetern, es zu Hindernissen auf der Fahrbahn halten soll. 5.5.1 Initialisierung Damit die beiden Lichtsensoren sicher zu Fahrbahn und Markererkennung eingesetzt werden können, müssen diese zuvor initialisiert werden. Dieses geschieht über den in Kapitel 4.5 beschriebenen Initialisierungsbereich auf der Fahrbahn. Die Initialisierung ist eines der neu hinzugekommenen Features des ATF und verbessert die Positionierungsgenauigkeit enorm. Umgesetzt ist die Initialisierung in der Methode initSensors() der Klasse TrackNavigator, deren genaues Vorgehen in Kapitel 4.5 beschrieben ist. 46 5.5. DAS TRANSPORTFAHRZEUG KAPITEL 5. IMPLEMENTIERUNG 5.5.2 Linienverfolgung Die Linienverfolgung funktioniert auf eine grundlegend andere Art und Weise, als die für das alte ATF implementierte Version. In der alten Version des ATF wurde der von dem Sensor für die Fahrbahn ermittelte Wert mit einem Referenzwert für die Fahrbahn verglichen. War dieser Wert größer, und somit der aktuelle Untergrund zu hell, wurde nur das linke Rad angetrieben und das ATF hat einen Schwenk nach rechts gemacht. Entsprechen, wenn der eingelesene Wert zu klein war, hat das ATF einen Schwenk nach links gemacht. Auf diese Art und Weise hat sich das ATF, anstatt der Fahrbahnmarkierung auf einer geraden Linie zu folgen, dieses in einer Schlangenform getan. Die überarbeitete Implementierung ist darauf ausgerichtet der Fahrbahnmarkierung flüssiger zu folgen. Dazu wurde der vorhandene Farbverlauf der Fahrbahn und die Tatsache, dass der genaue Helligkeitswert der Mitte der Fahrbahn von der Initialisierung her bekannt ist, ausgenutzt. Das ATF geht jetzt davon aus, dass es genau in Richtung der Fahrbahn ausgerichtet ist und fängt dementsprechend an geradeaus zu fahren. Der von der Fahrbahnmarkierung ausgelesene Helligkeitswert wird wiederum mit dem Sollwert der Fahrbahn verglichen. Ist die Differenz der beiden Werte unterhalb eines gewissen Schwellwertes, fährt das ATF weiterhin geradeaus und verlangsamt nur einen der beiden Motoren etwas, abhängig davon, auf welcher Seite der Ideallinie sich das ATF befindet. Überschreitet die Differenz zwischen dem Sollwert und dem aktuell ausgelesenen Wert den Schwellwert, so fängt das ATF an, sich in die benötigte Richtung zu drehen. Der Winkel, um den sich das ATF hierbei dreht ist davon abhängig, wie groß die Differenz der Werte ist. Der Winkel α wird mit Hilfe der Gleichung 5.1 berechnet. α= lineColor − trackColor 10 (5.1) Geht man davon aus, dass die gewünschte Helligkeit der Fahrbahn (lineColor ) in etwa 60 entspricht und die ermittelten Helligkeiten zwischen 202 und 100 liegt, so entspricht α einem Wert zwischen −4 und 4. Dementsprechend würde sich das ATF um einen Winkel von maximal 4◦ in die benötigte Richtung drehen. Es hat sich herausgestellt, dass dieses Verfahren eine sehr stabile Geradeausfahrt ermöglicht und auch in engen Kurven das ATF sicher auf der Fahrbahn hält. Zudem erhöht sich die Genauigkeit der von der Odometrie ermittelten Position bei diesem Ansatz deutlich gegenüber dem einfachen Anhalten eines der beiden Antriebsräder. Dieses ist darauf zurückzuführen, das der Schlupf bei der Drehung deutlich geringer ist, da sich hierbei beide Räder drehen können. 2 Es werden im Normalfall keine Helligkeiten unter 20 ermittelt, da der schwarze Streifen der Fahrbahn schmaler ist als der Messbereich des Lichtsensors. 47 5.5. DAS TRANSPORTFAHRZEUG KAPITEL 5. IMPLEMENTIERUNG 5.5.3 Positionsbestimmung Das ATF benutzt zur Positionsbestimmung zwei unterschiedliche Methoden, die sich gegenseitig unterstützten. Zum Einen wird die Odometrie benutzt, um vorallem Kurvenfahrten zu erkennen, zum Anderen die Marker auf der Fahrbahn. Dadurch lässt sich relativ robust eine genaue Position und die Fahrtrichtung des ATF bestimmen. Die Positionsbestimmung ist in der Klasse T rackN avigator implementiert. Im Folgenden ist beschrieben, wie die beiden Methoden funktionieren und wie sie sich gegenseitig unterstützen Odometrie Die Odometrie ermöglicht es, aus den Radumdrehungen die aktuelle Position und die Fahrtrichtung des Roboters in Relation zu dem Startpunkt zu berechnen. Diese Werte sind allerdings ungenau und die Fehler summieren sich, je länger die Position nicht anderweitig korrigiert wird. Die Fehler können in zwei Klassen aufgeteilt werden. Zum Einen gibt es die systematischen und zum Anderen die nicht systematischen Fehler. Bei den systematischen Fehlern handelt es sich um Berechnungsungenauigkeiten (Rundungsfehler und Ungenauigkeit bei der Bestimmung des Radumfangs und Radabstand). Nicht systematische Fehler entstehen etwa durch Durchdrehen (Schlupf) der Räder auf dem Untergrund oder Unebenheiten auf dem Untergrund.[TBF05, Har03] In der leJOS Bibliothek ist bereits ein Navigator implementiert, der zur Positionsbestimmung auf der Odometrie basiert. Dieser T achoN avigator nutzt die neue Fähigkeit der NXT Motoren aus, dass diese die durchgeführten Umdrehungen direkt mitzählen können. Leider besitzt diese Klasse in der leJOS Version 0.4 einige Bugs, die dazu führen, dass oft völlig falsche Positionen berechnet werden. Außerdem müssen für die Neuberechnung der Position die Motoren angehalten werden. Seit der Revision 1143 sind die Bugs behoben und es ist sogar möglich, während die Motoren sich bewegen die Positionsdaten zu aktualisieren. In Abbildung 5.6 ist eine Positionsveränderung eines ATF im Koordinatensystem schematisch dargestellt. Die Position des Roboters im Punkt P1 ist durch das Tupel l = (x, y, a) gegeben. Das Tupel wird in bestimmten Abständen aktualisiert, dazu werden die Größenänderungen ∆x, ∆y und ∆α auf die zugehörige Tupelelemente aufaddiert. Es werden die Werte ∆l und ∆r mit Hilfe der, in den NXT Motoren eingebauten, Inkrementalgebern gemessen. Daraus ergibt sich nach der Gleichung (5.2) mit Hilfe des Radabstandes d der Drehwinkel ∆α. ∆α = ∆r − ∆l d 48 (5.2) 5.5. DAS TRANSPORTFAHRZEUG KAPITEL 5. IMPLEMENTIERUNG ∆l ∆α α y P1 P2 ∆y ∆s ∆r ∆x d x Abbildung 5.6: Schema einer Positionsveränderung 49 5.5. DAS TRANSPORTFAHRZEUG KAPITEL 5. IMPLEMENTIERUNG Die Wegstrecke ∆s wird nach Gleichung (5.3) berechnet. Sie ist der Mittelwert von ∆l und ∆r. ∆s = ∆r + ∆l 2 (5.3) Anhand der Werte ∆x, ∆y und ∆α wird das Positionstupel aktualisiert. Genaueres dazu ist in [Pan02] zu entnehmen. Die Berechnung der neuen Position findet in der Methode updatePosition() der Klasse TachoNavigator statt. Markererkennung Die Marker werden von dem rechten Lichtsensor des ATF erkannt und dazu benutzt die von der Odometrie berechnete Position zu korrigieren. Die Markererkenung an sich ist sehr einfach, es muss nur in regelmäßigen Abständen überprüft werden, ob der dafür zuständige Lichtsensor einen bestimmten Schwellwert unterschreitet. Dieser Schwellwert kann über die Konstante MARKER DIFF festgelegt werden. Aufwendiger gestaltet sich die Korrektur der Odometriedaten durch die Markererkennung. Besonders wichtig ist es dabei die Fahrtrichtung anzupassen, da durch den Schlupf der Räder auf dem Untergrund besonders dieser Wert zu Ungenauigkeiten neigt. Dazu wird intensiver Gebrauch von den bekannten Merkmalen der Fahrbahn und des ATF gemacht: • Die Position, an der das ATF vor dem Initialisierungsbereich platziert wird ist genau bekannt. Über einen Aufruf von setPosition(flot x, float y, float angle) in der Methode initSensors() wird dieser Startpunkt festgelegt. • Die beiden engen 180◦ Kurven auf den beidem schmalen Seiten der Fahrbahn werden dazu genutzt, die genaue Position so wie den Winkel erneut festzulegen. Dieses ist möglich, da nur an diesen beiden Stellen ein Marker überfahren wird, bei dem die Fahrtrichtung des ATF 0◦ bzw 180◦ ist. • Während der Fahrt entlang der langen Geraden wird das Raster der Markierung benutzt, um die Position neu zu bestimmen. Je nach Fahrtrichtung (90◦ bzw -90◦ ) ist die x -Position des ATF bekannt, da davon ausgegangen wird, dass der Sensor für die Fahrbahn sich ungefähr auf der Mitte der Bahn befindet. Für die Bestimmung der y-Position wird ausgenutzt, dass das Raster regelmäßig ist und somit kann die y-Position auf den Wert gesetzt werden, der dem von der Odometrie bestimmten am nächsten liegt. Das regelmäßige Raster über die Fahrbahn hat einen Abstand von 50cm. Die dazwischen als Marker erkannten Fahrbahnabzweigungen liegen genau auf der Hälfte. Somit wird der y-Wert der Position auf das am nächsten an der von der Odometrie ermittelten Position liegende, Vielfache von 25cm gesetzt. Dieses sind in der Regel nur kleine Korrekturen, da bei der 50 5.5. DAS TRANSPORTFAHRZEUG KAPITEL 5. IMPLEMENTIERUNG Geradeausfahrt die zurückgelegte Strecke von der Odometrie sehr genau berechnet wird. Die beschriebene Korrektur der Positionsdaten wird in der Methode correctPosition() durchgeführt. 5.5.4 Anfahrt der Zielpositionen Zur Anfahrt einer Zielposition auf der Fahrbahn wird ausgenutzt, dass über den gesamten Untergrund ein Koordinatensystem gelegt wurde. Somit lassen sich für alle anzufahrenden Zielpunkte genaue Koordinaten und ein Winkel festlegen, um eine genaue Positionierung für das ATF festzulegen. Da dem ATF die eigene Positionierung bekannt ist, kann dieses berechnen in welchem Winkel ∆α die anzufahrende Zielposition liegt. Wenn dem ATF angewiesen wurde eine bestimmte Zielposition anzufahren, fängt das ATF damit an, der Fahrbahnmarkierung zu folgen. Jedes Mal wenn von dem ATF ein Marker erkannt wurde, wird die aktuelle Position berechnet und nach dem in Abschnitt 5.5.3 beschriebenen Prinzip korrigiert. Daraufhin wird der Winkel berechnet in dem die Zielposition zu der aktuellen Fahrtrichtung liegt. Ist dieser Winkel zwischen 25◦ und 75◦ groß und stimmt die gewünschte Drehrichtung des ATF mit der aktuellen überein, so biegt das ATF nach rechts hin ab und folgt der Fahrbahn so lange bis der nächste Marker erreicht ist. Das ATF befindet sich nun an der gewünschten Zielposition. Dieses Prinzip funktioniert sehr genau, so dass sich die Paletten von der Übergabestation und dem Regalbediengerät gut erfassen lassen. Theoretisch könnte auf diese Weise auf die Führungslinien denen das ATF folgt komplett verzichtet werden, leider ist dafür die Odometrie zu ungenau, um sich alleine darauf verlassen zu können. × Abbildung 5.7: Anfahrt der Zielposition 51 5.5. DAS TRANSPORTFAHRZEUG KAPITEL 5. IMPLEMENTIERUNG Der in Abbildung 5.7 dargestellte Ausschnitt der Fahrbahn zeigt, wie die korrekte Position zu Abbiegen des ATF gefunden wird. Das rote X stellt die anzufahrende Position dar. Der linke rote Pfeil deutet einen Winkel von 25◦ rechts der aktuellen Fahrtrichtung an. Somit wird das ATF, wenn der linke Marker erkannt wird nicht versuchen abzubiegen, da der Winkel zwischen der aktuellen Fahrtrichtung und der Zielposition kleiner als 25◦ ist. Der nächste von dem ATF erkannte Marker wird die Abzweigung nach unten sein. Von dieser Position aus ist der Winkel zwischen der aktuellen Fahrtrichtung und der Zielposition größer als 25◦ und somit biegt das ATF nach rechts ab. 52 6 Erweiterungsmölichkeiten Das in den vorhergehenden Kapiteln dargestellte und entwickelte System bietet sich dazu an in einigen Punkten noch deutlich in der Funktionalität erweitert zu werden. Im Folgenden werden noch einige Ideen zu einzelnen Komponenten des Hochregallagers betrachtet, die das System teilweise stabiler funktionieren lassen würden, bzw. versuchen sollen, weitere Komponenten reeller Hochregallager in das Model einzubinden. Einige dieser Erweiterungen basieren auf Sensoren von Drittherstellern, die nicht in den normalen LEGO Mindstorms Bausätzen enthalten sind. Eine relativ offensichtliche Erweiterung des Hochregallagersystemes wäre es, dieses mit weiteren Regalbediengeräten und den dazugehörigen Hochregalen, Übergabestationen und autonomen Transportfahrzeugen auszustatten. In der aktuellen Ausbaustufe besteht von jedem der angesprochenen Komponenten nur ein Exemplar. Dieses ist zum Einen darauf zurückzuführen, dass einige benötigte Bauteile in zu geringer Zahl vorhanden sind, bzw. noch in dem RCX Hochregallager verbaut sind. Zum Anderen darauf, dass die Bluetooth-Kommunikation zum momentanen Zeitpunkt mir der aktuellen leJOS Version noch sehr problematisch ist. Sind diese Probleme in neueren leJOS Versionen erst einmal behoben, ist es ohne größeren Aufwand möglich das System, und vor allem die Kommunikation, auf Grundlage dieser Bachelorarbeit so zu erweitern, dass eine Vielzahl von Übergabestationen, Regalbediengeräten und autonomen Transportfahrzeugen unterstützt werden. Solch ein komplexerer Aufbau würde einem reellen Hochregallager deutlich näher kommen und viele interessante Anwendungen zulassen. Um die Kommunikation mit mehreren Komponenten umzusetzen, wird es nötigt sein die Commands um einige Parameter zu erweitern, um Informationen darüber zu verwalten, welche Komponenten für einen Vorgang benutzt werden sollen. Zusätzlich müsste die Klasse upb.hrl.rc.RC dahingehend angepasst werden, dass mehrere Verbindungen als jeweils nur eine für Übergabestationen, Regalbediengeräte und Transportfahrzeuge aufgebaut werden können und für jedes Hochregal eine Instanz der Klasse upb.hrl.rc.LVS zur Verfügung steht. 53 6.1. ATF ERWEITERUNG KAPITEL 6. ERWEITERUNGSMÖLICHKEITEN 6.1 ATF Erweiterung Die Positionsbestimmung des autonomen Transportfahrzeuges funktioniert zur Zeit auf Basis der Odometrie und der Markererkennung (siehe Kapitel 5.5), welche zusammen ein gutes Ergebnis liefern. Es gibt jedoch eine relativ einfache Möglichkeit die Güte der Positionsbestimmung, auf einfache Art und Weise, noch deutlich zu erhöhen. Der NXT Baustein des ATF hat noch einen Sensoreingang übrig der unbenutzt ist. Es würde sich anbieten dort einen Kompasssensor von HiTechnic (siehe Kapitel 3.3.6) anzuschließen und diesen mit der bestehenden Steuerung zu kombinieren. In dem Packet lejos.navigation gibt es bereits die Klasse CompassNavigator, die die Positionsbestimmung auf Basis der Odometrie und des Kompasssensors ermöglicht. Die Steuerung des ATF müsste nun dahingehend angepasst werden, dass der TrackNavigator anstatt dem TachoNavigator den CompassNavigator benutzt. Der Kompasssensor müsste, parallel zu den Lichtsensoren, während der Initialisierung des ATF mit initialisiert werden. Durch diesen Schritt ist zu jeder Zeit die genaue Richtung in die das ATF zeigt, bekannt und muss nicht mit Hilfe der Marker approximiert werden. Besonders während der Kurvenfahrt ist dieses von Vorteil, da der Schlupf der Räder während dieser Phase besonders hoch ist und sich in einem relativ hohen Fehler in der Ausrichtung bemerkbar macht. Mit Hilfe des Kompasses sollte es auf jeden Fall möglich sein, wenn nicht sogar auf die Führungslinien, zumindest auf die zusätzlichen Marker, in Form des Rasters auf der Fahrbahn, verzichten zu können. Möglicherweise ließe sich die Wegfindung der Transportfahrzeuge so abändern, dass auf durchgängige Führungslinien verzichtet werden könnte und diese nur in der Umgebung von Übergabestationen oder Regalbediengeräten zum Einsatz kommen, um sich dort nicht nur auf die Odometrie verlassen zu müssen. Um jedoch die Transportfahrzeuge in die Nähe dieser Elemente zu navigieren, ist die Odometrie auf jeden Fall ausreichend und um Kollisionen mit anderen Transportfahrzeugen zu vermeiden, kann auf den, in Benutzung befindlichen, Ultraschall Sensor vertraut werden. 54 6.2. UEG ERWEITERUNG KAPITEL 6. ERWEITERUNGSMÖLICHKEITEN 6.2 UEG Erweiterung Die aktuelle Version der Übergabestation ist im Prinzip nur eine einfachere Version eines Regalbediengerätes und hat nur die Möglichkeit eine Palette von einem ATF zu entnehmen oder darauf abzulegen. Um eine neue Palette einzulagern, muss diese also zuvor manuell auf der Lastaufnahmeeinheit der Übergabestation platziert werden. Um dieses zu umgehen, wäre es gut die Übergabestation mit einer automatischen Warenanlieferung zu verknüpfen. Dazu müsste der aktuelle Aufbau um ein weiteres Transportsystem, wie etwa Förderbändern, erweitert werden. Diese würden Paletten zu der Übergabestation transportieren, von wo die Übergabestation die Paletten wiederum entnimmt und auf einem ATF ablegt. Die Auslagerung könnte entsprechend umgekehrt funktionieren. Grundsätzlich gibt es mehrere Möglichkeiten dieses umzusetzen. Es ist zum Beispiel möglich die Übergabestation auf einer, durch einen weiteren Motor angetriebenen, drehbaren Bodenplatte zu montieren. Dadurch könnte die UEG eine Palette durch einen 90◦ Dreh nach rechts oder links auf unterschiedlichen Förderbändern ablegen. Alternativ könnte für die Auslagerung auch eine weitere Übergabestation aufgebaut werden, so dass für die Ein- und Auslagerung jeweils unterschiedliche Übergabestationen verantwortlich sind. Durch solch einen Aufbau könnten auf dem Förderband ankommende Paletten automatisch eingelagert werden, ohne, dass für jede Palette einzelnd über die Steuerung ein Auftrag zur Einlagerung angestoßen werden müsste. 55 6.3. LAGERVERWALTUNG KAPITEL 6. ERWEITERUNGSMÖLICHKEITEN 6.3 Lagerverwaltung In einem reellen Hochregallager werden zur Verfolgung und Identifizierung von Ladeeinheiten Barcodes oder, in neueren Anlagen, auch die berührungslos auslesbaren RFID (Radio Frequency Identification) Tags benutzt. An geeigneten Punkten im System kann so überprüft werden, welche Palette diesen passieren [rfi03]. Um etwas ähnliches in dem LEGO Hochregallager umzusetzen, bietet es sich an z.B den Color Sensor von HiTechnic (siehe Kapitel 3.3.6) zu benutzen. Dieser hat die Möglichkeit 16 Farben eindeutig zu identifizieren. Auf diese Weise wäre es möglich zumindest 16, entsprechend farbig markierte, Paletten identifizieren und damit verfolgen zu können. Entsprechende Punkte für den Einsatz eines solchen Sensors wären z.B. an den Übergabestationen und/oder den Regalbediengeräten. In dem aktuellen Ausbau bietet das Lagerverwaltungssystem nur die Möglichkeit Paletten, die ausgelagert werden sollen, anhand ihrer Lagerposition zu wählen. Mit Hilfe eines Farbsensors wäre es möglich, die an der Übergabestation erkannte Farbe der Palette an das Lagerverwaltungssystem weiterzugeben. Dieses könnte nun in dem Menüsystem die Möglichkeit anbieten die Farbe der auszulagernden Palette auszuwählen, wobei die Lagerposition dabei für den Bediener uninteressant wäre. Den farbigen Paletten könnten auch bestimmte weitere Merkmale zugeordnet werden. So könnte etwa eine schwarze Palette deutlich höher oder breiter sein als eine rote und dürfte dementsprechend nur in bestimmten Lagerplätzen, oder Hochregalen, einsortiert werden, bzw. müsste anders behandelt werden. Auf diese Weise können auch komplexe Lagerverwaltungssysteme umgesetzt werden, die darauf ausgerichtet sind, die Umschlagleistung des Lagers zu erhöhen. Erkennt das Lagerverwaltungssystem beispielsweise, dass eine bestimmte Sorte Paletten sehr häufig angefordert wird, so könnten diese an einer schneller erreichbaren Position gelagert werden, als eine die weniger oft ein- und ausgelagert wird. 56 7 Fazit und Ausblick Im Rahmen dieser Bachelorarbeit wurde die Konstruktion so wie Steuerung des RCX Hochregallagers, so weit dieses zum aktuellen Zeitpunkt möglich ist, mit Hilfe der LEGO Mindstorms NXT umgesetzt. Es konnten dabei alle Komponenten des Systems in ähnlicher Form mit den NXT Bausteinen in der neuen Konstruktionsweise aufgebaut, und zusätzlich, in zeitaufwendiger Detailarbeit, mit entsprechenden CAD Programmen umgesetzt werden. Dabei wurde versucht die Funktionalität der RCX Modelle zu übernehmen und mit Hilfe der neuen Sensoren und Aktoren zu erweitern. Dieses ist besonders bei dem autonomen Transportfahrzeug, in Bezug auf die Wegfindung und Kollisionsvermeidung, und den übrigen Elementen bei der Initialisierung, bemerkbar. Die umgesetzte Steuerung der einzelnen Komponenten ist in sich komplett und erfüllt die benötigten Aufgaben. Dabei werden alle durch die Sensoren gegebenen Möglichkeiten ausgeschöpft, um eine möglichst präzise Arbeitsweise zu gewähren. Über das eingebaute Menüsystem des Lagerverwaltungssystems lassen sich die einzelnen Aktionen und komplette Ein- und Auslagerungsvorgänge initiieren. Allerdings muss berücksichtigt werden, dass die Kommunikation zwischen den einzelnen Komponenten wegen des frühen Entwicklungsstadiums von leJOS NXJ noch eingeschränkt ist. Mit Erscheinen neuerer Versionen von leJOS NXJ sollte die erstellte Software jedoch ohne Änderungen eine stabile Kommunikation ermöglichen. Trotzt dieser Umstände ist die Kommunikation in den Grundzügen einsatzbereit und leicht für zusätzliche Aufgaben erweiterbar. Das Hochregallager bietet an einigen Stellen weiteren Raum für Ausbau und mögliche Verbesserungen. Besonders die in Kapitel 6 dargestellten Möglichkeiten bieten einigen Anreiz dafür. Alle der vorgestellten Erweiterungen lassen sich dabei auf Basis der während dieser Arbeit entwickelten Steuerung und Konstruktion umsetzten. Im Bezug auf das Ziel dieser Bachelorarbeit bleibt festzuhalten, dass ein komplettes Hochregallagersystem und dessen Steuerung auf Basis der LEGO Mindstorms NXT in Verbindung mit leJOS NXJ umgesetzt werden konnte. 57 A UML Diagramme A.1 Klassendiagramme «interface » Protocol Kommunikation + GO_TO + GO_TO_RBG + GO_TO_UEG + IN_RBG_POSITION + IN_UEG_POSITION + LOADED_RBG + LOADED_UEG + LOAD_RBG + LOAD_UEG + UNLOADED_RBG + UNLOADED_UEG + UNLOAD_RBG # btc # btrd # dis # dos # friendlyName + Kommunikation() + close() + getBTConnection() - «multidimensionalArray» getBytes() + getFriendlyName() + UNLOAD_UEG + receive() + send() + close() + receive() + send() ClientKommunikation MasterKommunikation - FRIENDLY_NAME + ClientKommunikation() + MasterKommunikation() - connectToMaster() RBGKommunikation UEGKommunikation + RBGKommunikation() + UEGKommunikation() + load() + load() + unload() + unload() ATFKommunikation + ATFKommunikation() + goTo() + goToRBG() + goToUEG() Abbildung A.1: Klassendiagramm upb.hrl.comm 58 A.1. KLASSENDIAGRAMME ANHANG A. UML DIAGRAMME ATF TrackNavigator - FRIENDLY_NAME - display - kommunikation - navigator 1 - navigator + ATF() + main() - kommunikation - display 1 upb::hrl::comm::ClientKommunikation + ClientKommunikation() - DISTANCE - FRONT_DIFF - MAP_UNITS - MARKER_DIFF - MAX_TURN_ANGLE - MIN_TURN_ANGLE - SIDE_DIFF - SPEED - TRACK_DIFF - TRACK_WIDTH - WHEEL_DIAMETER - distanceSensor - lineColor - markerSensor - trackSensor - connectToMaster() 1 + + + + + + + 1 Display - kommunikation ~ kommunikation ~ navigator - navigator 1 + Display() + run() TrackNavigator() correctPosition() followLine() goTo() initSensors() markerValue() onMarker() onTrack() roundAngle() trackValue() Abbildung A.2: Klassendiagramm des Autonomen Transportfahrzeuges 59 A.2. SEQUENZDIAGRAMME ANHANG A. UML DIAGRAMME A.2 Sequenzdiagramme RC : RC ATF1 : ATF RBG1 : RBG Benutzer Auslagern GoToRBGCommand InRBGPositionCommand UnloadRBGCommand UnloadedRBGCommand GoToUEGPosition InUEGPositionCommand LoadUEGCommand LoadedUEGCommand Abbildung A.3: Sequenzdiagramm Auslagern 60 UEG1 : UEG B Konstruktionsabbildungen Abbildung B.1: Das Regalbediengerät mit Hochregal 61 ANHANG B. KONSTRUKTIONSABBILDUNGEN Abbildung B.2: Das Regalbediengerät 62 ANHANG B. KONSTRUKTIONSABBILDUNGEN Abbildung B.3: Die Lastaufnahmeeinheit 63 B.1. ANSCHLUSSBELEGUNG ANHANG B. KONSTRUKTIONSABBILDUNGEN B.1 Anschlussbelegung Anschluss Motor A Motor B Motor C Sensor 1 Sensor 2 Sensor 3 Sensor 4 Regalbediengerät Motor Fahreinheit Motor Hubeinheit Motor Lastaufnahme Taster Fahreinheit Taster Hubeinheit Taster Lastaufnahme - Übergabestation Motor Hubeinheit Motor Lastaufnahme Taster Hubeinheit Taster Lastaufnahme - Transportfahrzeug Antrieb links Antrieb recht Lichtsensor links Lichtsensor recht Abstandssensor - Tabelle B.1: Anschlussbelegung der Modelle 64 C Inhalt der beiliegenden CD Verzeichnis Beschreibung bin Der bin-Ordner enthält die, mit der leJOS NXJ Version auf dieser CD, kompilierten und gelinkten Binaries. Diese lassen sich auf, mit der entsprechenden Version der leJOS Firmware bespielte, NXT Bausteine übertragen. Es ist jedoch empfohlen die Java Sourcen mit einer aktuellen Version von leJOS erneut zu kompilieren. ldraw Dieses Verzeichnis enthält die, mit Hilfe von MLCad und Bricksmith, umgesetzten Konstruktionsanleitungen und die entsprechenden Stücklisten. Die Konstruktionsanleitungen und Stücklisten sind in Form von ldraw und pdf -Dateien vorhanden. lejos nxj Dieser Ordner enthält die, zum kompilieren und linken, benutzte leJOS NXJ Version. Es ist jedoch empfehlenswert eine aktuelle Version von der leJOS Homepage zu beziehen. src In diesem Verzeichnis ist der gesamte Quelltext der umgesetzten Steuerung für die NXT Bausteine gesammelt. thesis In diesem Ordner ist diese Bachelorarbeit in Form einer pdf Datei zu finden. track Dieser Ordner enthält den benutzten Fahrbahnuntergrund in Form einer pdf -Datei, so wie die zum Erstellen benutzten LATEX Sourcen. Tabelle C.1: Verzeichnisstruktur der beiliegenden CD 65 D Inbetriebnahme Im Folgenden ist die Inbetriebnahme und Bedienung des Hochregallagers in stichpunktartiger Form dargestellt. Dabei wird nur auf die prinzipiell durchzuführenden Vorgänge eingegangen, nicht aber alle Einzelschritte erklärt. Es wird davon ausgegangen, dass eine komplett eingerichtete leJOS NXJ Entwicklungsumgebung zur Verfügung steht. 1. Den Quelltext aus dem src Verzeichnis der CD mit der aktuellen leJOS NXJ Version kompilieren und linken. 2. Die erhaltenen nxj-Dateien auf auf vier NXT Bausteine übertragen. 3. Über den Menüpunkt Bluetooth der leJOS Firmware sicherstellen, dass die NXT Bausteine sich untereinander erkennen. 4. Die NXT Bausteine nach der, in Tabelle B.1 gegebenen Anschlussbelegung, mit den Komponenten des Hochregallagers verbinden. 5. Die Programme auf den NXT Bausteinen starten. Dabei ist zu beachten, dass das Transportfahrzeug direkt vor dem Initialisierungsbereich positioniert ist, da dieses sofort damit anfängt zu dem Parkplatz zu fahren. 6. Über das Verbindungsmenü auf dem Controller Baustein die Bluetooth Verbindungen zu allen Komponenten aufbauen. 7. Es lässt sich nun über den Menüpunkt Betrieb auf dem Controller Baustein eine Einlagerung anstoßen. Dazu sollte sich eine Palette auf der Lastaufnahmeeinheit der Übergabestation befinden. 66 Literaturverzeichnis [Bag02] Bagnall, Brian: Core Lego Mindstorms Programming: Programming the RCX in Java. Prentice Hall International, 2002. – ISBN 978–0130093646 [Bag07] Bagnall, Brian: Maximum LEGO NXT: Building Robots with Java Brains. Variant Press, 2007. – ISBN 978–0973864915 [BDD+ 07] Boogaarts, Martijn ; Daudelin, Jonathan A. ; Davis, Brian L. ; Kelly, Jim ; Morris, Lou ; Rhodes, Fay ; Rhodes, Rick ; Scholz, Matthias P. ; Smith, Christopher R. ; Torok, Rob: The LEGO MINDSTORMS NXT Idea Book. Design, Invent, and Build: Design, Invent and Build. No Starch Press, 2007. – ISBN 978–1593271503 [Har03] Harder, Anatolij: Adaptive Antriebsregelung mit Positionsbestimmung für Roboterfußball – Anwendungen, Universität Paderborn, Diplomarbeit, 2003 [hrl01] Hochregallager Schmalgangsystem. http://www.ssi-schaefer.at/service/pdf/ Hochregallager.pdf. Version: 2001 [Hur06] Hurbain, Philippe E.: LEGO Rotation Sensor Internals. philohome.com/sensors/legorot.htm. Version: 2006 [lag83] Fachhandbuch Lagertechnik und Betriebseinrichtung. Verband für Lagertechnik und Betriebseinrichtungen, 1983 [lvs07] Leistungsbeschreibung Lagerverwaltungssystem. Lagerverwaltungssystem.pdf. Version: 2007 [Mar95] Martin, Fred G.: The Art of LEGO Design. In: The Robotics Practitioner: The Journal for Robot Builders 1 (1995), Nr. 2 [Pan02] Pantzer, Thomas: Echtzeit-Lernverfahren zur Fehlerbegrenzung und Driftkorrektur für Odometrie-basierte Lokalisierungsverfahren. http://www. ∼ informatik.uni-leipzig.de/ pantec/khepera/diffeq/. Version: 2002 [rcx07] LEGO MINDSTORMS Internals. http://www.crynwr.com/lego-robotics/. Version: 2007 [rfi03] RFID – Optimierung der Value Chain. http://www.gs1austria.at/epc/ downloads/MIP deutsch030505.pdf. Version: 2003 67 http://www. http://www.tw-online.de/ Literaturverzeichnis Literaturverzeichnis [SJ91] Schmidt, Rolf ; Jünemann, Reinhardt: Satellitenlagersysteme. Leistungsbestimmung und Betriebsstrategien. TÜV Media GmbH, 1991. – ISBN 978– 3824900367 [TBF05] Thrun, Sebastian ; Burgard, Wolfram ; Fox, Dieter: Probabilistic Robotics (Intelligent Robotics and Autonomous Agents). The MIT Press, 2005. – ISBN 978–0262201629 68