24.11.2012 Aufrufe

Diplomarbeit - Hochschule für Technik und Wirtschaft Dresden

Diplomarbeit - Hochschule für Technik und Wirtschaft Dresden

Diplomarbeit - Hochschule für Technik und Wirtschaft Dresden

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!