Diplomarbeit - Hochschule für Technik und Wirtschaft Dresden
Diplomarbeit - Hochschule für Technik und Wirtschaft Dresden
Diplomarbeit - Hochschule für Technik und Wirtschaft Dresden
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Hochschule</strong> <strong>für</strong> <strong>Technik</strong> <strong>und</strong> <strong>Wirtschaft</strong> <strong>Dresden</strong> (FH)<br />
Fachbereich Informatik / Mathematik<br />
<strong>Diplomarbeit</strong><br />
im Studiengang Informatik<br />
Thema: Konzeption eines offenen modularen Systems von Sensoren<br />
<strong>und</strong> Aktoren <strong>für</strong> den universellen Einsatz am Beispiel eines<br />
Roboters<br />
Eingereicht von: Daniel Popp<br />
Eingereicht am: 27.07.2004<br />
Betreuer: Prof. Dr. rer. nat. habil. Heino Iwe
<strong>Diplomarbeit</strong>: Modulares System Inhalt<br />
Inhaltsverzeichnis<br />
1. Einleitung................................................................................................................................... 5<br />
1.1. Roboter.............................................................................................................................. 5<br />
1.2. Steuerung.......................................................................................................................... 6<br />
1.3. Ziele .................................................................................................................................. 6<br />
2. Analyse der bestehenden Systeme <strong>und</strong> Konzepte von Robotern ................................................ 7<br />
2.1. Fixe Komplettsysteme........................................................................................................ 7<br />
2.1.1. Die historische Schildkröte „Elmer“.................................................................... 7<br />
2.1.2. Spider 3............................................................................................................ 8<br />
2.1.3. Beam-Roboter .................................................................................................. 8<br />
2.2. Einfache Eigenbausysteme................................................................................................ 8<br />
2.2.1. 80C535............................................................................................................. 9<br />
2.2.2. C-Control .......................................................................................................... 9<br />
2.2.3. Eigenbau D001................................................................................................. 9<br />
2.3. Programmierbare Komplettsysteme ................................................................................. 10<br />
2.3.1. LEGO Mindstorms .......................................................................................... 10<br />
2.3.2. fischertechnik.................................................................................................. 11<br />
2.3.3. Cybot.............................................................................................................. 11<br />
2.3.4. Khepera.......................................................................................................... 12<br />
2.3.5. Koala.............................................................................................................. 12<br />
2.4. Fazit ................................................................................................................................ 13<br />
3. Hardwareanalyse ..................................................................................................................... 14<br />
3.1. CISC................................................................................................................................ 14<br />
3.2. RISC................................................................................................................................ 14<br />
3.2.1. 32-Bit.............................................................................................................. 14<br />
3.2.2. 16-Bit.............................................................................................................. 15<br />
3.2.3. 8-Bit................................................................................................................ 15<br />
3.3. Wahl der Hardware .......................................................................................................... 15<br />
4. Datenstrukturen <strong>und</strong> Kommunikation........................................................................................ 16<br />
4.1. Die Elemente des Netzwerks ........................................................................................... 16<br />
4.1.1. Sensoren ........................................................................................................ 16<br />
4.1.2. Aktoren........................................................................................................... 18<br />
4.1.3. Weiterführende Elemente................................................................................ 19<br />
4.2. Datenmenge.................................................................................................................... 20<br />
4.3. Adressierung ................................................................................................................... 21<br />
4.3.1. Direkte Adressierung ...................................................................................... 21<br />
4.3.2. Gruppenadressierung ..................................................................................... 21<br />
4.3.3. Kombinierte Adressierung............................................................................... 22<br />
4.3.4. Adressierung im CAN-Bus .............................................................................. 23<br />
4.4. Adressierung im Netz....................................................................................................... 24<br />
26.07.2004 Seite 2 von 85
<strong>Diplomarbeit</strong>: Modulares System Inhalt<br />
4.5. Klassifizierung der Gruppentypen <strong>und</strong> ihrer Adressen ...................................................... 24<br />
4.6. Systemkommandos ......................................................................................................... 25<br />
5. Vergleich von Bussystemen <strong>für</strong> die Kommunikation.................................................................. 26<br />
5.1. Einteilung der Bussysteme............................................................................................... 26<br />
5.1.1. Parallele Bussysteme ..................................................................................... 27<br />
5.1.2. Serielle Bussysteme ....................................................................................... 27<br />
5.1.3. Serielle Betriebsarten...................................................................................... 28<br />
5.1.4. Symmetrische <strong>und</strong> asymmetrische serielle Schnittstellen ................................ 28<br />
5.1.5. Synchrone <strong>und</strong> asynchrone Übertragung ........................................................ 29<br />
5.1.6. Buszugriffsverfahren....................................................................................... 30<br />
5.1.7. Netzwerktopologien ........................................................................................ 30<br />
5.2. Das OSI-Schichtenmodell ................................................................................................ 32<br />
5.3. Überblick über gängige Bussysteme ................................................................................ 33<br />
5.3.1. Paralleler System-Bus PC............................................................................... 33<br />
5.3.2. Paralleler Peripherie-Bus SCSI ....................................................................... 34<br />
5.3.3. Paralleler Instrumentierungsbus IEC ............................................................... 34<br />
5.3.4. Serielle RS232................................................................................................ 34<br />
5.3.5. Serieller Komponenten-Bus I²C....................................................................... 34<br />
5.3.6. Serieller Peripherie-Bus USB .......................................................................... 34<br />
5.3.7. Serieller Feldbus CAN..................................................................................... 35<br />
5.3.8. Serielles Ethernet ........................................................................................... 35<br />
5.3.9. Übersicht ........................................................................................................ 36<br />
5.4. Auswahl des verwendeten Busses................................................................................... 37<br />
6. Programmierung der Knotenpunkte.......................................................................................... 39<br />
6.1. Die Programmiersprache PL0 .......................................................................................... 40<br />
6.2. Beispielanwendung.......................................................................................................... 41<br />
6.2.1. Zentrales Programm ....................................................................................... 42<br />
6.2.2. Verteiltes Programm ....................................................................................... 43<br />
6.3. Umsetzung ...................................................................................................................... 44<br />
6.3.1. Der Compiler .................................................................................................. 44<br />
6.3.2. Die Virtuelle Maschine .................................................................................... 46<br />
6.4. Zusammenfassung .......................................................................................................... 48<br />
7. Testen der Steuerungsskripte im Simulator .............................................................................. 49<br />
7.1. Vergleich verschiedener Simulatoren ............................................................................... 49<br />
7.1.1. LLWin............................................................................................................. 49<br />
7.1.2. Webot............................................................................................................. 50<br />
7.1.3. Easybot .......................................................................................................... 50<br />
7.1.4. Netbot............................................................................................................. 51<br />
7.2. Arbeiten mit der Virtuellen Maschine ................................................................................ 52<br />
7.2.1. Aufbau der VM.DLL ........................................................................................ 52<br />
26.07.2004 Seite 3 von 85
<strong>Diplomarbeit</strong>: Modulares System Inhalt<br />
7.2.2. Verwendung der VM.DLL................................................................................ 53<br />
7.3. Easybot ........................................................................................................................... 53<br />
7.3.1. Lightvision3D.................................................................................................. 53<br />
7.3.2. Easybot .......................................................................................................... 54<br />
7.3.3. Netzwerk ........................................................................................................ 55<br />
7.3.4. Khepera-Steuerung: Khepera_VM.DLL ........................................................... 55<br />
7.3.5. Cybot-Steuerung: Cybot_VM.DLL ................................................................... 56<br />
7.3.6. Offene Steuerung: Multi_VM.DLL.................................................................... 57<br />
7.4. Netbot.............................................................................................................................. 58<br />
7.4.1. Netzwerk ........................................................................................................ 58<br />
7.4.2. Knotenpunkte ................................................................................................. 59<br />
7.5. Fazit ................................................................................................................................ 61<br />
8. Praktische Anwendung............................................................................................................. 62<br />
8.1. Funktionalität der Knotenpunkte....................................................................................... 62<br />
8.1.1. Gr<strong>und</strong>umfang.................................................................................................. 62<br />
8.1.2. Knotentypspezifische Fähigkeiten ................................................................... 63<br />
8.1.3. Programmierbarkeit ........................................................................................ 63<br />
8.2. Programmierung <strong>und</strong> Steuerung vom Computer aus........................................................ 64<br />
8.2.1. Firmware ........................................................................................................ 64<br />
8.2.2. Skript .............................................................................................................. 64<br />
8.2.3. Parameter....................................................................................................... 64<br />
8.2.4. Codierung....................................................................................................... 64<br />
8.3. Beispielanwendung: Ausweichen ..................................................................................... 65<br />
8.3.1. Software ......................................................................................................... 66<br />
8.3.2. Aufbau............................................................................................................ 67<br />
8.3.3. Erweiterung .................................................................................................... 67<br />
9. Ergebnisse <strong>und</strong> Ausblick.......................................................................................................... 69<br />
9.1. Ergebnisse....................................................................................................................... 69<br />
9.2. Ausblick........................................................................................................................... 70<br />
Thesen............................................................................................................................................. 71<br />
Anhang ............................................................................................................................................ 72<br />
CD-Inhalt.......................................................................................................................................... 79<br />
Quellenverzeichnis........................................................................................................................... 80<br />
Abbildungs- <strong>und</strong> Tabellenverzeichnis ............................................................................................... 81<br />
Abkürzungsverzeichnis..................................................................................................................... 83<br />
Glossar ............................................................................................................................................ 84<br />
Erklärung zur Selbstständigkeit ........................................................................................................ 85<br />
26.07.2004 Seite 4 von 85
<strong>Diplomarbeit</strong>: Modulares System Einleitung<br />
1. Einleitung<br />
Ziel dieser <strong>Diplomarbeit</strong> ist es, ein Konzept <strong>für</strong> ein System von Sensoren (z.B. Entfernungsmesser<br />
oder Bewegungsmelder) <strong>und</strong> Aktoren (z.B. Motoren oder Lampen) zu schaffen, so dass diese beliebig<br />
miteinander kombinierbar <strong>und</strong> einzeln programmierbar sind, um die einzelnen Elemente steuern <strong>und</strong><br />
regeln zu können. Damit soll es möglich sein, ein „intelligentes“ Netzwerk mit einfachen Mitteln zu<br />
schaffen. Als Einsatzgebiete <strong>für</strong> dieses Netzwerk sind sowohl Steuerungsanlagen <strong>für</strong> räumlich<br />
ausgedehnte Objekte (z.B. Haussteuerung <strong>für</strong> Licht oder Heizung) als auch mobile Roboter denkbar.<br />
In dieser Arbeit stehen Roboter im Mittelpunkt der Entwicklung, dabei wird jedoch immer der Einsatz<br />
als Haussteuerung im Auge behalten.<br />
Die räumliche Anordnung der einzelnen Elemente <strong>und</strong> das Aussehen des Roboters spielt mit diesem<br />
Netzwerk keine Rolle mehr. Es kann jederzeit geändert <strong>und</strong> durch neue Elemente ergänzt werden.<br />
Diese lassen sich nahtlos in bestehende Systeme integrieren. Vor allem ist angestrebt, dass es keine<br />
Beschränkung in der Anzahl der anschließbaren Sensoren <strong>und</strong> Aktoren gibt. Die Programmierung der<br />
einzelnen Elemente soll in einer einfachen Skriptsprache möglich sein.<br />
1.1. Roboter<br />
Der Begriff Roboter leitet sich vom tschechischen „robota“ ab, was soviel wie „schwere Arbeit“ oder<br />
„Sklavenarbeit“ bedeutet. Geprägt hat diesen Ausdruck der tschechische Bühnenautor Karel Capek<br />
1921 durch sein Theaterstück „W.U.R.“ (Werstands Universal Robots). Er erdachte damit künstliche<br />
Wesen, die vor allem den Menschen imitieren, lange vor Wissenschaftlern. 1932 beeindruckte dann<br />
der Roboter Alpha die Besucher der Funkausstellung in Olympia/London. Er konnte einen Revolver<br />
abfeuern, mit Besuchern reden <strong>und</strong> Text in jeder Sprache lesen. Wie die Funkausstellung hatte kurze<br />
Zeit später jeder Jahrmarkt <strong>und</strong> jede Ausstellung, die etwas auf sich hielt, ihren eigenen Roboter.<br />
Diese riefen damals viel Aufsehen hervor, können aber, aus heutiger Sicht betrachtet, nur<br />
Fälschungen gewesen sein. Der erste wissenschaftliche Roboter wurde 1938 von Thomas Ross in<br />
Amerika entwickelt. Es handelte sich dabei um eine kleine Maschine, die wie eine Maus durch<br />
Versuch <strong>und</strong> Irrtum lernend, den Weg aus einem Labyrinth herausfand. Die Entwicklung<br />
hochkomplexer Roboter, wie dem ASIMO von Honda oder SDR <strong>und</strong> AIBO von Sony, werden von<br />
großen Firmen mit Millionenbudgets vorangetrieben. Auch im Heimbereich sind Roboter immer mehr<br />
im kommen. Sie übernehmen bereits heute einfache Aufgaben wie beispielsweise Staubsaugen. Die<br />
Faszination Roboter erfasst aber auch viele Amateure, die mit ihren eigenen Mitteln einfache Roboter<br />
schaffen <strong>und</strong> mit ihnen experimentieren.<br />
26.07.2004 Seite 5 von 85
<strong>Diplomarbeit</strong>: Modulares System Einleitung<br />
1.2. Steuerung<br />
Die heute auf dem Markt befindlichen Robotersysteme sind zum größten Teil entweder sehr<br />
spezialisiert, kostenintensiv oder relativ schwer zu beherrschen. Dadurch ist es <strong>für</strong> den Robotiker im<br />
nichtprofessionellen Bereich recht schwer, ein passendes System <strong>für</strong> sich zu finden. Der größte<br />
Nachteil liegt meist in der begrenzten Anzahl anschließbarer Sensoren <strong>und</strong> Aktoren beziehungsweise<br />
in der teilweise recht komplexen Entwicklungsumgebung.<br />
Die Steuerung von Robotern erfordert ein hohes Maß an Verständnis <strong>für</strong> die jeweilig verwendete<br />
Hardware <strong>und</strong> eine Einarbeitung in die entsprechende Entwicklungsumgebung. Die Umsetzung auf<br />
einen anderen Roboter oder auch nur die Verwendung eines neuen Prozessors bringt umfangreiche<br />
Anpassungen mit sich.<br />
1.3. Ziele<br />
Als Ergebnis der Arbeit sollen Sensoren wie Entfernungsmesser <strong>und</strong> Aktoren wie Motoren auf<br />
einfache Weise miteinander vernetzt werden können. Dieses Netz soll die Steuerung eines Roboters<br />
übernehmen. Jedes Element soll ein eigenes einfach zu entwickelndes Programm ausführen können<br />
<strong>und</strong> über ein geeignetes Verbindungssystem mit den anderen kommunizieren können. Dabei soll das<br />
Netzwerk in seiner Gesamtheit von der Anzahl der Elemente weitestgehend unabhängig funktionieren<br />
können. Der Ausfall eines Knotens soll das Netzwerk nicht stören, sondern nur die Steuerprogramme,<br />
die ihn benötigen, sollen beeinträchtigt werden. Der Rest muss ungestört davon weiter funktionieren.<br />
Durch die Verwendung einer eigenen einfachen Skriptsprache <strong>und</strong> die Einbindung einer virtuellen<br />
Maschine in die Robotersteuerung sollen die Probleme, die sich mit Weiterentwicklungen <strong>und</strong><br />
Veränderungen der Hardware ergeben, verringern<br />
Um Steueralgorithmen testen zu können, ohne jedes Mal das Modell aufbauen zu müssen, soll eine<br />
Möglichkeit geschaffen werden, diese am Computer zu testen <strong>und</strong> in einer simulierten Umgebung<br />
ablaufen zu lassen.<br />
26.07.2004 Seite 6 von 85
<strong>Diplomarbeit</strong>: Modulares System Analyse bestehender Robotersysteme<br />
2. Analyse der bestehenden Systeme <strong>und</strong> Konzepte von Robotern<br />
Es gibt auf dem Markt eine Vielzahl von mobilen <strong>und</strong> stationären Robotern. Sie sind speziell auf den<br />
jeweiligen K<strong>und</strong>enwunsch angepasst <strong>und</strong> entwickelt <strong>und</strong> entsprechend kostenintensiv. In der<br />
folgenden Aufstellung geht es vielmehr um einfache Robotersysteme, die auch <strong>für</strong> den<br />
„Heimgebrauch“ vorstellbar wären. Verglichen werden hierbei vor allem die Anpassbarkeit der Roboter<br />
an neue Aufgaben <strong>und</strong> die Art <strong>und</strong> Weise der Steuerung. Reine Industriespeziallösungen werden<br />
hierbei außen vor gelassen.<br />
2.1. Fixe Komplettsysteme<br />
Beliebt bei Hobbyrobotikern sind Systeme, die nur zusammengebaut werden müssen <strong>und</strong> dann eine<br />
ganz bestimmte Aufgabe erfüllen. Da sie meist nicht programmierbar sind, ist dieses Konzept nicht<br />
geeignet, um Roboter zu entwickeln, die auf neue Aufgabengebiete einstellbar sind. Dadurch, dass<br />
komplett alles vorbereitet ist, werden kaum Kenntnisse von Mechanik <strong>und</strong> Programmierung benötigt<br />
<strong>und</strong> sie bieten somit einen leichten Einstieg in die Thematik.<br />
2.1.1. Die historische Schildkröte „Elmer“<br />
Aus den Anfängen der mobilen Steuerung stammen Bauanleitungen <strong>für</strong> einfache Steuerungen, die ein<br />
tierhaftes Verhalten nachahmen. Besonders beliebt war die Schildkröte Elmer nach Grey Walter aus<br />
dem Jahr 1949. Sie hatte nur die Aufgabe Licht zu suchen <strong>und</strong> Hindernissen auszuweichen. Das<br />
erreichte sie mit einer einfachen Schaltung aus einer handvoll elektronischer Bauteile wie Transistoren<br />
<strong>und</strong> Widerständen. Sie kam komplett ohne Speicher oder Prozessoren aus, sondern reagierte nur<br />
mittels ihrer Schaltung direkt auf die Umgebung. [bb]<br />
Abbildung 2.1 - Die elektronische Schildkröte „Elmer“<br />
26.07.2004 Seite 7 von 85
<strong>Diplomarbeit</strong>: Modulares System Analyse bestehender Robotersysteme<br />
2.1.2. Spider 3<br />
Der Spider ist „Elmer“ sehr ähnlich. Im Gegensatz zur radgetriebenen Schildkröte besitzt er sechs<br />
Beine, die über zwei Motoren bewegt werden <strong>und</strong> über einen Entfernungssensor an der Spitze. Eine<br />
einfache Mikrocontrollersteuerung ermöglicht es ihm, Hindernissen auszuweichen. Da das Model über<br />
einen Controller, etwas Speicher <strong>und</strong> eine komplexere Schaltung als die Schildkröte verfügt, könnten<br />
damit eigene Anwendungen realisiert werden. Durch die geringe Anzahl der Sensoren (einer) <strong>und</strong><br />
Motoren (zwei) ist natürlich kaum eine andere Anwendung als die vorgesehene sinnvoll. [spid]<br />
Abbildung 2.2 - Der Laufroboter Spider<br />
2.1.3. Beam-Roboter<br />
Die modernste <strong>und</strong> interessanteste Variante von Robotern ohne komplizierte Steuerung sind Beam-<br />
Roboter. Sie sind besonders klein <strong>und</strong> funktionieren, einmal gestartet, komplett autark. So besitzen sie<br />
eine einfache Elektronik ohne Controller <strong>und</strong> oft eine Solarzelle. Beam-Roboter besitzen ein spezielles<br />
„Gehirn“, BiCore genannt, welches von Mark Tilden entwickelt wurde <strong>und</strong> lediglich aus einigen<br />
Logikschaltkreisen besteht. Es soll insektoides Verhalten nachahmen <strong>und</strong> ist <strong>für</strong> komplexere Aufgaben<br />
leider nicht geeignet. [beam]<br />
Abbildung 2.3 - Der Beamroboter UniBug<br />
2.2. Einfache Eigenbausysteme<br />
Es gibt unzählige Anleitungen um sich einen Roboter selbst zu bauen. Dabei wird im Allgemeinen von<br />
mobilen sich selbst steuernden Fahrzeugen ausgegangen. Die Mechanik wird dabei in der Werkstatt<br />
meist selbst zusammengebastelt <strong>und</strong> von einer Zentraleinheit gesteuert. Sensoren <strong>und</strong> Aktoren<br />
werden dabei meist direkt an diese „CPU“ angeschlossen.<br />
26.07.2004 Seite 8 von 85
<strong>Diplomarbeit</strong>: Modulares System Analyse bestehender Robotersysteme<br />
2.2.1. 80C535<br />
Auf Basis des SAB80C535-Mikrocontrollers sind verschiedene Steuerungen entstanden, die über<br />
gängige Schnittstellen verfügen (RS232, RS485, CAN). Der 80C535 ist ein 12 beziehungsweise 16<br />
MHz-Mikrocontroller von Infineon <strong>für</strong> den es Compiler in verschiedenen Sprachen (C, Pascal) gibt. Er<br />
muss separat programmiert werden, ist dadurch zwar sehr flexibel aber auch recht umständlich <strong>und</strong><br />
nur <strong>für</strong> erfahrene Entwickler geeignet. Sensoren <strong>und</strong> Aktoren werden üblicherweise direkt an den<br />
Controller angeschlossen. [C535]<br />
Abbildung 2.4 - Ein Mikrocontrollerboard 80C535<br />
2.2.2. C-Control<br />
Dieses von Conrad-Elektronik angebotene umfangreiche System ist durch den kommerziellen Druck<br />
weit entwickelt, aber natürlich auch recht kostenintensiv. Den Kern bildet ein 4 MHz-Mikrocontroller<br />
von Motorola. Um diesen sind in verschiedenen Ausführungen fertige Boards <strong>für</strong> unterschiedliche<br />
Anwendungen erhältlich. Größter Nachteil ist hier zum einen der Kostenfaktor <strong>und</strong> zum anderen die<br />
begrenzte Anschlussmöglichkeit von Sensoren <strong>und</strong> Aktoren, die direkt an das Zentralmodul<br />
angeschlossen werden. Programmiert wird das C-Control in der Sprache BASIC. [ccon]<br />
Abbildung 2.5 - Das System C-Control<br />
2.2.3. Eigenbau D001<br />
Der D001 ist ein Beispiel <strong>für</strong> einen r<strong>und</strong>en, dreirädrigen Roboter der zu Test- <strong>und</strong><br />
Experimentierzwecken entstanden ist. Als Kern dient ein 12 MHz Intel 80C51GB, der durch<br />
entsprechende Sensoren <strong>und</strong> Aktoren erweitert wurde. Für die Verbindung mit anderen Robotern<br />
wurde ein CAN-Bus integriert. Der D001 ist in seinen mechanischen <strong>und</strong> sensorischen Fähigkeiten<br />
festgelegt <strong>und</strong> kaum erweiterbar. In dieser oder einer ähnlichen Form existieren zahllose Roboter, die<br />
alle zueinander inkompatibel sind, aber im Gr<strong>und</strong>e die gleichen Ziele verfolgen. [d001]<br />
26.07.2004 Seite 9 von 85
<strong>Diplomarbeit</strong>: Modulares System Analyse bestehender Robotersysteme<br />
Abbildung 2.6 - Der D001-Experimentierroboter<br />
2.3. Programmierbare Komplettsysteme<br />
Da die vorigen Komplettsysteme kaum Raum <strong>für</strong> eigene Kreativität bieten <strong>und</strong> die Eigenbausysteme<br />
teils hohe mechanische Fertigkeiten erfordern, gibt es eine Reihe von fertigen Systemen, die frei<br />
programmierbar sind. Im Allgemeinen beschäftigen sie sich mit Fahrzeugsteuerungen <strong>und</strong> ermögliche<br />
es beispielsweise, Wegsuchalgorithmen zu testen.<br />
2.3.1. LEGO Mindstorms<br />
Die Firma LEGO aus Dänemark ist eigentlich ein Hersteller von Spielzeugkästen <strong>für</strong> Plastikbausteine.<br />
Vor ein paar Jahren begann sie, neue Märkte zu erschließen. Dazu gehören auch Robotersysteme.<br />
Mindstorms ist ein einfach zu bedienendes System welches durch die bekannten LEGO-Bausteine<br />
den schnellen Aufbau von Mechaniken <strong>und</strong> Fahrwerken ermöglicht. Die Steuerung übernimmt eine<br />
zentrale Einheit namens RCX, <strong>für</strong> die in einer grafischen Programmiersprache einfache Programme<br />
per Mausklick erstellt werden können. Es gibt eine Reihe von verschiedenen Sensoren, die direkt an<br />
das RCX angeschlossen werden. Leider ist es nur mit je drei Sensor- <strong>und</strong> Motoranschlüssen<br />
ausgestattet. Zwar lassen sich mehrere Geräte zusammenschalten um komplexere Aufgaben zu<br />
realisieren, aber sie müssen dann in einer speziellen C-ähnlichen Sprache programmiert werden.<br />
Außerdem sind die Kosten <strong>für</strong> die RCX recht erheblich. Alles in allem handelt es sich hierbei aber um<br />
ein gutes variables System, um in die Gr<strong>und</strong>lagen der Robotik einzusteigen <strong>und</strong> mit den<br />
verschiedensten Roboterarten zu experimentieren. [lego]<br />
Abbildung 2.7 - Ein LEGO-Roboter<br />
26.07.2004 Seite 10 von 85
<strong>Diplomarbeit</strong>: Modulares System Analyse bestehender Robotersysteme<br />
2.3.2. fischertechnik<br />
Die deutsche Firma fischertechnik beschäftigt sich wie LEGO mit der Herstellung von<br />
Modellbaukästen, wobei das Augenmerk mehr auf Industriesimulationen gelegt wird. Ansonsten sind<br />
sich die Angebote sehr ähnlich <strong>und</strong> auch das Konzept <strong>für</strong> Roboter ist vergleichbar. Eine zentrale<br />
Einheit steuert eine begrenzte Anzahl von Sensoren <strong>und</strong> Aktoren. Diese ist bei fischertechnik deutlich<br />
höher als bei LEGO, aber da<strong>für</strong> ist die ebenfalls grafisch orientierte Entwicklungsumgebung sehr<br />
komplex <strong>und</strong> <strong>für</strong> Einsteiger teilweise schwer verständlich. Vorteilhaft ist, dass sie einen integrierten<br />
Simulator enthält. Dadurch müssen die Programme nicht am fertigen Modell getestet werden. Wie<br />
LEGO ist das fischertechnik-System <strong>für</strong> Bastler gut geeignet, wobei diese schon Vorkenntnisse in<br />
Programmierung beziehungsweise in Programmablaufsteuerungen mitbringen sollten. [fisch]<br />
2.3.3. Cybot<br />
Abbildung 2.8 - Ein Laufroboter mit fischertechnik<br />
Der Cybot ist als Lernspielzeug konzipiert <strong>und</strong> wird als Abonnement-Heft vertrieben. Durch monatlich<br />
neue Anbauteile wächst das System mit der Zeit immer mehr an. Mit einer Vielzahl von Sensoren <strong>und</strong><br />
Controllern wäre er recht gut geeignet um eigene Anwendungsgebiete zu erschließen. Lediglich die<br />
mechanischen Gegebenheiten (Dreiradsystem <strong>und</strong> Sensoren in einem Autochassis) sind bindend.<br />
Leider sind die Controller nicht frei programmierbar, sondern enthalten lediglich vorprogrammierte<br />
Steuerungsmechanismen. Am Computer können jedoch eigene einfache Programme entwickelt <strong>und</strong><br />
auf dem Fahrzeug abgelaufen lassen werden. [rr]<br />
Abbildung 2.9 - Der Cybot<br />
26.07.2004 Seite 11 von 85
<strong>Diplomarbeit</strong>: Modulares System Analyse bestehender Robotersysteme<br />
2.3.4. Khepera<br />
Um Steueralgorithmen <strong>für</strong> autonome Roboter testen zu können, wurde in der Schweiz der Khepera<br />
entwickelt. Er ist ein sehr kleines mobiles Fahrzeug, welches über einige Sensoren <strong>und</strong> zwei Motoren<br />
verfügt. Im Kern steckt ein sehr leistungsfähiger 25 MHz Motorola Controller welcher mit C<br />
programmiert werden kann. Durch seine Größe (70mm x 30mm) <strong>und</strong> eine Vielzahl von Anbauteilen<br />
(Zeilenkamera, Greifarm) können Experimente, die eine reale Umgebung simulieren, sehr gut auf<br />
kleinem Raum durchgeführt werden. Durch seine kompakte Bauweise ist er aber mechanisch kaum<br />
änderbar. [kt]<br />
2.3.5. Koala<br />
Abbildung 2.10 - Der Miniaturroboter Khepera<br />
Der Koala ist der große Bruder des Khepera. Er besteht aus einem Autochassis, in dem ein 22 MHz<br />
Motorola Controller montiert ist <strong>und</strong> verfügt über eine Reihe von Infrarot- <strong>und</strong> Sonarsensoren. Der<br />
Koala ist da<strong>für</strong> gedacht, Experimente in maßstabsgerechten Umgebungen zu ermöglichen. Er ist <strong>für</strong><br />
Tests verschiedener Algorithmen vorbereitet, die eine Steuerung von autonomen Fahrzeugen<br />
ermöglichen sollen. Es werden sowohl C als auch LabVIEW oder MATLAB-Programme unterstützt. Er<br />
entspricht in seinen Funktionen weitestgehend dem Khepera, ist aber größer <strong>und</strong> massiver angelegt<br />
<strong>und</strong> besitzt ein geländegängiges Fahrwerk. Der Koala bietet schon viel Raum <strong>für</strong> eigene<br />
Anwendungen, ist aber als Fahrzeug festgelegt <strong>und</strong> ermöglicht daher kaum abweichende<br />
Experimente.[kt]<br />
Abbildung 2.11 - Der Autoroboter Koala<br />
26.07.2004 Seite 12 von 85
<strong>Diplomarbeit</strong>: Modulares System Analyse bestehender Robotersysteme<br />
2.4. Fazit<br />
Auch wenn es eine Vielzahl von Robotersystemen käuflich zu erwerben gibt, so haben doch alle mehr<br />
oder weniger große Nachteile aufzuweisen. Die meisten Systeme sind zu starr in ihren Möglichkeiten.<br />
Am schwersten wiegt dabei die Beschränkung in der Anzahl der Sensoren <strong>und</strong> Aktoren. Um ein<br />
Fahrzeug zu steuern sind ein paar wenige Sensoren sicher ausreichend <strong>und</strong> es werden auch nur zwei<br />
Motoren benötigt. Um einen komplexeren Roboter oder auch nur einen Teil wie beispielsweise einen<br />
Arm bauen zu können, sind aber wesentlich mehr Elemente nötig.<br />
Systeme wie der Khepera <strong>und</strong> der Koala bieten durch ihre leistungsfähigen Prozessoren viel Raum <strong>für</strong><br />
Experimente. Für ihre Aufgaben verfügen sie über ausreichend viele Sensoranschlüsse<br />
beziehungsweise ein eigenes Bussystem. Mit Kameras <strong>und</strong> Greifarmen als Anbauteilen sind sie gut<br />
ausgestattet. Aber zum einen erfordern sie eine eigene spezifische Programmierung <strong>und</strong> zum<br />
anderen können eben nur Fahrzeuge gebaut werden. Eine komplexere Steuerung wird wieder sehr<br />
aufwendig oder muss als Komplettmodul gekauft werden, was die Kosten erhöht.<br />
Ein verteiltes Netzwerk von Sensoren <strong>und</strong> Aktoren bietet dagegen die Möglichkeit, diese Probleme<br />
weitestgehend zu lösen. Die Kosten sind im Vergleich zu den meisten Systemen geringer <strong>und</strong> durch<br />
den dynamischen variablen Aufbau lassen sich alle denkbaren Roboter entwickeln. Es kann in<br />
vorhandene Mechaniken wie dem Cybot-Fahrwerk installiert werden oder auch auf völlig neu<br />
entwickelte, wie sie zum Beispiel mit LEGO-Bausteinen möglich sind. Dadurch kann jeder beliebige<br />
Roboter erdacht <strong>und</strong> realisiert werden.<br />
26.07.2004 Seite 13 von 85
<strong>Diplomarbeit</strong>: Modulares System Hardwareanalyse<br />
3. Hardwareanalyse<br />
Um einen Roboter zu steuern, gibt es unterschiedliche Herangehensweisen. Zum einen kann die<br />
Steuerung über ein rechenstarkes zentrales Element erfolgen <strong>und</strong> zum anderen durch eine Vielzahl<br />
kleinerer Prozessoren.<br />
Es existieren zwei unterschiedliche Philosophien <strong>für</strong> Prozessor-Architekturen. Dies sind auf der einen<br />
Seite die CISC (komplexer Befehlssatz mit über 100 Maschinenbefehlen), auf denen auch die<br />
Prozessoren in Personalcomputern aufbauen. Andererseits gibt es die RISC (reduzierter Befehlssatz<br />
mit weniger als 100 Befehlssätzen) mit den Erweiterungen ARM oder POWER-PC. Die Prozessoren<br />
in PDA (mobile Miniaturcomputer) sind meist ARM.<br />
3.1. CISC<br />
Neben den sehr leistungsstarken Computerprozessoren, die allerdings ohne jede Peripherie<br />
ausgeliefert werden, existieren noch so genannte Miniatur-PC die schon über die Gr<strong>und</strong>bausteine<br />
verfügen, die <strong>für</strong> den Betrieb benötigt werden. Dabei haben sich zwei Bereiche herausgebildet, die<br />
sich aber hauptsächlich im mechanischen Aufbau <strong>und</strong> in der Wahl der Anschlüsse unterscheiden.<br />
Dies sind PC/104 <strong>und</strong> Dimm-PC. Sie können Prozessoren von 386SX mit 40MHz bis 1GHz-Celeron<br />
enthalten <strong>und</strong> verfügen über Grafikkarten <strong>und</strong> die herkömmlichen PC-Busse, so dass sie wie ein<br />
normaler PC betrieben <strong>und</strong> auch programmiert werden können. Lediglich die Baugröße unterscheidet<br />
sich. Dimm-PC können etwa eine Größe von 8x8cm haben <strong>und</strong> PC/104-Module sind mit unter<br />
10x10cm kaum größer. Auf diesen Geräten können natürlich prinzipiell die gleichen Betriebssysteme<br />
laufen, wie auf den herkömmlichen Computern. Die Kosten <strong>für</strong> einen solchen Miniaturcomputer liegen<br />
zwischen 150 <strong>und</strong> 400 Euro, je nach Leistungsfähigkeit.<br />
3.2. RISC<br />
Neben der Architektur ist auch die Prozessor- beziehungsweise die Registergröße entscheidend <strong>für</strong><br />
die Leistungsfähigkeit des Gerätes. Die kleinsten Einheiten besitzen ein 8-Bit-Register <strong>und</strong> die<br />
größten sind derzeit mit 64-Bit-Registern ausgestattet.<br />
3.2.1. 32-Bit<br />
RISC-Controller mit 32-Bit-Registern sind derzeit stark im kommen. Sie haben eine hohe<br />
Reichenleistung <strong>und</strong> können im Prinzip das gleiche leisten, wie ein Computerprozessor. Es gibt <strong>für</strong> sie<br />
inzwischen Anpassungen der gängigen Betriebssysteme wie Microsoft Windows CE, Palm OS oder<br />
Linux. Sie haben Taktfrequenzen von 150 bis 400MHz <strong>und</strong> können sich damit zumindest auf dem<br />
Mobilsektor mit den Personalcomputern messen. Prozessoren dieser Größenordnung werden zum<br />
Beispiel in fast allen PDA (mobile Miniaturcomputer) verwendet. Die Preise fangen bei ca. 100 Euro<br />
<strong>für</strong> fertige Boards an, bei denen die nötige Peripherie schon enthalten ist.<br />
26.07.2004 Seite 14 von 85
<strong>Diplomarbeit</strong>: Modulares System Hardwareanalyse<br />
3.2.2. 16-Bit<br />
Die 16-Bit-Prozessoren sind im Mittelfeld eingeordnet. Sie haben eine höhere Leistung als die kleinen<br />
8-Bit-Einheiten, kommen aber bei weitem nicht an die Leistungsfähigkeit der 32-Bit-Controller heran.<br />
Sie verfügen neben einem internen Speicher über einen programmierbaren Speicherbaustein<br />
(EEPROM oder Flash) auf dem die Programme abgelegt werden. Sie können Geschwindigkeiten<br />
zwischen 8 <strong>und</strong> 60 MHz aufweisen <strong>und</strong> besitzen <strong>für</strong> den Betrieb gängiger Bustypen (z.B. RS232 oder<br />
CAN) die nötigen Voraussetzungen. Sie sind mit 30-50€ schon deutlich preisgünstiger.<br />
3.2.3. 8-Bit<br />
Dies ist die Familie der kleinsten verfügbaren Controller. Sie besitzen nur sehr wenig Arbeitsspeicher<br />
(bis 128kByte) <strong>und</strong> verfügen ebenfalls über einen programmierbaren Speicherbaustein. Der Preis (3-<br />
10€) wird durch die Speichergröße <strong>und</strong> die Anzahl der Anschlüsse bestimmt. Je mehr Anschlüsse ein<br />
Controller hat, desto mehr Peripherie kann er verwalten. Für die gängigen Bussysteme existieren<br />
auch hier die nötigen Voraussetzungen.<br />
3.3. Wahl der Hardware<br />
Auch wenn Prozessoren der CISC oder auch die großen RISC-Rechner sehr leistungsstark sind,<br />
fallen sie durch ihren hohen Preis als Knotenpunkte aus. Sie sind nur geeignet, um als zentrale<br />
Steuereinheit zu dienen. Eine einfache Fahrsteuerung besteht schon aus wenigstens drei Elementen:<br />
ein Entfernungsmesser, der nach vorn gerichtet ist <strong>und</strong> zwei Motoren <strong>für</strong> den Antrieb. Sollen diese<br />
jeweils mit einer eigenen Steuerung versehen werden, steigen die Kosten enorm an (zwischen 150<br />
<strong>und</strong> 500 Euro). Außerdem bieten sie extrem viele Möglichkeiten, die in solch einem Netzwerk<br />
überhaupt nicht benötigt werden. Nicht jeder Knotenpunkt muss zum Beispiel einen Bildschirm<br />
ansteuern können oder Emails verschicken, wie es große Prozessoren mit einem entsprechenden<br />
Betriebssystem wie beispielsweise Microsoft Windows CE können.<br />
Die richtige Wahl ist ein preisgünstiger Mikrocontroller mit 8-Bit-RISC-Architektur. Sie haben zwar<br />
wesentlich weniger Speicher <strong>und</strong> bieten nicht die gleichen Möglichkeiten wie ein großer Controller,<br />
aber die Leistung reicht aus, um eine oder auch mehrere Virtuelle Maschine zu betreiben, die<br />
angeschlossenen Sensoren <strong>und</strong> Aktoren zu bedienen <strong>und</strong> die Kommunikation mit dem Netzwerk zu<br />
übernehmen. Die Steuerung eines Roboters, wie dem Khepera mit seinen zwei Motoren <strong>und</strong> acht<br />
Entfernungsmessern ist mit zehn Mikrocontrollern realisierbar, die im Einzelstückpreis bei ca. 5 Euro<br />
liegen. Die gesamte Rechenleistung der Steuerung ist damit <strong>für</strong> ca. 50 Euro zu haben. Stattdessen<br />
einen zentralen Prozessor <strong>für</strong> diesen Preis zu bekommen, erweist sich bereits schwierig. Er könnte<br />
auch nicht ohne weiteres um neue Fähigkeiten erweitert werden, was mit dem Netzwerk kleiner<br />
preiswerter Elemente kein Problem ist.<br />
26.07.2004 Seite 15 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
4. Datenstrukturen <strong>und</strong> Kommunikation<br />
Um die Kommunikation zwischen den Elementen eines verteilten Netzwerks in einem Roboter sinnvoll<br />
gestalten zu können, müssen die Informationsmengen <strong>und</strong> Strukturen bekannt sein. Je nach Typ<br />
können <strong>und</strong> müssen die unterschiedlichsten Informationen ausgetauscht werden.<br />
4.1. Die Elemente des Netzwerks<br />
In einem herkömmlichen Roboter übernimmt eine zentrale Recheneinheit die Steuerung. An sie sind<br />
meist direkt die Sensoren <strong>und</strong> Aktoren angeschlossen. Diese entsprechen weitestgehend jenen, die<br />
auch in einem Netzwerk von selbst steuernden Sensoren <strong>und</strong> Aktoren eingesetzt werden.<br />
4.1.1. Sensoren<br />
Das Wort Sensor ist vom Lateinischen „sentio“ abgeleitet, was soviel wie fühlen oder wahrnehmen<br />
bedeutet. Ein Sensor ist also eine Einrichtung, um etwas wahrzunehmen. Die <strong>Technik</strong> ist dabei<br />
bestrebt, die vorhandenen Sensoren (auch Rezeptoren genannt) der Natur nachzuahmen. Der<br />
Mensch besitzt fünf so genannte Sinne: sehen, hören, fühlen, schmecken <strong>und</strong> riechen. Des Weiteren<br />
gibt es noch den Gleichgewichtssinn, der aber kein dem Menschen permanent bewusster Sinn ist <strong>und</strong><br />
den Temperatursinn. Dazu kommen noch einige aus der Natur, die ein Mensch so nicht besitzt, wie<br />
zum Beispiel: Ultraschall bei Fledermäusen <strong>und</strong> Delphinen, Magnetfeldorientierung bei Vögeln oder<br />
Tag-Nacht-Rhythmus bei einigen Pflanzen (in einem abgedunkelten Raum zu beobachten). Die<br />
meisten dieser Fähigkeiten sind sehr komplex <strong>und</strong> erfordern sehr viel Rechenaufwand bei der<br />
Auswertung. Daher werden weltweit Sensoren entwickelt, die ein sehr eng umgrenztes<br />
Aufgabengebiet haben. Dazu müssen die natürlichen Fähigkeiten der Menschen, Tiere <strong>und</strong> Pflanzen<br />
näher betrachtet, vereinfacht <strong>und</strong> nach Möglichkeit zusammengefasst werden.<br />
Sinn Natur <strong>Technik</strong><br />
Fühlen /<br />
Druckempfindlichkeit<br />
Mechanik<br />
Druckempfindliche Zellen reagieren auf<br />
Berührungen <strong>und</strong> senden ein Signal<br />
aus<br />
Gleichgewicht Unbewusstes „fühlen“ von winzigen<br />
Härchen die auf die Schwerkraft<br />
reagieren <strong>und</strong> die Lageänderungen<br />
registrieren<br />
Magnetfeldlinien Ähnlich Gleichgewicht, nur dass sehr<br />
kleine magnetische Späne sich nach<br />
dem Magnetfeld ausrichten <strong>und</strong> dies<br />
erfasst wird<br />
- Taster an/aus<br />
- Drucksensor<br />
- Kreiselsysteme<br />
- Beschleunigungs<br />
sensoren<br />
- Magnetometer<br />
26.07.2004 Seite 16 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
Sinn Natur <strong>Technik</strong><br />
Akustik<br />
Hören Wellen in der Luft werden mechanisch<br />
auf druck- oder schwingungs-<br />
empfindliche Zellen übertragen<br />
Ultraschall Hochfrequente Schallwellen werden<br />
Schmecken /<br />
Riechen<br />
ausgestoßen <strong>und</strong> anhand der Lauflänge<br />
des Signals wird die Entfernung<br />
bestimmt<br />
Chemie<br />
Moleküle „docken“ an speziellen nur <strong>für</strong><br />
sie passende Rezeptorzellen an <strong>und</strong><br />
verursachen ein Signal<br />
Optik<br />
Sehen Lichtstrahlen werden auf zwei<br />
verschiedene Zellarten geleitet:<br />
- Stäbchen -> Farbsehen<br />
- Zäpfchen -> Hell/Dunkel<br />
- Mikrofon<br />
- Ultraschallsensor<br />
- Chemischer<br />
Analysator<br />
- Helligkeitssensor<br />
- Kamera<br />
Tabelle 4.1 - natürlich vorkommende Sensoren <strong>und</strong> ihre technische Umsetzung<br />
Aus der obigen Auflistung ist erkennbar, dass es eigentlich <strong>für</strong> jeden natürlichen Sinn auch eine<br />
technische Entsprechung gibt. Zum Teil sind diese aber in der Auswertung sehr rechenintensiv. Zum<br />
Beispiel lässt sich das menschliche Sehen trotz hoch entwickelter Kameras <strong>und</strong><br />
Auswertungsschaltkreise nicht realitätsnah nachbauen. Es ist zu komplex <strong>und</strong> besteht nicht nur aus<br />
der rein optischen Aufnahme der Informationen, sondern aus der unbewussten Verarbeitung <strong>und</strong><br />
Aufbereitung. Gleiches gilt <strong>für</strong> die meisten anderen Sinne, da die Natur verschwenderisch mit den<br />
Rezeptoren umgehen kann. So enthält die Haut unzählige druckempfindliche Zellen. Ein Roboter, der<br />
die gleiche Empfindlichkeit aufweisen wollte, würde einen immensen Rechenaufwand betreiben<br />
müssen <strong>und</strong> allein schon durch die Anzahl der benötigten Sensoren extrem teuer. Daher werden nur<br />
so viele Sensoren eingesetzt, wie unbedingt notwendig oder diese soweit vereinfacht, dass sie billig<br />
sind <strong>und</strong> einfach auszuwerten. So reichen vielfach statt komplizierter Drucksensoren einfache Taster<br />
aus, die nur an/aus als Zustand kennen <strong>und</strong> in einem größeren Abstand verteilt sind. Teilweise reicht<br />
ein einziger Sensor pro Seite aus.<br />
26.07.2004 Seite 17 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
Weiterhin existiert eine Vielzahl von Sensoren (z.B. Entfernungsmesser), die so in der Natur gar nicht<br />
vorkommen, da sie aufgr<strong>und</strong> der Komplexität <strong>und</strong> des erstaunlichen unbewussten<br />
Erinnerungsvermögens des Gehirns nicht benötigt werden.<br />
Sensor Sinnvoller Wertebereich<br />
Temperatur -100..100°C<br />
Berührung/Taster aus/an = 0/1<br />
Druck 0..x bar/pascal<br />
Beschleunigung/Neigung 0..1000g (+ Richtung, meist durch Einbaurichtung bekannt)<br />
Helligkeit Lichtdichte Lux (Lumen/m²)<br />
Schalldruckpegel 0..130 dB (dezibel)<br />
Umdrehung/Zähler 0..x<br />
Drehzahl 0..100.000 U/min<br />
Lichtstärke Candela (Lumen*Steradian-1)<br />
Entfernung (IR, Sonar) 0..10.0000 mm (100m)<br />
Video/Audio Datenstrom<br />
Tabelle 4.2 - häufig verwendete Sensoren<br />
Ein großer Wertebereich <strong>und</strong> damit auch eine hohe Genauigkeit mag <strong>für</strong> einige Anwendungen sinnvoll<br />
sein, wird aber durch die Einschränkungen, wie sie in Kapitel 5 beschrieben werden, teilweise nicht<br />
erreicht. Für die meisten Sensoren reicht ein Wertebereich von zwei Byte (also 65.536 verschiede<br />
Werte), wie ihn die verwendeten Controller unterstützen, bei weitem aus.<br />
4.1.2. Aktoren<br />
Das Wort Aktor stammt ebenfalls aus dem Lateinischen <strong>und</strong> ist von ago, was (be)treiben<br />
beziehungsweise tun bedeutet, abgeleitet. Ein Aktor tut also etwas. In der Natur ist damit meist eine<br />
(Muskel-) Bewegung gemeint. In selteneren Fällen kann es sich auch um chemische (z.B. die<br />
Verfärbung eines Chamäleons) oder optische (z.B. leuchtende Tiefseefische) Effekte handeln.<br />
Muskeln lassen sich nur mit technisch hohem Aufwand umsetzen. Ein Muskel ist aus vielen kleinen<br />
Muskelfasern zusammengesetzt, die sich, sobald ein Signal anliegt, zusammenziehen. Für genau<br />
dieses Verhalten gibt es mittlerweile technische Lösungen. Lange Zeit war dies <strong>und</strong>enkbar <strong>und</strong> so ist<br />
die häufigste Antriebsquelle ein (Servo-) Motor. Wird er mit Strom (bzw. einer alternativen<br />
Energiequelle) versorgt, dreht sich seine Achse <strong>und</strong> diese Bewegung kann genutzt werden. Motoren<br />
mit diesem Funktionsprinzip gibt es schon recht lange <strong>und</strong> dementsprechend sind sie hoch entwickelt<br />
<strong>und</strong> in zahlreichen Varianten verfügbar. Als zweiten Motortypen haben sich Schrittmotoren etabliert.<br />
Sie funktionieren ähnlich wie Servomotoren, drehen sich im Unterschied zu diesen aber nicht<br />
26.07.2004 Seite 18 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
unkontrolliert lange, solange Strom anliegt, sondern benötigen eine extra Steuerung, die den Motor<br />
jeweils nur um eine bestimmte Anzahl von Gradschritten weiterdreht. Damit können solche Motoren<br />
sehr gut <strong>für</strong> Positionierungsarbeiten verwendet werden. Ein Nachteil liegt zum einen in der<br />
Beschränkung auf die Gradschritte <strong>und</strong> zum anderen darin, dass wiederum nur eine Drehbewegung<br />
erzeugt wird. Um dieses Problem zu lösen, wurden lineare Motoren entwickelt. Sie bewegen sich<br />
längs auf einer Schiene <strong>und</strong> können damit die Energie direkt ohne den Umweg über eine Mechanik<br />
(wie z.B. Seilzüge oder Schneckenradgetriebe) in lineare Bewegungen umsetzen. Die relativ neu auf<br />
dem Markt befindlichen künstlichen Muskelfasern erzeugen ebenfalls eine lineare Bewegung. Sie<br />
können aber im Vergleich zu den linearen Motoren weit weniger Kraft aufbringen. Da<strong>für</strong> haben sie den<br />
Vorteil, sehr klein zu sein. Da im Roboterbau oft beide Voraussetzungen gelten, finden sich sehr<br />
häufig auch Pneumatiken oder Hydrauliken im Einsatz. Da die Kraft dabei durch flexible<br />
Schlauchverbindungen übertragen wird, können die großen, die Kraft erzeugenden Bauteile an einem<br />
beliebigen Ort untergebracht werden <strong>und</strong> müssen nicht direkt am zu bewegenden Bauteil angebracht<br />
sein. Auf diese Art werden häufig Hände <strong>und</strong> Arme nachgebildet.<br />
Aktor Einstellbarer Wert<br />
Lampe, LED, … Helligkeit<br />
Lautsprecher Ton (Frequenz)<br />
Motoren<br />
- Servo<br />
- Schritt<br />
- Linear<br />
- Muskelfasern<br />
Pneumatik / Hydraulik<br />
Drehzahl, -richtung<br />
Schritte, Grad<br />
Entfernung<br />
an /aus<br />
Druck<br />
Magnete an/aus<br />
Tabelle 4.3 - häufig verwendete Aktoren<br />
Wie schon bei den Sensoren gilt auch bei den Aktoren, dass ein hoher Wertebereich eine hohe<br />
Genauigkeit erzeugt, diese aber durch die technischen Voraussetzungen (siehe Kapitel 5) auf zwei<br />
Byte begrenzt werden muss. Dies sollte aber <strong>für</strong> die hier aufgeführten Aktoren ausreichen.<br />
4.1.3. Weiterführende Elemente<br />
Abgesehen von den in den vorigen Abschnitten angesprochenen Elementen sind noch viele weitere<br />
denkbar <strong>und</strong> sinnvoll. Dies sind vor allem Spezialanwendungen, wie zum Beispiel ein neuronales<br />
Netz, eine FFT oder eine Kamera mit Objekterkennung. Diese müssen über die gleichen<br />
Kommunikationsmechanismen verfügen, wie die „normalen“ Knotenpunkte.<br />
26.07.2004 Seite 19 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
4.2. Datenmenge<br />
Wenn ein Netzwerk aus vielen verschiedenen Sensoren <strong>und</strong> Aktoren aufgebaut werden soll, muss die<br />
Kommunikation möglichst einfach durchzuführen <strong>und</strong> doch so dynamisch sein, dass alle Daten<br />
übertragen werden können. Dies gilt sowohl <strong>für</strong> die in Abschnitt 1 dieses Kapitels aufgeführten<br />
Sensoren <strong>und</strong> Aktoren als auch <strong>für</strong> noch nicht bedachte neue Elemente. Für jedes dieser Elemente<br />
könnte nun eine eigene spezifische Datenstruktur angelegt werden, die die abzufragenden Daten<br />
enthält.<br />
Diese könnte <strong>für</strong> einen Entfernungssensor zum Beispiel so aussehen:<br />
Um den Sensor aber überhaupt zum laufen zu bringen, benötigt er auch Kenntnis über die Art der<br />
Entfernungsmessung (Infrarot, Ultraschall) <strong>und</strong> Parameter, um die Daten auswerten zu können. Dazu<br />
wird eine zweite Struktur benötigt:<br />
Diese Strukturen wären <strong>für</strong> die meisten Sensoren unterschiedlich <strong>und</strong> sehr spezifisch. Ein Motor<br />
beispielsweise bräuchte nur einen Parameter (Drehzahl) um ihn zum drehen zu bringen. Dazu<br />
kommen aber noch etliche Parameter, die nur einmal eingestellt werden müssen, um verschiedene<br />
Motortypen gleich anzusprechen.<br />
Von einer einfachen <strong>für</strong> zukünftige neue Elemente offenen Kommunikation kann dabei also nicht die<br />
Rede sein. Es könnte eine dynamische Struktur entwickelt werden, in der am Anfang der Aufbau steht<br />
(ähnlich den Chunks im Grafikformat GIF) <strong>und</strong> damit alle möglichen Datenmengen erfasst werden,<br />
aber dies ließe sich mit der in Kapitel 5 vorgestellten Programmiersprache nur schwer realisieren.<br />
Einfacher ist es stattdessen, <strong>für</strong> jeden Parameter einen eigenen Funktionsaufruf vorzusehen. Der<br />
fragende Netzwerkknoten kann also ganz gezielt die Informationen abrufen, die <strong>für</strong> ihn wichtig sind<br />
<strong>und</strong> die Parameter setzen, die ein anderer Knoten unter Umständen benötigt. Weiterhin ermöglicht<br />
diese Herangehensweise ein einfaches Antwortverfahren.<br />
Statt der komplexen Datenstrukturen erfolgen die Aufrufe lediglich mit zwei beziehungsweise drei<br />
Parametern:<br />
typedef struct TDistanceSensor<br />
{<br />
int Distance;<br />
int Reach;<br />
};<br />
typedef struct TDistanceSensorParameter<br />
{<br />
int Reach;<br />
int Type; // infrared, ultrasonics<br />
int EmissionAngle;<br />
...<br />
};<br />
value:=Get(id,parameter_id);<br />
Put(id,parameter_id,value);<br />
26.07.2004 Seite 20 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
Die ID gibt an, welcher Knotenpunkt im Netzwerk gemeint ist. Um nicht nur einen (den Haupt-) Wert<br />
setzen <strong>und</strong> lesen zu können, sondern um auch die Einstellungen des Elements einfach einstellen zu<br />
können, muss noch angegeben werden, welcher Wert oder welche Eigenschaft gemeint ist.<br />
Parameter-ID Beschreibung<br />
0 Hauptwert (Entfernung, Helligkeit, Drehzahl usw.)<br />
1 erste Eigenschaft (maximale Entfernung usw.)<br />
2 …<br />
Tabelle 4.4 - Parametrisierung<br />
4.3. Adressierung<br />
Um die Knotenpunkte ansprechen zu können, müssen diese adressiert werden. Da<strong>für</strong> gibt es<br />
verschiedene Herangehensweisen. Diese sollen an einem Beispiel erläutert werden.<br />
4.3.1. Direkte Adressierung<br />
Der Roboter soll bei einer bestimmten Umgebungstemperatur stehen bleiben. Da<strong>für</strong> muss ein<br />
Knotenpunkt dazu programmiert werden, dies zu tun. Praktischerweise übernimmt dies die Einheit, die<br />
sowieso die Motoren ansteuert. Dies kann direkt mit der bekannten Adresse eines Temperatursensors<br />
dessen Wert abfragen. Wenn der Sensor die ID 4 hat, sieht der Programmteil folgendermaßen aus:<br />
...<br />
temperature:=Get(4,0);<br />
if temperature>60 then<br />
motor_speed:=0;<br />
...<br />
Der Nachteil dabei ist, dass die ID des Temperatursensors bekannt sein muss.<br />
4.3.2. Gruppenadressierung<br />
Um zu erreichen, dass auch ohne Kenntnis der genauen Adresse ein Wert eines bestimmten Typs (im<br />
Beispiel die Temperatur) abfragbar ist, können Broadcast-Aufrufe (Gruppenaufrufe) verwendet<br />
werden. Das Programm fragt nicht mehr einen bestimmten Temperatursensor, dessen Adresse es<br />
kennen muss, sondern erk<strong>und</strong>igt sich im Netzwerk allgemein: hat irgendein Sensor eine Temperatur.<br />
Dazu muss die Adressierung gruppenweise erfolgen. So könnte die ID 8 <strong>für</strong> Temperaturen vorgemerkt<br />
sein. Der Programmteil muss dann folgendermaßen lauten:<br />
...<br />
temperature:=Get(8,0);<br />
if temperature>60 then<br />
motor_speed:=0;<br />
...<br />
In dieser Variante der Adressierung würden aber alle Temperatursensoren antworten <strong>und</strong> es müsste<br />
ein Auswahlverfahren existieren, welcher nun vom Programm verwendet wird.<br />
26.07.2004 Seite 21 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
Diese Art der Adressierung macht daher bei einigen Sensor- <strong>und</strong> Aktortypen keinen Sinn. Gerade das<br />
Setzen von Werten, wie beispielsweise der Motordrehzahl, benötigt meist die direkte Angabe der<br />
richtigen Adresse, da sonst das Verhalten des Roboters unvorhersagbar wäre. Eine Ausnahme ist die<br />
Abschaltung aller Teilnehmer oder eine ähnliche Aktion.<br />
4.3.3. Kombinierte Adressierung<br />
Am idealsten ist daher eine kombinierte Anwendung, die die Verwendung beider Verfahren<br />
unterstützt.<br />
Wie im Kapitel 5 noch erläutert werden wird, existiert in der verwendeten Programmiersprache nur ein<br />
einziger Datentyp: die 2-Byte-Ordinalzahl. Durch diese Einschränkung können maximal 65.536<br />
verschiedene Adressen genutzt werden. Dies ist auch <strong>für</strong> einen Roboter, der aus vernetzen Sensoren<br />
<strong>und</strong> Aktoren besteht, eine recht hohe Zahl, die in einem einzigen Roboter wohl kaum erreicht werden<br />
wird.<br />
Um Gruppenadressen einzuführen, kann ein einzelnes Bit benutzt werden, um anzuzeigen, ob eine<br />
Geräteadresse verwendet wird oder eine Gruppenadresse. Dadurch reduziert sich die Anzahl der<br />
direkten Geräteadressen auf 32.767. Hinzu kommt aber die gleiche Anzahl an Typengruppen.<br />
Um zu unterscheiden, welche Art von Adresse vorliegt, ist es am sinnvollsten, das höchste Bit in der<br />
Adresse zu verwenden. Damit liegen alle Gruppenadressen oberhalb der 32.768.<br />
Die beiden Beispielaufrufe würden dann so aussehen:<br />
...<br />
temperature:=Get(4,0);<br />
if temperature>60 then<br />
motor_speed:=0;<br />
...<br />
Als zweite Variante könnten die 16 zur Verfügung stehenden Bits so unterteilt werden, dass ein Teil<br />
die Gruppenzugehörigkeit <strong>und</strong> der Rest die Nummer innerhalb der Gruppe angibt.<br />
Mögliche sinnvolle Kombinationen (Einteilungen) sind:<br />
Gruppe Geräte<br />
Bit Gruppen Bit Geräte pro Gruppe<br />
4 16 12 4096<br />
8 256 8 256<br />
...<br />
temperature:=Get(32776,0);<br />
if temperature>60 then<br />
motor_speed:=0;<br />
...<br />
Die Zusammenfassung zu einer Adresse muss entweder der Endanwender vornehmen oder kann<br />
sinnvollerweise auch automatisch von der Maschine übernommen werden.<br />
26.07.2004 Seite 22 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
Die Aufrufe müssen da<strong>für</strong> folgendermaßen geändert werden: GET(group_id,id,parameter);<br />
Das Beispiel sieht dann wie folgt aus:<br />
...<br />
temperature:=Get(8,4,0);<br />
if temperature>60 then<br />
motor_speed:=0;<br />
...<br />
Diese Art der Adressierung ist die variabelste <strong>und</strong> kann am besten auf die verschiedenen<br />
Robotertypen angewendet werden.<br />
4.3.4. Adressierung im CAN-Bus<br />
Die Verwendung des CAN-Busses (siehe auch Kapitel 4) bringt eine Einschränkung in der Vergabe<br />
der Adressen mit sich. In einer CAN-Nachricht sind 29 Bit <strong>für</strong> die Adressierung vorgesehen. Diese ist<br />
keine Adresse im herkömmlichen Sinne. Sie bestimmt nicht den Empfänger sondern versieht die<br />
Nachricht mit einer Kennung. Physikalisch gesehen empfangen alle Knotenpunkte die Nachricht. Ein<br />
Empfangsregister mit einer frei konfigurierbaren Bitmaske entscheidet automatisch, ob die Nachricht<br />
<strong>für</strong> den Knoten interessant ist oder nicht. Dies erfolgt bereits im Bus-Controller <strong>und</strong> ist von der darüber<br />
liegenden Software unabhängig.<br />
Von den 29 Bit werden normalerweise fünf Bit <strong>für</strong> eine Priorisierung der Nachrichten <strong>und</strong> die Fluss-<br />
Steuerung verwendet. Durch die Priorisierung ist es möglich, dass sich im Kollisionsfall die höher<br />
priorisierte <strong>und</strong> damit wichtigere Nachricht durchsetzt <strong>und</strong> gesendet wird. Außerdem wird es möglich,<br />
dass eine laufende Sendung durch eine höher priorisierte Nachricht unterbrochen wird, die zum<br />
Beispiel einen Fehler meldet.<br />
Von den zur Verfügung stehenden 29 Bit sind also nur 24 Bit <strong>für</strong> die Adressierung verwendbar. Um<br />
auf Anfragen reagieren zu können <strong>und</strong> um den Nachrichtenempfang bestätigen zu können, wie es im<br />
CAN-Protokoll vorgeschrieben ist, benötigt der Empfänger die Adresse des Senders. Diese könnte in<br />
den Datenbytes der Nachricht verpackt werden. Da diese aber aus maximal acht Bytes bestehen <strong>und</strong><br />
zusätzlich zu den eigentlichen Daten noch einiges an Zusatzinformationen übertragen werden muss,<br />
wird die Senderadresse mit in dem Identifier verpackt. Es kann also nur die Hälfte der Adressbits <strong>für</strong><br />
eine Adresse verwendet werden, also 12 Bit.<br />
Diese 12 Bit können in einer kombinierten Adressierung wie im vorigen Abschnitt beschrieben<br />
verwendet werden. Es würden dann 2.047 Geräte in 2.047 verschiedenen Gruppen ansprechbar sein.<br />
Dies ist eine ausreichend hohe Anzahl.<br />
Bei der zweiten Variante besteht das Problem, dass 12 Bit knapp bemessen sind. So können zum<br />
Beispiel 15 Gruppen mit jeweils bis zu 255 Geräten angesprochen werden. Sie bietet allerdings einen<br />
Vorteil, der diese Beschränkung größtenteils wieder gut macht. Dadurch, dass der Identifier einer<br />
Nachricht nicht nur mit einer Adresse belegt ist, sondern auch über eine Gruppenkennung verfügt,<br />
26.07.2004 Seite 23 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
kann der Empfänger entscheiden, ob er eine Anfrage von diesem Sendertyp überhaupt bearbeitet.<br />
Dadurch kann ein Rechtesystem geschaffen werden, welches die Sicherheit im Bus erhöht. So<br />
können zum Beispiel Systemkommandos nur von autorisierten Knotenpunkten verschickt werden <strong>und</strong><br />
nicht von irgendeinem Sensor, der nur das System stören würde. Daher wird diese Art der<br />
Adressierung im Weiteren verwendet. [etsch], [law]<br />
4.4. Adressierung im Netz<br />
Die kombinierte Adressierung nach der im vorigen Abschnitt beschriebenen zweiten Variante<br />
ermöglicht die größtmögliche Variabilität bei gleichzeitiger hoher Sicherheit. Die Elemente des<br />
Netzwerkes werden also in maximal 15 Gruppen eingeteilt <strong>und</strong> mit einer 8-Bit-Identifizierungsnummer<br />
versehen. Bei allen Anfragen <strong>und</strong> Schreiboperationen muss angegeben werden, welchen Parameter<br />
die Operation betrifft.<br />
4.5. Klassifizierung der Gruppentypen <strong>und</strong> ihrer Adressen<br />
Für die im ersten Abschnitt dieses Kapitels vorgestellten Sensoren <strong>und</strong> Aktoren müssen <strong>für</strong> die<br />
Gruppenadressierung ID vergeben werden. Weiterhin sind zusätzliche Eigenschaftswerte aufgeführt,<br />
die abgefragt <strong>und</strong> je nach Berechtigung auch gesetzt werden können.<br />
Nr. Sensor/Aktor - Hauptwert (param=0) Zusätzliche Werte (param=1,2,..)<br />
1 Temperatur Minimal- <strong>und</strong> Maximaltemperatur<br />
2 Berührung/Taster -<br />
3 Druck Maximaler Druck<br />
4 Beschleunigung/Neigung -<br />
5 Helligkeit -<br />
6 Umdrehung/Zähler -<br />
7 Drehzahl -<br />
8 Entfernung (IR, Sonar) Maximale Entfernung<br />
9 Lampe, LED - Helligkeit -<br />
10 Motoren - Drehzahl Maximale Drehzahl<br />
11 Pneumatik / Hydraulik - Druck Maximaler Druck<br />
12 Magnete -<br />
13 Lautsprecher -<br />
14 Mikrofon -<br />
15 Kontrollgeräte / Programmiereinheiten usw. -<br />
Tabelle 4.5 - Gruppentypen <strong>und</strong> -adressen<br />
26.07.2004 Seite 24 von 85
<strong>Diplomarbeit</strong>: Modulares System Datenstrukturen <strong>und</strong> Kommunikation<br />
Falls diese Gruppen nicht ausreichen muss entweder die Adressierung verschoben werden (mehr<br />
Gruppen, weniger Elemente pro Gruppe) oder die Datenbreite erhöht werden, was eine Vergrößerung<br />
des Speicherbedarfs der Virtuellen Maschine hervorruft. Als dritte Möglichkeit könnten die acht<br />
Adressbit, die <strong>für</strong> die Geräteidentifizierung nötig sind, je nach Bedarf nochmals <strong>für</strong> eine<br />
Untergruppierung verwendet werden, wenn nur wenige Geräte dieses Typs erwartet werden. Die<br />
verwendeten Controller im Netzwerk sind auf diese Arbeitsweise vorbereitet, nur die Adressierung aus<br />
der Virtuellen Maschine heraus muss angepasst oder per Hand vollzogen werden.<br />
4.6. Systemkommandos<br />
Jeder Knoten im Netzwerk besitzt eine Virtuelle Maschine, deren ablaufendes Programm über zwei<br />
Befehle (Get, Put) mit den anderen Knotenpunkten kommunizieren kann. So können die Werte<br />
abgefragt <strong>und</strong> gesetzt werden, die im vorigen Abschnitt aufgeführt sind.<br />
Zusätzlich wird noch eine Anzahl von Systemkommandos benötigt, die die Virtuellen Maschinen<br />
steuern. Damit diese die normalen Werte aus dem vorigen Abschnitt (die durch spätere Erweiterungen<br />
eventuell wesentlich umfangreicher ausfallen) nicht stören, sind sie mit einer hohen Nummerierung<br />
versehen. Sie werden von dem Programm auf dem Controller direkt ausgeführt, ohne dass da<strong>für</strong> ein<br />
Skript innerhalb der Virtuellen Maschine gestartet werden muss.<br />
Parameter-ID Funktion<br />
1001 Deaktivieren<br />
1002 Neustart<br />
1003 Selbsttest<br />
1004 Speicherplatz<br />
1005 Gruppe<br />
1006 Uhrzeit abfragen/setzen<br />
1007 Programmanzahl<br />
1008 Programmgröße<br />
1009 Programmdownload<br />
1010 Skript starten<br />
1011 Skript stoppen<br />
1012 Skript in einer Schleife aufrufen (Anzahl)<br />
1013 Skript zu einer bestimmten Zeit starten<br />
1014 Skript zu einer bestimmten Zeit stoppen<br />
1015 Skript bei einem bestimmten Schwellwert starten<br />
1016 Skript bei einem bestimmten Schwellwert stoppen<br />
Tabelle 4.6 - Systemkommandos<br />
26.07.2004 Seite 25 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
5. Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
Der Begriff Roboter ist sehr weit gefasst. Zum einen kann ein kleines, mobiles <strong>und</strong> autarkes Fahrzeug<br />
gemeint sein. Es wird meist von zwei getrennt motorisierten Rädern angetrieben oder besitzt sogar<br />
einfache Beine. Zum anderen kann ein Roboter auch eine Nachbildung des menschlichen Körpers<br />
oder eines Körperteiles sein. Millionenteure Entwicklungen bei Honda <strong>und</strong> anderen Firmen machen<br />
dort immer schnellere Fortschritte <strong>und</strong> bringen Roboter, die uns ähnlich sehen <strong>und</strong> bald ebenso<br />
geschickt sind, hervor. Dann gibt es noch die Gruppe der Haussysteme, die roboterartige Züge<br />
aufweisen, aber räumlich festgelegt sind. So kann eine Überwachung eines großen Gebäudes von<br />
einem Roboter übernommen werden, der aus verschiedenen stationären <strong>und</strong> mobilen Teilen besteht.<br />
Die visuelle Einheit eines Wächterroboters muss nicht an ihm befestigt sein, sondern kann auch aus<br />
vielen Kameras bestehen, die am Gebäude montiert sind <strong>und</strong> auf die er über ein geeignetes<br />
Kommunikationsmedium zugreift.<br />
In der Praxis wird <strong>für</strong> jede dieser Anwendungen ein eigenes Verfahren eingesetzt. Die Anzahl der<br />
Sensoren <strong>und</strong> Aktoren, die Art der Recheneinheit <strong>und</strong> auch die Datenübertragung sind spezifisch <strong>für</strong><br />
jedes einzelne Problem gelöst. Damit wird es aber unmöglich, mit nur einem System variabel zu<br />
bauen <strong>und</strong> zu experimentieren <strong>und</strong> alle Bereiche abzudecken. Um nun mit einem verteilten Netzwerk<br />
all diese Aufgaben wahrnehmen zu können, muss es über einen einfachen robusten<br />
Datenübertragungsmechanismus verfügen.<br />
5.1. Einteilung der Bussysteme<br />
Um Systeme <strong>und</strong> Komponenten miteinander zu verbinden, werden zwischen diesen Schnittstellen<br />
vereinbart. Diese können durch ein busfähiges (z.B. SCSI) oder durch ein nicht busfähiges (z.B.<br />
RS232) System realisiert werden. Nicht busfähige Verbindungen dienen dem direkten Anschluss<br />
eines Gerätes (z.B. ein Modem) an eine zentrale Recheneinheit. Busfähige Verbindungen<br />
ermöglichen den Betrieb mehrerer Teilnehmer (z.B. Festplatten). Dadurch können viele Geräte relativ<br />
einfach miteinander kommunizieren. Jeder Teilnehmer verfügt über ein Interface, welches die Signale<br />
auf dem Bus dekodiert <strong>und</strong> diejenigen auswertet <strong>und</strong> weitergibt, die <strong>für</strong> dieses Gerät bestimmt sind.<br />
Für ein Netzwerk von Sensoren <strong>und</strong> Aktoren sind busfähige Verbindungen die richtige Wahl.<br />
Busfähige Verbindungen lassen sich in verschiedene Gruppen einteilen. Die Bandbreite geht von<br />
integrierten Bussystemen, wie sie in kleinen integrierten Schaltungen vorkommen, bis zu ganze<br />
Gebäudekomplexe umfassende Feldbusse. Dabei wird nach seriellen <strong>und</strong> parallelen Bussystemen<br />
<strong>und</strong> synchronen <strong>und</strong> asynchronen Übertragungen unterschieden.<br />
26.07.2004 Seite 26 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
5.1.1. Parallele Bussysteme<br />
Das Prinzip der parallelen Datenübertragung beruht darauf, dass alle Bits einer Dateninformation<br />
gleichzeitig (bitparallel) vom Sender zum Empfänger übertragen werden. Für eine Datenübertragung<br />
werden neben den eigentlichen Zeichen noch weitere Informationen benötigt, die die Übertragung<br />
steuern <strong>und</strong> Auskunft über den Zustand der Geräte geben. Die Steuerung kann sowohl in Software als<br />
auch in Hardware erfolgen. Übernimmt es die Software, müssen Steuersignale vereinbart sein. Erfolgt<br />
es hardwareseitig, werden zusätzliche Leitungen benötigt. Die Daten werden adressiert übertragen.<br />
Dadurch kann schon durch die Hardware festgelegt werden, ob die Nachricht <strong>für</strong> den Empfänger von<br />
Bedeutung ist. Parallele Schnittstellen sind in verschiedenen Ausführungen anzutreffen:<br />
Integrierter Bus<br />
Ein integrierter Bus verbindet sowohl integrierte Komponenten (z.B. Speicher, Interrupt-Controller)<br />
direkt innerhalb eines hoch integrierten Bauelementes (z.B. Mikrocontroller) als auch externe vom<br />
Mikroprozessor abhängige Komponenten (z.B. auf einem PC-Mainboard).<br />
Beispiele: Daten-, Adress- <strong>und</strong> Steuerleitungen<br />
System-Bus<br />
Ein System-Bus ermöglicht die Ankopplung von Baugruppen (Platinen <strong>und</strong> Einschübe) wie Grafik-,<br />
Prozessor-, oder Speicherkarten.<br />
Beispiele: VME-, Multi-, PC-Bus<br />
Paralleler Peripherie-Bus<br />
Ein paralleler Peripherie-Bus dient der Ankopplung von Peripheriegeräten wie Druckern oder<br />
Scannern an ein Computersystem.<br />
Beispiel: SCSI<br />
Instrumentierungs-Bus<br />
Ein Instrumentierungs-Bus wird hauptsächlich in der Messtechnik zum Koppeln von Messgeräten<br />
eingesetzt.<br />
Beispiel: VXI, IEC<br />
5.1.2. Serielle Bussysteme<br />
Die serielle Datenübertragung zeichnet sich dadurch aus, dass im Gegensatz zur parallelen<br />
Übertragung weit weniger Verbindungsleitungen benötigt werden, die in der Regel auch weit größere<br />
Entfernungen überbrücken können. Die Daten werden bitweise zwischen den Geräten übertragen.<br />
Zwischen dem Sender <strong>und</strong> dem Empfänger müssen Vereinbarungen getroffen werden, wann die<br />
Daten gültig sind. Da<strong>für</strong> ist es notwendig, dass Beginn <strong>und</strong> Ende der Bitfolge eindeutig festgelegt sind.<br />
26.07.2004 Seite 27 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
Komponenten-Bus<br />
Ein Komponenten-Bus dient sowohl der Verbindung von Bauelementen (zum Beispiel Audio- oder<br />
Video-IC) als auch der von kompletten Schaltungseinheiten.<br />
Beispiele: I²C, Access Bus<br />
Serieller Peripherie-Bus<br />
Ein serieller Peripherie-Bus ist eine kostengünstige Alternative zum parallelen Peripherie-Bus. Er<br />
weist eine einfachere Verkabelung auf <strong>und</strong> dient dem Anschluss von unterschiedlichsten<br />
Peripherieeinheiten wie Kameras, Tastaturen oder auch Festplatten.<br />
Beispiel: USB<br />
Feldbus<br />
Ein Feldbus ist ein lokales Bussystem <strong>für</strong> Industrieumgebungen, welches in der Regel mit einem<br />
übergeordneten Bussystem (Systembus) verb<strong>und</strong>en wird.<br />
Beispiele: Bitbus, Profibus, CAN-Bus<br />
5.1.3. Serielle Betriebsarten<br />
Es wird zwischen drei Betriebsarten (Richtungen) unterschieden.<br />
Richtungsbetrieb<br />
(Simplex)<br />
Wechselbetrieb<br />
(Half Duplex)<br />
Gegenbetrieb<br />
(Duplex, Full Duplex)<br />
Die Rollen von Sender <strong>und</strong> Empfänger<br />
sind exakt festgelegt. Der Datenfluss<br />
erfolgt nur in eine Richtung.<br />
Alle Geräte können sowohl senden, als<br />
auch empfangen. Aber immer nur eins<br />
davon.<br />
Tabelle 5.1 - serielle Betriebsarten<br />
Alle Geräte können zur gleichen Zeit<br />
Sender <strong>und</strong> Empfänger sein.<br />
5.1.4. Symmetrische <strong>und</strong> asymmetrische serielle Schnittstellen<br />
Im Prinzip benötigt eine serielle Verbindung nur eine einzige Leitung <strong>für</strong> die Datenübertragung. Dies<br />
wird bei asymmetrischen Schnittstellen umgesetzt. Das Datensignal bezieht sich auf die Masseleitung.<br />
Störimpulse wirken sich direkt als Fehler aus. Symmetrische Schnittstellen verwenden zwei<br />
Datenleitungen <strong>und</strong> die Dateninformation entspricht der Differenz des Spannungspegels, der auf den<br />
beiden Leitungen übertragen wird. Diese Schnittstellen stellen sich daher störungssicherer dar.<br />
26.07.2004 Seite 28 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
Signal<br />
Signal +<br />
Signal -<br />
Abbildung 5.1 - Asymmetrische <strong>und</strong> symmetrische Schnittstelle<br />
5.1.5. Synchrone <strong>und</strong> asynchrone Übertragung<br />
Synchrone Übertragung<br />
Für synchrone Übertragungen werden Taktleitungen verwendet. Der Sender gibt gleichzeitig mit den<br />
Daten auf einer extra Leitung ein Taktsignal aus. Die zu übertragenden Daten werden zu Blöcken<br />
zusammengefasst, die von speziellen Steuerzeichen eingefasst sind. Der Taktgenerator des<br />
Empfängers synchronisiert sich dadurch auf die eingehenden Daten.<br />
Asynchrone Übertragung<br />
Sender<br />
Asymmetrische Schnittstelle<br />
Störimpuls<br />
101100111101011<br />
Sender<br />
101100100001011<br />
kein Fehler<br />
Bei asynchronen Übertragungen werden keine Taktleitungen verwendet. Die Informationen zur<br />
Synchronisierung werden jedem einzelnen Zeichen mitgegeben. Es werden keine Blöcke gebildet.<br />
Dadurch weist diese Form der Übertragung ein niedrigeres Nutzdatenverhältnis als die synchrone auf.<br />
Durch die einfachere Schaltungstechnik ist sie aber ideal <strong>für</strong> den Anschluss langsamerer Peripherie.<br />
26.07.2004 Seite 29 von 85<br />
Fehler<br />
Symmetrische Schnittstelle<br />
Störimpuls<br />
Empfänger<br />
Empfänger
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
5.1.6. Buszugriffsverfahren<br />
Es werden verschiedene Buszugriffsverfahren unterschieden:<br />
Master/Slave Gesteuert durch eine zentrale Instanz (Master) durch Aufruf<br />
der Teilnehmer (Slave) in einer bestimmten Reihenfolge<br />
Delegated Token Gesteuert durch eine zentrale Instanz die das Buszugriffsrecht<br />
vergibt, das der Teilnehmer vom Master erhält <strong>und</strong> an diesen<br />
zurückgibt<br />
Token-Passing Das Buszugriffsrecht wird vom Teilnehmer an den nächsten<br />
Zeitschlitze<br />
(Time Division<br />
Multiple Access)<br />
Zufälliger Buszugriff<br />
(Carrier Sense,<br />
Multiple Access)<br />
Teilnehmer weitergereicht (alle sind Master)<br />
Jeder Teilnehmer besitzt nach einem festen Zeitplan das<br />
Buszugriffsrecht<br />
Jeder Teilnehmer ist bezüglich des Buszugriffs<br />
gleichberechtigt <strong>und</strong> ist somit Master. Er kann damit auf den<br />
Bus zugreifen, sobald dieser frei ist. Durch<br />
Kollisionserkennung muss die Fehlerfreiheit der Daten<br />
garantiert werden.<br />
Ringschiebeprinzip Kein Buszugriffsverfahren im eigentlichen Sinne. Die<br />
Teilnehmer sind über Punkt-zu-Punkt-Verbindungen in einer<br />
Ringstruktur mit dem Master verb<strong>und</strong>en <strong>und</strong> geben die Daten<br />
zyklisch weiter.<br />
Tabelle 5.2 - Buszugriffsverfahren<br />
5.1.7. Netzwerktopologien<br />
Die Topologie eines Netzwerks ist die Verbindungsstruktur zwischen den Teilnehmern. Sie ist<br />
maßgeblich <strong>für</strong> den Aufwand der physikalischen Netzstruktur, die Einsatzgrenzen <strong>und</strong> die<br />
Randbedingungen.<br />
Sterntopologie<br />
Alle Teilnehmer sind über Punkt-zu-Punkt-Verbindungen mit einem zentralen Teilnehmer verb<strong>und</strong>en.<br />
Vorteile Nachteile<br />
- jeder hat eine eigene Verbindung<br />
- einfache Einbindung neuer Teilnehmer<br />
- keine Zugriffsregelung nötig<br />
- große Gesamtlänge der Verbindungen<br />
- Ausfall der Zentrale beendet das Netz<br />
- zentraler Teilnehmer benötigt viele<br />
Schnittstellen<br />
26.07.2004 Seite 30 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
Bustopologie<br />
In einem Bus erfolgt eine elektrisch passive Ankopplung aller Teilnehmer an ein gemeinsames<br />
Medium. Die von den Teilnehmern gesendeten Informationen stehen allen zur Verfügung.<br />
Baumtopologie<br />
Vorteile Nachteile<br />
- einfache Verkabelung<br />
- einfache Ankopplung<br />
- einfache Erweiterung<br />
- Ausfall eines Teilnehmers hat keinen<br />
Einfluss auf den Rest<br />
- Beliebige logische<br />
Kommunikationsstrukturen möglich<br />
- begrenzte Buslänge (durch Repeater<br />
erweiterbar)<br />
- Buszugriffsregelung erforderlich<br />
- Teilnehmeridentifizierung nötig<br />
In einem Baum ist durch Verzweigungselemente die Aufspaltung des Netzes in Abhängigkeit von<br />
geografischen Anforderungen möglich. Auch die Verbindung verschiedener Topologien wird möglich.<br />
Ringtopologie<br />
Vorteile Nachteile<br />
- minimierter Verkabelungsaufwand<br />
- variabler Aufbau des Netzwerks<br />
möglich<br />
- höhere Kosten durch die<br />
Verzweigungselemente<br />
Ein Ring besteht aus einer geschlossenen Kette von gerichteten Punkt-zu-Punkt-Verbindungen.<br />
Vorteile Nachteile<br />
- hohe Buslänge, da jeder Teilnehmer<br />
das Signal auffrischt<br />
- einfache Teilnehmeridentifizierung<br />
über die geografische Position<br />
- bei Ausfall eines Teilnehmers fällt das<br />
ganze Netz aus (durch Red<strong>und</strong>anz oder<br />
Überbrückung vermeidbar)<br />
- Eingliederung eines neuen Teilnehmers<br />
erfordert eine Betriebsunterbrechung<br />
26.07.2004 Seite 31 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
5.2. Das OSI-Schichtenmodell<br />
Einen internationalen Standard <strong>für</strong> Kommunikationssysteme stellt das OSI-Modell (Open System<br />
Interconnection) dar. Es bildet ein Basisreferenzmodell <strong>für</strong> Schnittstellen, in dem eine Protokollstruktur<br />
beschrieben ist, welche eine Unabhängigkeit von Hard- <strong>und</strong> Software <strong>und</strong> die Kommunikation<br />
zwischen unterschiedlichen Systemen ermöglichen soll. Das OSI-Modell besteht aus sieben<br />
Schichten, die eindeutig festgelegte Aufgaben übernehmen. Die Informationen werden gr<strong>und</strong>sätzlich<br />
nur zwischen benachbarten Schichten ausgetauscht. In der Praxis werden nicht immer alle Ebenen<br />
getrennt voneinander ausgeführt. In der Minimalausführung besteht ein OSI-System aus mindestens<br />
den unteren beiden Ebenen. Alle darüber liegenden Schichten werden dann zu einer einzigen<br />
zusammengefasst.<br />
Schicht Bezeichnung Funktion<br />
7 Anwendungsschicht Anwendung<br />
6 Darstellungsschicht Darstellung<br />
5 Sitzungsschicht Steuerung<br />
4 Transportschicht Transport<br />
3 Vermittlungsschicht Vermittlung<br />
2 Sicherungsschicht Sicherung<br />
1 Physikalische Schicht Bitübertragung<br />
Tabelle 5.3 - Das OSI-Schichtenmodell<br />
Physikalische Schicht<br />
Anwendungsorientierte<br />
Schichten<br />
Netzorientierte Schichten<br />
Hier werden die elektrischen, mechanischen <strong>und</strong> funktionalen Eigenschaften der Schnittstelle<br />
festgelegt.<br />
Sicherungsschicht<br />
Diese Schicht regelt die Synchronisation zwischen den Teilnehmern <strong>und</strong> beinhaltet die<br />
Fehlererkennung <strong>und</strong> die Korrekturmechanismen.<br />
Vermittlungsschicht<br />
Hier erfolgt der Aufbau der Verbindung zwischen den Kommunikationspartnern. Des Weiteren<br />
realisiert diese Schicht auch die Adressierung, die Vermittlung <strong>und</strong> den Verbindungsauf- <strong>und</strong> -abbau.<br />
26.07.2004 Seite 32 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
Transportschicht<br />
In dieser Schicht erfolgt der Datentransport zwischen den Endteilnehmern. Weiterhin erfolgt - wenn<br />
nötig - die Zerlegung in kleinere Einzelpakete <strong>und</strong> eine weitere Fehlerkontrolle. Bei fehlenden oder<br />
verfälschten Daten wird eine Wiederholung angeregt <strong>und</strong> es wird die korrekte Reihenfolge der Pakete<br />
wiederhergestellt.<br />
Sitzungsschicht<br />
Hier erfolgt die Synchronisation <strong>und</strong> Organisation der Daten- <strong>und</strong> Steuerinformationen <strong>für</strong> die sich im<br />
Dialog befindlichen Stationen. Sie wird auch als Kommunikationssteuerschicht bezeichnet <strong>und</strong> steuert<br />
unter anderem den Datenfluss, die Datenzwischenspeicherung <strong>und</strong> die Zeitspanne zwischen<br />
Verbindungsauf- <strong>und</strong> -abbau (auch als Sitzung bezeichnet).<br />
Darstellungsschicht<br />
In dieser Schicht erfolgt eine Aufbereitung der Daten <strong>für</strong> die Anwendungsschicht. Es erfolgt eine<br />
Kontrolle der Datenein- <strong>und</strong> -ausgabe, die Durchführung von Datenkonvertierungen <strong>und</strong><br />
Formatanpassungen.<br />
Anwendungsschicht<br />
Hier erfolgt die Regelung <strong>für</strong> den Zugriff auf die Anwenderprogramme. Die Aufgabe der<br />
Anwendungsschicht ist die Bereitstellung von anwenderspezifischen Protokollen wie die<br />
Identifizierung der Teilnehmer <strong>und</strong> die Überprüfung der Zugriffsberechtigung.<br />
5.3. Überblick über gängige Bussysteme<br />
Für ein vernetztes System von Sensoren <strong>und</strong> Aktoren sind einige Faktoren <strong>für</strong> das zu verwendende<br />
Bussystem ausschlaggebend. Dies sind zum einen Robustheit <strong>und</strong> Fehlertoleranz. Wird ein<br />
Knotenpunkt entfernt, sollte das restliche System weiterlaufen. Zum anderen muss eine einfache<br />
Anschlussmöglichkeit gegeben sein. Kabel mit sehr vielen Leitungen sind anfälliger gegen<br />
mechanische Belastungen. Die Stecker- beziehungsweise Verbindungseinheiten werden mit<br />
zunehmender Leitungszahl komplizierter <strong>und</strong> damit fehleranfälliger.<br />
5.3.1. Paralleler System-Bus PC<br />
Die allgemein als PC (Personal Computer) bezeichneten Computer auf der Basis von Intel-<br />
Prozessoren stellen den größten Marktanteil auf dem Computersektor dar. Ein Gr<strong>und</strong> da<strong>für</strong> ist das<br />
verwendete Slotkonzept, welches eine individuelle Ausstattung des Computers mit verschiedener<br />
Hardware gestattet. Mit dem Original-PC der Firma IBM wurde der 8-Bit-PC-Bus eingeführt, der später<br />
als 16-Bit-Variante unter der Bezeichnung ISA in nahezu jedem Rechner verwendet wurde. Dieser<br />
Bus ist aber durch die hohe Leitungszahl nicht <strong>für</strong> verteilte Netze geeignet.<br />
26.07.2004 Seite 33 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
5.3.2. Paralleler Peripherie-Bus SCSI<br />
SCSI bietet eine busorientierte Geräteschnittstelle als Peripheriebus <strong>und</strong> ähnelt in seiner Art dem IEC-<br />
Bus. Im Unterschied zu diesem ist er multi-master-fähig. Das heißt, es kann prinzipiell jeder<br />
Teilnehmer die Funktionalität des Masters übernehmen, falls der Master ausfällt. Nachteilig sind die<br />
Begrenzungen der Anzahl der Teilnehmer, die maximale Kabellänge <strong>und</strong> die hohe Leitungsanzahl.<br />
Positiv fällt die höhere Datenübertragungsrate ins Gewicht.<br />
5.3.3. Paralleler Instrumentierungsbus IEC<br />
Der IEC-Bus ist ein weltweiter Standard in der Messtechnik zur Kopplung von Geräten wie Voltmetern<br />
oder Frequenzzählern. Nachteil dieser Lösung ist, dass ein IEC-Bus auf 15 Geräte (inklusive<br />
Controller) beschränkt ist <strong>und</strong> die Kabellänge auf maximal 2 Meter spezifiziert ist. Die definierte<br />
maximale Datenübertragungsrate von 1MByte/s wäre aber ausreichend. Er arbeitet asynchron <strong>und</strong><br />
das langsamste Gerät bestimmt über ein 3-Leitungs-Handshakeverfahren die Geschwindigkeit. Es<br />
sind ziemlich viele Leitungen <strong>für</strong> den Betrieb notwendig, was potentielle Fehlerquellen erzeugt.<br />
5.3.4. Serielle RS232<br />
Die RS232 (auch V24 genannt) ist die wohl am häufigsten verwendete serielle Schnittstelle. Da sie<br />
nur <strong>für</strong> die direkte Verbindung zweier Geräte gedacht ist, fällt sie von vornherein als Wahl <strong>für</strong> ein<br />
Netzwerk heraus.<br />
5.3.5. Serieller Komponenten-Bus I²C<br />
Der I²C-Bus ist eine Entwicklung von Philips <strong>für</strong> die serielle Verbindung von integrierten Schaltungen<br />
auf einer Platine. Da lediglich zwei Datenübertragungsleitungen (Datenleitung <strong>und</strong> Taktleitung)<br />
benötigt werden, ist der Anschluss einfacher als bei parallelen Systemen. Jedes I²C-Bauelement<br />
verfügt über eine eigene Adresse <strong>und</strong> kann sowohl als Sender als auch als Empfänger arbeiten. Des<br />
Weiteren ist der Bus multi-master-fähig. Die Generierung des Taktsignals wird vom Master<br />
übernommen. Ein Nachteil ist, dass die Adressen der Bauelemente meist vom Hersteller festgesetzt<br />
sind <strong>und</strong> nur in einigen Fällen minimal angepasst werden können (untere 3 Bits). Auf dem Bus darf<br />
keine Adresse mehrfach vorkommen. Der I²C ist damit mit Einschränkungen <strong>für</strong> ein verteiltes<br />
Netzwerk gut geeignet.<br />
5.3.6. Serieller Peripherie-Bus USB<br />
Im Gegensatz zum I²C werden beim USB (Universal Serial Bus) die Adressen nicht vom Hersteller<br />
vergeben, sondern werden vom Master nach dem Einschalten des Systems automatisch zugewiesen.<br />
Da der USB mit einer differentiellen (symmetrischen) Datenübertragung arbeitet, benötigt er zwei<br />
Datenleitungen. Zusätzlich wird eine Leitung zur Spannungsversorgung <strong>für</strong> die Endgeräte hinzugefügt.<br />
Über diese können sich Geräte mit geringer Stromaufnahme (= 500mA) mit Energie versorgen. Die<br />
Verbindungen werden von Gerät zu Gerät ausgeführt. Damit ist USB im eigentlichen Sinne kein Bus,<br />
sondern stellt sich topologisch als kombinierte Strang-Sternstruktur dar. Ein Gerät sollte aus diesem<br />
Gr<strong>und</strong> immer auch als Hub fungieren, um den Anschluss weiterer Geräte zu ermöglichen. Parallel<br />
26.07.2004 Seite 34 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
können auch separate Hubs eingesetzt werden. Durch diesen Zusatzaufwand eignet sich USB kaum<br />
<strong>für</strong> komplexe Netzwerke.<br />
5.3.7. Serieller Feldbus CAN<br />
CAN (Controller Area Network) ist ein Bus aus der Automobilindustrie <strong>und</strong> seit 1994 das am meisten<br />
verbreitete Protokoll in diesem Sektor. Da der CAN-Bus multi-master-fähig ist <strong>und</strong> dies noch durch ein<br />
zufallsorientiertes Zugriffsverfahren mit Kollisionserkennung erweitert wird, ist er ideal <strong>für</strong> ein verteiltes<br />
Netzwerk geeignet. Jeder Teilnehmer kann, sobald der Bus frei ist, eine priorisierte Nachricht<br />
absetzen. Kollidieren die Anfragen „gewinnt“ die Nachricht mit der höchsten Priorität, wobei die<br />
„unterlegene“ Nachricht automatisch neu gesendet wird, sobald der Bus frei wird. Außerdem verfügen<br />
CAN-Busse über umfangreiche Fehlererkennungsmechanismen in verschiedenen Ebenen. Sie sind<br />
damit <strong>für</strong> das Netzwerk sehr gut geeignet.<br />
5.3.8. Serielles Ethernet<br />
Ethernet ist der zurzeit am weitesten verbreitete Standard <strong>für</strong> Netzwerke. Der Name (Ether = Äther)<br />
weist noch auf die ersten Funknetze hin. Die Datenübertragung erfolgt wie bei dem CAN-Bus mit<br />
einem zufallsorientierten Zugriffsverfahren mit Kollisionserkennung. Anders als beim CAN werden im<br />
Kollisionsfall aber beide Nachrichten nicht übertragen <strong>und</strong> die Sender verhandeln, wer die Nachricht<br />
zuerst absetzen darf. Da jedoch die Protokollstruktur die auf dem Ethernet aufsetzt (TCP) von kaum<br />
einem Controller direkt unterstützt wird, ist er <strong>für</strong> das geplante Netz eher ungeeignet.<br />
26.07.2004 Seite 35 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
5.3.9. Übersicht<br />
Parallele Systeme<br />
Name PC SCSI IEC<br />
Geräteanzahl - 8 - 32 15<br />
Kabellänge - 6 - 25 m 2 m<br />
Leitungen 62 50 - 110 23<br />
Datenbusbreite 8 Bit 8 - 32 Bit 8 Bit<br />
Adressbreite 1 MByte 3 - 5 Bit 5 Bit<br />
Datenübertragungsrate 1 MByte/s 5 - 20 MByte/s 1 MByte/s<br />
Übertragungsart Synch. Asynch. Asynch.<br />
Buszugriffsart - Master/Slave<br />
Multi-master<br />
Master/Slave<br />
Topologie Bus Bus Bus<br />
Serielle Systeme<br />
Name RS232 I²C USB CAN Ethernet<br />
Geräteanzahl 2 127 127 1024<br />
Kabellänge 15 m Wenige<br />
Meter<br />
3 - 5 m Bis 1000<br />
26.07.2004 Seite 36 von 85<br />
m<br />
2500 m<br />
Leitungen 3 2 3 1 - 2 1 - 2<br />
Adressbreite - 7 Bit 7 Bit 5 - 29 Bit 10 Bit<br />
Datenübertragungsrate 20<br />
kBit/s<br />
100<br />
kByte/s<br />
1,5 - 480<br />
MByte/s<br />
Übertragungsart Asym. Synch. Sym.,<br />
Buszugriffsart - Master/Slave<br />
Topologie Punkt-zu-<br />
Punkt<br />
multi-master<br />
Tabelle 5.4 - Übersicht über Bussysteme<br />
[etsch], [law], [dem]<br />
Asynch.<br />
Bus Punkt-zu-<br />
Bis 1<br />
MBit/s<br />
Sym.,<br />
Asynch.<br />
Master/Slave Zufall<br />
Punkt<br />
multi-m.<br />
10 - 100<br />
MBit/s<br />
Alles<br />
möglich<br />
Zufall<br />
multi-m.<br />
Bus Bus
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
5.4. Auswahl des verwendeten Busses<br />
Für ein verteiltes Netzwerk von Sensoren <strong>und</strong> Aktoren spielen folgende Faktoren eine wichtige Rolle:<br />
- einfache Anschlussmöglichkeit<br />
- ausreichende Kabellänge<br />
- robuste Verbindung<br />
- Fehlertoleranz<br />
- einfaches Einfügen/Auskoppeln von Teilnehmern<br />
Aus der Tabelle 4.4 ist ersichtlich, dass es in Hinblick auf Geschwindigkeit kaum Vorteile durch<br />
parallele Bussysteme gibt. Da serielle Verbindungen durch die geringe Leitungsanzahl wesentlich<br />
einfacher aufzubauen <strong>und</strong> zu warten sind, überwiegt dieser Vorteil bei weitem. Ein Nachteil ist<br />
generell die begrenzte Anzahl von anschließbaren Geräten.<br />
Der CAN-Bus sticht hierbei heraus, da er die Anzahl der Teilnehmer nicht vom Protokoll her begrenzt,<br />
sondern diese nur von der Leistungsfähigkeit der eingesetzten Treiberbausteine abhängt. Des<br />
Weiteren verfügt er über mehrere, einander ergänzende Fehlererkennungsmechanismen. Da der<br />
CAN-Bus symmetrisch betrieben wird <strong>und</strong> somit eine sehr geringe Fehlerquote aufweist, ist er die<br />
beste Wahl <strong>für</strong> ein verteiltes Netzwerk. Die im Vergleich zum Ethernet geringere<br />
Datenübertragungsrate wirkt sich im Projekt nicht negativ aus. Außerdem finden sich preisgünstige<br />
Umsetzungen des CAN in vielen Mikrocontrollern. Ethernet ist dagegen vergleichsweise teuer. Daher<br />
wurde <strong>für</strong> die Realisierung des Netzwerkes der CAN-Bus gewählt.<br />
Wegen der begrenzten Ausbreitungsgeschwindigkeit (17-20cm/s) der Signale auf den Leitungen <strong>und</strong><br />
der Tatsache, dass in einigen Protokoll-Abschnitten eine Reaktion anderer Bus-Teilnehmer verlangt<br />
wird, sind Bitrate <strong>und</strong> Buslänge beim CAN-Bus direkt miteinander gekoppelt. Das heißt, je länger die<br />
Leitungen sind, umso geringer kann die Übertragungsrate sein.<br />
Formel: Buslänge * Bitrate < 40m * 1MBit/s.<br />
Daraus ergeben sich zum Beispiel folgende Beziehungen:<br />
40 m Buslänge bei 1 MBit/s<br />
400 m Buslänge bei 100 kBit/s<br />
1000 m Buslänge bei 40 kBit/s<br />
Diese sollten <strong>für</strong> einen normalen Betrieb eines Netzwerkes ausreichen. Für höhere Datenströme, wie<br />
sie unter Umständen bei Videoanwendungen auftreten können, muss dann partiell auf ein anderes<br />
System umgestiegen werden. Die Datenüberragungsrate muss dem CAN-Controller bekannt sein.<br />
Der CAN-Bus ist im OSI-Modell in den Schichten 1 (physikalische Schicht) <strong>und</strong> 2 (Sicherungsschicht)<br />
angesiedelt. Er übernimmt also die physikalische Übertragung <strong>und</strong> die Sicherstellung der<br />
Fehlererkennung <strong>und</strong> Korrektur der ankommenden Daten. Dazu verfügt jede CAN-Botschaft über eine<br />
15-Bit-CRC-Prüfsumme, es wird ein Frame-Check durchgeführt <strong>und</strong> der Sender erwartet eine<br />
26.07.2004 Seite 37 von 85
<strong>Diplomarbeit</strong>: Modulares System Vergleich von Bussystemen <strong>für</strong> die Kommunikation<br />
Bestätigung über den Empfang seiner Nachricht. Im Fehlerfall erfolgt eine automatische Wiederholung<br />
der fehlerhaften Nachrichtensendung. Parallel dazu existieren noch zwei Mechanismen zur<br />
Fehlererkennung auf Bitebene. Das ist zum einen das so genannte Monitoring: jeder Sender<br />
beobachtet den Buspegel. Durch Differenzen zwischen gesendetem <strong>und</strong> empfangenem Bit können<br />
Bitfehler schnell erkannt werden. Zum anderen werden die Synchronisationsflanken nach der<br />
Methode des Bit-stuffings erzeugt. Die NRZ-Codierung (Non-Return-To-Zero) gewährleistet die<br />
maximale Effizienz bei der Bitcodierung.<br />
Durch den Aufbau als echter Bus <strong>und</strong> sein Zugriffsverfahren ist CAN sehr robust, was den Ausfall<br />
oder das Einfügen von Teilnehmern angeht. Da<strong>für</strong> muss nicht das gesamte Netzwerk abgeschaltet<br />
werden, sondern es kann im laufenden Betrieb geschehen. Tritt ein Fehler mehrfach auf, deaktivieren<br />
sich die störenden Teilnehmer automatisch selbst.<br />
Eine CAN-Nachricht kann bis zu acht Byte Daten enthalten <strong>und</strong> ist in ein so genanntes Frame<br />
eingebettet. Dieses besteht aus dem Identifier, Steuer- <strong>und</strong> Acknowledge-Bit. Für den Identifier sind<br />
zwei verschiedene Größen vorgesehen. Die ältere Reglementierung (CAN 2.0A) sieht einen 11-Bit-<br />
Identifier vor. Neuere Umsetzungen setzen auf einen 29-Bit-Identifier nach dem Standard CAN 2.0B.<br />
Aufbau des Identifiers: siehe Kapitel 3.3.<br />
Der CAN-Bus ist durch seine Eigenschaften die beste Wahl <strong>für</strong> dieses Projekt. Er ist robust, schnell,<br />
einfach zu bedienen <strong>und</strong> kostengünstig. An Stellen wo seine Fähigkeiten nicht mehr ausreichen, kann<br />
auf ein anderes Bussystem umgestiegen werden. So genannte Bridges ermöglichen dann die<br />
Kommunikation über die Busgrenzen hinweg.<br />
26.07.2004 Seite 38 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
6. Programmierung der Knotenpunkte<br />
Herkömmliche Robotersysteme besitzen im Allgemeinen einen leistungsfähigen Prozessor als<br />
zentrale Einheit, an den die Sensoren <strong>und</strong> Aktoren direkt angeschlossen werden. Der Vorteil dieses<br />
Aufbaus liegt darin, dass nur eine einzige rechenstarke Einheit programmiert werden muss. Der<br />
Nachteil ist, dass solche Systeme in der Anzahl der anschließbaren Sensoren <strong>und</strong> Aktoren meist stark<br />
begrenzt sind. Oft sind nicht mehr als zehn Anschlüsse vorhanden. Für größere Roboter müssen dann<br />
mehrere dieser Prozessoren vernetzt oder ein Bussystem integriert werden. Zusätzlich ist der<br />
Wechsel auf einen anderen leistungsfähigeren Prozessor zum Teil sehr aufwendig, da viele Teile der<br />
Programme neu entwickelt werden müssen. Des Weiteren ist eine Erweiterung des bestehenden<br />
Roboters meist nur durch Abschalten <strong>und</strong> Neuprogrammierung möglich. Eingriffe in ein laufendes<br />
System sind normalerweise nicht vorgesehen.<br />
Mit einem Netzwerk von einzeln agierenden Sensoren <strong>und</strong> Aktoren ist es möglich, genau diese<br />
Nachteile zu umgehen. Jeder Knotenpunkt läuft weitestgehend autark <strong>und</strong> kann zu jeder Zeit aus dem<br />
Netzwerk entfernt werden. Sollten andere Teilnehmer auf Informationen von ihm angewiesen sein,<br />
bekommen sie zwar eine Fehlermeldung <strong>und</strong> können unter Umständen ihre Aufgabe nicht mehr<br />
vollständig wahrnehmen, aber dies beeinflusst in vielen Fällen nicht das Gesamtsystem. Es kann<br />
weiter laufen <strong>und</strong> sobald der entfernte Knotenpunkt wieder aktiv wird, ist der alte Zustand ohne<br />
Unterbrechung wiederhergestellt. Dadurch können (nahezu) beliebig viele Sensoren <strong>und</strong> Aktoren<br />
miteinander kombiniert werden. Damit sich die Kosten <strong>für</strong> so ein Netzwerk nicht überschlagen,<br />
müssen die Steuereinheiten <strong>für</strong> jeden Sensor <strong>und</strong> Aktor entsprechend günstig sein. Statt einem<br />
leistungsfähigen Zentralrechner wird eine Vielzahl kleinerer Controller verwendet.<br />
Der Nachteil bei dieser Herangehensweise ist, dass jeder dieser Controller separat programmiert<br />
werden muss. Solange alle vom gleichen Typ sind, ist der Aufwand noch überschaubar, aber sobald<br />
später einmal das Netzwerk erweitert werden soll <strong>und</strong> die verwendeten Controller nicht mehr<br />
verfügbar sind oder leistungsfähigere Controller verwendet werden sollen, würde der Aufwand wieder<br />
stark ansteigen. Sinn macht es daher, von Anfang an auf den Controllern eine Virtuelle Maschine zu<br />
installieren. Werden die Controller ausgetauscht, muss nur die Virtuelle Maschine <strong>für</strong> den neuen<br />
Controllertyp angepasst werden <strong>und</strong> alle Steuerungsprogramme funktionieren ohne Änderung weiter.<br />
Am einfachsten wäre es <strong>für</strong> den Entwickler, wenn er <strong>für</strong> die Programmierung des Netzwerkes eine der<br />
momentan verbreiteten Sprachen (wie C++, Pascal oder JAVA) verwenden könnte. Leider sind diese<br />
Sprachen mittlerweile so komplex <strong>und</strong> umfangreich, dass eine dazugehörige virtuelle Maschine die<br />
Leistungsfähigkeit eines einfachen Controllers mit wenig Speicher schnell übersteigen würde. Nach<br />
Rücksprache mit Prof. Dr.-Ing. Beck (Professor <strong>für</strong> Compiler/Interpreter-Bau an der HTW-<strong>Dresden</strong>) fiel<br />
die Wahl auf einen von ihm verwendeten Compiler, der auf der Sprache PL0 basiert. Die zugehörige<br />
Virtuelle Maschine ist so klein gehalten, dass sie auch auf Controllern mit wenigen h<strong>und</strong>ert Byte<br />
Speicher zumindest einfache kleine Programme noch ausführen kann, die zu Steuerzwecken in der<br />
Regel ausreichen.<br />
26.07.2004 Seite 39 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
6.1. Die Programmiersprache PL0<br />
Die Syntax von PL0 ist dem Pascal sehr ähnlich. Eine Vereinfachung zu Pascal besteht in der<br />
Beschränkung auf einen einzigen Datentyp (integer <strong>für</strong> ganzzahlige Konstanten <strong>und</strong> Variablen).<br />
Dadurch reduziert sich die Größe der Virtuellen Maschine enorm. Um effizient programmieren zu<br />
können, sind in PL0 Prozeduraufrufe vorgesehen. Diese wurden <strong>für</strong> diese Arbeit zusätzlich um die<br />
Möglichkeit von Funktionsaufrufen, also mit Rückgabewert, erweitert, da dies die Programmierung<br />
enorm erleichtert <strong>und</strong> kaum Zusatzaufwand in der Virtuellen Maschine bedeutet.<br />
Standardmäßig waren im vorhandenen PL0-Compiler folgende Befehle realisiert:<br />
Befehl Bedeutung<br />
VAR a,b; Variablendefinition<br />
IF bedingung THEN anweisung Einseitige Bedingung<br />
WHILE bedingung DO anweisung Kopfgesteuerte Schleife<br />
PROCEDURE name; Prozedur-Deklaration<br />
BEGIN anweisungen END Anweisungsblock<br />
CALL name Prozeduraufruf<br />
? a Eingabeaufforderung <strong>für</strong> eine Zahl<br />
! a Ausgabe einer Zahl<br />
odd<br />
= #<br />
< >=<br />
Vergleichsoperatoren:<br />
ungerade<br />
gleich, ungleich<br />
kleiner, kleiner gleich<br />
größer, größer gleich<br />
+ - * / Mathematische Operatoren<br />
Tabelle 6.1 - Sprachumfang von PL0<br />
Die Befehle PUT <strong>und</strong> GET wurden hinzugefügt, um die Kommunikation zwischen den Knotenpunkten<br />
zu realisieren. Sie sind möglichst einfach gehalten, um unabhängig von der Art des Knotenpunkts alle<br />
Daten übermitteln zu können. Jeder Sensor <strong>und</strong> Aktor verfügt über eine definierte Parametermenge,<br />
die unterschiedlich groß sein kann. Jeder Parameter kann einzeln abgefragt <strong>und</strong> gesetzt werden<br />
(siehe auch Kapitel 3).<br />
Im Anhang A.1 befinden sich die Syntaxgraphen, die die Sprache abbilden.<br />
[beck]<br />
26.07.2004 Seite 40 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
Erweitert wurden folgende Elemente:<br />
Befehl Erweiterung<br />
{ text } Kommentar<br />
IF bedingung THEN anweisung<br />
ELSE anweisung<br />
Zweiseitige Bedingung<br />
FUNCTION name; Funktionsdeklaration. Gibt einen Wert zurück.<br />
PUT(group,id,parameter,value); Anweisung an den Knotenpunkt id den Wert value<br />
an die Stelle parameter zu schreiben<br />
GET(group,id,parameter); Anweisung an den Knotenpunkt id den Wert an<br />
der Stelle parameter zu lesen <strong>und</strong><br />
zurückzusenden<br />
Tabelle 6.2 - Erweiterung von PL0 <strong>für</strong> den Einsatz im Netzwerk<br />
6.2. Beispielanwendung<br />
Um den Unterschied zwischen einem zentral gesteuerten Roboter <strong>und</strong> einem verteilten Netzwerk von<br />
Sensoren <strong>und</strong> Aktoren zu verdeutlichen, eignet sich folgendes Beispiel recht gut. Dabei wird von der<br />
Steuerung des Khepera - Roboters ausgegangen. Er ist als Beispiel im in Kapitel 6 aufgeführten<br />
Simulator Easybot enthalten <strong>und</strong> kann daher verwendet werden, um die Vorgehensweise zu testen.<br />
Der Khepera verfügt über sechs frontale <strong>und</strong> zwei rückwärtige Entfernungssensoren. Als Antrieb<br />
werden zwei Motoren eingesetzt. Die Sensoren <strong>und</strong> die Motoren werden durchnummeriert, um sie<br />
ansteuern zu können.<br />
Abbildung 6.1 - Schematische Darstellung eines Khepera<br />
Das Programm soll durch eine einfache Zusammenrechnung der einzelnen Sensorwerte sicherstellen,<br />
dass der Roboter nicht gegen eine Wand fährt.<br />
26.07.2004 Seite 41 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
6.2.1. Zentrales Programm<br />
Für den zentralen Prozessor wird das Programm am Stück übersetzt <strong>und</strong> auf den Khepera geladen.<br />
Die Abkürzungen der Variablen bedeuten:<br />
sfl - sensor front left<br />
shl - sensor front half left<br />
sl - sensor left<br />
srl - sensor rear left<br />
ml - motor left<br />
Für rechts erfolgt die Namensgebung nach dem gleichen Schema.<br />
Das Programm liest die einzelnen Sensorwerte aus (über die gleichen Funktionen, die auch im<br />
Netzwerk verwendet werden), <strong>und</strong> rechnet sie <strong>für</strong> beide Motoren zusammen <strong>und</strong> setzt diese Werte.<br />
var sfl,shl,sl,sfr,shr,sr,srl,srr,ml,mr,sreach,speed;<br />
BEGIN<br />
speed:=5;<br />
sreach :=get(8,1,1); {get sensor reach}<br />
sfl:=get(8,3,0); if sfl>sreach then sfl:=sreach; {get sensor front left}<br />
shl:=get(8,2,0); if shl>sreach then shl:=sreach; {get sensor half left}<br />
sl :=get(8,1,0); if sl >sreach then sl :=sreach; {get sensor left}<br />
sfr:=get(8,4,0); if sfr>sreach then sfr:=sreach; {get sensor front right}<br />
shr:=get(8,5,0); if shr>sreach then shr:=sreach; {get sensor half right}<br />
sr :=get(8,6,0); if sr >sreach then sr :=sreach; {get sensor right}<br />
srl:=get(8,8,0); if srl>sreach then srl:=sreach; {get sensor rear left}<br />
srr:=get(8,7,0); if srr>sreach then srr:=sreach; {get sensor rear right}<br />
ml:=sfl+shl+sl-(sfr+shr+sr)/(speed/2);<br />
mr:=sfr+shr+sr-(srl+shl+sl)/(speed/2);<br />
put(10,1,0,mr/speed); {set right motor speed}<br />
put(10,2,0,ml/speed); {set left motor speed}<br />
END.<br />
Abbildung 6.2 - Beispielprogramm <strong>für</strong> eine zentrale Steuerung<br />
Soll nun der Roboter zum Beispiel um Scheinwerfer erweitert werden, muss er angehalten <strong>und</strong><br />
umprogrammiert werden. Erst danach kann er mit der neuen Funktionalität seine Arbeit wieder<br />
aufnehmen. Die Scheinwerfer leuchten in Abhängigkeit davon, ob sich der Roboter bewegt.<br />
var sfl,shl,sl,sfr,shr,sr,srl,srr,ml,mr,sreach,speed;<br />
BEGIN<br />
speed:=5;<br />
sreach :=get(8,1,1); {get sensor reach}<br />
...<br />
...<br />
put(10,1,0,mr/speed); {set right motor speed}<br />
put(10,2,0,ml/speed); {set left motor speed}<br />
if (mr*ml)=0 then put(9,1,0,0); {set headlights off}<br />
else put(9,1,0,1); {set headlights on}<br />
END.<br />
Abbildung 6.3 - Das erweiterte zentralgesteuerte Programm<br />
26.07.2004 Seite 42 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
6.2.2. Verteiltes Programm<br />
Im verteilten Netzwerk, in dem jeder Sensor <strong>und</strong> jeder Aktor eine eigene Rechenlogik besitzt, könnte<br />
jeder Knotenpunkt obiges Programm ausführen. Das Programm kann aber auch in Teile zerlegt<br />
werden, die jeweils die Steuerung eines Motors übernehmen. Diese können dann direkt auf dem dem<br />
Motor zugehörigen Controller laufen. Fällt nun ein Motor aus, funktioniert der andere weiter (in diesem<br />
Beispiel nicht sinnvoll, da der Roboter im Kreis fahren würde, aber immerhin wäre es möglich). Wenn<br />
dieses Prinzip <strong>für</strong> andere Anwendungen adaptiert wird, kann so die Funktionalität jederzeit erweitert<br />
werden, ohne die laufenden Programme zu unterbrechen. So können die im Beispiel verwendeten<br />
Scheinwerfer nachträglich hinzugefügt werden Der Programmteil dazu funktioniert unabhängig von<br />
den beiden anderen auf dem Controller der Scheinwerfer <strong>und</strong> kann jederzeit ersetzt oder entfernt<br />
werden. Auch wenn die Motorsteuerung geändert wird, hat das keinen Einfluss auf das<br />
Scheinwerferprogramm.<br />
var sfl,shl,sl,sfr,shr,sr,srl,srr,ml,sreach,speed;<br />
BEGIN<br />
speed:=5;<br />
sreach :=get(8,1,1); {get sensor reach}<br />
sfl:=get(8,3,0); if sfl>sreach then sfl:=sreach; {get sensor front left}<br />
shl:=get(8,2,0); if shl>sreach then shl:=sreach; {get sensor half left}<br />
sl :=get(8,1,0); if sl >sreach then sl :=sreach; {get sensor left}<br />
sfr:=get(8,4,0); if sfr>sreach then sfr:=sreach; {get sensor front right}<br />
shr:=get(8,5,0); if shr>sreach then shr:=sreach; {get sensor half right}<br />
sr :=get(8,6,0); if sr >sreach then sr :=sreach; {get sensor right}<br />
srl:=get(8,8,0); if srl>sreach then srl:=sreach; {get sensor rear left}<br />
srr:=get(8,7,0); if srr>sreach then srr:=sreach; {get sensor rear right}<br />
ml:=sfl+shl+sl-(sfr+shr+sr)/(speed/2);<br />
put(10,2,0,ml/speed); {set left motor speed}<br />
END.<br />
Abbildung 6.4 - Verteiltes Programm: linker Motor<br />
var sfl,shl,sl,sfr,shr,sr,srl,srr,mr,sreach,speed;<br />
BEGIN<br />
speed:=5;<br />
sreach :=get(8,1,1); {get sensor reach}<br />
sfl:=get(8,3,0); if sfl>sreach then sfl:=sreach; {get sensor front left}<br />
...<br />
...<br />
srr:=get(8,7,0); if srr>sreach then srr:=sreach; {get sensor rear right}<br />
mr:=sfr+shr+sr-(srl+shl+sl)/(speed/2);<br />
put(10,1,0,mr/speed); {set right motor speed}<br />
END.<br />
Abbildung 6.5 - Verteiltes Programm: rechter Motor<br />
var ml,mr;<br />
BEGIN<br />
mr:=get(10,1,0);<br />
ml:=get(10,2,0);<br />
if (mr*ml)=0 then put(9,1,0,0); {set headlights off}<br />
else put(9,1,0,1); {set headlights on}<br />
END.<br />
Abbildung 6.6 - Verteiltes Programm: Scheinwerfer<br />
26.07.2004 Seite 43 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
6.3. Umsetzung<br />
Um die Sensoren <strong>und</strong> Aktoren beziehungsweise die dazugehörigen Controller in die Lage zu<br />
versetzen, Steuerprogramme ausführen zu können, müssen die PL0-Programme in einen Code<br />
übersetzt werden, den die Controller verstehen. Um die Programme nicht <strong>für</strong> jeden Controllertypen<br />
spezifisch zu übersetzen, wird ein Code erzeugt, der von einer Virtuellen Maschine ausgeführt<br />
werden kann. Diese verfügt über einen Kellerspeicher, auf dem alle Daten abgelegt werden. Damit sie<br />
auch auf kleineren Controllern mit wenig Arbeitsspeicher lauffähig ist, ist die Breite des Maschinen-<br />
Speichers auf zwei Byte festgelegt.<br />
Der Code ist relativ klein gehalten <strong>und</strong> kommt mit derzeit 35 Befehlen aus. Damit ist er bereits<br />
gegenüber dem von Prof. Beck verwendeten Zwischencode um einige Befehle erweitert worden. Sie<br />
dienen zum einen dem Alternativ-Zweig der zweiseitigen Verzweigung (IF THEN ELSE) <strong>und</strong> den<br />
Funktionsaufrufen <strong>und</strong> zum anderen wurden zwei neue Befehle eingeführt, um mit den anderen<br />
Knotenpunkten kommunizieren zu können. Diese Befehle holen sich ihre Parameter vom<br />
Kellerspeicher <strong>und</strong> schreiben die Ergebnisse dorthin zurück. Die Virtuelle Maschine entscheidet dabei,<br />
ob sich die Anfrage an einen entfernten Knoten richtet oder die Daten direkt vom gleichen Controller<br />
bezogen werden können. Dadurch, dass keine Unterschiede bei diesen beiden Aufrufen in der<br />
Skriptsprache gemacht werden, vereinfacht sich die Programmierung <strong>und</strong> die Programme können mit<br />
gleichen Ergebnissen auf jedem Knoten ausgeführt werden, ohne extra angepasst werden zu<br />
müssen.<br />
6.3.1. Der Compiler<br />
Auf die genaue Entwicklung eines Compilers soll hier nicht eingegangen werden, sondern es wird nur<br />
ein grober Überblick gegeben.<br />
Ein Compilervorgang besteht aus mehreren Phasen. Am folgenden Beispiel werden diese kurz<br />
erläutert.<br />
CONST pi=3;<br />
VAR a,x;<br />
BEGIN<br />
IF a>0 THEN<br />
x:=2*pi+a;<br />
END.<br />
Phase Bedeutung<br />
Lexikalische Analyse Der Quelltext wird in eine Folge von Symbolen zerlegt.<br />
(const)(id,pi)(=)(num,3)(;)<br />
(var)(id,a)(,)(id,x)(;)<br />
(begin)<br />
(if)(id,a)(>)(then)<br />
(id,x)(:=)(num,2)(*)(id,pi)(+)(id,a)(;)<br />
(end)(;)<br />
26.07.2004 Seite 44 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
Syntaxanalyse Die Symbole der lexikalischen Analyse werden in einen<br />
Syntaxbaum überführt <strong>und</strong> dabei auf ihre formale<br />
Korrektheit geprüft.<br />
Semantische Analyse Der Syntaxbaum wird attributiert <strong>und</strong> in eine Symboltabelle<br />
überführt. Dazu wird die inhaltliche Korrektheit des<br />
Programms überprüft.<br />
Name Art Wert/Adresse<br />
pi const 3<br />
a var 0<br />
x var 4<br />
Zwischencodegenerierung Der Baum wird in maschinenunabhängigen Zwischencode<br />
überführt.<br />
if a > 0 goto L1<br />
goto L2<br />
L1: t1 = 2 * 3<br />
t2 = t1 + a<br />
x = t2<br />
L2:<br />
Codeoptimierung Aus dem Zwischencode werden überflüssige Anweisungen<br />
<strong>und</strong> unnötige Zugriffe (z.B. auf den Arbeitsspeicher)<br />
entfernt.<br />
L:<br />
if a
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
Die Phasen können nacheinander ausgeführt werden. Dies wird aber in der Praxis aus<br />
Geschwindigkeitsgründen eher selten gemacht, sondern die Phasen werden zusammengefasst <strong>und</strong><br />
parallel ausgeführt. Es wird dann von einem Ein-Pass-Compiler gesprochen.<br />
Der verwendete Compiler ist ein solcher Ein-Pass-Compiler mit Syntax- <strong>und</strong> Codetabellen.<br />
Änderungen können einfach durchgeführt werden, indem die Tabellen angepasst werden. Die<br />
lexikalische Analyse wird durch einen endlichen Automaten (Zustandsmaschine) mit<br />
Zeichenklassenvektor, Schaltmatrize <strong>und</strong> Symboltabelle durchgeführt. Er liefert schrittweise die<br />
Symbole an die nachfolgenden Phasen. Die Syntax- <strong>und</strong> die semantische Analyse <strong>und</strong> die<br />
Codeerzeugung werden über Überführungsgraphen realisiert. Dazu werden die Syntaxgraphen<br />
umgeformt <strong>und</strong> so genannte Bögen definiert. Durch diese Bögen wird die Korrektheit des Programms<br />
sichergestellt <strong>und</strong> die Überführung in den Zielcode realisiert. Der Automat geht dabei vom ersten<br />
erkannten Symbol aus <strong>und</strong> versucht es in den Bögen zu finden. Nur wenn dies gelingt <strong>und</strong> der weitere<br />
Ablauf des Programms ebenfalls durch die Bögen realisiert werden kann, ist es korrekt <strong>und</strong> kann in<br />
Maschinencode übersetzt werden. An den Knotenpunkten jedes Bogens werden Funktionen<br />
aufgerufen, die der Codeerzeugung dienen.<br />
Der fertige Code kann auf den Controller gespielt <strong>und</strong> von der dort befindlichen Virtuellen Maschine<br />
direkt ausgeführt werden.<br />
Abbildung 6.7 - Codedatei<br />
Im Anhang A.2 <strong>und</strong> A.3 befinden sich die Symboltabellen <strong>und</strong> Bogengraphen des Compilers.<br />
[beck]<br />
00: 03 00 01 00 1B 22 00 00|00 08 00 01 00 00 06 01<br />
10: 00 13 1E 19 0F 00 04 04|00 06 02 00 06 00 00 0E<br />
20: 01 00 00 0C 07 17 03 00|00 00 02 00<br />
6.3.2. Die Virtuelle Maschine<br />
Die virtuelle Maschine muss den vom Compiler erzeugten Code verstehen <strong>und</strong> ausführen können.<br />
Sie besitzt einen Kellerspeicher, auf dem die Operationen ausgeführt werden.<br />
In den Code wurde am Anfang eine Versionsnummer integriert. Anhand dieser kann die Virtuelle<br />
Maschine entscheiden, ob sie den Code ausführen kann oder nicht. Am Ende der Codedatei folgt die<br />
Konstantentabelle. Der Code ist prozedurweise abgelegt <strong>und</strong> wird komplett eingelesen, umgeformt<br />
<strong>und</strong> als Listen <strong>und</strong> Tabellen im Speicher abgelegt. Danach wird die Hauptroutine Befehl <strong>für</strong> Befehl<br />
ausgeführt <strong>und</strong> falls es nötig ist in die Unterfunktionen verzweigt.<br />
Die Prozeduren enthalten in ihrer Deklaration ihre Codelänge, eine fortlaufende Nummer <strong>und</strong> die<br />
Größe des Variablenspeichers. [beck]<br />
26.07.2004 Seite 46 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
Das Beispiel aus dem vorigen Abschnitt wird also von der Maschine so gelesen:<br />
03 00 - Versionsnummer (3)<br />
01 00 - Anzahl Prozeduren (1)<br />
1B 22 00 00 00 08 00 - Prozedur 0 mit 34 Byte Codelänge <strong>und</strong> 8 Byte Datenlänge<br />
01 00 00 - puValVrMain 0 (a)<br />
06 01 00 - puConst 1 (0)<br />
13 - cmpGT<br />
1E - dup<br />
19 0F 00 - jnot<br />
04 04 00 - puAdrVrMain 4 (x)<br />
06 02 00 - puConst 2 (3)<br />
06 00 00 - puConst 0 (0)<br />
0E - OpMult<br />
01 00 00 - puValVrMain 0 (a)<br />
0C - OpAdd<br />
07 - storeVal<br />
17 - retProc<br />
03 00 - Konstante 0 (3)<br />
00 00 - Konstante 1 (0)<br />
02 00 - Konstante 2 (2)<br />
Abbildung 6.8 - Interpretierte Codedatei<br />
Für jeden Befehl, den die Maschine ausführen soll, existiert eine Funktion, die ihn realisiert <strong>und</strong> auf<br />
dem Kellerspeicher <strong>und</strong> mit dem Speicher arbeitet. Identisch arbeitende Funktionen (z.B. die<br />
Vergleichsoperatoren) wurden dabei weitestgehend zusammengefasst.<br />
while (!Ende)<br />
{<br />
switch (*pC++)<br />
{<br />
case puValVrLocl:FcpuValVrLocl(); break;<br />
case puValVrMain:FcpuValVrMain(); break;<br />
...<br />
}<br />
}<br />
/*--- Push Value Variable local ---*/<br />
int FcpuValVrLocl(void)<br />
{<br />
short Displ,Val;<br />
Displ=getShortParameter(pC);pC+=2;<br />
Val=rd2(pInfProc[iCProc].pVar+Displ);<br />
push2(Val);<br />
return OK;<br />
}<br />
...<br />
Abbildung 6.9 - Beispiele <strong>für</strong> Funktionen der Virtuellen Maschine<br />
26.07.2004 Seite 47 von 85
<strong>Diplomarbeit</strong>: Modulares System Programmierung der Knotenpunkte<br />
6.4. Zusammenfassung<br />
Da moderne Hochsprachen sehr komplex sind <strong>und</strong> sich diese Komplexität auch in der Virtuelle<br />
Maschine niederschlagen würde, es aber erklärtes Ziel ist, diese auch auf leistungsschwächeren<br />
Controllern laufen zu lassen, wurde eine einfache Sprache (PL0) gewählt. Die <strong>für</strong> die Umsetzung<br />
benötigten Komponenten ließen sich aus dem von Prof. Beck bereitgestellten Quellen realisieren.<br />
Der verwendete Compiler kann als Lexer, als Parser oder als Compiler übersetzt werden. Der Lexer<br />
ist nur <strong>für</strong> die lexikalische Analyse zuständig. Der Parser versucht, die Symbole, die der Lexer liefert,<br />
in den Bogengraphen einzusortieren. Mit den Knotenpunkten der Graphen sind Funktionen<br />
verb<strong>und</strong>en, die <strong>für</strong> die Codegenerierung zuständig sind. Damit wird aus dem Parser der Compiler.<br />
Dazu gehört noch die virtuelle Maschine, die die Codedateien ausführt. Alle Programme sind in C<br />
geschrieben <strong>und</strong> als Kommandozeilenversion übersetzt. Es existiert ein MS Visual C++ 6.0 - Projekt,<br />
in das alle Einzelprogramme integriert wurden, so dass sie auf der gleichen Codebasis arbeiten. Mit<br />
diesen vier Programmen ist eine Basis vorhanden, mit der eigene Skripte übersetzt <strong>und</strong> ausgeführt<br />
werden können.<br />
Als Kommandozeilenvariante funktioniert zwar der Compiler, er ist aber wenig komfortabel. Er sollte in<br />
einer späteren Arbeit aufbereitet <strong>und</strong> in eine grafisch orientierte Windows-Oberfläche überführt<br />
werden. In erster Linie ist ein „normaler“ Editor mit entsprechenden Compilermöglichkeiten<br />
ausreichend. Weiterführend wäre dann eine Programmierung aus „Bausteinen“, wie sie auch von<br />
LEGO Mindstorms <strong>und</strong> fischertechnik angeboten wird, sinnvoll. Dabei wird nicht herkömmlicher<br />
Quelltext geschrieben, sondern er wird aus Programmbausteinen wie beispielsweise zweiseitigen<br />
Bedingungen oder kopfgesteuerten Schleifen aufgebaut, die dann grafisch miteinander verb<strong>und</strong>en<br />
werden. In dieser Richtung gibt es noch viel Entwicklungsspielraum.<br />
Abbildung 6.10 - Grafische Programmierung bei LEGO<br />
26.07.2004 Seite 48 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
7. Testen der Steuerungsskripte im Simulator<br />
Wenn eine Robotersteuerung entwickelt wird, ist es oft schwierig, alle Abläufe exakt zu bedenken <strong>und</strong><br />
alle Fehlerquellen von Anfang an auszuschließen. Viele Tests am echten Objekt sind nötig, um die<br />
Algorithmen <strong>und</strong> Verfahren zu testen <strong>und</strong> zu optimieren. Dies ist natürlich immer mit der Gefahr<br />
verb<strong>und</strong>en, dass ein Test fehlschlägt <strong>und</strong> wertvolle <strong>Technik</strong> beschädigt wird. Außerdem sind<br />
umfangreiche Testserien, die immer wieder die gleiche Ausgangssituation benötigen (wie dies zum<br />
Beispiel bei der Entwicklung genetischer Algorithmen oder neuronaler Netze der Fall ist), sehr<br />
aufwendig <strong>und</strong> oft schon dadurch verfälscht, dass der Mensch nie exakt die gleiche Ausgangssituation<br />
herstellen kann.<br />
Diese Probleme lassen sich reduzieren, wenn die Tests mit einem Simulator ausgeführt werden<br />
können. Zum einen entfallen die aufwendigen Testvorbereitungen (Umgebung bauen, Roboter<br />
technisch vorbereiten <strong>und</strong> programmieren usw.) <strong>und</strong> zum anderen ist es möglich, exakt die gleiche<br />
Umgebung immer <strong>und</strong> immer wieder als Ausgangssituation zu nutzen.<br />
Die Arbeit, um einen solchen Simulator zu entwickeln, ist enorm. Zusätzlich zu den Erfordernissen, die<br />
die Programmierbarkeit des zu simulierenden Roboters mit sich bringt, kommen noch einige weitere.<br />
So muss der Simulator in der Lage sein, eine mögliche Umgebung realitätstreu nachzuahmen. Er<br />
sollte einfach zu bedienen sein <strong>und</strong> dynamische Anpassungen ermöglichen.<br />
7.1. Vergleich verschiedener Simulatoren<br />
In diesem Abschnitt werden verschiedene Simulatoren auf ihre Tauglichkeit untersucht, das verteilte<br />
Netzwerk von Sensoren <strong>und</strong> Aktoren in einer realen Umgebung zu simulieren.<br />
7.1.1. LLWin<br />
Die Firma fischertechnik aus Deutschland liefert zu ihrem Roboterbaukasten eine<br />
Entwicklungsumgebung mit. Diese ermöglicht das einfache Verbinden von Funktionsbausteinen. Es<br />
wird nicht wie zum Beispiel im MS Visual C++ textbasiert programmiert, sondern vielmehr ein<br />
Programm mit Mausklicks zusammengestellt. Der Vorteil dieser Entwicklungsumgebung im Vergleich<br />
zur funktionsmäßig sehr ähnlichen der dänischen Firma LEGO ist, dass sie über einen<br />
Simulationsmodus verfügt. Dieser ermöglicht es den Entwicklern, ihre Programme zu testen, ohne das<br />
reale Modell aufbauen zu müssen. Die Software hat einen hohen Abstraktionsgrad <strong>und</strong> erfordert<br />
einiges an Vorstellungsvermögen, um den programmierten Roboter mit den Aktionen in Verbindung<br />
zu bringen. Leider ermöglicht LLWin keine freie Programmierung mit einer eigenen Sprache, so dass<br />
das Programm als Simulator <strong>für</strong> das verteilte Netzwerk nicht geeignet ist. [fisch]<br />
26.07.2004 Seite 49 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
7.1.2. Webot<br />
Abbildung 7.1 - LLWin<br />
Die Schweizer Firma K-Team entwickelt <strong>und</strong> vertreibt die Roboter Khepera <strong>und</strong> Koala. Um <strong>für</strong> diese<br />
effiziente Programme schreiben zu können, wird von der Firma cyberbotics der Simulator Webot<br />
angeboten. Diese Software ist bereits mit einer Simulation dreidimensionaler Welten ausgestattet.<br />
Dies ermöglicht es dem Programmierer sehr gut, reale Umgebungen zu simulieren <strong>und</strong> seine<br />
Programme nicht nur abstrakt im Kopf oder am echten Objekt zu testen. Webot liefert fertige Beispiele<br />
<strong>für</strong> die Programmierung <strong>für</strong> viele verschiedene Roboter mit. Leider sind diese aber nur in der<br />
kommerziellen Version einsetzbar. Die frei erhältliche Version hat diese Fähigkeit nicht <strong>und</strong> ist daher<br />
<strong>für</strong> dieses Projekt nicht geeignet. [cb]<br />
Abbildung 7.2 - Webot<br />
7.1.3. Easybot<br />
Mit der <strong>Diplomarbeit</strong> von Dipl. Inform. O. Michel ist ein weiterer Simulator entstanden. Aufbauend auf<br />
dem von ihm entwickelten 3D-Modellierer Lightvision3D hat er eine Robotersteuerungsschnittstelle<br />
entwickelt. Lightvision3D ist vom Umfang eher ein einfacher Modellierer, der sich mit kommerziellen<br />
Lösungen wie dem 3D-Studio von Kinetex (Autodesk) nicht messen kann. Da<strong>für</strong> ist er sehr einfach<br />
bedienbar <strong>und</strong> durch die Erweiterungsmöglichkeiten sehr gut als Simulator geeignet. Die Erweiterung<br />
Easybot ermöglicht es, Gruppenobjekte in Lightvision3D, die Sensoren enthalten, als Roboter<br />
anzusteuern. Da sowohl die Umgebung im Lightvision3D als auch die Robotersteuerung so variabel<br />
26.07.2004 Seite 50 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
gehalten sind, dass beliebige Roboter in den unterschiedlichsten Szenarien simuliert werden können,<br />
ist Easybot sehr gut geeignet, um neue Konzepte zu testen. Da Lighvision3D leider keine getrennte<br />
Steuerung <strong>für</strong> jeden Sensor eines Roboters unterstützt, müssen in diesem Bereich einige Abstriche<br />
gemacht werden. Es können zwar mehrere Objekte mit eigenen Sensoren versehen werden, aber<br />
diese können mechanisch nicht miteinander verb<strong>und</strong>en werden. Trotzdem ist er eine gute Wahl, um<br />
zumindest die Virtuelle Maschine zu testen. (siehe Kapitel 6.3) [mich]<br />
7.1.4. Netbot<br />
Abbildung 7.3 - Easybot<br />
Um die Funktionen zu testen, die Easybot nicht unterstützt, war es notwendig, eine eigene<br />
Testumgebung zu schaffen. Diese betrifft vor allem die Kommunikation <strong>und</strong> Interaktion unter den<br />
Sensoren <strong>und</strong> Aktoren. Zu diesem Zweck ist eine DCOM-Client-Server-Architektur entstanden, wobei<br />
der Server den Bus simuliert <strong>und</strong> die Clients die Sensoren <strong>und</strong> Aktoren. (siehe Kapitel 6.4)<br />
Abbildung 7.4 - Netbot<br />
26.07.2004 Seite 51 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
7.2. Arbeiten mit der Virtuellen Maschine<br />
Während der Entwicklung der verschiedenen Steuerungen, die in den folgenden Abschnitten<br />
beschrieben werden, hat sich herausgestellt, dass es einen enormen Aufwand darstellt, bei einer<br />
Änderung der Virtuellen Maschine die verschiedenen Steuerungen mit zu ändern. Da einige Fehler<br />
<strong>und</strong> Unschönheiten erst im laufenden Betrieb sichtbar werden, sind solche Änderungen aber<br />
unabdingbar. Daher wurde die Virtuelle Maschine in eine DLL eingebettet, die von allen<br />
Steuermodulen verwendet werden kann. Sie hat zusätzlich den Vorteil, dass die Programmiersprache<br />
des Entwicklers (ob VC++, Delphi oder Java), der ein Steuermodul schreiben will, keine Rolle mehr<br />
spielt.<br />
7.2.1. Aufbau der VM.DLL<br />
Die originale Virtuelle Maschine, wie sie auch als Kommandozeilenversion vorliegt, ist als<br />
prozedurales Programm geschrieben. Um die Übersichtlichkeit zu erhöhen <strong>und</strong> die Maschine stärker<br />
vom Kellerspeicher zu trennen, wurden die einzelnen Funktionen in Klassen eingebettet. Um auf die<br />
Virtuelle Maschine von außen zugreifen zu können, müssen einige Funktionen freigegeben werden<br />
<strong>und</strong> Funktionen des Steuermoduls der DLL bekannt gegeben werden. Da der Code <strong>und</strong> die<br />
Ressourcen der DLL nur einmal global im Programmspeicher gehalten werden <strong>und</strong> von jedem<br />
Steuermodul innerhalb des Programms nur referenziert werden, muss das aufrufende Modul bei jeder<br />
Funktion eindeutig identifiziert werden. Da<strong>für</strong> wird von der DLL beim initialisieren eine eindeutige<br />
Nummer vergeben, die bei den Funktionsaufrufen mit übergeben werden muss. Zusätzlich kann vom<br />
aufrufenden Modul ein Zeiger übergeben werden, der bei Funktionsaufrufen aus der DLL heraus in<br />
das Modul hinein wieder übergeben wird. Dadurch können spezifische Daten (z.B. welcher Roboter<br />
gemeint ist) gespeichert werden.<br />
exportierte Funktionen:<br />
vmInit Initialisiert die Virtuelle Maschine <strong>und</strong> erwartet Zeiger auf die von der<br />
Virtuellen Maschine benötigten Funktionen (Get, Put, GetValue,<br />
PutValue), um Werte einzulesen <strong>und</strong> auszugeben<br />
Liefert die ID zurück<br />
vmOpenFile Öffnet eine Codedatei (auch im laufenden Betrieb möglich)<br />
vmRun Startet den Ablauf der Codedatei<br />
vmRestart Setzt die Virtuelle Maschine in ihren Ausgangszustand zurück<br />
vmStep Ermöglicht die Schrittweise Ausführung der Codedatei<br />
Abbildung 7.5 - Aufbau der VM.DLL<br />
26.07.2004 Seite 52 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
7.2.2. Verwendung der VM.DLL<br />
Um die Virtuelle Maschine zu verwenden, muss die DLL geladen <strong>und</strong> initialisiert werden. Dies kann<br />
statisch passieren, also die DLL direkt fest in das Programm eingeb<strong>und</strong>en werden oder es kann<br />
dynamisch geschehen, das heißt, dass die DLL erst geladen wird, wenn sie verwendet wird <strong>und</strong> damit<br />
auch jederzeit im laufenden Betrieb entladen <strong>und</strong> getauscht werden kann. Die Funktionen der DLL<br />
müssen an Funktionszeiger geb<strong>und</strong>en werden, damit sie verwendet werden können. Im ersten Aufruf<br />
muss die Virtuellen Maschine initialisiert werden <strong>und</strong> es müssen ihr die Zeiger auf die beiden<br />
Kommunikationskommandos (Get, Put) bekannt gemacht werden. Als Rückgabewert erhält das<br />
aufrufende Programm eine Nummer, über die die DLL die richtige Maschine erkennen kann.<br />
Abbildung 7.6 - Einbinden der VM.DLL<br />
7.3. Easybot<br />
FARPROC funcptr;<br />
dllhandle=LoadLibrary("vm.dll");<br />
if (dllhandle==0) AfxMessageBox("DLL nicht gef<strong>und</strong>en!");<br />
funcptr=GetProcAddress(dllhandle, "vmOpenFile");<br />
if (funcptr)<br />
vm_openfile=(FXOpenFile)funcptr;<br />
else<br />
AfxMessageBox("Funktion vmOpenFile nicht gef<strong>und</strong>en!");<br />
funcptr=GetProcAddress(dllhandle, "vmStep");<br />
if (funcptr)<br />
vm_step=(FXStep)funcptr;<br />
else<br />
AfxMessageBox("Funktion vmStep nicht gef<strong>und</strong>en!");<br />
...<br />
if (vm_init)<br />
nr=vm_init(robot,NULL,NULL,Get,Put);<br />
else<br />
nr=-1;<br />
Der Simulator Easybot von O. Michel ist sehr gut geeignet, um Algorithmen zur Steuerung von<br />
Robotern zu testen, die nur aus einem Antrieb <strong>und</strong> Entfernungssensoren bestehen. Er bietet gute<br />
Möglichkeiten, um eine reale Umgebung nachzuempfinden. In diese können Roboter gesetzt werden,<br />
die einen Satz Sensoren enthalten, die aber in erster Linie nur die Entfernung zum nächsten Objekt<br />
angeben. Über eine Schnittstelle können diese Sensoren abgefragt <strong>und</strong> der Roboter bewegt werden.<br />
Dies wird durch die Schnittstelle Easybot in Lightvision3D realisiert.<br />
7.3.1. Lightvision3D<br />
Lightvision3D ist ein einfacher 3D-Modellierer. Er ermöglicht das Erzeugen einfacher 3D-Welten, die<br />
als Testumgebung <strong>für</strong> Roboter dienen können.<br />
Erzeugt werden die Objekte direkt im Programm. Hier<strong>für</strong> steht eine Reihe von Gr<strong>und</strong>körpern wie zum<br />
Beispiel Dreieck, Kugel oder Pyramide zur Verfügung. Um auch komplexere Objekte erzeugen zu<br />
können <strong>und</strong> gleichzeitig eine größtmögliche Dynamik zu erreichen, ist der Modellierer mit mehreren<br />
freien Schnittstellen versehen. Diese ermöglichen sowohl die Anbindung komplexerer<br />
Konstruktionswerkzeuge als auch spezieller Lade- <strong>und</strong> Speicherfunktionen <strong>für</strong> andere Dateiformate,<br />
wie zum Beispiel .3ds, einem Format des professionellen 3D-Modellierers 3D-Studio Max von Kinetix.<br />
Diese Erweiterungen müssen als DLL vorhanden sein. Jedes Objekt kann mit Materialeigenschaften<br />
26.07.2004 Seite 53 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
oder Texturen belegt werden <strong>und</strong> wird entsprechend der frei setzbaren Lichtquellen beleuchtet. Dies<br />
erhöht zum einen die optische Unterscheidungsfähigkeit <strong>und</strong> zum anderen das Realismusempfinden.<br />
Der Blickwinkel ist mit beliebig setzbaren Kameras frei wählbar. [mich]<br />
Abbildung 7.7 - Lightvision3D<br />
7.3.2. Easybot<br />
Lightvision3D bietet vor allem den großen Vorteil der Erweiterbarkeit. Die <strong>für</strong> die Robotersimulation<br />
wichtigste Schnittstelle ist die so genannte „FreeJob“-PlugIn-Schnittstelle. Sie ermöglicht den<br />
steuernden Zugriff von „außen“ auf alle Objekte innerhalb von Lightvision3D.<br />
Easybot greift auf diese Schnittstelle zu <strong>und</strong> ermittelt alle Gruppenobjekte, die ein Unterobjekt namens<br />
„sensor...“ enthalten <strong>und</strong> stellt diese als Einzelroboter zur Verfügung. Für jedes dieser Gruppenobjekte<br />
kann ein Steuermodul geladen werden. Dieses muss als speziell strukturierte DLL vorliegen. Das<br />
Hauptprogramm ruft in einem einstellbaren zyklischen Zeitintervall eine Funktion (Navigate) der<br />
Steuermodule auf. In dieser Funktion können die Sensorwerte verarbeitet werden <strong>und</strong> die Position<br />
<strong>und</strong> Richtung des Roboters geändert werden.<br />
Die Sensoren werden in Lightvision3D durch Strahlen ausgehend von einem Dreieck simuliert. Da der<br />
3D-Modellierer Kenntnis von den Eigenschaften des Objektes besitzt, auf das der Strahl trifft, können<br />
mehr Informationen bereitgestellt werden, als nur die Entfernung.<br />
Dem Entwickler steht innerhalb der Steuer-DLL <strong>für</strong> jeden erkannten Sensor eine Sammlung von<br />
Werten zur Verfügung:<br />
- Entfernung vom Startpunkt (Dreieck) bis zum Schnittpunkt des Strahls mit dem Objekt<br />
- Name<br />
- Materialname<br />
- Farbe des Materials<br />
- Absolute Position des Schnittpunktes<br />
- Start- <strong>und</strong> Endpunkt des Strahls<br />
Mit der Farbe lässt sich eine einfache Ein-Punkt-Kamera simulieren. Durch die Kombination mehrerer<br />
Sensoren könnte so ein normales Kamerabild erzeugt werden. Durch die Verwendung von geeigneten<br />
Materialnamen können Temperaturen oder andere Materialeigenschaften übermittelt werden.<br />
26.07.2004 Seite 54 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
Das Gr<strong>und</strong>gerüst <strong>für</strong> ein solches Steuermodul steht von O. Michel zur Verfügung. Der Entwickler<br />
braucht sich ausschließlich um die Erstellung der Algorithmen kümmern.<br />
Um einen Roboter mit einem Steuermodul zu verbinden, muss in Lightvision3D das Plugin Easybot<br />
gestartet werden <strong>und</strong> in diesem auf dem Roboternamen doppelt geklickt werden. Im sich öffnenden<br />
Dialog kann die entsprechende DLL geladen werden. Mit „open dialog“ wird dann der Steuerdialog der<br />
DLL geladen (siehe nächste Abschnitte). Mit den Buttons im Bereich „simulation control“ kann der<br />
Ablauf der Simulation gesteuert werden.<br />
[mich]<br />
# Stopp der Simulation<br />
> Start der Simulation (Einzelschritte im eingestellten Zeitintervall)<br />
>| Einzelschritt (die Funktion „navigate“ des Steuermoduls wird einmal aufgerufen)<br />
Abbildung 7.8 - Lightvision3D mit Easybot<br />
7.3.3. Netzwerk<br />
Dadurch, dass das Modul Easybot lediglich ein Gruppenobjekt der obersten Ebene als Roboter<br />
erkennen kann <strong>und</strong> keine Untergruppen als eigenständige Roboter aufführt, können die Sensoren<br />
nicht getrennt voneinander programmiert werden. Ein verteiltes Netzwerk von Sensoren <strong>und</strong> Aktoren<br />
lässt sich so nicht aufbauen. Es könnten zwar mehrere Objekte mit Sensoren aufgebaut werden, aber<br />
es müsste eine Möglichkeit geschaffen werden, wie diese miteinander kommunizieren können <strong>und</strong> vor<br />
allem, wie sie gemeinsam eine Bewegung ausführen können. Vor allem der Aspekt der Koordination<br />
der Bewegungen der einzelnen Objekte bedingt einen hohen Entwicklungsaufwand, der in dieser<br />
<strong>Diplomarbeit</strong> nicht betrieben wurde. Es wurden drei Varianten des Steuerungsmoduls geschaffen, die<br />
die Virtuelle Maschine enthalten <strong>und</strong> jeweils in der Lage sind, ein Fahrzeug mit zwei angetriebenen<br />
Rädern zu simulieren.<br />
7.3.4. Khepera-Steuerung: Khepera_VM.DLL<br />
Da O. Michel in seiner <strong>Diplomarbeit</strong> auf dem Khepera aufbaut, sind bei ihm Modelle dieses Roboters<br />
bereits enthalten. Der Khepera ist ein kleines mobiles Fahrzeug, das über zwei Motoren verfügt <strong>und</strong><br />
über acht Infrarotsensoren seine Umgebung wahrnehmen kann. Damit können Algorithmen zur<br />
Fahrzeugsteuerung gut getestet werden.<br />
26.07.2004 Seite 55 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
Um den Khepera mit Skripten steuern zu können, muss im Modul Easybot die Khepera_VM.DLL<br />
geladen werden. Diese lädt automatisch die Virtuelle Maschine aus dem vorigen Abschnitt <strong>und</strong> bindet<br />
die wichtigen Funktionen. Als Dialog wird dann eine symbolhafte Darstellung in 2D des Khepera von<br />
oben dargestellt. Jeder Infrarotsensor hat eine Nummer <strong>und</strong> ist der Gruppe 8 zugeordnet (siehe<br />
Kapitel 3). Die Räder haben ebenfalls eine Nummer <strong>und</strong> sind in der Gruppe 10. Alle anderen Gruppen<br />
<strong>und</strong> Nummern werden in diesem Steuermodul nicht unterstützt. Die Nummern können <strong>für</strong> die<br />
Programmierung aus der untenstehenden Abbildung entnommen werden.<br />
Als Beispielprogramm kann der in Abbildung 5.2 dargestellte Quellcode verwendet werden. Dazu<br />
muss auf dem gelb umrahmten schwarzen Viereck in der Mitte doppelt geklickt werden. Um den<br />
Roboter an die Ausgangsposition zurückzusetzen, muss auf den darunter liegenden doppelt geklickt<br />
werden. Die gemessenen Entfernungswerte stehen direkt neben dem jeweiligen Sensor <strong>und</strong> die<br />
Motorgeschwindigkeiten werden ebenfalls direkt in der Grafik angezeigt.<br />
Abbildung 7.9 - Kheperamodell<br />
7.3.5. Cybot-Steuerung: Cybot_VM.DLL<br />
Im Gegensatz zum Khepera, der nicht in der Lage ist, von einem verteilten Netzwerk von Sensoren<br />
<strong>und</strong> Aktoren gesteuert zu werden (siehe Kapitel 2.3) kann das Chassis des Cybot genutzt werden, um<br />
ein solches Netzwerk zu installieren. Der Rumpf bietet genügend Raum <strong>für</strong> Platinen <strong>und</strong> alle<br />
originalen Bauteile sind nur gesteckt oder geschraubt, so dass die vorhandene Elektronik gegen das<br />
Netzwerk ausgetauscht werden kann. Um den Cybot (der auch in Kapitel 7 Anwendung findet)<br />
simulieren zu können, ist ein dem Khepera ähnliches Modell <strong>für</strong> Lightvision3D entstanden. Der größte<br />
Unterschied ist der, dass der Cybot nur über zwei Entfernungssensoren verfügt, die in Fahrtrichtung<br />
zeigen. Die rückseitigen Sensoren entfallen. Um einfache Steuerungen testen zu können, wurde die<br />
Khepera-Steuerung so abgewandelt, dass sie <strong>für</strong> den Cybot tauglich ist.<br />
Abbildung 7.10 - Cybotmodell<br />
26.07.2004 Seite 56 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
7.3.6. Offene Steuerung: Multi_VM.DLL<br />
Da mit den beiden vorangegangenen Steuermodulen nur zentrale Programme, die exakt auf einen<br />
bestimmten Roboter zugeschnitten sind, testbar sind, war es notwendig, ein dynamisches, in der<br />
Anzahl der Sensoren nicht beschränktes Steuermodul zu programmieren. In der Funktionalität<br />
unterscheidet es sich nicht von den beiden anderen. Es ist aber in der Lage, <strong>für</strong> die beiden Motoren<br />
<strong>und</strong> <strong>für</strong> jeden Sensor ein getrenntes Programm ablaufen zu lassen. Im Unterschied zu den beiden<br />
vorigen Modulen können die Sensoren nur schwer optisch angeordnet werden. Die Wahl fiel auf eine<br />
einfachere Listenausgabe.<br />
Am Anfang der Liste steht die aktuelle Position mit der Rücksetzmöglichkeit auf den Nullpunkt per<br />
Doppelklick. Darunter folgt die Liste mit den beiden Motoren <strong>und</strong> allen Sensoren. Durch einen<br />
Doppelklick auf eine Motor- oder Sensorbezeichnung kann ein Skript <strong>für</strong> diesen geladen werden. Es<br />
wird automatisch ausgeführt, wenn die Simulation läuft. Um verschiedene Skripte parallel testen zu<br />
können, ohne sie ständig neu laden zu müssen, ist es aber möglich, einzelne Motor- oder<br />
Sensorskripte anzuhalten. Dies erfolgt durch Klick auf das Pausensymbol (||) hinter der jeweiligen<br />
Bezeichnung. Angehaltene Skripte können jederzeit durch einen Klick auf das Abspielsymbol (>)<br />
wieder gestartet werden.<br />
Am Anfang jeder Zeile steht der Wert des Sensors <strong>und</strong> am Ende die Bezeichnung der geladenen<br />
Skriptdatei.<br />
Abbildung 7.11 - Dialogbeispiele einer offenen Steuerung <strong>für</strong> Easybot<br />
Mit diesem Steuermodul ist es somit möglich, jedes Fahrzeug mit zwei Motoren <strong>und</strong> einer beliebigen<br />
Anzahl von Entfernungssensoren innerhalb von Lightvision3D <strong>und</strong> damit in einer echten 3D-Welt-<br />
Umgebung zu testen. Durch die Unterstützung von je einem Skript je Motor <strong>und</strong> Sensor können auch<br />
verteilte Programme gut getestet werden. Wie schon in den beiden vorangegangenen Steuermodulen<br />
wird das geladene Skript beim Aufruf der Navigate-Funktion von Easybot aus komplett abgearbeitet.<br />
Es sollte also keine Endlosschleife enthalten. Da<strong>für</strong> ist dieser Simulator nicht ausgelegt.<br />
Im Folgenden ist ein Beispiel <strong>für</strong> die Steuerung des Cybot mit zwei Einzelprogrammen aufgeführt,<br />
wobei jedes Programm in einem der beiden Motoren laufen kann. Cybot weicht dabei Hindernissen<br />
immer nach rechts aus.<br />
26.07.2004 Seite 57 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
Abbildung 7.12 - Steuerprogramm Cybot, linker Motor<br />
Abbildung 7.13 - Steuerprogramm Cybot, rechter Motor<br />
7.4. Netbot<br />
Um Roboter entwickeln <strong>und</strong> testen zu können, die nicht einem Fahrzeug entsprechen, war es nötig,<br />
eine weitere Simulationsumgebung zu schaffen. Dabei wurde Wert darauf gelegt, dass es sich wirklich<br />
um voneinander getrennt laufende Programme handelt, die miteinander kommunizieren. Die<br />
Schaffung einer weiteren realen 3D-Umgebung spielte dabei keine Rolle. In einer weiterführenden<br />
Arbeit kann dieses Verfahren mit Easybot verknüpft werden, um die Vorteile beider Simulatoren<br />
miteinander zu verbinden.<br />
7.4.1. Netzwerk<br />
var sl,sr,ml,sreach,speed,fak;<br />
BEGIN<br />
fak:=15;<br />
speed:=10;<br />
sreach :=get(8,1,1); {get sensor reach}<br />
sl := get(8,1,0); if sl>sreach then sl:=sreach; {get sensor left}<br />
sr := get(8,2,0); if sr>sreach then sr:=sreach; {get sensor right}<br />
if slsreach then sr:=sreach; {get sensor right}<br />
if sl(sreach/fak) then<br />
mr:=sreach/2;<br />
if sl>(sreach/fak) then<br />
if sr(sreach/fak) then<br />
if sl
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
Zielknoten bekannt ist <strong>und</strong> leitet die Anfrage dorthin um. Die Antwort wird dann an den aufrufenden<br />
Knoten zurückgegeben. Um sich beim Server zu registrieren, muss jeder Client seine Gruppe <strong>und</strong><br />
seine Nummer bekannt geben. Damit der Server die Anfragen weiterleiten kann, muss er aber auch<br />
selbst die Clients erreichen können. Dies könnte durch ein Polling-Verfahren erreicht werden, bei dem<br />
der Client in bestimmten Zeitintervallen beim Server nachsieht, ob eine Anfrage <strong>für</strong> ihn vorliegt. Dies<br />
erzeugt aber eine hohe Buslast <strong>und</strong> wird daher hier nicht verwendet. Jeder Client stellt einen<br />
eigenständigen DCOM-Server dar, dessen Interface er dem NetbotServer bekannt gibt. Durch dieses<br />
so genannte Callback-Verfahren kann der NetbotServer jeden Client jederzeit erreichen <strong>und</strong> Werte<br />
abfragen, die er an den aufrufenden Client zurückgeben kann.<br />
Abbildung 7.14 - Typbibliotheken NetbotServer <strong>und</strong> NetbotClient<br />
Der NetbotServer muss als DCOM-Objekt in Windows angemeldet werden. Dies erfolgt durch einen<br />
einmaligen direkten Aufruf. Danach wird er automatisch gestartet, sobald ein Client darauf zugreifen<br />
will. Der Server funktioniert komplett ohne Nutzereingaben <strong>und</strong> kann daher auch versteckt laufen (dies<br />
ist in den DCOM-Eigenschaften einstellbar). Anschaulicher ist jedoch die grafische Oberfläche. Auf<br />
dieser werden im Mittelteil die angemeldeten Knotenpunkte (Clients) farbig dargestellt. Wie in Kapitel<br />
3 beschrieben, kann der Server 15 Gruppen mit jeweils 255 Clients bedienen. Dazu hält er eine<br />
statische Tabelle mit allen angemeldeten Knotenpunkten. Zusätzlich werden alle Anfragen mit<br />
Ergebnis in der Statuszeile angezeigt.<br />
Abbildung 7.15 - NetbotServer<br />
7.4.2. Knotenpunkte<br />
Um die Knotenpunkte, also die Sensoren <strong>und</strong> Aktoren, im Netzwerk abzubilden, müssen diese eine<br />
Virtuelle Maschine enthalten <strong>und</strong> sich am Netzwerk (in der Simulation der NetbotServer) anmelden<br />
können. Da die Knotenpunkte in ihrem Aufbau nahezu identisch sind, wurde nur ein Client<br />
programmiert, der jede der in Kapitel 3 beschriebenen Gruppen simulieren kann. Die jeweilige Gruppe<br />
wird zur Erstellungszeit festgelegt <strong>und</strong> kann dann nicht mehr geändert werden. Beim Aufruf startet der<br />
26.07.2004 Seite 59 von 85
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
Client automatisch den NetbotServer. Danach muss dem Server noch die Nummer (ID) des Clients<br />
bekannt gegeben werden. Dabei werden automatisch auch die Callback-Routinen verb<strong>und</strong>en.<br />
Abbildung 7.16 - Aufruf des NetbotServer durch den Client<br />
Der Knotenpunkt ist damit schon im Netzwerk eingeb<strong>und</strong>en <strong>und</strong> kann bereits seine Aufgabe<br />
wahrnehmen. Je nach Gruppentyp kann der Wert des Knotens (z.B. die Entfernung) in der Oberfläche<br />
eingestellt werden. Dieser wird auf Anfrage von außen weitergereicht. Soll ein Wert von außen gesetzt<br />
werden, prüft der Client, ob dies überhaupt möglich ist (es ist nicht möglich, die Temperatur von<br />
außen zu setzen, da dies ein Messwert ist!). Um das Netzwerk mit Logik zu versehen, kann jeder<br />
Knotenpunkt eine Skriptdatei laden <strong>und</strong> ausführen. Dies entspricht weitestgehend dem Verfahren, das<br />
auch im Easybot eingesetzt wurde. Es wird die gleiche VM.DLL als Gr<strong>und</strong>lage genutzt.<br />
Abbildung 7.17 - Beispiel <strong>für</strong> NetbotClients<br />
Die Abbildung 6.4 am Anfang dieses Kapitels zeigt eine simulierte Umgebung des auch im Easybot<br />
vorhandenen Cybot. Im laufenden Betrieb zeigt der sich drehende rote Strich beim Motor dessen<br />
Bewegung an. Im Gegensatz zum Easybot kann diese Simulation im Netbot jederzeit um<br />
Funktionalitäten erweitert werden. Beispielsweise kann der Cybot mit zwei Lampen (LED) versehen<br />
werden, die (als Warnsignal) zu leuchten beginnen, wenn einer der Sensoren einem Objekt zu nahe<br />
kommt.<br />
// Create DCOM-Server<br />
FNetbot = CoNetbotCB.Create();<br />
FCallback = (ICallback)CoNetbotCallbackObj.Create();<br />
// Initialize and bind Callback<br />
FNetbot.SetCallback(group,id,FCallback);<br />
// call for value<br />
FNetbot.GetValue(group_id,id,param,value);<br />
...<br />
var sl,ll,sreach,fak;<br />
BEGIN<br />
fak:=15;<br />
sreach :=get(8,1,1); {get sensor reach}<br />
sl := get(8,1,0); if sl>sreach then sl:=sreach; {get sensor left}<br />
if sl
<strong>Diplomarbeit</strong>: Modulares System Testen der Steuerungsskripte im Simulator<br />
7.5. Fazit<br />
Die in diesem Kapitel vorgestellten Simulatoren Easybot <strong>und</strong> Netbot sind mit ihren jeweiligen<br />
Einschränkungen gut geeignet, um die Steuerung eines Roboters mit einem Netzwerk von Sensoren<br />
<strong>und</strong> Aktoren zu simulieren.<br />
Easybot eignet sich hervorragend, um Fahrzeuge mit zwei angetriebenen Rädern zu simulieren <strong>und</strong><br />
mit dem offenen Steuermodul ist er auch in der Lage mehrere Skripte ablaufen zu lassen, wie es im<br />
Netzwerk der Fall sein wird.<br />
Der Netbot ist durch die fehlende optische 3D-Unterstützung weniger gut geeignet, wenn reale sich<br />
bewegende Objekte abgebildet werden sollen. Er erfordert ein hohes Abstraktionsvermögen des<br />
Anwenders. Auf der anderen Seite hat er aber den Vorteil, nicht auf Fahrzeuge festgelegt zu sein,<br />
sondern die Simulation beliebiger Roboter (so z.B. auch Haussteuerungen) zu ermöglichen.<br />
In einer weiterführenden Arbeit sollten beide miteinander kombiniert werden, um die größtmögliche<br />
Effizienz zu erreichen. Dazu müssen die Easybot-Steuermodule mit dem DCOM-Server verb<strong>und</strong>en<br />
werden. Dieser benötigt gleichzeitig neue Funktionalitäten, die die mechanischen Zusammenhänge<br />
der einzelnen Roboter abbildet. So sollte sich der Arm eines Roboters mitbewegen, sobald sich der<br />
Gr<strong>und</strong>körper bewegt. Dieses Verhalten kann durch den Server mit gesteuert werden. Einfacher wäre<br />
jedoch eine Weiterentwicklung des Easybot in dieser Richtung.<br />
Ein Ansatz in dieser Richtung bietet die <strong>Diplomarbeit</strong> von K. Hofmann, ebenfalls Studentin der HTW-<br />
<strong>Dresden</strong>, die mir leider zu spät vorlag, um sie komplett als Gr<strong>und</strong>lage dieser Arbeit zu nutzen. Bei<br />
dem von ihr geschaffenen Simulator JRoboSim wurde Wert auf die Erweiterbarkeit <strong>und</strong> Flexibilität<br />
gelegt. Im Unterschied zu Easybot sind von JRoboSim alle Quellen frei erhätlich <strong>und</strong> können<br />
demzufolge an die eigenen Bedürfnisse angepasst werden. Die Ausprägung <strong>für</strong> eine verteilte<br />
Simulation bietet diese Software ebenfalls noch nicht, wurde aber von Frau Hofmann bereits<br />
vorgesehen <strong>und</strong> als Erweiterung in Aussicht gestellt.<br />
26.07.2004 Seite 61 von 85
<strong>Diplomarbeit</strong>: Modulares System Praktische Anwendung<br />
8. Praktische Anwendung<br />
Die mit den Hilfsmitteln des vorigen Kapitels entwickelten <strong>und</strong> getesteten Robotersteuerungen sollen<br />
nicht nur in einem Simulator sondern auch in der Praxis Verwendung finden.<br />
Wie in den vorangegangenen Kapiteln beschrieben soll der Roboter nicht aus einer einzelnen<br />
Zentralsteuerung mit einem leistungsfähigen Prozessor bestehen, an den alle Sensoren <strong>und</strong> Aktoren<br />
direkt angeschlossen sind, sondern aus einem Netzwerk von Controllern, mit denen jeweils ein<br />
Sensor oder Aktor verb<strong>und</strong>en ist. Die Controller müssen Kenntnis über ihr angeschlossenes Endgerät<br />
haben <strong>und</strong> mit ihm arbeiten können. Alle anderen Geräte sind <strong>für</strong> sie abstrakt <strong>und</strong> können über das<br />
Netzwerk abgefragt <strong>und</strong> gesetzt werden, ohne zu wissen, was <strong>für</strong> Parameter genau <strong>für</strong> eine Messung<br />
benötigt werden.<br />
Im Gegensatz zu einem Heimcomputer haben Controller sehr wenig Speicher (wenige Kilobyte) <strong>und</strong><br />
müssen schon daher völlig anders programmiert werden. Zum Beispiel sollten Funktionsaufrufe<br />
möglichst vermieden werden <strong>und</strong> Speicher allozieren ist komplizierter (der Speicher ist meist in Blöcke<br />
von 256 Byte eingeteilt <strong>und</strong> muss selbst verwaltet werden) als bei den heute üblichen Verfahren bei<br />
Personalcomputern. Daher wurde die Programmierung der Controllersteuerung <strong>und</strong> der Entwurf <strong>und</strong><br />
Aufbau der dazugehörigen elektrischen Schaltungen von Dipl. Ing. M. Dittmar übernommen. Er ist auf<br />
die Programmierung von Controllern <strong>und</strong> dem Entwerfen von den zugehörigen Platinen spezialisiert.<br />
Im Anhang A.7 findet sich ein Beispiel <strong>für</strong> die Programmierung der Maschine auf dem Controller.<br />
Bei der Auswahl des Controllers spielten mehrere Faktoren eine Rolle. Gesucht wurde ein preiswerter<br />
Controller, der genügend Anschlussmöglichkeiten <strong>für</strong> die verschiedenen Knotentypen bietet <strong>und</strong> über<br />
ausreichend Speicher verfügt. Außerdem sollte er den in Kapitel 4 gewählten Bus (CAN) unterstützen.<br />
Die Wahl fiel auf Mikrocontroller der Baureihe PIC18 von der amerikanischen Firma Microchip. Sie<br />
bieten alle benötigten Fähigkeiten <strong>und</strong> liegen preislich in einem annehmbaren Rahmen (ca. 3-6€ pro<br />
Einzelstück, je nach Ausführung).<br />
8.1. Funktionalität der Knotenpunkte<br />
Jeder Knotenpunkt muss zum einen über Fähigkeiten verfügen, die alle gemein haben <strong>und</strong> zum<br />
anderen über einige, die auf sein spezifisches Endgerät zugeschnitten sind.<br />
8.1.1. Gr<strong>und</strong>umfang<br />
Die wichtigste Aufgabe aus Anwendersicht ist die Fähigkeit, Codedateien auszuführen. Dazu musste<br />
die Virtuelle Maschine in eine Form gebracht werden, die der Controller ausführen kann <strong>und</strong> es<br />
müssen die beiden Steuerbefehle (Get, Put) umgesetzt werden. Des Weiteren muss die<br />
Kommunikation zwischen den einzelnen Elementen des Netzwerkes sichergestellt <strong>und</strong> auf<br />
Systemkommandos von außen reagiert werden. Um <strong>für</strong> zukünftige Erweiterungen vorbereitet zu sein,<br />
wurden die Controller von M. Dittmar so programmiert, dass sie auch mehrere Virtuelle Maschinen<br />
gleichzeitig ablaufen lassen können.<br />
26.07.2004 Seite 62 von 85
<strong>Diplomarbeit</strong>: Modulares System Praktische Anwendung<br />
8.1.2. Knotentypspezifische Fähigkeiten<br />
Darüber hinaus muss jeder Knotenpunkt über die Fähigkeit verfügen, mit seinem speziellen Sensor<br />
beziehungsweise Aktor zu interagieren <strong>und</strong> dessen Werte <strong>und</strong> Fähigkeiten dem Netzwerk zur<br />
Verfügung zu stellen. Die dazu benötigten Parameter müssen im Controllerprogramm enthalten sein<br />
<strong>und</strong> können später noch angepasst werden. Jeder Knotentyp hat einen eigenen spezifischen<br />
Programmteil innerhalb des Controllers. Das von M. Dittmar entwickelte Controllerprogramm enthält<br />
die spezifischen Programmteile <strong>für</strong> alle Knotentypen. Es wird erst im Controller entschieden, welcher<br />
Typ verwendet wird. Dadurch sind die Controller universell einsetzbar <strong>und</strong> müssen nicht jedes Mal<br />
neu programmiert werden.<br />
8.1.3. Programmierbarkeit<br />
Um den Controller in die Lage zu versetzen die vorgenannten Fähigkeiten ausführen zu können, muss<br />
er immer wieder neu programmiert werden. Dies geschieht zu Anfang mit einem so genannten<br />
Programmiergerät. Es spielt das Programm direkt in den Controllerspeicher ein. Dies ist sehr<br />
umständlich <strong>und</strong> erfordert einen Eingriff in die umgebende Elektronik. Da aber vor allem die<br />
Steuerungsskripte jederzeit austauschbar sein sollen, ist dieses Verfahren zu umständlich. Daher<br />
besteht eine Gr<strong>und</strong>funktion der Controllersoftware darin, Updates über eine RS232-Schnittstelle, die<br />
von einem Computer direkt angesprochen werden kann, zu empfangen. Um den Controller zu<br />
programmieren versieht das Computerprogramm die Daten mit einer Kennung, die besagt, was getan<br />
werden soll (Firmwareupdate, Skriptupdate, Parametereinstellung) <strong>und</strong> schickt sie über die RS232 an<br />
den Controller Um den Programmiervorgang überwachen zu können, wird jedes Byte vom Controller<br />
im Echomodus bestätigt. Das bedeutet, dass er das empfange Byte direkt wieder zurücksendet.<br />
Daran kann das Computerprogramm erkennen, ob die Programmierung erfolgreich war <strong>und</strong> sie im<br />
Fehlerfall abbrechen oder wiederholen.<br />
In einer Weiterentwicklung soll der Computer ebenfalls mit einer CAN-Schnittstelle versehen werden<br />
<strong>und</strong> die Programmierung im laufenden Netzwerk vonstatten gehen. Dies hat den Vorteil, dass keine<br />
Umbauten am Roboter nötig sind, sondern sich nur der Personalcomputer in den Bus einklinken<br />
muss. Wie schon in den Systemkommandos (Tabelle 3.6) vorgesehen, kann er dann jeden<br />
Knotenpunkt einzeln steuern <strong>und</strong> überwachen. Auch die Fehlersuche, die momentan an jedem<br />
Controller einzeln mittels einer RS232-Debug-Schnittstelle geschieht, kann dann über den CAN-Bus<br />
leichter erfolgen.<br />
26.07.2004 Seite 63 von 85
<strong>Diplomarbeit</strong>: Modulares System Praktische Anwendung<br />
8.2. Programmierung <strong>und</strong> Steuerung vom Computer aus<br />
Um jeden Knotenpunkt mit einem neuen Programm versehen <strong>und</strong> die Parameter, die <strong>für</strong> den Betrieb<br />
notwendig sind, einstellen zu können, wurde ein spezielles Computerprogramm entwickelt. Es<br />
kommuniziert über eine RS232-Schnittstelle (im Computer als COM vorhanden) mit dem Controller.<br />
Abbildung 8.1 - Netbot Setup Programm<br />
8.2.1. Firmware<br />
Mit der Funktion „Send Firmware“ kann ein komplettes Firmwareupdate übertragen werden. Das<br />
heißt, die komplette Software des Controllers wird ausgetauscht. Dies birgt natürlich das Risiko, dass,<br />
wenn etwas fehlschlägt, der Controller nicht mehr verwendbar wird. Daher sind die Gr<strong>und</strong>routinen, die<br />
zum Betrieb des Controllers <strong>und</strong> die Kommunikation mit der RS232 betreffen, von der<br />
Programmierung ausgeschlossen. Sollen sie ersetzt werden, muss auf das umständlichere<br />
Programmiergerät zurückgegriffen werden.<br />
8.2.2. Skript<br />
Damit die Virtuelle Maschine einfach mit neuen Skriptdateien versorgt werden kann, können diese mit<br />
dem Computerprogramm über die RS232 an den Controller übertragen werden. Die Übertragung<br />
erfolgt wie bei einem Firmware-Update <strong>und</strong> wird nur von einer anderen Kennung eingeleitet.<br />
8.2.3. Parameter<br />
Um die Sensoren <strong>und</strong> Aktoren korrekt ansteuern zu können, müssen dem Controller der<br />
Knotenpunkttyp, seine ID <strong>und</strong> die Geschwindigkeit bekannt sein, mit der er über den CAN-Bus<br />
kommunizieren kann. Diese Werte können gelesen <strong>und</strong> geschrieben werden.<br />
8.2.4. Codierung<br />
Um die dargestellten Aufgaben erledigen zu können, muss das Programm die Daten verpacken. Sie<br />
werden mit einer Kennung versehen, die angibt, was getan werden soll. Zusätzlich wird am Ende eine<br />
Checksumme übertragen, mit der der Controller überprüfen kann, ob die Übertragung fehlerfrei war.<br />
Kennung<br />
Länge<br />
Daten<br />
Checksumme<br />
Abbildung 8.2 - Aufbau der Kommunikation zwischen Computer <strong>und</strong> Controller<br />
26.07.2004 Seite 64 von 85
<strong>Diplomarbeit</strong>: Modulares System Praktische Anwendung<br />
Kennung Bedeutung<br />
10 Schreibe Firmware<br />
20 Schreibe Skript<br />
30 Schreibe Parameter<br />
40 Lese Parameter<br />
50 Statusabfrage<br />
Tabelle 8.1 - Kennung der Übertragung zwischen Computer <strong>und</strong> Controller<br />
8.3. Beispielanwendung: Ausweichen<br />
Da der in der Simulation im vorigen Kapitel verwendete Khepera sich elektronisch <strong>und</strong> mechanisch<br />
nicht verändern lässt, wird bei diesem Beispiel lediglich das Fahrzeugchassis von Cybot benutzt.<br />
Dazu wird die originale Elektronik entfernt <strong>und</strong> durch vier Controller-Knotenpunkte ersetzt, die über<br />
CAN miteinander verb<strong>und</strong>en sind. Dabei kann die Stromversorgung (vier Batterien Typ AA, 1.5V <strong>und</strong><br />
ein 9V-Block) genutzt werden. Die einzelnen Knotenpunkte werden mit einem 5-adrigen<br />
Flachbandkabel mit der Stromversorgung verb<strong>und</strong>en. Gleichzeitig werden damit die CAN-Leitungen<br />
verb<strong>und</strong>en.<br />
Das Kabel enthält folgende Leitungen:<br />
- Masse<br />
- Strom <strong>für</strong> die Controller<br />
- Strom <strong>für</strong> die Endgeräte (Spannung je nach angeschlossenem Erzeuger)<br />
- zweimal CAN<br />
Abbildung 8.3 - Fahrwerk des Cybot <strong>und</strong> die originale Elektronik<br />
Abbildung 8.4 - Aktoren <strong>und</strong> Sensoren als Einzelkomponenten<br />
26.07.2004 Seite 65 von 85
<strong>Diplomarbeit</strong>: Modulares System Praktische Anwendung<br />
8.3.1. Software<br />
In diesem Beispiel finden die bereits vorgestellten Programme aus den vorigen Kapiteln ihre<br />
Anwendung. Der Roboter soll sich durch den Raum bewegen <strong>und</strong> Hindernissen ausweichen.<br />
var sl,sr,ml,sreach,speed,fak;<br />
BEGIN<br />
fak:=15;<br />
speed:=10;<br />
sreach :=get(8,1,1); {get sensor reach}<br />
sl := get(8,1,0); if sl>sreach then sl:=sreach; {get sensor left}<br />
sr := get(8,2,0); if sr>sreach then sr:=sreach; {get sensor right}<br />
if slsreach then sr:=sreach; {get sensor right}<br />
if sl(sreach/fak) then<br />
mr:=sreach/2;<br />
if sl>(sreach/fak) then<br />
if sr(sreach/fak) then<br />
if sl
<strong>Diplomarbeit</strong>: Modulares System Praktische Anwendung<br />
8.3.2. Aufbau<br />
Abbildung 8.7 - Weg des Roboters im Simulator<br />
Um dieses Verhalten in der Realität nachzuvollziehen, müssen die Steuerungsskripte mit dem<br />
Computerprogramm NetbotSetup in die beiden Motorsteuerungen geladen werden. Die beiden<br />
Entfernungsmesser erhalten keine Skripte. Sie liefern den Motorsteuerungen auf Anfrage ihre Werte.<br />
Der linke Motor muss nach diesem Beispiel mit der Nummer 1 <strong>und</strong> der rechte mit der Nummer 2<br />
versehen werden. Dies gilt ebenso <strong>für</strong> die Sensoren. Diese Nummern können natürlich frei gewählt<br />
werden. Es müssen dann lediglich die Steuerprogramme entsprechend angepasst werden.<br />
Sind alle Controller eingestellt, können sie, soweit dies noch nicht geschehen ist, auf dem Fahrwerk<br />
montiert werden. Die Programmierung kann auch im eingebauten Zustand erfolgen, da da<strong>für</strong> nur ein<br />
serielles Verbindungskabel mit Adapter angebracht werden muss. Da<strong>für</strong> muss lediglich darauf<br />
geachtet werden, dass die Anschlüsse von außen gut erreichbar sind.<br />
Abbildung 8.8 - Cybot mit Netbot-Controllern<br />
Der Roboter kann damit in Betrieb genommen werden <strong>und</strong> sich im Raum bewegen.<br />
Abbildung 8.9 - Netbot in Bewegung<br />
8.3.3. Erweiterung<br />
Soll der Roboter zusätzlich zu diesen Funktionen noch eine weitere übernehmen, beispielsweise das<br />
Einschalten einer Warnlampe, wenn ein Hindernis zu nah ist, kann dies ohne Eingriff in die laufenden<br />
26.07.2004 Seite 67 von 85
<strong>Diplomarbeit</strong>: Modulares System Praktische Anwendung<br />
Systeme geschehen. Es müssen lediglich zwei neue Controller eingestellt <strong>und</strong> angeschlossen<br />
werden. Die linke Warnlampe erhält wieder die Nummer 1 <strong>und</strong> die rechte die Nummer 2. Damit<br />
können die untenstehenden Programme verwendet werden.<br />
Abbildung 8.10 - Steuerprogramm linke Warnlampe<br />
Abbildung 8.11 - Steuerprogramm rechte Warnlampe<br />
Die beiden Controller mit den Lampen müssen montiert werden. Da dies bei einem sich bewegenden<br />
Roboter schwierig ist, muss er in diesem Beispiel da<strong>für</strong> abgeschaltet werden. Da das System aber<br />
da<strong>für</strong> ausgelegt ist, dies auch im laufenden Betrieb zu machen, können die Erweiterungen installiert<br />
werden, ohne das Netzwerk zu stören. Falls die ID falsch vergeben wurden <strong>und</strong> bereits im Netzwerk<br />
existieren, deaktivieren sich die neu hinzukommenden Einheiten automatisch.<br />
Abbildung 8.12 - Netbot mit installierten Warnlampen<br />
Wird der Roboter nach dieser Erweiterung wieder in Betrieb genommen, vollführt er immer noch die<br />
gleichen Bewegungen im Raum. Zusätzlich aber leuchten die Warnlampen auf, wenn sich ein<br />
Hindernis nähert.<br />
var sl,ll,sreach,fak;<br />
BEGIN<br />
fak:=15;<br />
sreach :=get(8,1,1); {get sensor reach}<br />
sl := get(8,1,0); if sl>sreach then sl:=sreach; {get sensor left}<br />
if slsreach then sr:=sreach; {get sensor right}<br />
if sr
<strong>Diplomarbeit</strong>: Modulares System Ergebnisse <strong>und</strong> Ausblick<br />
9. Ergebnisse <strong>und</strong> Ausblick<br />
Wie das im März dieses Jahres stattgef<strong>und</strong>ene erste Wettrennen autonom steuernder Fahrzeuge<br />
gezeigt hat, ist das Thema Roboter <strong>und</strong> effiziente Steuerung aktueller denn je. Bei dem 160 Meilen<br />
Rennen kam das beste Team knapp 7,4 Meilen weit. Zum zweiten Wettlauf im Herbst nächsten<br />
Jahres werden wieder viele Verbesserungen erwartet. Die meisten Teams waren mit der Zielsetzung<br />
gestartet, offenes Gelände zu erreichen. Davon, das Ziel zu erreichen, träumten nur wenige.<br />
9.1. Ergebnisse<br />
Das in dieser Arbeit vorgestellte Konzept eines verteilten Netzwerkes von selbstständigen Sensoren<br />
<strong>und</strong> Aktoren kann auch dazu verwendet werden, eine solch komplexe Aufgabe zu übernehmen. Dazu<br />
werden dann aber weitere Elemente, die in dieser Arbeit nicht betrachtet wurden, benötigt. Dies betrifft<br />
vor allem optische Wahrnehmungen <strong>und</strong> Objekt- beziehungsweise Wegerkennung. Diese Arbeiten<br />
werden kaum von Skripten übernommen werden können, sondern müssen in speziellen da<strong>für</strong><br />
vorgesehenen DSP-Controllern aufbereitet werden.<br />
Vor allem der Test von Algorithmen sowohl im Simulator als auch im realen Modell kann mit den hier<br />
vorgestellten <strong>Technik</strong>en gut vollzogen werden. Es sind sowohl mobile autarke Fahrzeuge mit wenig<br />
Aufwand programmier- <strong>und</strong> testbar, als auch Haussteuerungen, die aus einer Vielzahl von einzelnen<br />
Elementen bestehen. Die Testläufe können sowohl in den beiden Simulatoren (Steuermodule <strong>für</strong><br />
Easybot <strong>und</strong> der selbst entwickelte Netbot) als auch in der Realität mit den von Diplomingenieur M.<br />
Dittmar programmierten Mikrocontrollern durchgeführt werden. Ein späterer Austausch der<br />
verwendeten Controller durch einen anderen Typ ist jederzeit ohne Änderung der Steuerungsskripte<br />
möglich. Es muss lediglich die Virtuelle Maschine an den neuen Controllertyp angepasst werden.<br />
Durch die Kapselung der Virtuellen Maschine als DLL kann diese in jedem beliebigen Programm<br />
eingesetzt werden. Dadurch ist es möglich, sie später auch in neuen Simulatoren ohne eine<br />
Veränderung der Maschinenfunktionen einzubinden. Soll die Virtuelle Maschine um Fähigkeiten<br />
erweitert werden, die nicht die Kommunikation zwischen den Elementen des Netzwerkes betreffen, so<br />
brauch nur die DLL geändert <strong>und</strong> ausgetauscht werden. Die Endprogramme bleiben von diesen<br />
Änderungen weitestgehend unberührt.<br />
Durch die Entwicklung von Netbot als DCOM-Client-Server-Architektur wurde bereits der erste Schritt<br />
<strong>für</strong> eine über viele Rechner gehende Testumgebung geschaffen.<br />
Das System ist jederzeit um neue, einfach zu programmierende, Elemente erweiterbar. So kann sich<br />
eine Vielzahl neuer Elemente einfügen, die sich an die geschaffenen Kommunikationsrichtlinien<br />
halten.<br />
Damit wurden die Ziele der Arbeit erreicht.<br />
26.07.2004 Seite 69 von 85
<strong>Diplomarbeit</strong>: Modulares System Ergebnisse <strong>und</strong> Ausblick<br />
9.2. Ausblick<br />
Weiterentwicklungen sind in vielerlei Hinsicht erstrebenswert. Dies betrifft in erster Linie den Komfort<br />
bei der Erstellung der Steuerskripte. Der hier verwendete Kommandozeilencompiler sollte mit einem<br />
grafisch orientierten Editor ähnlich denen von Microsoft oder Borland verb<strong>und</strong>en werden. Auch die<br />
Ausgabe von Fehlercodes, die zum Abbruch des Übersetzungsvorgangs führen, sollte eingearbeitet<br />
werden. Derzeit erfolgt nur eine ungefähre Angabe der Position im Quelltext. Ein nächster großer<br />
Schritt <strong>für</strong> die Verwendbarkeit auch zu Schulzwecken wäre eine grafische Programmierumgebung,<br />
wie sie die Firmen LEGO oder fischertechnik vormachen. Diese ermöglichen gerade Anfängern einen<br />
leichten Einstieg in die Thematik, ohne sie gleich mit einer fremden Programmiersprache zu belasten.<br />
Auch auf dem Gebiet des Sprachumfangs besteht durchaus Weiterentwicklungspotential. Zusätzlich<br />
zu den kopfgesteuerten Schleifen sollten Zählschleifen eingeführt werden. Eine Mehrfachverzweigung<br />
<strong>und</strong> vor allem logische Operatoren würden das System vervollständigen. Die Einführung eines<br />
zweiten Datentyps (reelle Zahl) würde dem Entwickler die Arbeit mit dem System vereinfachen. Da<br />
dies <strong>für</strong> die Controller eine erhebliche Belastung darstellt (extrem rechenaufwendig) könnte da<strong>für</strong> über<br />
eine Erweiterung um eine Art Coprozessor, der nur im Bedarfsfall verwendet wird, oder ein ähnliches<br />
Verfahren nachgedacht werden. Denkbar wäre auch die Unterstützung einer moderneren<br />
Hochsprache wie C++. Dazu muss aber erst die Leistungsfähigkeit der Controller in der Realität<br />
getestet werden, um entscheiden zu könne, ob sie komplexere Virtuelle Maschinen beherrschen<br />
können.<br />
Die Simulation auf einem Personalcomputer kann noch entscheidend verbessert werden. Dazu<br />
müssen die Fähigkeiten eines dreidimensionalen Simulators wie dem Easybot mit denen eines<br />
verteilten Netzwerkes kombiniert werden.<br />
Im Easybot sollten neue Sensoren <strong>und</strong> Aktoren wie zum Beispiel Lampen eingeführt werden. Das<br />
vorhandene System im Lightvision3D sollte um eine Kollisionserkennung erweitert werden, um das<br />
Realitätsempfinden zu erhöhen. (Nachtrag: mittlerweile mit der <strong>Diplomarbeit</strong> von M. Lelle geschehen).<br />
Eine der vordringlichsten Änderungen wäre aber die Schaffung der Möglichkeit, auf andere Objekte<br />
zuzugreifen, um auch komplexere Roboter steuern zu können, die aus mehreren Teilen bestehen <strong>und</strong><br />
nicht nur aus einem Fahrwerk mit direkt angebrachten Sensoren.<br />
Einen Ansatz in diese Richtung bietet JRoboSim. Durch sein offenes flexibles System ist er in der<br />
Lage, genau diese Aufgaben zu übernehmen. Die Ausprägung als verteiltes System liegt zwar noch<br />
nicht vor, kann aber einfacher realisiert werden, als bei Easybot.<br />
Der Simulator Netbot kann um die Fähigkeit erweitert werden, über eine geeignete Schnittstelle (z.B.<br />
einer RS232-CAN-Bridge) mit dem real existierenden Controller-Netzwerk zu interagieren <strong>und</strong> so<br />
einen weiteren Knotenpunkt dazustellen.<br />
26.07.2004 Seite 70 von 85
<strong>Diplomarbeit</strong>: Modulares System Thesen<br />
Thesen<br />
Die dezentrale Steuerung von Robotern auf Basis eines intelligenten Netzwerkes von eigenständig<br />
agierenden Sensoren <strong>und</strong> Aktoren ist eine kostengünstige effiziente Alternative zu herkömmlichen<br />
Systemen.<br />
Die Verwendung eines Netzwerkes von Controllern statt einer zentralen Recheneinheit ermöglicht den<br />
einfachen Austausch einzelner Elemente, ohne das Gesamtsystem wesentlich zu beeinflussen.<br />
Im Gegensatz zu zentral gesteuerten Robotern, bei denen die Sensoren <strong>und</strong> Aktoren meist direkt an<br />
den Rechenkern angeschlossen werden <strong>und</strong> deren Anzahl daher meist beschränkt ist, ermöglicht das<br />
Netzwerk eine wesentlich höhere Anzahl von Elementen.<br />
Die Nutzung einer Virtuellen Maschine bringt eine Verringerung des Entwicklungsaufwandes <strong>für</strong> den<br />
Endnutzer. Änderungen an den Controllern haben keinen Einfluss auf die Steuerskripte.<br />
Durch die Verwendung einer Virtuellen Maschine können Steuerprogramme leicht in einem Simulator<br />
getestet werden <strong>und</strong> ohne Änderung im realen Roboter ablaufen.<br />
Durch die Ausprägung der Virtuellen Maschine als DLL kann sie in jedem beliebigen<br />
Windowsprogramm eingesetzt werden. Also auch in anderen, neuen Simulatoren. Außerdem ist sie<br />
dadurch sprachunabhängig.<br />
Die Steuerskripte werden in PL0, einer einfachen pascalähnlichen Sprache, entwickelt <strong>und</strong> von einem<br />
Kommandozeilencompiler übersetzt.<br />
Die Codedateien laufen in allen Implementierungen der Virtuellen Maschine identisch ab, egal ob im<br />
Simulator oder im realen Roboter.<br />
Für den Simulator Easybot sind drei verschiedene Steuerungsmodule (Khepera, Cybot, multi)<br />
entstanden, die die Virtuelle Maschine enthalten <strong>und</strong> Steuerprogramme ausführen können.<br />
Ein zweiter Simulator, Netbot, speziell <strong>für</strong> die Simulation der Kommunikation auch über<br />
Rechnergrenzen hinaus, wurde mit einer DCOM-Client-Server-Architektur entwickelt.<br />
Es wurde auf Basis von PIC-Mikrocontrollern der Firma Microchip ein reales Netzwerk aufgebaut <strong>und</strong><br />
erfolgreich getestet.<br />
26.07.2004 Seite 71 von 85
<strong>Diplomarbeit</strong>: Modulares System Anhang<br />
Anhang<br />
program block<br />
.<br />
PROGRAM<br />
ident ;<br />
block CONST ident<br />
VAR<br />
PROCEDURE<br />
FUNCTION<br />
statement<br />
factor ident<br />
number<br />
( express )<br />
GET ( express , express )<br />
Abbildung A.1 - Syntaxgraphen in PL0<br />
;<br />
,<br />
ident<br />
statement ident := express<br />
CALL<br />
;<br />
,<br />
ident<br />
= number<br />
ident ; block<br />
;<br />
IF condition<br />
THEN statement<br />
ELSE statement<br />
WHILE condition<br />
DO statement<br />
BEGIN statement<br />
END<br />
? ident<br />
! express<br />
;<br />
PUT ( express , express , express )<br />
condition ODD express<br />
express<br />
express<br />
term factor<br />
+<br />
-<br />
*<br />
/<br />
= # < >=<br />
term<br />
+<br />
-<br />
26.07.2004 Seite 72 von 85
<strong>Diplomarbeit</strong>: Modulares System Anhang<br />
/* Zeichenklassenvektor */<br />
static char vZKI[256]=<br />
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F */<br />
/*--------------------------------------------------------------------------------*/<br />
/* 0 */ {7,7, 7,7,7,7,7,7,7,7,7,7,7,7, 7,7, //<br />
/* 1 */ 7,7, 7,7,7,7,7,7,7,7,7,7,7,7, 7,7, //<br />
/* 2 */ 7,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0, // ! " # $ % & ' ( ) * + , - . /<br />
/* 3 */ 1,1, 1,1,1,1,1,1,1,1,3,0,5,4, 6,0, // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?<br />
/* 4 */ 0,2, 2,2,2,2,2,2,2,2,2,2,2,2, 2,2, // @ A B C D E F G H I J K L M N O<br />
/* 5 */ 2,2, 2,2,2,2,2,2,2,2,2,0,0,0, 0,0, // P Q R S T U V W X Y Z [ \ ] ^ _<br />
/* 6 */ 0,2, 2,2,2,2,2,2,2,2,2,2,2,2, 2,2, // ` a b c d e f g h i j k l m n o<br />
/* 7 */ 2,2, 2,2,2,2,2,2,2,2,2,8,0,9, 0,0, // p q r s t u v w x y z { | } ~<br />
/* 8 */ 0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0, // € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž<br />
/* 9 */ 0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0, // ‘ ’ “ ” • - — ˜ š › œ ž Ÿ<br />
/* A */ 0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0, // ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯<br />
/* B */ 0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0, // ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿<br />
/* C */ 0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0, // À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï<br />
/* D */ 0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0, // Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß<br />
/* E */ 0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0, // à á â ã ä å æ ç è é ê ë ì í î ï<br />
/* F */ 0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0}; // ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ<br />
/* Schaltmatrix des Automaten */<br />
static char vSMatrix[9][12]=<br />
/* So Zi Bu ':' '=' '' Space { }<br />
. " */<br />
/*-------0--------1-------2-------3-------4-------5--------6-------7-------8-------<br />
9-------10-------11------*/<br />
/* 0 */ {0+ifslb, 1+ifsl, 2+ifgl, 3+ifsl, 0+ifslb, 4+ifsl, 5+ifsl, 0+ifl, 6+ifl,<br />
0+ifslb, 0+ifslb, 8+ifl, // normal<br />
/* 1 */ 0+ifb, 1+ifsl, 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifb,<br />
0+ifb, 7+ifsl, 0+ifb, // oNumber<br />
/* 2 */ 0+ifb, 2+ifsl, 2+ifgl, 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifb,<br />
0+ifb, 0+ifb, 0+ifb, // char<br />
/* 3 */ 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifslb, 0+ifb, 0+ifb, 0+ifb, 0+ifb,<br />
0+ifb, 0+ifb, 0+ifb, // :<br />
/* 4 */ 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifslb, 0+ifb, 0+ifb, 0+ifb, 0+ifb,<br />
0+ifb, 0+ifb, 0+ifb, // <<br />
/* 5 */ 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifslb, 0+ifb, 0+ifb, 0+ifb, 0+ifb,<br />
0+ifb, 0+ifb, 0+ifb, // ><br />
/* 6 */ 6+ifsl, 6+ifsl, 6+ifsl, 6+ifsl, 6+ifsl, 6+ifsl, 6+ifsl, 6+ifsl,<br />
6+ifsl,0+iflb, 6+ifsl, 6+ifsl, // {}<br />
/* 7 */ 0+ifb, 7+ifsl, 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifb, 0+ifb,<br />
0+ifb, 0+ifb, 0+ifb, // fNumber<br />
/* 8 */ 8+ifsl, 8+ifsl, 8+ifsl, 8+ifsl, 8+ifsl, 8+ifsl, 8+ifsl, 8+ifsl,<br />
8+ifsl,8+ifsl, 8+ifsl, 0+iflb // ""<br />
};<br />
// Symboltabelle<br />
const int vWSymbCount=19;<br />
char* vWSymb[vWSymbCount]={"BEGIN", "CALL", "CONST", "DO", "ELSE", "END", "IF",<br />
"ODD", "PROCEDURE", "FUNCTION", "THEN", "VAR", "WHILE", "PROGRAM", "INTEGER",<br />
"FLOAT", "STRING", "GET", "PUT"};<br />
Abbildung A.2 - Tabellen der lexikalischen Analyse in PL0<br />
26.07.2004 Seite 73 von 85
<strong>Diplomarbeit</strong>: Modulares System Anhang<br />
/* Nr tBg BgX Action,Next,Alt */<br />
tBog gProgram[]=<br />
{<br />
/* 0 */ {BgSy,{(unsigned long)zPRG }, NULL , 1, 3}, /*(0) --'PROGRAM'--> (1)*/<br />
/* 1 */ {BgMo,{(unsigned long)mcIdent }, NULL , 2, 0}, /*(1) ---ident-----> (2)*/<br />
/* 2 */ {BgSy,{(unsigned long) ';' }, NULL , 3, 0}, /*(2) ----';'------> (3)*/<br />
/* 3 */ {BgGr,{(unsigned long)gBlock }, NULL , 4, 0}, /*(3) ---block-----> (4)*/<br />
/* 4 */ {BgSy,{(unsigned long) '.' }, Pr_04, 5, 0}, /*(4) ----'.'------> (5)*/<br />
/* 5 */ {BgEn,{(unsigned long) 0 }, NULL , 0, 0} /*(5) ------------->(ENDE)*/<br />
};<br />
tBog gBlock[]=<br />
{<br />
/* 0 */ {BgSy,{(unsigned long)zCST }, NULL , 1, 6}, /*(0) --'CONST'--> (1)*/<br />
/* 1 */ {BgMo,{(unsigned long)mcIdent }, Bl_01, 2, 0}, /*(1) ---ident---> (2)*/<br />
/* 2 */ {BgSy,{(unsigned long) '=' }, NULL , 3, 0}, /*(2) ----'='----> (3)*/<br />
/* 3 */ {BgMo,{(unsigned long)mcONumb }, Bl_03, 4, 0}, /*(3) ---o-number--> (5)*/<br />
/* 4 */ {BgSy,{(unsigned long) ',' }, NULL , 1, 5}, /*(5) ----','----> (1)*/<br />
/* 5 */ {BgSy,{(unsigned long) ';' }, NULL , 6, 0}, /* + ----';'----> (7)*/<br />
/* 6 */ {BgSy,{(unsigned long)zVAR }, NULL , 7,10}, /*(6) ---'VAR'---> (7)*/<br />
/* 7 */ {BgMo,{(unsigned long)mcIdent }, Bl_08, 8, 0}, /*(7) ---ident---> (8)*/<br />
/* 8 */ {BgSy,{(unsigned long) ',' }, NULL , 7, 9}, /*(8) ----','----> (7)*/<br />
/* 9 */ {BgSy,{(unsigned long) ';' }, NULL ,10, 0}, /* + ----';'---->(10)*/<br />
/*10 */ {BgSy,{(unsigned long)zPRC }, NULL ,11,15}, /*(10)--'PROCEDURE'-->(11)*/<br />
/*11 */ {BgMo,{(unsigned long)mcIdent }, Bl_12,12, 0}, /*(11)---ident--->(12)*/<br />
/*12 */ {BgSy,{(unsigned long) ';' }, NULL ,13, 0}, /*(12)----';'---->(13)*/<br />
/*13 */ {BgGr,{(unsigned long)gBlock }, NULL ,14, 0}, /*(13) --block--->(14)*/<br />
/*14 */ {BgSy,{(unsigned long) ';' }, Bl_15,10, 0}, /*(14)----';'---->(10)*/<br />
/*15 */ {BgSy,{(unsigned long)zFNC }, NULL ,16,20}, /*(10)--'FUNCTION'-->(11)*/<br />
/*16 */ {BgMo,{(unsigned long)mcIdent }, Bl_17,17, 0}, /*(11)---ident--->(12)*/<br />
/*17 */ {BgSy,{(unsigned long) ';' }, NULL ,18, 0}, /*(12)----';'---->(13)*/<br />
/*18 */ {BgGr,{(unsigned long)gBlock }, NULL ,19, 0}, /*(13) --block--->(14)*/<br />
/*19 */ {BgSy,{(unsigned long) ';' }, Bl_20,10, 0}, /*(14)----';'---->(10)*/<br />
/*20 */ {BgNl,{(unsigned long) 0 }, Bl_21,21, 0}, /*(15)----nil---->(16)*/<br />
/*21 */ {BgGr,{(unsigned long)gStatement}, NULL ,22, 0}, /*(16)-Statement->(17)*/<br />
/*22 */ {BgEn,{(unsigned long) 0 }, NULL , 0, 0} /*(17)----------->(ENDE)*/<br />
};<br />
tBog gStatement[]=<br />
{<br />
/* 0 */ {BgMo,{(unsigned long)mcIdent },St_00, 1, 3}, /*( 0)---ident---> (1)*/<br />
/* 1 */ {BgSy,{(unsigned long)zErg },NULL , 2, 0}, /*( 1)---':='----> (2)*/<br />
/* 2 */ {BgGr,{(unsigned long)gExpr },St_02,31, 0}, /*( 2)--express-->(23)*/<br />
/* 3 */ {BgSy,{(unsigned long)zCLL },NULL , 4, 5}, /*( 3)--'CALL'---> (4)*/<br />
/* 4 */ {BgMo,{(unsigned long)mcIdent },St_04,31, 0}, /*( 4)---ident--->(23)*/<br />
/* 5 */ {BgSy,{(unsigned long)zIF },NULL , 6,11}, /*( 5)----'IF'---> (6)*/<br />
/* 6 */ {BgGr,{(unsigned long)gCondition},St_06, 7, 0}, /*( 6)-condition-> (7)*/<br />
/* 7 */ {BgSy,{(unsigned long)zTHN },NULL , 8, 0}, /*( 7)---'THEN'--> (8)*/<br />
/* 8 */ {BgGr,{(unsigned long)gStatement},St_08, 9, 0}, /*( 8)-statement-> (9)*/<br />
/* 9 */ {BgSy,{(unsigned long)zELSE },St_09,10,31}, /*( 9)---'ELSE'-->(10)*/<br />
/*10 */ {BgGr,{(unsigned long)gStatement},St_10,31, 0}, /*(10)-statement->(23)*/<br />
/*11 */ {BgSy,{(unsigned long)zWHL },St_11,12,15}, /*(11)--'WHILE'-->(12)*/<br />
/*12 */ {BgGr,{(unsigned long)gCondition},St_12,13, 0}, /*(12)-condition->(13)*/<br />
/*13 */ {BgSy,{(unsigned long)zDO },NULL ,14, 0}, /*(13)----'DO'--->(14)*/<br />
/*14 */ {BgGr,{(unsigned long)gStatement},St_14,31, 0}, /*(14)-statement->(23)*/<br />
/*15 */ {BgSy,{(unsigned long)zBGN },NULL ,16,19}, /*(15)--'BEGIN'-->(16)*/<br />
/*16 */ {BgGr,{(unsigned long)gStatement},NULL ,17,18}, /*(16)-statement->(17)*/<br />
/*17 */ {BgSy,{(unsigned long)';' },NULL ,16, 0}, /*(17)----';'---->(16)*/<br />
/*18 */ {BgSy,{(unsigned long)zEND },NULL ,31, 0}, /*(18)---'END'--->(23)*/<br />
/*19 */ {BgSy,{(unsigned long)'?' },NULL ,20,21}, /*(19)----'?'---->(20)*/<br />
/*20 */ {BgMo,{(unsigned long)mcIdent },St_20,31, 0}, /*(20)---ident--->(23)*/<br />
/*21 */ {BgSy,{(unsigned long)'!' },NULL ,22,23}, /*(21)----'!'---->(22)*/<br />
/*22 */ {BgGr,{(unsigned long)gExpr },St_22,31, 0}, /*(22)--express-->(23)*/<br />
/*23 */ {BgSy,{(unsigned long)zPUT },NULL ,24, 0}, /*(21)----'Put'---->(22)*/<br />
/*24 */ {BgSy,{(unsigned long) '(' },NULL ,25, 0}, /* + ----'('----> (1)*/<br />
/*25 */ {BgGr,{(unsigned long) gExpr },NULL ,26, 0}, /*(1) --express--> (2)*/<br />
/*26 */ {BgSy,{(unsigned long) ',' },NULL ,27, 0}, /* + ----','----> (1)*/<br />
/*27 */ {BgGr,{(unsigned long) gExpr },NULL ,28, 0}, /*(1) --express--> (2)*/<br />
/*28 */ {BgSy,{(unsigned long) ',' },NULL ,29, 0}, /* + ----','----> (1)*/<br />
/*29 */ {BgGr,{(unsigned long) gExpr },NULL ,30, 0}, /*(1) --express--> (2)*/<br />
/*30 */ {BgSy,{(unsigned long) ')' },St_30,31, 0}, /*(2) ----')'----> (3)*/<br />
/*31 */ {BgEn,{(unsigned long)0 },NULL , 0, 0} /*(23)--------->(ENDE)*/<br />
};<br />
26.07.2004 Seite 74 von 85
<strong>Diplomarbeit</strong>: Modulares System Anhang<br />
tBog gCondition[]=<br />
{<br />
/* 0 */ {BgSy,{(unsigned long) zODD }, NULL , 1, 2}, /*(0) ---'ODD'---> (1)*/<br />
/* 1 */ {BgGr,{(unsigned long) gExpr }, Co_01,15, 0}, /*(1) --express-->(15)*/<br />
/* 2 */ {BgGr,{(unsigned long) gExpr }, NULL , 3, 0}, /* + --express--> (3)*/<br />
/* 3 */ {BgSy,{(unsigned long) '=' }, NULL , 4, 5}, /*(3) ----'='----> (4)*/<br />
/* 4 */ {BgGr,{(unsigned long) gExpr }, Co_04,15, 0}, /*(4) --express-->(15)*/<br />
/* 5 */ {BgSy,{(unsigned long) '#' }, NULL , 6, 7}, /* + ----'#'----> (6)*/<br />
/* 6 */ {BgGr,{(unsigned long) gExpr }, Co_06,15, 0}, /*(6) --express-->(15)*/<br />
/* 7 */ {BgSy,{(unsigned long) '' }, NULL ,12,13}, /* + ----'>'---->(12)*/<br />
/*12 */ {BgGr,{(unsigned long) gExpr }, Co_12,15, 0}, /*(12)--express-->(15)*/<br />
/*13 */ {BgSy,{(unsigned long) zge }, NULL ,14, 0}, /* + ----'>='--->(14)*/<br />
/*14 */ {BgGr,{(unsigned long) gExpr }, Co_14,15, 0}, /*(14)--express-->(15)*/<br />
/*15 */ {BgEn,{(unsigned long) 0 }, NULL , 0, 0} /*(10)--------->(ENDE)*/<br />
};<br />
tBog gExpr[]=<br />
{<br />
/* 0 */ {BgSy,{(unsigned long) '+' }, NULL , 3, 1}, /*(0) ----'+'----> (3)*/<br />
/* 1 */ {BgSy,{(unsigned long) '-' }, NULL , 4, 2}, /* + ----'-'----> (4)*/<br />
/* 2 */ {BgNl,{(unsigned long) 0 }, NULL , 3, 0}, /* + ----nil----> (3)*/<br />
/* 3 */ {BgGr,{(unsigned long) gTerm }, NULL , 5, 0}, /*(3) ----nil----> (5)*/<br />
/* 4 */ {BgGr,{(unsigned long) gTerm }, Ex_04, 5, 0}, /*(4) ----nil----> (5)*/<br />
/* 5 */ {BgSy,{(unsigned long) '+' }, NULL , 8, 6}, /*(5) ----'+'----> (8)*/<br />
/* 6 */ {BgSy,{(unsigned long) '-' }, NULL , 9, 7}, /* + ----'-'----> (9)*/<br />
/* 7 */ {BgNl,{(unsigned long) 0 }, NULL ,10, 0}, /* + ----nil---->(10)*/<br />
/* 8 */ {BgGr,{(unsigned long) gTerm }, Ex_08, 5, 0}, /*(8) --- term---> (5)*/<br />
/* 9 */ {BgGr,{(unsigned long) gTerm }, Ex_09, 5, 0}, /*(9) --- term---> (5)*/<br />
/*10 */ {BgEn,{(unsigned long) 0 }, NULL , 0, 0} /*(10)--------->(ENDE)*/<br />
};<br />
tBog gTerm[]=<br />
{<br />
/* 0 */ {BgGr,{(unsigned long) gFact }, NULL , 1, 0}, /*(0) ---factor--> (1)*/<br />
/* 1 */ {BgSy,{(unsigned long) '*' }, NULL , 4, 2}, /*(1) ----'*'----> (4)*/<br />
/* 2 */ {BgSy,{(unsigned long) '/' }, NULL , 5, 3}, /* + ----'/'----> (4)*/<br />
/* 3 */ {BgNl,{(unsigned long) 0 }, NULL , 6, 0}, /* + ----nil----> (6)*/<br />
/* 4 */ {BgGr,{(unsigned long) gFact }, Te_04, 1, 0}, /*(4) ---factor--> (1)*/<br />
/* 5 */ {BgGr,{(unsigned long) gFact }, Te_05, 1, 0}, /*(5) ---factor--> (1)*/<br />
/* 6 */ {BgEn,{(unsigned long) 0 }, NULL , 0, 0} /*(6) --------->(ENDE)*/<br />
};<br />
tBog gFact[]=<br />
{<br />
/* 0 */ {BgMo,{(unsigned long)mcIdent}, Fc_00,11, 1}, /*(0) ---ident---> (6)*/<br />
/* 1 */ {BgMo,{(unsigned long)mcONumb}, Fc_01,11, 2}, /* + ---o-number--> (6)*/<br />
/* 2 */ {BgSy,{(unsigned long) '(' }, NULL , 3, 5}, /* + ----'('----> (1)*/<br />
/* 3 */ {BgGr,{(unsigned long) gExpr }, NULL , 4, 0}, /*(1) --express--> (2)*/<br />
/* 4 */ {BgSy,{(unsigned long) ')' }, NULL ,11, 0}, /*(2) ----')'----> (3)*/<br />
/* 5 */ {BgSy,{(unsigned long) zGET }, NULL , 6, 0}, /* + ----'GET'--->(14)*/<br />
/* 6 */ {BgSy,{(unsigned long) '(' }, NULL , 7, 0}, /* + ----'('----> (1)*/<br />
/* 7 */ {BgGr,{(unsigned long) gExpr }, NULL , 8, 0}, /*(1) --express--> (2)*/<br />
/* 8 */ {BgSy,{(unsigned long) ',' }, NULL , 9, 0}, /* + ----','----> (1)*/<br />
/* 9 */ {BgGr,{(unsigned long) gExpr }, NULL ,10, 0}, /*(1) --express--> (2)*/<br />
/*10 */ {BgSy,{(unsigned long) ')' }, Fc_11,11, 0}, /*(2) ----')'----> (3)*/<br />
/*11 */ {BgEn,{(unsigned long) 0 }, NULL , 0, 0} /*(3) --------->(ENDE)*/<br />
};<br />
Abbildung A.3 - Bogengraphen des PL0-Compilers<br />
26.07.2004 Seite 75 von 85
<strong>Diplomarbeit</strong>: Modulares System Anhang<br />
typedef enum TCODE<br />
{<br />
/*--- Kellerbefehle ---*/<br />
puValVrLocl,/*00 (int Displ) [Kellern Wert lokale Variable] */<br />
puValVrMain,/*01 (int Displ) [Kellern Wert Main Variable] */<br />
puValVrGlob,/*02 (int Displ,int iProc) */<br />
puAdrVrLocl,/*03 (int Displ) [Kellern Adresse lokale Variable] */<br />
puAdrVrMain,/*04 (int Displ) [Kellern Adresse Main Variable] */<br />
puAdrVrGlob,/*05 (int Displ,int iProc) [Kellern Adresse globale Variable] */<br />
puConst ,/*06 (int Index) [Kellern einer Konstanten] */<br />
storeVal ,/*07 () [Speichern Wert -> Adresse, beides aus Keller]*/<br />
putVal ,/*08 () [Ausgabe eines Wertes aus Keller nach stdout] */<br />
getVal ,/*09 () [Eingabe <strong>und</strong> Speichern eines Wertes */<br />
/*--- arithmetische Befehle ---*/<br />
vzMinus ,/*0A () [Vorzeichen -] */<br />
odd ,/*0B () [ungerade -> 0/1] */<br />
/*--- binaere Operatoren kellern 2 Operanden aus <strong>und</strong> das Ergebnis ein ----*/<br />
OpAdd ,/*0C () [Addition] */<br />
OpSub ,/*0D () [Subtraktion ] */<br />
OpMult ,/*0E () [Multiplikation ] */<br />
OpDiv ,/*0F () [Division ] */<br />
cmpEQ ,/*10 () [Vergleich = -> 0/1] */<br />
cmpNE ,/*11 () [Vergleich # -> 0/1] */<br />
cmpLT ,/*12 () [Vergleich < -> 0/1] */<br />
cmpGT ,/*13 () [Vergleich > -> 0/1] */<br />
cmpLE ,/*14 () [Vergleich 0/1] */<br />
cmpGE ,/*15 () [Vergleich >=-> 0/1] */<br />
/*--- Sprungbefehle ---*/<br />
call ,/*16 (int ProzNr) [Prozeduraufruf] */<br />
retProc ,/*17 () [Ruecksprung] */<br />
jmp ,/*18 (int RelAdr) [SPZZ innerhalb der Funktion] */<br />
jnot ,/*19 (int RelAdr) [SPZZ innerhalb der Funkt.,Beding.aus Keller] */<br />
jnut ,/*1A (int RelAdr) [SPZZ innerhalb der Funkt.,Beding.aus Keller] */<br />
entryProc ,/*1B (int CodeLen, int ProcIdx, int VarLen) */<br />
putStrg ,/*1C (char[]) */<br />
EndOfCode ,/*1D */<br />
dup ,/*1E () [dupliziert obersten Stackeintrag] */<br />
pop ,/*1F () [entfernt obersten Stackeintrag] */<br />
retFunc ,/*20 () [Ruecksprung] */<br />
getValPara ,/*21 () [Hole Sensordaten zum Keller] */<br />
putValPara /*22 () [Gebe Sensordaten aus Keller] */<br />
}tCode;<br />
Abbildung A.4 - Code der Virtuellen Maschine<br />
Abbildung A.5 - Aufbau der Klassen der Virtuellen Maschine<br />
26.07.2004 Seite 76 von 85
<strong>Diplomarbeit</strong>: Modulares System Anhang<br />
Baugruppe Prozessor<br />
U3<br />
Baugruppe RS232-Treiber<br />
J5<br />
1 2<br />
8<br />
7<br />
6<br />
5<br />
TX0 RS<br />
GND CANH<br />
VCC CANL<br />
RX0 RX1<br />
A82C250<br />
1<br />
2<br />
3<br />
4<br />
U1<br />
TST2<br />
TST3<br />
TST4<br />
TST5<br />
C5 1µF<br />
28<br />
27<br />
26<br />
25<br />
24<br />
23<br />
22<br />
21<br />
20<br />
19<br />
18<br />
17<br />
16<br />
15<br />
RB7<br />
RB6<br />
RB5<br />
RB4<br />
RB3/CANRX<br />
RB2/CANTX<br />
RB1<br />
RB0<br />
VDD<br />
VSS<br />
RC7/RX<br />
RC6/TX<br />
RC5<br />
RC4/SDA<br />
MCLR<br />
RA0<br />
RA1<br />
RA2<br />
RA3<br />
RA4<br />
RA5<br />
VSS<br />
OSC1<br />
OSC2<br />
RC0<br />
RC1<br />
RC2/CCP1<br />
RC3/SCL<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
14<br />
R2 220<br />
X4<br />
C6 1µF<br />
RM 2,54mm<br />
X1<br />
1 +12V<br />
2 CANH<br />
3 CANL<br />
4 GND<br />
5 +5V<br />
5x1<br />
R9<br />
120<br />
Lötjumper<br />
5P<br />
C3<br />
100n<br />
1<br />
2<br />
3<br />
4<br />
5<br />
12P<br />
TST1<br />
U5<br />
R1 4,7k<br />
LED1<br />
R7 220<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
RM 2,54mm<br />
X3<br />
C7 1µF<br />
16<br />
2<br />
15<br />
6<br />
C1+<br />
C1-<br />
C2+<br />
C2-<br />
1<br />
3<br />
4<br />
5<br />
TST6<br />
TST7<br />
TST8<br />
TST9<br />
TST10<br />
TST11<br />
5P<br />
5P<br />
VCC<br />
V+<br />
GND<br />
V-<br />
5P<br />
C4 1µF<br />
14<br />
7<br />
13<br />
8<br />
T1IN<br />
T2IN<br />
R1OUT<br />
R2OUT<br />
11<br />
10<br />
12<br />
9<br />
5P<br />
T1OUT<br />
T2OUT<br />
R1IN<br />
R2IN<br />
1<br />
2<br />
3<br />
4<br />
+5V<br />
GND<br />
RS232-0 RX<br />
X2<br />
1 +5V<br />
2 GND<br />
3 RS232-0 RX<br />
4 RS232-0 TX<br />
4x1<br />
RM 2,54mm<br />
LED2<br />
R8 220<br />
C1 22pF<br />
R5 1k<br />
4x1<br />
DSUB-9<br />
C15<br />
15pF<br />
MAX232<br />
X1<br />
10 MHz<br />
C2 22pF<br />
Abbildung A.6 - Schaltpläne<br />
RS232-0 TX<br />
5P<br />
5P<br />
C17<br />
15pF<br />
B<br />
R6 1k<br />
PIC18F258<br />
R4 1k<br />
R3 1k<br />
5P<br />
SDA<br />
SCL<br />
Typische Sensoren <strong>und</strong> Aktoren<br />
R14<br />
TST2<br />
X3<br />
TST2<br />
1k<br />
LED2<br />
Taster<br />
Baugruppe Stromversorgung<br />
26.07.2004 Seite 77 von 85<br />
O1<br />
R12 220<br />
TST2<br />
+12V<br />
R15<br />
R13 1k<br />
1k<br />
X6<br />
1<br />
2<br />
3<br />
4<br />
5<br />
5x1<br />
1<br />
2<br />
3<br />
4<br />
5<br />
SI1<br />
X5<br />
SG2<br />
CANH<br />
J1<br />
TST2<br />
U4<br />
LM7805C/TO220<br />
B1<br />
+<br />
-<br />
Piezo<br />
CANL<br />
R11 120<br />
2<br />
1<br />
fuse<br />
5P<br />
GND<br />
+5V<br />
3<br />
1<br />
OUT<br />
IN<br />
Opt_Sens<br />
C11<br />
10µ<br />
C9<br />
100n<br />
C8<br />
100n<br />
C10<br />
100µ<br />
1<br />
2<br />
3<br />
4<br />
4x1<br />
TST6<br />
X7<br />
1<br />
2<br />
3<br />
4<br />
5<br />
5x1<br />
GND<br />
+12V<br />
1<br />
2<br />
3<br />
4<br />
5<br />
2<br />
CANH<br />
CANL<br />
GND<br />
+5V<br />
TST6<br />
T1<br />
A<br />
LSP1<br />
1<br />
2<br />
VBB OUT<br />
IN GND<br />
BTS450<br />
4<br />
3<br />
12P<br />
R10<br />
5P<br />
TST2<br />
Trimmpotential<br />
+12V<br />
R16<br />
1k<br />
CANH<br />
CANL<br />
GND<br />
X8<br />
1<br />
2<br />
3<br />
4<br />
5<br />
5x1<br />
1<br />
2<br />
3<br />
4<br />
5<br />
+5V
<strong>Diplomarbeit</strong>: Modulares System Anhang<br />
unsigned char Init_VM (tVM_Struct *VM)<br />
{<br />
unsigned char uc;<br />
const rom char *codePtr;<br />
unsigned int ui, ui1, ui2, ui3;<br />
unsigned long uli;<br />
VM->pCodeFile = VM_CODE;<br />
uc=CheckCodeFileVersion(VM->pCodeFile);<br />
if(uc) return(uc);<br />
VM->VM_StackSize = _VM_StackSize;<br />
VM->VM_StackPtr = 0;<br />
VM->VM_Stack = VM_Stack;<br />
VM->Flags = DebugFlag;<br />
}<br />
VM->pProzedure = VM->pCodeFile + 8; // Pointer auf erste Prozedur<br />
codePtr = VM->pProzedure;<br />
VM_ReadLong (VM->pCodeFile + 4,(long*)&uli);<br />
if(uli & 0xFFFF0000L) return(ERROR_READ_PROCHEADER);<br />
VM->ProcCount = (unsigned int)uli;<br />
for(ui=0; ui < VM->ProcCount; ui++) {<br />
if(!ScanProcHeader(codePtr,&ui1,&ui2,&ui3)) codePtr += ui2;<br />
else return(ERROR_READ_PROCHEADER);<br />
}<br />
VM->pConstant = codePtr + ui2; // Start Konstantenarea<br />
VM->pCodeFile = codePtr; // Start Hauptprozedur<br />
VM->ProcCount = 0; // Aktuelle Prozedur<br />
return(OK);<br />
Abbildung A.7 - Initialisierungsteil der Virtuellen Maschine auf dem Controller<br />
26.07.2004 Seite 78 von 85
<strong>Diplomarbeit</strong>: Modulares System Anhang<br />
CD-Inhalt<br />
Abbildung A.8 - CD-Inhalt<br />
26.07.2004 Seite 79 von 85
<strong>Diplomarbeit</strong>: Modulares System Quellenverzeichnis<br />
Quellenverzeichnis<br />
[dem] Computerschnittstellen <strong>und</strong> Bussysteme<br />
Klaus Dembowski; ISBN: 3-7785-2526-3;Hüthig GmbH, Heidelberg, 1997<br />
[etsch] Controller-Area-Network Gr<strong>und</strong>lagen, Protokolle, Bausteine, Anwendungen<br />
Konrad Etschberger; ISBN: 3-446-19431-2; Carl Hanser Verlag, München, Wien, 2000<br />
[law] CAN Controller Area Network Gr<strong>und</strong>lagen<strong>und</strong> Praxis<br />
Wolfgang Lawrenz; ISBN: 3-7785-2575-1; Hüthig GmbH, Heidelberg, 1997<br />
[jon] Mobile Roboter Von der Idee zur Implementierung<br />
J. L. Jones, A.M. Flynn; ISBN: 3-89319-855-5; Addison-Weslay GmbH, 1996<br />
[bb] Bastelbuch <strong>für</strong> Modellelektronik<br />
Autorenkollektiv; Deutscher Militärverlag, Berlin 1970<br />
[beck] Vorlesungsskript Compiler/Interpreter<br />
Prof. Dr.-Ing. A. Beck, HTW-<strong>Dresden</strong><br />
[mich] Entwicklung einer Softwarelösung <strong>für</strong> die Simulation autonomer Roboter in einer 3-<br />
dimensionalen Umgebung<br />
Dipl. Inform. O. Michel, <strong>Diplomarbeit</strong>, 2000<br />
[ccon] http://www.c-control.de<br />
[lego] http://www.mindstorms.com<br />
[fisch] http://www.fischertechnik.de<br />
[d001] http://me.in-berlin.de/~urmel/robot<br />
[rr] http://www.realrobots.de<br />
[kt] http://www.k-team.com<br />
[cb] http://www.cyberbotics.com<br />
[cc] http://www.cc-i.com<br />
[awa] http://www.saar.de/~awa/compiler.htm<br />
[beam] http://www.buildcoolstuff.com/topics/BEAM_Walker/3.shtml<br />
[C535] http://alf.zfn.uni-bremen.de/~g16i/80c535.htm<br />
[spid] http://www.robotstore.com/catalog/display.asp?pid=254<br />
26.07.2004 Seite 80 von 85
<strong>Diplomarbeit</strong>: Modulares System Abbildungen <strong>und</strong> Tabellen<br />
Abbildungs- <strong>und</strong> Tabellenverzeichnis<br />
Abbildung 2.1 - Die elektronische Schildkröte „Elmer“......................................................................... 7<br />
Abbildung 2.2 - Der Laufroboter Spider............................................................................................... 8<br />
Abbildung 2.3 - Der Beamroboter UniBug........................................................................................... 8<br />
Abbildung 2.4 - Ein Mikrocontrollerboard 80C535 ............................................................................... 9<br />
Abbildung 2.5 - Das System C-Control ............................................................................................... 9<br />
Abbildung 2.6 - Der D001-Experimentierroboter ............................................................................... 10<br />
Abbildung 2.7 - Ein LEGO-Roboter................................................................................................... 10<br />
Abbildung 2.8 - Ein Laufroboter mit fischertechnik ............................................................................ 11<br />
Abbildung 2.9 - Der Cybot ................................................................................................................ 11<br />
Abbildung 2.10 - Der Miniaturroboter Khepera.................................................................................. 12<br />
Abbildung 2.11 - Der Autoroboter Koala ........................................................................................... 12<br />
Abbildung 5.1 - Asymmetrische <strong>und</strong> symmetrische Schnittstelle ....................................................... 29<br />
Abbildung 6.1 - Schematische Darstellung eines Khepera ................................................................ 41<br />
Abbildung 6.2 - Beispielprogramm <strong>für</strong> eine zentrale Steuerung ......................................................... 42<br />
Abbildung 6.3 - Das erweiterte zentralgesteuerte Programm............................................................. 42<br />
Abbildung 6.4 - Verteiltes Programm: linker Motor ............................................................................ 43<br />
Abbildung 6.5 - Verteiltes Programm: rechter Motor.......................................................................... 43<br />
Abbildung 6.6 - Verteiltes Programm: Scheinwerfer.......................................................................... 43<br />
Abbildung 6.7 - Codedatei ................................................................................................................ 46<br />
Abbildung 6.8 - Interpretierte Codedatei ........................................................................................... 47<br />
Abbildung 6.9 - Beispiele <strong>für</strong> Funktionen der Virtuellen Maschine ..................................................... 47<br />
Abbildung 6.10 - Grafische Programmierung bei LEGO.................................................................... 48<br />
Abbildung 7.1 - LLWin...................................................................................................................... 50<br />
Abbildung 7.2 - Webot...................................................................................................................... 50<br />
Abbildung 7.3 - Easybot ................................................................................................................... 51<br />
Abbildung 7.4 - Netbot...................................................................................................................... 51<br />
Abbildung 7.5 - Aufbau der VM.DLL ................................................................................................. 52<br />
Abbildung 7.6 - Einbinden der VM.DLL............................................................................................. 53<br />
Abbildung 7.7 - Lightvision3D ........................................................................................................... 54<br />
Abbildung 7.8 - Lightvision3D mit Easybot ........................................................................................ 55<br />
Abbildung 7.9 - Kheperamodell......................................................................................................... 56<br />
Abbildung 7.10 - Cybotmodell........................................................................................................... 56<br />
Abbildung 7.11 - Dialogbeispiele einer offenen Steuerung <strong>für</strong> Easybot.............................................. 57<br />
Abbildung 7.12 - Steuerprogramm Cybot, linker Motor...................................................................... 58<br />
Abbildung 7.13 - Steuerprogramm Cybot, rechter Motor ................................................................... 58<br />
Abbildung 7.14 - Typbibliotheken NetbotServer <strong>und</strong> NetbotClient ..................................................... 59<br />
Abbildung 7.15 - NetbotServer.......................................................................................................... 59<br />
Abbildung 7.16 - Aufruf des NetbotServer durch den Client .............................................................. 60<br />
26.07.2004 Seite 81 von 85
<strong>Diplomarbeit</strong>: Modulares System Abbildungen <strong>und</strong> Tabellen<br />
Abbildung 7.17 - Beispiel <strong>für</strong> NetbotClients....................................................................................... 60<br />
Abbildung 7.18 - Warnlampe links <strong>für</strong> den Cybot .............................................................................. 60<br />
Abbildung 8.1 - Netbot Setup Programm .......................................................................................... 64<br />
Abbildung 8.2 - Aufbau der Kommunikation zwischen Computer <strong>und</strong> Controller................................ 64<br />
Abbildung 8.3 - Fahrwerk des Cybot <strong>und</strong> die originale Elektronik ...................................................... 65<br />
Abbildung 8.4 - Aktoren <strong>und</strong> Sensoren als Einzelkomponenten......................................................... 65<br />
Abbildung 8.5 - Steuerprogramm linker Motor................................................................................... 66<br />
Abbildung 8.6 - Steuerprogramm rechter Motor ................................................................................ 66<br />
Abbildung 8.7 - Weg des Roboters im Simulator............................................................................... 67<br />
Abbildung 8.8 - Cybot mit Netbot-Controllern.................................................................................... 67<br />
Abbildung 8.9 - Netbot in Bewegung................................................................................................. 67<br />
Abbildung 8.10 - Steuerprogramm linke Warnlampe ......................................................................... 68<br />
Abbildung 8.11 - Steuerprogramm rechte Warnlampe....................................................................... 68<br />
Abbildung 8.12 - Netbot mit installierten Warnlampen....................................................................... 68<br />
Abbildung 8.13 - Netbot in Bewegung............................................................................................... 68<br />
Abbildung A.1 - Syntaxgraphen in PL0 ............................................................................................. 72<br />
Abbildung A.2 - Tabellen der lexikalischen Analyse in PL0 ............................................................... 73<br />
Abbildung A.3 - Bogengraphen des PL0-Compilers .......................................................................... 75<br />
Abbildung A.4 - Code der Virtuellen Maschine.................................................................................. 76<br />
Abbildung A.5 - Aufbau der Klassen der Virtuellen Maschine............................................................ 76<br />
Abbildung A.6 - Schaltpläne ............................................................................................................. 77<br />
Abbildung A.7 - Initialisierungsteil der Virtuellen Maschine auf dem Controller .................................. 78<br />
Abbildung A.8 - CD-Inhalt................................................................................................................. 79<br />
Tabelle 4.1 - natürlich vorkommende Sensoren <strong>und</strong> ihre technische Umsetzung .............................. 17<br />
Tabelle 4.2 - häufig verwendete Sensoren........................................................................................ 18<br />
Tabelle 4.3 - häufig verwendete Aktoren........................................................................................... 19<br />
Tabelle 4.4 - Parametrisierung.......................................................................................................... 21<br />
Tabelle 4.5 - Gruppentypen <strong>und</strong> -adressen....................................................................................... 24<br />
Tabelle 4.6 - Systemkommandos ..................................................................................................... 25<br />
Tabelle 5.1 - serielle Betriebsarten ................................................................................................... 28<br />
Tabelle 5.2 - Buszugriffsverfahren .................................................................................................... 30<br />
Tabelle 5.3 - Das OSI-Schichtenmodell ............................................................................................ 32<br />
Tabelle 5.4 - Übersicht über Bussysteme ......................................................................................... 36<br />
Tabelle 6.1 - Sprachumfang von PL0................................................................................................ 40<br />
Tabelle 6.2 - Erweiterung von PL0 <strong>für</strong> den Einsatz im Netzwerk ....................................................... 41<br />
Tabelle 6.3 - Phasen eines Compilers .............................................................................................. 45<br />
Tabelle 8.1 - Kennung der Übertragung zwischen Computer <strong>und</strong> Controller...................................... 65<br />
26.07.2004 Seite 82 von 85
<strong>Diplomarbeit</strong>: Modulares System Abkürzungen <strong>und</strong> Glossar<br />
Abkürzungsverzeichnis<br />
ARM Advanced RISC Machine<br />
BEAM Biology Electronics Astetics Mechanics<br />
CAN Controller Area Network<br />
CISC Complex Instruction Set Computer<br />
CPU Central Processing Unit (dt: zentrale Verarbeitungseinheit)<br />
CRC Cyclic Red<strong>und</strong>ancy Check (Prüfsumme)<br />
DLL Dynamic Link Library (dt: dynamisch ladbare Bibliothek)<br />
COM Communication Port (serielle Schnittstelle am Personalcomputer)<br />
DCOM Distributed Component Object Model (rechnerübergreifende Prozessschnittstelle)<br />
DSP Digital Signal Processor<br />
FFT Fast Fourier Transformation<br />
GIF Graphics Interchange Format<br />
I²C Inter IC-Bus (interner integrierter Schaltungsbus)<br />
IC Integrated Circuit (dt: Integrierter Schaltkreis)<br />
IEC Instrumentierungsbus nach der IEC625 (International Electronic Commission)<br />
ISO International Standard Organisation<br />
MS Microsoft<br />
OS Operating System (Betriebssystem)<br />
OSI Open System Interconnection<br />
PC Personal Computer<br />
PDA Personal Digital Assistant (mobile Mini-Computer)<br />
POWER Performance Optimisation With Enhanced RISC<br />
RCX Robotic Command Explorer<br />
RISC Reduced Instruction Set Computer<br />
SCSI Small Computer System Interface<br />
TCP Transmission Control Protocol (verbindungsorientiertes Transportprotokoll)<br />
USB Universal Serial Bus<br />
VME Versa Module Europe Bus<br />
VXI VMEbus eXtensions for Instrumentation<br />
VC++ Visual C++<br />
26.07.2004 Seite 83 von 85
<strong>Diplomarbeit</strong>: Modulares System Abkürzungen <strong>und</strong> Glossar<br />
Glossar<br />
Acknowledgebit Empfangsbestätigung<br />
Bit-stuffing „Bitstopfen“: Jeder Bitfolge von fünf 1-Bits in den Anwendungsdaten wird ein<br />
zusätzliches 0-Bit angehängt. Dadurch wird verhindert, das Flags als Datenzeichen<br />
aufgefasst werden.<br />
Bridge Verbindungselement zwischen verschiedenen Netzwerken<br />
Callback Rückrufverfahren. D.h. ein Server kann damit den Client von sich aus erreichen,<br />
zurückrufen.<br />
Frame Byte-Rahmen um die Nutzdaten (z.B. Steuerbits)<br />
Hub engl.: Mittelpunkt. Knotenpunkt von Leitungen in einem sternförmig angelegten<br />
Netzwerk<br />
Identifier Bezeichner / Identifizierungsmerkmal<br />
Master zentrale Instanz auf einem Bus, der die Entscheidungsgewalt hat<br />
Multi-Master Falls der eigentliche Master ausfällt, kann jeder Teilnehmer dessen Funktion<br />
übernehmen<br />
NRZ „non return to zero“ – Kodierungsverfahren in der seriellen Signalübertragung.<br />
Jedem Bit wird ein konkretes Signal zugeordnet (z.B. 0=0-Spannung, 1=positive<br />
Spannung).<br />
OSI-Modell internationaler Standard <strong>für</strong> Kommunikationssysteme der ISO<br />
Slave Teilnehmer auf einem Bus, der vom Master das „Rederecht“ zugewiesen bekommt<br />
26.07.2004 Seite 84 von 85
<strong>Diplomarbeit</strong>: Modulares System<br />
Erklärung zur Selbstständigkeit<br />
Ich versichere, dass ich die <strong>Diplomarbeit</strong> selbstständig verfasst <strong>und</strong> keine anderen als die<br />
angegebenen Quellen <strong>und</strong> Hilfsmittel benutzt habe.<br />
Daniel Popp<br />
<strong>Dresden</strong>, den 26.07.2004<br />
26.07.2004 Seite 85 von 85