Entwicklung eines dynamisch über Tools modifizierbaren

Transcrição

Entwicklung eines dynamisch über Tools modifizierbaren
Systementwicklungsprojekt
Entwicklung eines dynamisch über Tools
modifizierbaren Filternetzwerkes
Nikolas Dörfler, Peter Hallama, Korbinian Schwinger,
Maximilian Schwinger
Aufgabensteller: Prof. Dr. Gudrun Klinker
Betreuer: Dipl. Inf. Christian Sandor
Abgabedatum: 10.04.2004
Hiermit versichern die Unterzeichnenden, dass sie die vorliegende Ausarbeitung
des Systementwicklungsprojektes ’Entwicklung eines dynamisch über Tools modifizierbaren Filternetzwerkes’ selbständig verfasst und nur die in der Bibliographie
eingeführten Quellen verwendet haben.
Nikolas Dörfler
Peter Hallama
Korbinian Schwinger
Maximilian Schwinger
Zusammenfassung
Im Rahmen eines Systementwicklungsprojektes wurde innerhalb des an der
TU München entwickelten DWARF ein Set von Applikationen erstellt, mit
dem es möglich ist die in einem solchen System notwendige kontinuierliche
Integration von Daten zu realisieren. Als Form wurde die eines Netzwerkes
von Filtern gewählt.
Dieses ist mit Hilfe des erstellten Toolsets konfigurierbar gestaltet. Seine
Konfiguration kann zur Laufzeit geändert werden. Ebenso ist seine Struktur zur Laufzeit mit Hilfe von zusätzlichen Tools änderbar.
INHALTSVERZEICHNIS
i
Inhaltsverzeichnis
1 Einleitung
1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Struktur des Dokuments . . . . . . . . . . . . . . . . . . . . . . .
1
1
1
2 DWARF
2.1 Infrastruktur . . .
2.1.1 Services . .
2.1.2 Middleware
2.1.3 Architektur
.
.
.
.
3
3
6
6
7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Anforderungsanalyse
3.1 Szenario . . . . . . . . . . . . . . . . .
3.2 Anforderungen . . . . . . . . . . . . .
3.2.1 Funktionale Anforderungen . .
3.2.2 Nichtfunktionale Anforderungen
3.2.3 Pseudoanforderungen . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
8
9
9
9
10
4 Verwandte Arbeiten
4.1 OpenTracker . . . . . . .
4.2 DART . . . . . . . . . .
4.3 VR-Juggler . . . . . . .
4.4 metaDESK . . . . . . .
4.5 DemoPaja . . . . . . . .
4.6 Unit . . . . . . . . . . .
4.7 Einordnung der Arbeiten
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
11
12
13
14
15
17
17
.
.
.
.
20
20
21
22
23
.
.
.
.
.
.
.
.
24
24
24
24
26
36
36
37
43
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 System-Design
5.1 Designziele . . . . . . . . . . . .
5.2 Dekomposition der Subsysteme
5.3 Hardware/Software - Zuordnung
5.4 Datenhaltung - und Speicherung
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6 Implementierung
6.1 Funktionalität - Filter . . . . . . . . .
6.1.1 Wahl der Programmiersprache:
6.1.2 Schnittstellen nach außen . . .
6.1.3 Klassendesign: . . . . . . . . .
6.2 Konfigurierbarkeit - CARMelion . . . .
6.2.1 Wahl der Programmiersprache .
6.2.2 Klassendesign . . . . . . . . . .
6.3 Evolution der Filter . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
INHALTSVERZEICHNIS
ii
7 Résumé
7.1 Ergebnis . . . . . . . . . . . . . . . . . . .
7.2 Probleme . . . . . . . . . . . . . . . . . .
7.2.1 Probleme speziell bei Filterservices
7.2.2 Probleme speziell bei CARmelion .
7.3 Future Work . . . . . . . . . . . . . . . . .
.
.
.
.
.
45
45
45
45
45
46
.
.
.
.
47
47
49
49
52
B Verwendete/Notwendige Hardware
B.1 Laboraufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
56
A Spinof - Entwicklungen
A.1 3D Audio . . . . . .
A.1.1 Future Work .
A.2 PoseRecorder . . . .
A.3 TUI . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ABBILDUNGSVERZEICHNIS
iii
Abbildungsverzeichnis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Mapping der realen Bewegung zunächst linear, dann exponentiell
Die virtuelle Hand der Testperson kann die Vase nur mit dem
GoGo-Gadget erreichen. . . . . . . . . . . . . . . . . . . . . . . .
DWARF-Typische Infrastruktur . . . . . . . . . . . . . . . . . . .
Servicedarstellung in UML . . . . . . . . . . . . . . . . . . . . . .
Beispiel einer Servicebeschreibung im XML-Format . . . . . . . .
Beispiel für DWARF-Architektur . . . . . . . . . . . . . . . . . .
DWARF - Architektur . . . . . . . . . . . . . . . . . . . . . . . .
OpenTracker - Anwendungsbeispiel . . . . . . . . . . . . . . . . .
DART, die Publisher-Erweiterung . . . . . . . . . . . . . . . . . .
VjControl - Control-Utility des VR-Jugglers . . . . . . . . . . . .
Benutzerinterface des DemoPaja . . . . . . . . . . . . . . . . . . .
Typisches Unit-Netzwerk . . . . . . . . . . . . . . . . . . . . . . .
Klassifizierung der Arbeiten . . . . . . . . . . . . . . . . . . . . .
Dekomposition in Subsysteme . . . . . . . . . . . . . . . . . . . .
Hardware/Software-Zuordung . . . . . . . . . . . . . . . . . . . .
Konfiguration eines Filter ber CARmelion . . . . . . . . . . . . .
Die Schnittstellen des Filters . . . . . . . . . . . . . . . . . . . .
Ein Filternetzwerk in DIVE . . . . . . . . . . . . . . . . . . . . .
Klassendiagramm eines Filters . . . . . . . . . . . . . . . . . . .
Debugoutput des DistanceFilters nach dem Starten. . . . . . . .
Empfang und Versand von Filterdaten. . . . . . . . . . . . . . . .
Interpolation zwischen den Stützwerten (Interpolator) . . . . . . .
Klassendiagramm des Parsephonefilters . . . . . . . . . . . . . . .
Registrierung der Variablen einer Formel . . . . . . . . . . . . . .
Abfrage der Variablenwerte . . . . . . . . . . . . . . . . . . . . .
Debugsausgaben Parsephone nach dem starten . . . . . . . . . . .
Parsephone: Ansicht in DIVE beim registrieren der Formel ADD(x,y)
Parsephone: Ansicht in DIVE nach dem registrieren der Formel
ADD(x,y) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parsephone beim Addieren zweier Werte . . . . . . . . . . . . . .
DIVE-Bild eines von DIVE gestarteten CARmelion . . . . . . . .
Einfaches CARmelion-GUI zur Bedienung von 3 abilities . . .
Klassenhirarchie der CARmelion Implementierung . . . . . . . .
Konfigurieren eines Filters mit dem Grapheneditor . . . . . . . .
Endgültige Struktur des GenericFilters . . . . . . . . . . . . . . .
Prinzip räumlicher Klangdarstellung mit 2 Lautsprechern . . . . .
Prinzip räumlicher Klangdarstellung mit 4 Lautsprechern (quadrophonisch) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Klassenhierarchie der PoseRecorder-Imlementierung . . . . . . .
Beispiel einer TUI-Anwendung . . . . . . . . . . . . . . . . . . . .
1
2
4
5
6
7
8
12
13
14
16
17
18
21
22
25
25
26
27
28
29
32
33
34
34
35
35
35
35
36
38
40
41
44
47
48
51
52
ABBILDUNGSVERZEICHNIS
39
40
41
42
43
44
45
Apple Macintosh G4 dual . . . . . . . . . .
ART Kamera . . . . . . . . . . . . . . . . .
Apple Cinema-Display . . . . . . . . . . . .
3D Soundkarte Terratec Aureon Fun 5.1 . .
Dolby 5.1 System Terratec Home Arena 5.1
Die ’Basic Visualisation’ . . . . . . . . . . .
Das tangible Auto-Objekt . . . . . . . . . .
iv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
54
54
55
55
56
56
57
1 EINLEITUNG
1
1
Einleitung
Zunächst wollen wir zum besseren Verständnis des Dokumentes und des Projektes
dem Leser nahebringen, welches die Motivation für das vorliegende Projekt ist.
Des weiteren wollen wir auf Struktur und Aufbau des Dokumentes näher
eingehen.
1.1
Motivation
Häufig ist es in der Augmented Reality1 notwendig
nicht lineare Zusammenhänge
zwischen Benutzerinteraktion und Reaktion des AR-Systems
herzustellen. Beispiel dafür wäre
das, in [?] Eingeführte GoGo. Hierbei wird die Bewegung der Hand einer Testperson, wie in Abbildung 1
zu sehen ist, zunächst linear,
bei ’starker’ Bewegung jedoch
exponentiell auf ein virtuelles Objekt abgebildet (siehe
Abbildung 1: Mapping der realen Bewegung
auch Abbildung 2).
Um nun derartike nicht- zunächst linear, dann exponentiell
lineare Verknüpfungen herstellen zu können ist eine Bearbeitung der Daten,
welche die Bewegungen beschreiben, notwendig. Diese Berechnung soll von Filtern durchgeführt werden. Interessant wäre hier ebenso die nichtlinearen Zusammenhänge verändern zu können.
1.2
Struktur des Dokuments
Das vorliegende Dokument hält sich an den grundlegenden Aufbau, welcher laut
[?] den im Softwareengineering relevanten Strukturen entspricht.
• Im Kapitel zwei, der Anforderungsanalyse, werden Funktionale-, Nichtfunktionaleund Pseudoanforderungen welchen dieses SEP gerecht werden muss im Detail erörtert.
• Das dritte Kapitel beschäftigt sich mit verwandten Arbeiten und deren
besonderen Eigenschaften. Es wird näher darauf eingegangen, in wie weit
1
Unter Augmented Reality (Erweiterte Realität, Augmentierte Realität, kurz AR) versteht
man die (meist visuelle) Überlagerung (=Erweiterung) von virtueller Information mit der Realität in Echtzeit. Dabei soll die Information möglichst am richtigen geometrischen Ort dargestellt
werden.[?]
1 EINLEITUNG
2
Abbildung 2: Die virtuelle Hand der Testperson kann die Vase nur mit dem
GoGo-Gadget erreichen.
diese Arbeiten Anforderungen genügen, die denen des vorliegenden SEPs
ähneln.
• Im Abschnitt System-Design, dem vierten Kapitel, werden wir den Aufbau
des Gesamtsystems, seine Zergliederung in Subsysteme und die Rolle des
Systementwicklungsprojektes in diesem Gesamtsystem genauer betrachten.
• Im Kapitel fünf, welches die Implementation des Systementwicklungsprojektes zum Thema hat, wird beschrieben, wie die Realisierung des Projektes
als Schlussfolgerung aus den vorangegangenen Kapiteln bzw. Arbeitsschritten des Softwareengineering aussieht.
• Das Kabitel sechs, dem Résumé, werden die erreichten Ergebnisse, aufgetretene Probleme und mögliche Ansatzpunkte für die zukünftige Weiterentwicklung der erstellten Applikationen angeführt.
• Im Anhang findet sich sowohl eine kurze Beschreibung der bei der Erstellung
der notwendigen Applikationen entstandenen SpinOf-Produkte, namentlich
dem PoseRecorder, dem 3D-Audio-Service und der Anwendung von TUIObjekten. Des weiteren wird hier die von uns verwendete Hardware, sowie
der Laboraufbau beschrieben.
2 DWARF
2
3
DWARF
DWARF, das Distributed Wareable Augmented Reality Framework ist ein Forschungsprojekt der Technischen Universität München
welches, wie schon aus dem Namen zu erkennen ist, im Bereich der augmentierten Realität angesiedelt ist.
Das DWARF wurde entwickelt, um schnelle Prototypenerstellung durch mehrere Entwickler an unterschiedlichen Computeren zu
ermöglichen. Dadurch wurde der am Lehrstuhl für angewandtes Software Engineering
vorhandene Infrastruktur, bestehend aus Systemen auf PC-Basis mit den OS-Platformen
Linux und Windows, und Apple Macintosh Workstations, Rechnung getragen[?].
Es ist des weiteren möglich Hardwareomponenten, wie z.B. Tracking Systeme, die von Drittem hergestellt wurden, einzubinden. Im DWARF werden
AR-Anwendungen als verteilte Systeme modelliert, welche sich aus mobilen und
stationären Komponenten zusammensetzen können. Ein derartiges System kann
sich selbst zur Laufzeit durch Austausch oder Rekonfiguration von Komponenten
verändern.
2.1
Infrastruktur
Das DWARF - Framework kann auf vier Abstrakten Ebenen betrachtet werden[?]
(Abbildung 3).
• Auf der niedrigsten und damit Systemnächsten Ebene der Betrachtung
können wir das eigentliche System der PeerToPeer-Verbindung2 der einzelnen im System verwendeten Rechner sehen. Hier kann beispielsweise der
ServiceManager oder der CORBA3 -basierte Notificationservice angesiedelt
werden.
• Die nächsthöhere Ebene beinhaltet allgemeine Komponenten, die für Augmented Reality - Applikationen benötigt werden. Dazu gehören beispielsweise das Trackingsystem und die umgebungsspezifische Kontextgenerierung.
2
Bei einem PeerToPeer-Netzwerk sind, im Gegensatz zu einem ServerClient-Netzwerk, alle
teilnehmenden Rechner gleichberechtigt.
3
Die Common Object Request Broker Architecture kurz CORBA ist eine objektorientierte
Middleware, die plattformübergreifende Protokolle und Dienste definiert und von der Object
Management Group (OMG) entwickelt wird. CORBA ermöglicht das Erstellen verteilter Anwendungen in heterogenen Umgebungen.[?]
2 DWARF
4
Applikation 1
Applikation 2
...
Data Access
Navigation
Bluetooth
Communication
Service
service Access
Taskflow
Engine
AR
Wareable Computing
User
Interface
Engine
Tracking
Manager
Optical
Tracker
ID
Tracker
GPS
Tracker
World Modell
Attention
Management
CAP Router
Ubiquitous Computing
Computing
Context
Sensor
Actuator
Dynamisches Peer-to-Peer-System
Service
Manager
Service
Lokation
Protokoll
CORBA
Notification
Service
Abbildung 3: DWARF-Typische Infrastruktur
2 DWARF
5
• Die dritte Ebene wird als die allgemeine Applikationsebene beschrieben.
Komponenten, die auf den allgemeinen Aufgaben der darunterliegenden
Schichten aufbauen sind hier angesiedelt.
• Die oberste Ebene ist die der konkreten Applikation, welche für den Benutzer des Systems sichtbar ist.
Ein Framework für den Bereich der Augmented Reality wie das DWARF
muss einigen Ansprüchen genügen. Zum einen sollte es eine robuste Middleware
bieten, welche für Verbindung zwischen den einzelnen Komponenten Sorge trägt.
Zum anderen ein allgemein gehaltenes Konzept zur Erstellung von Applikationen,
welches auch wiederverwendet werden kann.
Die vorgenannten Komponenten bzw. Konzepte sind der Garant für Wiederbenutzbarkeit einzelner Systemteile in unterschiedlichen Applikationen. Um auf
die konzeptionelle Gestaltung des DWARF näher einzugehen stellen wollen wir
einen Blick auf die folgednen Punkte werfen:
• Service: Ein Service ist eine Komponente, die andere Services oder der Benutzer durch seine abilities mit Daten versorgt, die von dem genannten
Service bearbeitet, verändert oder gefiltert wurden. Durch die needs des
Service erhält der Service Daten (Abbildung 4).
• Middleware: Die Middleware konfiguriert und verbindet die Services dynamisch zur Laufzeit miteinander. Dabei werden die individuellen needs bzw.
abilities berücksichtigt.
• Architektur: Die Architektur soll die grundlegenden Strukturen des ARSystems und seine Fähigkeiten beschreiben. Dazu ist es notwendig, dass
unterschieldiche Entwickler sich an vorgegebene Konventionen bezüglich der
rolle ihrer Services und der zur Verbindung notwendigen Interfaces halten.
Die Kernkomponente des DWARF<<DWARFService>>
Frameworks ist der service
ability
Beispielservice
need
manager, der sich um Start,
ability
Verschaltung und Handhabung
need
der einzelnen DWARF-Services
ability
kümmert. Dies ist in unserem Falle auf unterschiedliAbbildung 4: Servicedarstellung in UML
chen Systemen innerhalb eines Netzwerkes möglich. Somit ist die Möglichkeit gegeben, ubiquitäre4 Applikationen zu implementieren.
Auf die oben genannten Punkte soll nun in den folgenden Abschnitten etwas
genauer eingegangen werden.
4
Unter dem 1988 von Mark Weiser geprägten Begriff ’Ubiquitous Computing’ wird die Allgegenwärtigkeit von Informationstechnik und Computerleistung verstanden, die in beliebige
Alltagsgegenstände eindringt[?].
2 DWARF
6
<service name="TestStringSender" startOnDemand="false"
stopOnNoUse="true" startCommand="TestStringSender"
isTemplate="true">
<attribute name="subsystem" value="testing"/>
<attribute name="serviceclass" value="testserver"/>
<ability name="status" type="Status">
<connector protocol="ObjrefExporter"/>
</ability>
<ability name="sendstrings" type="StringData">
<attribute name="foo" value="I send events"/>
<connector protocol="PushSupplier"/>
</ability>
<ability name="writestrings" type="StringData">
<attribute name="foo" value="I write data"/>
<connector protocol="Shmem"/>
</ability>
</service>
Abbildung 5: Beispiel einer Servicebeschreibung im XML-Format
2.1.1
Services
Ein DWARF-Service implementiert, neben der eigentlichen Funktionalität, die
Interfaces, welche zur Kommunikation innerhalb der gegebenen Infrastruktor von
Nöten sind. Repräsentiert werden diese innerhalb der Infrastruktur zum einen
durch sogenannte needs und abilities. Hierbei stehen die needs für InputInterfaces, die abilities für Output-Interfaces.
Beschrieben werden die vorgenannten Interfaces in der sogenannten service
description. Somit ist in diesen die Verbindungsstruktur der verschiedenen Services festgelegt. Servicebeschreibungen können in Form von XML-Dateine gespeichert werden (Abbildung 5).
2.1.2
Middleware
Im Falle von DWARF wird die Middleware vom sogenannten service manager
repräsentiert. Eine Instanz des service managers wird auf jedem teilnehmenden
Rechner gestartet. Jeder service managers trägt die ihm bekannten service
descriptions dem Gesamtpool derservice descriptions bei und sorgt dafür,
dass korrespondierende needs und abilities verbunden werden.
2 DWARF
7
<<DwarfService>>
Tracking
Pose
Data
Pose
Data
PoseData
<<DwarfService>>
Filter2
<<DwarfService>>
Filter1
Configuration
<<DwarfService>>
Filter3
Configuration
Configuration
<<DwarfService>>
CARmelion
Input
Data
Analog
Unlimited
<<DwarfService>>
UIC
PoseData
Viewer
Command
PoseData
<<DwarfService>>
Viewer
Abbildung 6: Beispiel für DWARF-Architektur
2.1.3
Architektur
Die konzeptionelle Architektur definiert die grundlegende Struktur eines ARSystems. Basis dafür sind Konventionen unter den beteiligten Entwicklern. Ein
Beispiel für ein im DWARF-Framework aufgebautes System und dessen Architektur kann in Abbildung 6 betrachtet werden. Hier ist ein Filternetzwerk, wie
es Ziel dieses SEPS ist und in den folgenden Kapiteln beschrieben wird, und sein
Zusammenspiel mit anderen DWARF-Komponenten in einem UML-Diagram abgebildet. Eine allgemeinere Beschreibung wird mit Abbildung 7 gegeben
3 ANFORDERUNGSANALYSE
8
Input
Trackingadapter
diskrete Ereignisse
...
kontinuierliche Ereignisse
<<Tokens>>
Interaktionsmanagement
continuous
Integration
User Interface
Controller
...
<<Tokens>>
<<Commands>>
Output
3D-Viewer
...
Abbildung 7: DWARF - Architektur
3
Anforderungsanalyse
Um die an dieses Projekt zu stellenden Anforderungen deutlich herausarbeiten
zu können ist es von großer Wichtigkeit, sich zunächst mit der vorhandenen Umgebung zur Entwicklung und Anwendung des Ergebnisses auseinanderzusetzen,
was Thema des vorangegangenen Kapitels war.
Ein weiterer Bezugspunkt der Anforderungsanalyse ist natürlich die Beschreibung des Szenarios, in welchem die Ergebnisse dieses SEPs verwendet werden
soll.
3.1
Szenario
Das CAR-Projekt soll, wie schon in der Einführung beschrieben, als Kollaborationsbasis für Ingenieure und Nichtingenieure dienen. Dabei wird der Laboraufbau
in eine Simulation der Fahrzeugumgebung, die zur Generierung von Situationen,
auf den das Fahrzeug durch Änderung von Darstellungen, Repräsentationen und
Verhaltensweisen im zweiten Teil der Simulation, der Simulation des Fahrzeuginneren, reagieren soll. Eine genauere Beschreibung des Aufbaus findet sich im
Abschnitt B.1
Aufgabe der in diesem SEP zu erstellenden Komponenten ist es nun, die
dynamischen Änderungen, die mit einfachen Zusammenhängen beschreibbar sind,
durch konfigurierbare Komponenten zur Filterung von Daten zu realisieren.
3 ANFORDERUNGSANALYSE
3.2
9
Anforderungen
Aus den oben beschriebenen Faktoren, der Umgebung und dem Szenario, zusammen mit den Vorstellungen des Betreuers und der Aufgabenstellerin ergeben sich
die Anforderungen an das Systementwicklungsprojekt. Die Anforderungen lassen
sich in drei Gruppen unterteilen.
3.2.1
Funktionale Anforderungen
Funktionale Anforderungen an ein System sind diejenigen Anforderungen, welche
die Interaktion zwischen System und Umwelt beschreiben und unabhängig von
der Art der Implementierung sind[?].
• Es sind Filter zur Verarbeitung von Daten zu erstellen, die verschiedene
einfache mathematische Zusammenhänge implementieren. So wären als Beispiele Filter denkbar, die in Orientierungsdaten, welche sie erhalten Rotationsachsen vertauschen.
• Mit dem in einem anderen SEP entwickelten Service DWARF Interactive
Visualisation Environment, kurz DIVE5 , welcher in einem parallel zu dem
vorliegenden SEP laufenden Systementwicklungsprojekt weiterentwickelt
wurde soll es möglich sein, Filterservices zu starten.
• Die Services sollen die Möglichkeit bieten, Veränderungen der Konfiguration
durchzuführen.
• Die Konfiguration der Filter soll über ein Interface erfolgen, dass für alle
Filter einheitlich ist.
• Die oben genannten Veränderungen der Konfiguration sollen zur Laufzeit
durchführbar sein.
• Die Struktur und das Zusammenspiel von mehreren Filtern bzw. Filternetzwerken soll zur Laufzeit veränderbar sein.
• Die Filter sollen zur Hilfe bei Integrationstests verwendet werden können.
3.2.2
Nichtfunktionale Anforderungen
Nichtfunktionale Anforderungen sind Anforderungen, welche das von einem Benutzer erkennbare Verhalten des Systems betreffen.
Sie stehen nicht in direkter Beziehung zur funktionalen Verhaltensweise des
Systems[?].
5
DIVE wurde als Visualisierungstool im DWARF entwickelt. Es hat unter anderem die
Fähigkeit, die Verbindungsstati der verschiedenen Services im Netzwerk zu zeigen und auch die
Eigenschaften der Verbindungen zu editieren.
3 ANFORDERUNGSANALYSE
10
• Die Ausgabe der verarbeiteten Daten soll in Echtzeit6 erfolgen. Diese Anforderung ist für AR-Anwendungen, die direkte Auswirkung auf die Augmentierung haben stets erforderlich.
• Um die oben beschriebenen Anwendungen mit den zu erstellenden Filtern
realisieren zu können ist eine gewisse Mindeststabilität des Filternetzwerkes
unerlässlich.
3.2.3
Pseudoanforderungen
Pseudoanforderungen sind diejenigen Anforderungen, welche nicht durch die Projektziele selbst, sondern durch Kunden oder in diesem Falle durch den Aufgabensteller gegeben werden.
• Die wichtigste Anforderung des Aufgabenstellers ist die Verwendung des
DWARF als Basis der Entwicklungen.
• Die zu erstellenden Filter sollen mit den in anderen Arbeiten implementierten Komponenten des Projektes CAR innerhalb des Projektes CAR
verwendbar sein.
• Die filternden Funktionen sollen nicht in einem einzigen ’Multifunktionsfilter’, sondern in separaten Filtern, welche sich untereinander verschalten
implementiert werden.
6
Die Definition von Echtzeit ist umstritten. Die breiteste Zustimmung findet folgende Definition: Ein Echtzeit-System ist ein System, bei dem das Ergebnis der Berechnung innerhalb eines
gewissen Zeitraumes garantiert vorliegt. Verletzt das System diese Zeitschranke, hat das System
versagt. Um die Echtzeit-Fähigkeit eines Echtzeit-Systems theoretisch nachweisen zu können,
müssen die Häufigkeit der externen Ereignisse, die Laufzeit der einzelnen Programmteile und
die Zeitschranken bekannt sein[?].
4 VERWANDTE ARBEITEN
4
11
Verwandte Arbeiten
Auf dem relativ aktuellen Forschungsgebiet der Augmented Reality gibt es viele
Arbeiten die zumindest ähnliche Ziele verfolgen. Ein Blick über den Tellerrand
der eigenen Entwicklungen hinaus ist daher zumindest lohnenswert, wenn nicht
gar unverzichtbar. Auch eine Untersuchung der verwandten Entwicklungen der
Virtuellen Realität7 soll hier durchgeführt werden.
4.1
OpenTracker
Kurzbeschreibung
OpenTracker ist ein als ’OpenSource8 ’ verfügbares
Projekt, das es sich zum Ziel gesetzt hat eine Software zu entwickeln, die Lösungen für unterschiedlichste
Anforderungen, welche Verarbeitung von Trackingdaten betreffen, bietet.
Hierbei wird versucht das System so modular wie
möglich aufzubauen. Die Konfiguration erfolgt über
XML. Dieses Projekt wurde an der Technischen Universität Wien initiiert[?].
Besonderheiten
Motivation für das OpenTracker-Projekt war die Beobachtung, dass derzeit das
Hauptaugenmerk bei den Entwicklungen im Bereich Tracking auf der Erstellung
des Trackers selbst, nicht aber auf einem soliden Ansatz für die Software zur Verarbeitung der Trackingdaten liegt. Als Folge davon sind die meisten kommerziell
erhältlichen Systeme mit wenig modularer, schwer konfigurierbarer und meist gar
nicht anpassbarer Software ausgestattet. Genau diese Beobachtung führt uns zu
den Besonderheiten des OpenTracker-Projektes.
Das Hauptkonzept des Open Tracker ist es, den Trackingdatenfluss in VR
und AR- Umgebungen, welcher typischerwiese aus Generierung der Trackingdaten durch die Trackinghardware, einlesen der Daten durch Gerätetreiber, Transformation der Trackingdaten in die benötigte Form und senden der Daten über
das Netzwerk besteht, aufzubrechen und ein ’Data-Flow’ - Netzwerk aus den einzelnen Komponenten zu erstellen. Grund für dieses Vorgehen ist die Tatsache,
dass all die vorgenannten Schritte in jedem AR oder VR - Setup vorhanden sind,
allerdings in eventuell anderen Ausprägungen und Anordnungen.
Die Anordnung und Ausführung der einzelnen Schritte wird, ähnlich einem
Szenengraph, organisiert. Aufbau und Konfiguration dieses die Arbeitsschritte
bestimmenden Graphen werden durch das Editieren einer XML-Datei relativ einfach. ermöglicht.[?]
7
Als Virtuelle Realität (VR) wird die Darstellung der Wirklichkeit und ihrer physikalischen
Eigenschaften in einer in Echtzeit computergenerierten Umgebung bezeichnet[?].
8
Der englische Ausdruck Open Source steht einerseits für ’quelloffen’ (in dem Sinne, dass der
Quelltext eines Programms frei erhältlich ist), andererseits für ’offene Quelle’ (in dem Sinne,
dass ein Werk frei zur Verfgung steht). Software gilt als Open Source, wenn sie bestimmte
Kriterien erfüllt, die in ihrer Open-Source-Lizenz geregelt sind[?].
4 VERWANDTE ARBEITEN
12
Abbildung 8: OpenTracker - Anwendungsbeispiel
4.2
DART
Kurzbeschreibung
Das Designer’s Augmented Reality Toolkit, kurz DART, ist eine
Entwicklung des Georgia Institute
of Technology in Atlanta. Mit ihm ist eine Prototypenerstellung von Augmented
Reality-Applikationen mit Hilfe von Tangible User Interfaces möglich. DART
wurde zur Unterstützung von AR-Experten, speziell beim ’rapid prototyping9 ’
entwickelt. DART ist eine Erweiterung des Macromedia Directors, welcher einer
der wohl am meisten verbreiteten Multimediadesigner ist[?].
Besonderheiten
Die größte Besonderheit des Projektes DART ist wohl das Konzept der Bedienung durch Tangible User Interfaces10 . Für die Benutzung ist eine Umgebung,
9
Das (Rapid) Prototyping ist eine Methode der Softwareentwicklung, die zu schnellen Ergebnissen führen soll. Diese Ergebnisse werden z.B. in der Machbarkeitsphase benötigt, um
ein Software-Projekt vom Aufwand und von den Kosten einzuschätzen und um überhaupt die
Machbarkeit einer Lösung zu demonstrieren[?].
10
Als Tangible User Interface oder kurz TUI bezeichnet man metaphorische Objekte, mit
denen der Benutzer in der realen Welt interagieren kann. Eine Manipulation des Objektes in
vorher festgelegter Art hat Auswirkungen auf die zugehörige Applikation.
4 VERWANDTE ARBEITEN
13
ausgestattet mit multiplen Tracking-Sensoren und Displays in verschiedensten
Konfigurationen, notwendig. Somit hat der Designer die Möglichkeit seine ARAnwendung in der selben Umgebung zu entwickeln, in der sie später benutzt
werden soll.
Durch die Bedienung via
metaphorischer Objekte wird
als Zielgruppe neben der der
technischen Designer auch
diejenige der nichttechnischen
erschlossen.
Die Integration in den
Macromedia Director erfolgt
durch hinzufügen von sogenannten ’behaviors’, also Verhaltensweisen, die dem Director als Erweiterungen, welche in LINGO11 erstellt wurden bzw. durch erstellen sogenannter Director Xtras12 ,
Abbildung 9: DART, die Publisher-Erweiterung
die in C++ implementiert
werden.
Beispielsweise kann nun durch das Hinzufügen von Actor-Verhaltensweisen
ein Objekt in der AR-Szene mit einem realen Objekt verbunden oder Verhaltensweisen nach dem Muster ’Wenn X eintritt führe Y aus’ definiert werden.
4.3
VR-Juggler
Kurzbeschreibung
Der VR-Juggler ist, wie schon aus dem Namen
erkennbar, ein Tool, welches speziell für die Anforderungen von VR-Szenarien entwickelt wurde.
Er agiert als Bindeglied zwischen der eigentlichen
VR-Anwendungen und der Hardware.
Somit muss der Entwickler der Software auf
der höchsten Applikationsebene sich bespielsweise nicht mehr um die Hardware und Hardwaretreiberspezifischen Trackingdaten und deren Importierung und Konvertierung
kümmern sondern erhält unabhängig vom verwendeten Trackingsystem die Positionsdaten in standardisierter Form direkt vom VR-Juggler [?].
11
LINGO ist eine Scriptsprache, die im Macromedia Director zur Erstellung von multimedialem Content verwendet wird.
12
Macromedia Director Xtras sind Erweiterungen, die in Form von Bibliotheken hinzugefügt
werden.
4 VERWANDTE ARBEITEN
14
Abbildung 10: VjControl - Control-Utility des VR-Jugglers
Besonderheiten
Der VR-Juggler agiert, wie in der Kurzbeschreibung erwähnt, als ’Middleware’ zwischen den verschiedenen VR-Anwendungen. Das System besteht einerseits
aus dem Mikrokernel, der als Bindeglied zwischen den verschiedenen Managern
dient, andererseits aus den Managern selbst. Die Aufgabe der Manager sind beispielsweise die Verwaltung der Anzeigegeräte, aller Eingaben und ähnlichem.
Durch das Design des VR-Jugglers ist es möglich platformunabhängig Systeme
zu entwickeln und zu benutzen.
Um nun eine VR-Application erstellen zu können ist es zunächst notwendig,
den VR-Juggler an die vorhandene Hardware anzupassen. Zur Vereinfachung der
Konfiguration und der Erstellung von Applikationen wurde ein Java-Frontend,
der VjControl erstellt, welches in Abbildung 10 betrachtet werden kann.
4.4
metaDESK
Kurzbeschreibung
Das metaDESK - Projekt beschäftigt sich mit der Erstellung von Benutzerinterfaces, die näher an den dem Menschen aus seiner natürlichen Umgebung ge-
4 VERWANDTE ARBEITEN
15
wohnten Interaktionsformen liegen, als das GUI13 . Zu diesem Zweck wurde schon
1997 eine augmentierte Umgebung entwickelt, in der Versuche mit neuen Bedienungsmetaphern möglich waren[?].
Besonderheiten
Das metaDESK-System
besteht aus folgenden Komponenten: Das Zentrale Objekt des Systems ist der
’desk’. Wie der Name vermuten lässt ist er tischähnlich. Er ist mit einer berührungssensitiven Oberfläche und
zur Bildwiedergabe mit einem Rückprojektor ausgestattet. Weitere Komponenten sind die ’active lens’,
ein Flatscreen der an einem schwenkbaren Arm befestigt wird und die ’passive lens’, eine optisch transparente Oberfläche durch die
der ’desk’ projezieren kann.
In der beschriebenen Umgebung nun werden die von der GUI bekannten Bedienungsobjekte wie ’icons’, ’menues’ und ’handles’ in Tangible User InterfaceObjekte, nämlich phicons (physical icons), trays und phandles(physical handles)
übersetzt.
4.5
DemoPaja
Kurzbeschreibung
Der DemoPaja ist ein Authoring Tool, das zu den klassischen MultimediaDesignern gezählt werden kann. Eine ’Demo’ kann in diesem Zusammenhang als
Demonstration oder Komposition verschiedener multimedialer Inhalte allein
als Kunstwerk oder Beispiel der Fähigkeiten des Authors und der zur Verfügung
stehenden Hardware beschrieben werden. Zu diesem Zweck bietet der DemoPaja ein einfach und nahezu intuitiv
4 VERWANDTE ARBEITEN
16
Abbildung 11: Benutzerinterface des DemoPaja
bedienbares Benutzerinterface. Die Bedienungsparadigmen des DemoPaja sind
vergleichbar mit den allgemein in der Welt der klassischen Multimediadesigner
üblichen Ausprägungen. Beispiele dafür wären etwa das Macromedia-Flash Designertool oder ’After Effects’, welches von Adobe vertrieben wird.
Besonderheiten
Im Gegensatz zu den vorgenannten Arbeiten ist der Demopaja eher für eine weniger versierte Zielgruppe ausgelegt. Auch die Ziele des Multimediadesigns sind
wesentlich niedriger gesteckt, als z.B. die Ziele eines Frameworks zur Erstellung
von AR-Applikationen.
Die Erstellung von Animationen erfolgt als Komposition von Animationen,
Videospuren, Audiospuren u.s.w. die entsprechend ihrer Position in der Timeline
zu einem fest bestimmten Zeitpunkt der Demo wiedergegeben werden. Das Interface zur Erstellung dieser Demos ist, wie in Abbildung 11 erkennbar, intuitiv
verständliches und verwendet, ähnlich einem Zeitplanungsdiagramm, an der Timeline ausgerichtete Ereignisse.
13
GUI ist eine Abkürzung aus dem IT-Bereich für ’Graphical User Interface’, was wörtlich
übersetzt ’Grafische Benutzerschnittstelle’ bedeutet, in der Softwareergonomie jedoch in der
Regel treffender als Grafische Benutzungsschnittstelle bzw. Mensch-Maschine-Schnittstelle bezeichnet wird. Ein GUI stellt dem Benutzer somit eine grafische Schnittstelle zur Bedienung
des Rechners zur Verfügung[?].
4 VERWANDTE ARBEITEN
4.6
17
Unit
Kurzbeschreibung
Die Idee hinter Unit ist die eines Frameworks zum Zwecke der Entwicklung des
Designs und der Implentierung interaktiver Technologien. Als potentielle Anwendungsgebiete werden vom Author sowohl Augmented, als auch Virtual Reality Szenarien gesehen.
Um diese Idee zu verwirklichen wird bei Unit eine abstrakte Ebene der Benutzerinteraktion geschaffen, die zwischen der Ebene der Benutzereingaben und
der Ebene der eigentlichen Applikation liegt[?].
Besonderheiten
Der Name Unit leitet sich aus den
verwendeten Bezeichnungen innerhalb
der Systemarchitektur ab. Die Units
sind hier einzelne abstracte Entitäten.
Sie bestehen aus Methoden, die die Informationsverarbeitung innerhalb der
Unit repräsentieren und Verbindungen,
die einseitige Informationskanäle nach
außen darstellen. Die wahre Stärke des
Systems Unit liegt in der Zusammenschaltung mehrerer Unit-Entitäten zu
einem Netzwerk. Somit kann die Informationsverarbeitung stufenartig bis
zur endgültigen Ausgabe aufgebaut werden.
Die Entwicklungsarbeit neuer Applikationen erfolgt bei diesem Framework durch instanziieren und manipu- Abbildung 12: Typisches Unit-Netzwerk
lieren verschiedener Units.
4.7
Einordnung der Arbeiten
Um nun eine Vergleichsmöglichkeit zur Einordnung der vorgestellten Arbeiten
zu haben müssen wir uns zunächst ein Bezugssystem definieren, in das wir die
Arbeiten und ihre speziellen Ausprägungen einordnen können. Als Bezugsgrößen
bietet sich z.B. an:
• Zielgruppe: Ist die vorgestellt Arbeit eher für den Entwickler oder für einen
potentiellen Enduser, soweit man in dieser Domäne eher versiertere Personen von Enduser sprechen kann, gedacht?
AR
4 VERWANDTE ARBEITEN
DART
18
metaDESK
OpenTracker
Unit
VRJuggler
VR
DemoPaja
multimedial
ubiquitär
Abbildung 13: Klassifizierung der Arbeiten
• VR - oder AR-Applikation: Kann die Arbeit eher zur Erstellung von Szenarien der virtuellen oder der augmentierten Realität verwendet werden?
• Klassischer oder ubiquitärer Multimediadesigner: Werden eher klassische
Konzepte zur Erstellung der Applikationen verwendet oder ubiquitäre?
Der Einfachheit halber werden wir die Arbeiten nur mit Hilfe der letztgenannten beiden Bezugsgrößen einordnen. Somit ist eine Darstellung ähnlich einer
Portfolioanalyse möglich(Abbildung 13).
Viele Konzepte der vorgestellten Arbeiten eignen sich gut um Anstoß und Ideen für unser eigenes Projekt zu sammeln. Um nun aus den verwandten Arbeiten
etwas für die unsrige schlussfolgern zu können bietet es sich an auch unsere Arbeit in das vorgegebene Portfolio einzuordnen. Dies fällt dank der Anforderungsanalyse relativ leicht. Unsere Arbeit ist eindeutig der augmentierten Realität
zuzuordnen. Die Methoden, welche verwendet werden sind wiederum eindeutig
ubiquitär.
Somit ist die Arbeit, die der unsrigen in dieser Beziehung am ähnlichsten
ist ohne Zweifel das Projekt metaDESK. Wenn wir nun die Zielsetzungen dieses
Projektes in Relation zu den unsrigen sehen erkennen wir wieder starke Parallelen: Auch metaDESK versuchte neue Konzepte, in seinem Falle nur auf die
Verwendung von TUI-Objekten als Ersatz für die klassische GUI beschränkt, zu
untersuchen.
Viele Konzepte und Ideen des metaDESK-Projektes werden sicher in das unsrige miteinfließen. Auch die anderen angeführten Arbeiten spiegeln interessante
4 VERWANDTE ARBEITEN
19
Ideen der Entwickler wieder, die wir, soweit für uns von Nutzen, mit in unserer
Arbeit berücksichtigen werden.
5 SYSTEM-DESIGN
5
20
System-Design
Beim Design des Systems werden die in den vorgenannten Abschnitten aufgeführten relevanten Punkte, nämlich die Anforderungen an das System und die Konzeptideen, die uns aus verwandten Arbeiten brauchbar erscheinen zu einem Modell überführt, welches eine Dekomposition des Projektes in seine Subsysteme
möglich macht.
5.1
Designziele
Die Designziele geben die Qualität der Ansprüche wieder, denen das Gesamtsystem genügen muss. Wichtige Punkte, die zu dieser Kathegorie zählen, auf die
während der Realisierung des Projektes stets geachtet werden muss, sind in unserem Falle:
• Geschwindigkeit: Da für das Projekt CAR relativ viele Daten gefiltert und
bearbeitet werden müssen ist eine gewisse Mindestgeschwindigkeit jedes
einzelnen Filters durch die Echtzeitrelevanz der AR-Anwendung CAR notwendig. Zusätzlich zu der Datenmenge, welche jeder einzelne Filter bearbeiten muss macht die Notwendigkeit vieler Filter die Geschwindigkeit der
Einzelfilter zu einem sehr wichtigen Designziel.
• Erweiterbarkeit: Das Netzwerk von Filtern soll ohne großen Aufwand um
weitere Filter erweiterbar sein. Dieses Ziel ist durch das Verbindungskonzept
des DWARF relativ leicht zu verwirklichen.
• Modifizierbarkeit: die Filternetze sollen in ihren Verbindungen, welche die
Abhängigkeiten untereinander ausdrücken, leicht veränderbar sein.
• einfache Anwendbarkeit: Nach der Entwicklungsphase soll die Verwendung
und evtl. auch die Weitertentwicklung der zu erstellenden Applikationen
relativ einfach realisierbar sein.
• Konfigurierbarkeit: Die Filterservices sollen, auch zur Laufzeit, die Möglichkeit bieten, Änderungen an ihrer Konfiguration, also der Behandlung der zu
verarbeitenden Daten, durchzuführen. Diese Konfigurierbarkeit soll auch in
weiteren Filtern einfach integrierbar sein.
• Wiederverwendbarkeit: auch nach Abschluss des Systementwicklungsprojektes und des Projektes CAR sollen die entwickelten Services weiter für
andere Szenarien verwendbar sein.
5 SYSTEM-DESIGN
21
continuus Integration
CARmelion
Filter
Filter1
Filter2
DIVE
Abbildung 14: Dekomposition in Subsysteme
5.2
Dekomposition der Subsysteme
Die Dekompositions des Systems hat zum Zweck, die funktionalen Anforderungen an das Gesamtsystem in eine Aufteilung dieses in Subsysteme zu überführen.
Eine rudimentäre Dekomposition kann in Abbildung 14 betrachtet werden. Hier
wird die kontinuierliche Integration, welche im Kapitel ’DWARF’ eingeführt wurde genauer aufgegliedert. In unserem Fall kann die kontinuierliche Integration in
mehrere Komponenten aufgespalten werden. Namentlich dem CARmelion, weches für die Konfiguration des eigentlichen datenbearbeitenden Partes, der Filter,
zuständig ist und die Userinteraktion mit der Filterkonfiguration ermöglichen soll
und den Filtern selbst.
Das DIVE, welches im Rahmen eines früheren SEP’s[?] erstellt und in einem
parallel zu diesem SEP laufenden Projekt weiterentwickelt wurde, steht ausserhalb der erstellten Ordnung. Das hat als Grund die vielfältigen Einsatzmöglichkeiten des DIVE, welche es zu mehr als einer Gruppe zugehörig machen.
Die im Kapitel ’Designziele’ eingeführten Kriterien bewogen uns zur vorgenannten Aufteilung. Die Komponenten, welche für die eigentliche kontinuierliche Datenverarbeitung verantwortlich sind und als DWARF-Komponenten zu
erstellen sind, werden als Basis für schnellere Entwicklung von Komponenten der
kontinuierlichen Integration erstellt. Um denjenigen, welche derartige Komponenten benötigen, das Leben zusätzlich zu vereinfachen wurde die Konfiguration
der Komponenten und das Graphical User Interface in einer eigenen Komponente implementiert. Aufteilung und Zweck der einzelnen Komponenten sollen hier
nocheinmal genau voneinander abgegrenzt werden:
• Filter: Die Filterkomponenten erhalten Daten, verarbeiten diese und geben
verarbeitete Daten aus. Die Art der Verarbeitung wird über das Senden
eines Konfigurations-Events an ein DWARF-Need vom Benutzer oder anderen DWARF-Services bestimmt.
5 SYSTEM-DESIGN
22
• CARmelion: Die Benutzerinteraktion mit den Filtern ist durch die graphische Oberfläche des CARmelion möglich. Von DIVE gestartet soll das
CARmelion die beim Start übergebene und zur Konfiguration des in DIVE beim Start ausgewählten Filters nötigen, Abilities ausbilden. Zu diesem
Zweck soll das CARmelion beliebige Datenquellen simulieren können.
5.3
Hardware/Software - Zuordnung
Das Kapitel Hardware/Software - ZuordPentium, 500 MHz, Matrox
G550, 256 MB
nung beschäftigt sich
mit der Zuordnung der,
im vorangegangenen Kapitel eingeführten, SubFilter
Audio
systeme zu vorhandeAthlon 2400+, GeForce FX
Athlon 2400+, GeForce FX
5600, 512 MB
5600, 512 MB
ner Hardware. Hierbei
wird Leistungsbedarf und
Bedarf anfordungsspezifischer Hardware berücksichtigt und gegebenenfalls genauer erläutert.
ART-Tracking
Visualisierung
In Abbildung 15 werAthlon XP 1600
Apple Macintosh PowerPC
dual G4
den die in der folgenden Tabelle begründeten Hardwarezuordnungen, sowie weitere in
Abbildung 15: Hardware/Software-Zuordung
unserem System vorhandene Software und deren Zuordnung zu Hardware grafisch dargestellt.
CARmelion
• Filter: die Filter sollten, wenn möglich, separat auf einem Rechner gestartet
werden. Der Grund dafür ist die Echtzeitrelevanz des mit Filtern zu verarbeitenden Datenstroms und die Unberechenbarkeit der Leistungsforderung
anderer Applkikationen auf dem verwendeten System. Das von uns verwendete System der Anwendung CAR ist ein Athlon 2400+ mit GeForce FX
5600 Grafikkarte und 512 MB RAM. Es läuft unter SuSe Linux.
• CARmelion: da die Hauptaufgabe des CARmelion das senden von diskreten
Daten ist und keine Verarbeitungsaufgaben anfallen ist der zu erwartende
Rechenaufwand relativ gering und beschränkt sich zum größten Teil auf die
einmalige GUI-Generierung. Der von uns für das CARmelion verwendete
Rechner ist daher nur ein Pentium mit 500 MHz, Matrox G550 Grafikkarte
und 256 MB RAM. Ebenfalls unter SuSe Linux.
5 SYSTEM-DESIGN
5.4
23
Datenhaltung - und Speicherung
Die hier benötigte Art der Datenhaltung und Speicherung kann von der Art der
Daten und dem Zweck derer Verarbeitung hergeleitet werden. Zunächst haben wir
die kontinuierlichen Daten, die z.B. vom ART-Tracking-System kommen können
und uns mit Positions- und Orientierungsdaten von Objekten versorgen. Sie geben
die aktuellen Verhältnisse wieder. Es besteht daher eigentlich keine Notwendigket
sie aufzuzeichnen. Um allerding z.B. Demonstrationen, bei denen Bewegungen
vorher festgelegt werden sollen, realisieren zu können kann es notwendig sein
Trackingdaten zu speichern. Zu diesem Zweck wurde der PoseRecorder, welcher
in Kapitel A.2 eingeführt wird, implementiert.
Die zweite Art von Daten, mit denen wir zu tun haben, sind Konfigurationsdaten, welche vom CARmelion generiert werden. Eine einmal getestete Konfiguration zu speichern ist durchaus sinnvoll und soll im CARmelion möglich sein.
Das Speichermodell kann in diesem Falle durchaus einfach gehalten werden,
da es sich nicht um sehr komplexe Datenstrukturen und keine groen Datenmengen
handelt. Beispielsweise wäre die Speicherung in einer relationalen Datenbank aus
den vorgenannten Gründen bestenfalls ineffizient.
6 IMPLEMENTIERUNG
6
24
Implementierung
6.1
Funktionalität - Filter
In diesem Abschnitt soll nun näher auf die Implementierung der Filter als Teil der
kontinuierlichen Integration eingegangen werden. Insbesondere die Wahl der Programmmiersprache, die Schnittstellen des Filters nach außen, sowie der genaue
Aufbau der verschiedenen Klassen sollen hier ausführlicher erläutert werden.
6.1.1
Wahl der Programmiersprache:
Als Programmiersprache fr die Filter wurde C++ gewhlt. Dies hat verschiedene
Grnde:
Geschwindigkeit Da die Filter dafr entworfen wurden in Echtzeit relevante
Daten zu verarbeiten war Geschwindigkeit ein wesentliches Kriterium. Deshalb wurde die Möglichkeit ausgeschlossen die Filter in einer Scriptsprache
wie Python zu schreiben. C++ dagegen bietet hohe Geschwindigkeit sowie
alle Mglichkeiten einer modernen Hochsprache.
Vorhandenes Template Zu Begin unseres Projekt lag bereits ein sog. TemplateService14 vor, der die grundstzlichen DWARF Service Funktionen wie z.B.
das Anmelden des Services beim Servicemanager, bereitstellte. Dies machte
es einfach bei unserem geringen Wissenstand zu Beginn des Projekts schnell
einen lauffähigen Service zu schreiben.
Bekanntheit der Sprache Ein weiteres Kriterium war, dass fast alle Teilnehmer bereits Erfahrungen mit C++ gesammelt hatten und es somit nahelag
diese Sprache zu verwenden.
6.1.2
Schnittstellen nach außen
Ein Filter benötigt drei verschiedene Verbindungen nach außen. (Siehe auch Bild
6.1.2)
• Er empfängt Daten: Zu diesem Zweck besitzt er DWARF Needs.
• Er versendet Daten: Hierzu besitzt er DWARF Abilities.
• Er ist konfigurierbar: Zu diesem Zweck besitzt er DWARF Needs. Diese
sind jedoch in seiner Servicebeschreibung speziell als Konfigurationsneed
gekennzeichnet15 Diese Konfigurationsneeds können beispielsweise mit dem
14
geschrieben von Martin Wagner
Um beim ServiceManager ein Need als Konfigurationsneed zu kennzeichnen muss es in
der XML-Servicebeschreibung das Attribut ConfigurationNeed besitzen. Dies dient auch dazu, dass der Filter selbst erkennt, welche seiner Eingänge zu seiner Konfigurationsschnittstelle
zählen.
15
6 IMPLEMENTIERUNG
25
Konfigurationsprogramm CARmelion angesteuert werden. Dieses Vorgehen
wird in Bild 6.1.2 dargestellt.
Abbildung 16: Konfiguration eines Filter ber CARmelion
Ein Filter besitzt mindestens ein Need
und eine Ability. Er muss allerdings nicht
zwingend ein Konfigurationsneed besitzen. Wie andere DWARF Services auch
müssen Filter diese zunächst beim Servicemanager anmelden. Dies geschieht
normalerweiser automatisch durch die
XML Beschreibung des Filters, die dem
ServiceManager vorliegt, aber der Filter besitzt auch Funktionen um selbstständig
Abbildung 17: Die Schnittstellen des seine Beschreibung verändern zu können
und neue Needs und Abilities einzufügen.
Filters
Um Daten verschicken zu können bedient sich das DWARF Framework des Notification Services des CORBA-ORBs(siehe
hierzu [?]). Alle Daten werden als strukturiertes Ereignis verschickt. Um nun solche Ereignisse empfangen und senden zu können wird jedem Need ein Empfänger
(Receiver) -Objekt, und jedem Ability ein Sender Objekt, zugeordnet. Vergleiche
hierzu Bild 6.1.2
Filter können über diese Schnittstellen miteinander und mit anderen Services
zu einem Netzwerk verschaltet.6.1.2 zeigt zum Beispiel ein Netzwerk von Filtern,
visualisiert mit DIVE.
6 IMPLEMENTIERUNG
26
Abbildung 18: Ein Filternetzwerk in DIVE
6.1.3
Klassendesign:
Receiver Diese Klasse erweitert die SvcProtPushConsumer Klasse. Sie benötigt
einen Zeiger auf das instantiierende Objekt, um später die empfangenen Daten weiterreichen zu können. Außerdem wird jeweils das letzte empfangene
Event zwischengespeichert. Da jeder Receiver direkt einem Need zugeordnet ist wird auch gleich der Name (in m name ) sowie der Typ des Needs (
Normales Need oder Konfigurationsneed ) gespeichert. Eine entscheidende
Stelle des Receivers ist die Methode push structuredEvent. Diese Methode wird vom CORBA NotificationService aufgerufen, wobei das Event als
Parameter übergeben wird. Sie speichert das Event zusammen mit der Zeit
des Eintreffens im Receiver ab, und ruft dann die gotEventMethode des Filterobjekts auf. Dabei wird wieder ein Zeiger auf das Receiverobjekt (this)
übergeben, damit die Filterklasse später einfach auf das empfangene Event
zugreifen kann.
void Receiver::push_structured_event(const CosNotification::
StructuredEvent& event)
{
above->lockMutex();
if (lastEvent.sevnt!=NULL) {delete lastEvent.sevnt;}
6 IMPLEMENTIERUNG
27
Abbildung 19: Klassendiagramm eines Filters
lastEvent.name = m_name;
lastEvent.received = true;
lastEvent.sevnt = new CosNotification::StructuredEvent(event);
gettimeofday(&lastEvent.timeStamp, 0);
above->unlockMutex();
above->gotEvent(this);
// Aufruf der Filtermethode
zur Eventbehandlung
}
Sender Die Senderklasse erweitert die SvcProtPushSupplier Klasse. Beim
Senden von Events ist zu beachten, dass zuerst eine Verbindung zu einem
empfangenden Service (Consumer ) aufgebaut sein muss. Wenn dies der Fall
ist ruft der ServiceManager die Methode setConsumer des Senders auf. Nun
können mit der Methode sendoutEvent Events über den Notificationservice
verschickt werden.
CommonList Da ein Filter eine, sich möglicherweise zu Laufzeit ändernde, Anzahl vpn Needs und Abilities besitzen kann bietet es sich an, die zughörigen
Objekte in einer verketteten Liste zu speichern, um den Filter möglichst
flexibel zu halten. Eine solche Liste implementiert CommonList. Durch die
Verwendung der Templateklasse T wird erreicht, dass diese Liste für beliebige Objekte verwendet werden kann. Der Filter verwendet jeweils eine Liste
für Sender (sndList) , Empfänger (recList) und Konfiguration (cfgList
).
6 IMPLEMENTIERUNG
28
Filter Diese Klasse ist abgeleitet von TemplateService der von Martin Wagner geschrieben wurde. TemplateService stellt die wichtigen Funktionen eines einfachen DWARF Services bereit. Es wird das einfachste Interface
BasicService implementiert. BasicService implementiert wiederum das
DWARF Service-Interface sowie das DWARF SvcStartup-Interface. Dadurch ist eine DWARF Service Funktionalität bis auf die die Methoden
run(),createNeedObject() und createAbilityObject() bereits gegeben.
Diese mussten neu implementiert werden.
Filter besitzt nun folgende Methoden.
• createAbilityObject(), createNeedObject(),addAbility(),addNeed(),removeAbi
removeNeeds().
Beim Start eines Filters werden createAbilityObject bzw. createNeedObject
für jedes Need bzw. Ability, welches in der XML Beschreibung eingetragen ist, automatisch vom Servicemanager aufgerufen. Dadurch wird
jeweils ein neues Sender- oder Receiverobjekt erzeugt und an die jeweilige Liste gehängt. Zur Laufzeit können neue Needs bzw. Abilities
und ihre zugehörigen Objekte mit den Funktionen addAbility und
addNeed erzeugt werden. removeNeeds bzw removeAbilites entfernen alle Needs/Abilities und melden diese auch beim Servicemanager
ab.
Abbildung 20: Debugoutput des DistanceFilters nach dem Starten.
• gotEvent()
Diese Methode wird vom Receiver aufgerufen wenn er ein neues Event
empfangen hat. Bei diesem Aufruf wird ein Zeiger auf das Receiverobject mitgeliefert, welches das Event erhalten hat. So kann im folgenden
schneller darauf zugegriffen werden. Die gotEvent Methode liest nun
6 IMPLEMENTIERUNG
29
den Typ des zugeordneten Needs aus (Normal oder Konfiguration ).
Bei einem normalen Need ruft sie anschließend die Calculate Methode auf. Ansonsten, wenn es sich um Konfigurationsdaten handelt,
wird Configure aufgerufen. Bild 21 zeigt den Ablauf beim Empfang
eines Events als Aktivitätsdiagramm. gotEvent übergibt dabei nicht
das Event selbst, sondern leitet einfach den Zeiger weiter. Dies sorgt
für größere Geschwindigkeit.
Abbildung 21: Empfang und Versand von Filterdaten.
Die folgenden Methoden sind für jeden Filter jeweils neu zu implementieren:
• run()
Diese Methode wird ausgeführt und sollte eigentlich die Hauptschleife
eines Services enthalten. Da ein Filter aber nur auf Events von außen reagieren muss dient die run-Methode eigentlich nur dazu, den
Hauptthread des Programms solange zu blockieren bis der Filter beendet werden soll.
• Calculate()
Hier werden alle Berechnungen des Filters gemacht und dem Filter
somit seine Funktionalität verliehen. Da diese Methode in der Filterklasse virtuell ist, bzw. aus einer leeren Methode besteht, muss sie für
jeden neuen Filter auch neu implementiert werden. Daher ist die folgenden Beschreibung nur eine bei allen Filtern bis jetzt verwendete
Möglichkeit.
6 IMPLEMENTIERUNG
30
Calculate bekommt als Übergabewert einen Zeiger auf das Receiver - Objekt, das das letzte Event empfangen hat. Dies ermöglicht
eine schnelle Abfrage des Events, da direkt über diesen Zeiger und die
Methode getEvent darauf zugegriffen werden kann. Wenn der Filter
allerdings mehrere Eingänge besitzt und diese jeweils für die Berechnung benötigt werden, kann man auch die recList - Liste durchlaufen
und so für alle Empfänger die Werte abfragen, da Calculate immer
nur dann aufgerufen wird, wenn ein neues Event empfangen wurde.
Man könnte aber z.B. die Calculate Methode auch von run aus in regelmäßigem Zeitabständen aufrufen und so garantieren, dass der Filter
kontinuierlich Daten berechnet und verschickt. Im Rahmen des Projekts CAR war das aber nicht nötig.
Nach der Berechnung muss Calculate die Daten in strukturierte Events
verpacken und diese an die Sender weiterreichen. Dies könnte folgendermaßen aussehen:
Zusammenstellen des Headers des Events
sevnt.header.fixed\_header.event\_type.type\_name="TestTyp\";
sevnt.header.fixed\_header.event\_type.domain\_name = "Dwarf\";
std::string event\_name = \"Output\";
sevnt.header.fixed\_header.event\_name = CORBA::string\_dup(event\_name.c\_str());
sevnt.header.variable\_header.length(0);
"Ubergabe der Daten in den Eventbody
sevnt.remainder\_of\_body <<= data;
Verschicken des Events "uber Ability 0
SndList.getNode(0)->sendOutEvent(sevnt);
Zuerst werden Datentyp (z.B. PoseData ), Domänenname sowie der
Name der Ability in den festen Header des Events geschrieben und
noch die Länge des möglichen variablen Headers auf null gesetzt. Dann
wird die sendOutEvent Methode des ersten Abilityobjekts aufgerufen
und das Event verschickt. Dies kann jedoch nur so erfolgen, wenn sichergestellt ist ,dass das ausgewählte Abilityobjekt als erstes in der
Liste steht. Bei mehreren Abilities muss man eventuell die Liste durchgehen und über getName der Senderklasse den Namen überprüfen.
Auch eine festgelegte Reihenfolge der Abilitydefinitionen in der XML
Datei des Filters sagt nämlich noch nichts darüber aus in welcher Reihenfolge die Abilities beim Servicemanager angemeldet werden. Daher
bekommen Abilityobjekte auch nicht mit Sicherheit einen festen Platz
in der Senderliste.
• Configure()
Mit Hilfe von Configure kann die Funktion der Filter von außen
6 IMPLEMENTIERUNG
31
zur Laufzeit weitgehend angepasst werden. Diese Methode ist, genau
wie Calculate, virtuell und sollte in einem neuen Filter auch neu
implementiert werden. Sie wird immer dann von gotEvent aus aufgerufen, wenn ein Event zur Konfigurationsänderung des Filters ankommt. Wie auch bei Calculate bekommt Configure einen Zeiger auf
das Empfängerobjekt das das letzte Event empfangen hat. Configure
muss sich anschließend über diesen Zeiger das Event holen und auslesen. Die Daten des Events können nun z.B. dazu dienen Berechnungsfaktoren neu zu setzten. In Configure könnten aber auch neue Needs
oder Abilities abhängig vom jeweiligen Wert eines Konfigurationsneeds
erzeugt werden. Dies wird z.B. im Filter Parsephone benutzt.(Näheres
dazu im nächsten Abschnitt)
Hinweis: Da die grundsätzliche Struktur der Klasse Filter und damit der Filterservices allgemein erst im Laufe dieser Arbeit entwickelt wurde liegt bei älteren
Filtern zum Teil eine etwas andere Struktur vor. Insbesondere sind Benennungen
von Methoden und Variablen abweichend oder es gibt noch keine Configure Methode. Der grundsätzliche Aufbau ist aber jeweils ähnlich. Siehe hierzu auch
Kapitel 6.3 Evolution der Filter.
Implementierung Spezieller Filter (Parsephone /Interpolator) Da
wir nun die Implementierung der Klasse Filter behandelt haben werde ich kurz
auf den Aufbau einiger ausgewählter Filter eingehen. Besonders interessant als
konfigurierbare Filter sind hierbei Parsephone und Interpolator. Alle hier behandelten Filter sind abgeleitet von der Klasse Filter die oben besprochen wurde.
Interpolator:
Der Interpolatorfilter bildet die Eingangswerte gemäß einer durch diskrete
Werte gegebenen Funktion ab. Alle Zwischenwerte werden hierbei durch lineare Interpolation erzeugt. Dieser Filter verarbeitet Daten vom Typ InputDataAnalogUnlimited. Über das Need GraphValues kann man dem Filter
Daten vom Typ FilterConfig schicken. Dieser Datentyp besteht aus einem
Feld mit 100 Wertepaaren. Diese werden dann als Koordinaten der Stützstellen der Funktion betrachtet und müssen von der kleinsten x-Koordinate
an aufsteigend geordnet sein. In der Methode Configure werden diese
Werte ausgelesen. Zunächst wird der kleinste und größte x-Wert gespeichert. Nun wird einfach der durchschnittliche Abstand der Stützpunkte,
hier Schrittweite genannt, berechnet und davon ausgegangen, dass die Werte äquidistant waren. Wenn der eingegebene X-Wert kleiner als der Minimalwert oder größer als der Maximalwert der Stützwerte ist so gibt der
Filter den zugehörigen y-Wert des Minimal bzw Maximal X-Werts aus. Dazwischen wird nach folgenden Formeln interpoliert:
6 IMPLEMENTIERUNG
32
valuelow = f loor((Input − M inimumV alue)/Schrittweite)
(1)
out = y(valuelow ) + (Input/Schrittweite − valuelow ) ∗ (y(valuelow ) − y(valuelow + 1))
(2)
valuelow ist dabei der Index des Werts der als nächstes links neben dem
Eingabewert liegt. Die Funktion floor bedeutet Abrunden auf die nächste
ganze Zahl.
Abbildung 22: Interpolation zwischen den Stützwerten (Interpolator)
Parsephone:
Der Parsephonefilter bedient sich der Formelinterpreterklasse von Korbinian Schwinger. Diese Klasse wertet mathematische Formeln aus und gibt
dann deren Ergebnis zurück. Jedes Formelinterpreterobjekt kann dabei eine
Formel interpretieren. Standardmäßig wird nur ein Formelinterpreterobjekt
sowie ein zugehöriges Need FormulaInput0 erzeugt. An dieses schickt man
nun als String eine Formel. Der Formelinterpreter durchsucht diese dann
und ruft für jede Variable die er findet eine über einen Zeiger bereitgestellte Methode von Parsephone registerVars auf, um ein Need dafür zu
registrieren. Wenn alle Needs registriert sind wird der Zeiger neu auf die
Methode zum Auslesen der Empfangenen Variablenwerte getVarValues
gesetzt und der Filter ist fertig konfiguriert .
Es ist allerdings auch möglich gleich mehrere Parser in einem Parsephonefilter laufen zu lassen. Hierzu kann man über das Konfigurationsneed
NumberOfInterpreters einfach eine Zahl (≥1) einstellen und der Filter erzeugt automatisch neue Formelinterpreter und zugehörige Formeleingänge.
6 IMPLEMENTIERUNG
33
Abbildung 23: Klassendiagramm des Parsephonefilters
An diese können dann wieder Formeln geschickt und neue Variablenneeds
registriert werden.
Die folgende Tabelle liefert einen Überblick über alle Funktionen die im
Interpreter implementiert sind.
Null- und Einstellige Operatoren
Konstanten
alle reelen Zahlen
Variablen
alle Buchstabenkombinationen
ABS
Betrag
ACO
Arcuscosinus
ASI
Arcussinus
ATA
Arcustangens
COS
Cosinus
EXP
Exponentialfunktion ex
LGN
Logarithmus Naturalis
LOG
Logarithmus zur basis 10
NEG
Negation
SIN
Sinus
SQR
Wurzel
TAN
Tangens
Zweistellige Operatoren
ADD
Addition
SUB
Subtraktion
DIV
Division
MUL
Multiplikation
POW
xy
ROO
y-te Wurzel von x
Der Aufbau der Formeln in BNF-Notation:
Formel := Konstante | Variable | Einstelliger Operator ( Formel) | Zweistellig
6 IMPLEMENTIERUNG
Abbildung 24: Registrierung der Variablen einer Formel
Abbildung 25: Abfrage der Variablenwerte
34
6 IMPLEMENTIERUNG
35
Abbildung 26: Debugsausgaben Parsephone nach dem starten
Abbildung 27: Parsephone: Ansicht in
DIVE beim registrieren der Formel
ADD(x,y)
Abbildung 28: Parsephone: Ansicht in
DIVE nach dem registrieren der Formel
ADD(x,y)
Abbildung 29: Parsephone beim Addieren zweier Werte
6 IMPLEMENTIERUNG
36
Abbildung 30: DIVE-Bild eines von DIVE gestarteten CARmelion
6.2
Konfigurierbarkeit - CARMelion
Das CARmelion hat als primäre Aufgabe die im vorangegangenen Abschnitt
erläuterten Filterservices zu konfigurieren. Dieser Abschnitt geht genauer auf die
Implementierung des CARmelion ein. Im ersten Unterbaschnitt wird die Wahl
der Programmiersprache gerechtfärtigt. Der darauf folgende Unterabschnitt geht
näher auf das gewählte Klassendesign ein und spricht die wichtigsten Funktionen
kurz an.
6.2.1
Wahl der Programmiersprache
Zur Implementierung musste zunächst eine Entscheidung über die zur Verwundung kommende Programmiersprache getroffen werden. Mögliche Programmiersprachen, für die mit DWARF auch schon Services und Erfahrungen existieren
sind:
• C++: Die Objektorientierte Programmiersprache C++ kann sicher als
hoch performant eingeschätzt werden. Ihr primärer Verwendungszweck liegt
in statischen, echtzeitrelevanten Anwendungen. Der ORB16 für C++ ist,
16
Der Object Request Broker, kurz ORB, ist das zentrale Bindeglied eines CORBA-Systems.
Der ORB stellt Methoden zur Verfügung, mit welchen man sowohl auf lokale, wie auch auf im
CORBA-Netz verteilt Objekte zugreifen kann.
6 IMPLEMENTIERUNG
37
wegen der weiten Verbreitung von C++, einer der am besten beträuten.
• Java: Java ist, wie auch C++, objektorientiert. Mit den neu verfügbaren
Compilern ist ebenfalls das früher latent vorhandene Performanzproblem
beseitigt. Somit liegen seine vorwiegenden Einsatzgebiete, wie die von C++,
in statischen, echtzeitrelevanten Anwendungen.
• Python: Python ist eine Skriptsprache, in der objektorientierte Programmierung möglich, aber nicht zwingend notwendig, ist. Ein ORB ist vorhanden.
Die Implementierung des CARmelion erfolgte nach der Analyse aller zu Verfügung
stehenden Programmiersprachen in der Scriptsprache Python. Die Gründe für
diese Entscheidung sind wie folgt:
• Für den geforderte dynamischen Charakter des CARmelion ist es unbedingt
notwendig, Code dynamisch zu generieren und einzubinden. Dies ist ohne
Kompilierung nur bei Scriptsprachen möglich.
• Da das gesamte Projekt innerhalb und mit Hilfe des DWARF zu erstellen
ist muss in der Sprache der Wahl eine ausgereifte CORBA-Implementierung
vorhanden sein.
• Das CARmelion hat weder rechenintensive Aufgaben zu leisten, noch ist
die Konfiguration von Services, was ja seine Hauptaufgabe ist, Echtzeitrelevant. Somit ist Performanz der Programmiersprache ein untergeordnetes
Kriterium
6.2.2
Klassendesign
Im folgenden sollen die Klassen des CARmelion detailiert beschrieben werden. Die
Klassen des CARmelion sind:initcon, GUI, Manctxt, manctxtimpl, CARmelion,
EventSenderThread, EventSender, Configuration, graphenEditorUI und Painting.
Klasse initcon: initcon ist die initialisierende Klasse des CARmelion. Sie
übernimmt einen Großteil der Umsetzung des dynamischen Grundkonzeptes. Dazu erzeugt sie aus der vom service manager übergebenen service description
die notwendigen need und ability-Objekte. Ebenso wird hier eine CARmelion-,
sowie eine GUI-Instanz erzeugt, die von initcon Informationen über die vom CARmelion zu unterstützenden abilities erhält. Das generieren dieser Informationen bereitet unter Python wegen der unvollständigen CORBA-Implementierung
größeren Aufwand (Kapitel 7.2.2).
6 IMPLEMENTIERUNG
Abbildung 31: Einfaches CARmelion-GUI zur Bedienung von 3 abilities
38
6 IMPLEMENTIERUNG
39
Klasse GUI: Die GUI-Klasse implementiert die dynamische Generierung der
eigentlichen Oberfläche aus den bei der Initialisierung erhaltenen Daten, die auf
die jeweiligen, in der service description beschriebenen, Angaben beruht.
Die einzelnen Funktionen der Klasse generieren jeweils ein bestimmtes Element
des GUI, z.B. fügt addItem der zu generierenden Oberfläche ein neues Element
hinzu. Mit der Funktion Berechnen wird, nachdem alle zu generierenden Oberflächenelemente der GUI-Instanz übergeben wurden, die Position der einzelnen,
nun dynamisch angeordneten, Oberflächenelemente, berechnet. Mit der Funktion
makeguifile wird anschließend der eigentliche Qt-Python-Code erzeugt und in
der Datei newGUI.py gesichert.
Klasse Manctxt: Die Datei newGUI.py beinhaltet nun die Oberfläche des
Python-Programms, welche auf die mit der service description übergebenen
Anforderungen abgestimmt ist. Ebenso beinhaltet sie schon alle später notwendigen Oberflächenstandardfunktionalitäten und Verbindungen, um von mancontxtimpl
eingebunden zu werden.
Klasse manctxtimpl: mancontxtimpl wird von der Klasse Manctxt abgeleitet. Sie erweitert diese um die Funktionalitäten des Sendens von structured
events als kontinuierlicher und als diskreter Sender für jede ability des CARmelion und um das korrespondierende Oberflächenelemente. Auch die für das
Speichern und Laden von Konfigurationen notwendigen Funktionen, fileSave,
fileLoad und newFile sind hier implementiert. Sie greifen auf Funktionen der
Instanz von CARmelion zu.
Klasse CARmelion: Die von initcon erzeugte Instanz von CARmelion übernimmt die Hauptaufgaben des CARmelion zur Laufzeit. Beispielsweise implementiert sie die eigentliche Durchführung des Ladens und Speicherns von Konfigurationen, die von mancontxtimpl aufgerufen werden. Die Datensicherung erfolgt im
denkbar einfachen Format CSV17 im Verzeichnis des CARmelion. Dabei wird der
Name vom service manager in der service description übergebene Name
als Dateiname verwendet. Beim Zurückladen der Konfiguration wird, um Fehlern durch eventuelle veränderte service descriptions vorzubeugen, nur die in
Name und Art in der gespeicherten Datei und im laufenden CARmelion exakt
übereinstimmenden Werte geladen.
In CARmelion befinden sich des weiteren die Methoden addSender, welche ein
neues Senderobjekt instanziiert und im lokalen Datenfeld senderArray verwaltet.
Auch die Methoden zur Registrierung der needs und abilities sind hier zu finden. Dies sind Standardmethoden die in jedem Fall implementiert werden müssen.
17
CSV steht für Character Separated Value. CSV wird als Synonym für einfach Datenstrukturen bei der Speicherung verwendet, bei denen die einzelnen Werte durch ein vorher festgelegtes
Zeichen voneinander getrennt werden.
6 IMPLEMENTIERUNG
40
initcon
Configuration
parent
__init__
push_structured_event
*
EventSenderTread
service
i
*
delay
__init__
run
1
1
1
CARmelion
parent
SenderArray
StructArray
TypeArray
nEventData
data
event
cont
__init__
saveconfig
loadconfig
resetconfig
addSender
StartThread
stopallThread
startService
stopService
getStatus
getHeaderData
getStructData
makeSendEvent
1
theGUI
argc
myOrbConnec
tion
cmdLineProps
smgr
newstruct
NameStruct
StructList
abi
nee
sender
app
w
__init__
parseEvents
GUI
init
body
header
itemCounter
currentGroupX
currentGroupY
currentGroupWidth
maxHeightProSeite
Spaltenbreite
bisherigeGesHoehe
1 currentItemX
currentItemY
itemHoehe
itemLabel
row
elementPos
elementPostmp
__init__
addItem
Berechnen
makeGui
initend
makeguifile
*
EventSender
consumer
hasConsumer
parent
__init__
setConsumer
disconnect_structured_push_suplier
sendEvent
generisch
manctxtimpl
parent
__init__
continiousSender
eventSender
fileSave
fileOpen
fileNew
1
Manctxt
generisch
__init__
generisch
1
Painting
height
buffer
werte
__init__
1
initList
paintEvent
cleanIt
mouseMoveEvent
mousePressEvent
resizeEvent
Abbildung 32: Klassenhirarchie der CARmelion Implementierung
*
graphenEditorUI
outputList
gesLabel
painting
array
__init__
setSize
listToString
makeFormula
6 IMPLEMENTIERUNG
41
Abbildung 33: Konfigurieren eines Filters mit dem Grapheneditor
Zur Klasse der Standardmethoden zählt auch die Methode startservice, die von
anderen Services aufgerufen werden kann.
Die Methoden startThread und stopallThread die einen Senderthread instanziieren, starten und alle Senderthreads beenden können ist ebendfalls Bestandteil der Klasse codeCARmelion. Die eigentliche Steuerung, das ’start’ und
’stop’ wird über das Setzen von Flags gesteuert, die, je nachdem ob ein einzelnes Event oder ein kontinuierlicher Strom von Events gesendet werden oder das
Senden gestoppt werden soll gesetzt werden.
Die Hilfsmethoden getStructData und getHeaderData zur Übernahme der
in der grafischen Benutzeroberfläche eingestellten Werte sind hier zu finden.
Klasse EventSenderThread: Hier wird die Methode send event aus der Instanz der Klasse EventSender wiederholt gestartet solange die Flags entsprechend gesetzt sind. Die threadgestützte Implementierung dieser Funktion erlaubt
es, das CARmelion zu jedem Zeitpunkt bedienbar zu halten. Nur durch diese Art
der Implementierung ist die Bedienbarkeit der Oberfläche, welche das starten,
stoppen u.ä. für jedes mit einer ability korrelierende Bedienungsobjekt einzeln
möglich.
Klasse EventSender: Der EventSender ist die Implementierung des eigentlichen DWARF-spezifischen Output - Kommunikationsinterfaces. Hier sind die
vorgesehenen Standardmethoden zu finden.
6 IMPLEMENTIERUNG
42
Klasse Configuration: Mit der Klasse Configuration steht ein Input-Interface
zur Verfügung. In der Methode push structured event muss zu diesem Zwecke
lediglich noch entsprechende Funktionalität, beispielsweise zur Auswertung von
ankommenden Daten, eingefügt werden.
Klasse Painting: Um eine für den Benutzer intuitive Konfigurierbarkeit von
Filtern, dem Hauptzweck des CARmelion, zu garantieren, wurde die hier implementierte Oberfläche dem CARmelion hinzugefügt (Abbildung 33). Die Klasse
Painting ist für die Darstellung der Eingabe und deren Übersetzung in ein Datenfeld, welches die generierte Eingabe beschreibt, zuständig. Von ihr wird die
Klasse graphenEditorUI abgeleitet.
Klasse graphenEditorUI: Um die Benutzereingaben und die Umwandlung
der Daten, die in der Instanz der Klasse Painting generiert wurden kümmert
sich das graphenEditorUI. Hier werden aus den Rohdaten, durch Anpassen der
Grenzen an die Benutzereinstellungen, mit Hilfe der Methode makeFormula Konfigurationsdaten in der Form eines Datenfeldes erzeugt.
6 IMPLEMENTIERUNG
6.3
43
Evolution der Filter
Die Idee der Filterimplementierung war es, dass jeder einzelne Filter auf einem
gemeinsamen Modell, dem GenericFilter, basiert, welches die grundlegende Kommunikation zwischen den DWARF-Services regeln sollte. Die spezielleren Filter
sollten eigentlich nur noch eine einzige Methode der Basisklasse überschreiben,
was den Vorteil hat, dass eine Weiterentwicklung des GenericFilters nicht dazu
führen würde, dass alle Filter neu geschrieben werden mussten.
Die erste Idee zur Implementierung des GenericFilter war, ein eigenes Datenformat zu entwickeln, das eine beliebige Anzahl beliebiger Datentypen speichern
konnte und dann erst nach Empfang der Daten ausgewertet und für die im speziellen Filter zu überschreibende Methode aufbereiten werden sollte. Diese Idee
würde zwar zu einem sehr allgemeinen Filter führen, aber schnell wurde klar, dass
es keinen Sinn hatte, die Daten auf eine so abstrakte Weise zu speichern, wenn
es in den einzelnen speziellen Filtern dann sowieso klar war, welche Datentypen
empfangen bzw. auch gesendet werden mussten - außerdem wäre die Auswertung
der Daten sehr aufwendig geworden, was zu relativ langsamen Filtern geführt
hätte.
Da permanent neue spezielle Filter entwickelt werden sollten und auch der
GenericFilter währenddessen noch stark geändert wurde, mussten die Filter mit
der entsprechenden Version des GenericFilter zusammen gespeichert werden und
sind damit nicht repräsentativ für die Filter, die mit dem entgültigen GenericFilter entwickelt werden können.
Die erste Version des GenericFilters konnte nur mit PoseData umgehen, was
wiederum zu einer zu starken Einschränkung führte, aber für die ersten speziellen
Filter, die zu schreiben waren, völlig ausreichte.
Die zweite Version des GenericFilters arbeitete schon eher, wie sie sollte : alle
Needs wurden in eigenen Instanzen der Need-Klasse in einer Liste gespeichert. Um
die Bearbeitung der empfangenen Daten möglich zu machen, wurden auch eine
Kopie der empfangenen Datenpackete zwischengespeichert. Dies war nötig, da
der Datentyp der Eingangskanäle für die späteren Filter beliebig sein sollte, und
damit dem Filter zu diesem Zeitpunkt noch unbekannt sein konnte. Die eigentliche
Arbeit sollte in der zu überschreibenden Methode calculate() ausgeführt werden.
Der Programmierer sollte nur noch den Namen der Eingangskanäle überprüfen
und das dazugehörige Datenpacket entsprechend interpretieren.
Die weiteren Versionen des GenericFilters beinhalten kleinere Erweiterungen der zweiten. Anfangs wurde die Liste nicht durch eine ’mutual exclusion’
geschützt, was zu Speicherschutzverletzungen führte, dieser Fehler wurde in der
dritten Version behoben. Obwohl rein logisch in der dritten Version des GenericFilters keine Speicherschutzverletzungen mehr auftreten konnten, stürzte eine
Corba-Funktion in einem spezielllen Filter, dem MergeFilter mit eben dieser ab.
Dies lag an der Tatsache, dass ein wiederholtes entpacken eines StructuredEvents
dazu führte, dass ein interner Zeiger des Objekts auf einen falschen Speicherbe-
6 IMPLEMENTIERUNG
44
Abbildung 34: Endgültige Struktur des GenericFilters
reich wies - dies wurde behoben, indem dieser Fall einfach ausgeschlossen wurde.
Die letzte Änderung an dem Funktionsumfang des GenericFilters ergab sich
daraus, dass der Parsephone Filter seinen need zur Laufzeit ändern musste, der
GenericFilter musste also in der Lage sein, needs und abilities dynamisch hinzuzufügen bzw. auch wieder zu löschen.
Nachdem die Filter für ein Leistungsproblem verantwortlich gemacht wurden,
wurden noch mehrere kleinere Optimierungen zu Lasten der Einfachheit in der
Erstellung neuer Filter und zu Gunsten der Geschwindigkeit gemacht.
7 RÉSUMÉ
7
45
Résumé
7.1
Ergebnis
Als Ergebnis des Projektes CAR und damit auch des hier vorliegenden SEP’s lässt
sich eine Umgebung zur Entwicklung von einfachen AR-Szenarien vorstellen, die,
im Verhältnis zu ihrer einfachen Konfigurier- und Modifizierbarkeit sehr mächtig
ist. Beispiel für eine Anwendung dieser Umgebung ist das CAR-Szenario.
7.2
Probleme
Während der Entwicklung traten einige unerwartete Probleme auf. Unter anderem sind hier anzuführen:
• Probleme mit der Kalibrierung des ART-Tracking-Systems standen bei jedem Test auf der Tagesordnung. Ursache war jedoch meist nur der von den
Teilnehmern gescheute Zeitaufwand der neukalibrierung.
• Durch das Ausführen von zu vielen Services auf einem Rechner ging die
Echtzeitfähigkeit des Systems verloren
• Ein schwerwiegendes Problem war folgender bei größeren Filternetzwerken
sehr unangenehme Effekt: War ein Filternetzwerk aufgebaut und konfiguriert verschalteten die Services nach dem Neustarte eines einzelnen Filterservices häufig nicht mehr
7.2.1
Probleme speziell bei Filterservices
Bei der Integration stellte sich heraus, dass 2 der programmierten Filter falsche
Ergebnisse lieferten. Nach mehreren verschiedenen gescheiterten Ansätzen, diese
korrekt zu implementieren, stellte sich haraus, dass eine grundlegende mathematische Sammlung von Hilfsfunktionen der Quaternionenmathematik einen Fehler
aufwies. Nachdem niemand in der Lage war diesen Fehler während des Projekts
zu beheben, lief die Implementierung auf Ausprobieren und Raten heraus, und
kostete deswegen weit mehr Zeit, als dafür vorgesehen war.
7.2.2
Probleme speziell bei CARmelion
Während der Implementierungsphase des CARmelion erfuhren wir Schwierigkeiten im Zusammenhang mit der dynamischen Erzeugung von Code. Als Lösung
wurde der Weg über die Generierung einer, zur Laufzeit festen, Datei zur Beschreibung des GUI und seiner Funktionalität gewählt.
Ein weiteres Problem hatte die nicht voll funktionsfähige CORBA-Portierung
unter Python zur Ursache: Durch das Fehlen eines Interface-Repository entstand
7 RÉSUMÉ
46
erheblicher Mehraufwand. Alternativer Weg war es, die fertige Beschreibung einer bereits instanziierten Datenstruktur mit der dir() - Funktion18 des PythonInterpreters zu analysieren. Dadurch erhalten wir ein Datenfeld, welches in verschlüsselter Form die Datenstruktur beschreibt.
7.3
Future Work
Ein so weitläufig und flexibel angelegtes Projekt ist natürlich niemals wirklich
abgeschlossen. Es wird stets den Bedarf an neuen Anpassungen und Weiterentwicklungen geben. In diesem Kapitel nun sollen mögliche Ansatzpunkte für die
zukünftige Arbeit mit den Ergebnissen dieses Systementwicklungsprojektes gegeben werden.
• Im Bereich der Filterservices, die für möglichst einfache Implementierung
von neuen Services gestaltet wurden kann ein weiterer Schritt in Richtung
Benutserfreundlichkeit getan werden, indem man versucht einen ähnlichen
Weg der GUI-gestützten Codegenerierung zu beschreiten, wie sie in [?]
gewählt wurde.
• Natürlich wird es stets den Bedarf für neue Filterservices mit neuen Funktionen geben. Somit wird es stets notwendig sein neue Funktionalitäten in
die Filter zu integrieren.
• Das CARmelion könnte als Fortführung der bestehenden Implementierung
noch mit einer Auswertungsfunktion für empfangene Daten ausgestattet
werden.
• Stets sollte an der Steigerung der Performanz des generischen Filtermodells
gearbeitet werden.
• Die Funktionalität der Positionsdatenaufzeichnung könnte, in verallgemeinerter Form, als Zusatzfunktion in das CARmelion integriert werden.
18
Die Funktion dir() des Pythoninterpreters gibt die in einem Modul definierten Namen als
geordnete Liste von Strings zurück. Dazu zählen Module, Funktionen, Variablen u.s.w..
A SPINOF - ENTWICKLUNGEN
47
Abbildung 35: Prinzip räumlicher Klangdarstellung mit 2 Lautsprechern
A
A.1
Spinof - Entwicklungen
3D Audio
Um im Simulator Klänge in 3 Dimensionen wiedergeben zu können wurde der
3DAudioService entwickelt. Der angedachte Einsatzzweck für diesen war eine
Wiedergabe von Warnsignalen im Simulator, wenn das Fahrzeug sich in der Situation des Einparkens einem Hindernis zu stark annähert. Hierbei war wichtig, dass
für die Testpersonen erkennbar ist, dass der Ton aus der Richtung des Hindernisses zu kommen scheint, und mit sinkender Entfernung lauter wird. Ursprünglich
sollte diese Aufgabe von dem bereits vorhandenen Viewer erledigt werden, der
auf Coin3D basiert, welches diese Funktionalität bereits bietet. Allerdings erwies
sich die Implementierung unter Linux als nicht funktionsfähig, darauf weisen aber
auch die Entwickler hin, die sie, zumindest unter Linux, noch als sehr experimentell bezeichnen. Deswegen war eigentlich nicht zu erwarten, daß sie problemlos
laufen würde.
Um eine Klangquelle im 3 dimensionalen Raum zu platzieren, gibt es verschiedene Ansätze. Einer der prinzipiell einfachsten ist es, den Hörer von allen
Seiten mit Lautsprechern einzuschließen, und die Position des Tons dadurch zu
beeinflussen, dass die jeweils zur Klangquelle nächsten Lautsprecher - je nach Entfernung zur Klangquelle - den Ton mehr oder weniger laut abspielen. Dieses Verfahren kann durch verschiedene Techniken noch weiter verbessert werden, so dass
A SPINOF - ENTWICKLUNGEN
48
Abbildung 36: Prinzip räumlicher Klangdarstellung mit 4 Lautsprechern (quadrophonisch)
ein noch akkuraterer Klangeindruck entsteht. Aus Mangel an dazu fähigen Treibern unter Linux, blieb es bei erstgenannten Modell. Im Prinzip ist es technisch
möglich, auch nur mit 2 Audiokanälen einen 3 dimensionalen Klang zu erzeugen,
was an der Tatsache liegt, dass der Mensch nur 2 Ohren besitzt, was bereits die
Firma Aureal, die für die Nasa Audiochips für Shuttlesimulatoren herstellte, ausnutzte, allerdings ist dazu ein entsprechender Treibermodus notwendig, der unter
Linux nicht vorhanden war. Bei dieser Technik ist es notwendig, zu wissen, wo
sich der Hörer relativ zu den Lautsprechern befindet, damit die beiden Kanäle
entsprechend beeinflusst werden können. Da der dreidimensionale Höreindruck
aber nicht angeboren, sondern erst erlernt wird, stellt er eine extrem individuelle
Sache dar. Es ist z.B. möglich, dass eine Person bei diesem Ansatz den Klang
tatsächlich sehr gut im Raum erkennen kann, wobei einer zweiten Testperson
jegliche räumliche Tiefe bei ihrem Klangeindruck fehlt. Dies ist auch der Grund,
warum sich die einfache Methode mehrerer Lautsprecher durchgesetzt hat, da
hierbei der Raumklang sehr viel näher an der tatsächlichen Situation simuliert
werden kann.
Für den 3DAudioService wurde die API OpenAL verwendet, die entwickelt
wurde, um eine platformunabhängige Unterstützung von Soundkarten zu bieten, was auch den Namen erklärt, der nicht ohne Grund an OpenGL erinnert.
Im Gegensatz zu anderen APIs wie DirectSound, Aureal3D und der WaveOut-
A SPINOF - ENTWICKLUNGEN
49
API unter Windows oder auch ALSA oder das OSS unter Linux handelt es sich
nicht um eine Schnittstelle, die tatsächlich direkt auf die vorhandene Hardware
zugreift, sondern um ein Programm, das auf die bereits im System vorhandenen
Schnittstellen benutzt. Dies hat den Vorteil, dass viele Eigenheiten der APIs nicht
durch die Vereinheitlichung verloren gehen, da man im Grunde auch nach dem
Prinzip des kleinsten gemeinsamen Nenners hätte vorgehen können. Programme
dieser Funktionalität werden im allgemeinen auch als Wrapper bezeichner, da sie
tatsächlich nur eine einheitliche Kommunikationsebene zu den im System vorhandenen Schnittstellen bieten und Funktionsaufrufe nur umleiten. Dies hat den
kleinen Nachteil, dass durch dieses Umleiten Systemleistung verloren geht, die
man als quasi ungenutzt bezeichnen kann, da nur dem Programmierer und nicht
dem Endanwender Vorteile entstehen.
Bei dem Test des 3DAudioService unter Linux stellte sich heraus, dass der
Treiber der im Versuchsaufbau verwendeten 3D Soundkarte entgegen der Freigabe von SuSe und auch dem Controlpanel des Treibers noch keine Wiedergabe
von Klängen über mehr als 2 Kanäle beherrschte. Zwar wurden alle 4 Kanäle
angesprochen, wobei allerdings das hintere Boxenpaar das Signal der vorderen
Lautsprecher abspielte. Das Resultat war, dass es logischerweise sehr einfach entschieden werden konnte, ob sich ein Ton links oder rechts vom Hörer befindet,
allerdings nicht, ob er sich hinten oder vorne befand.
A.1.1
Future Work
Sobald der neue Treiber für die 3DSoundkarte entwickelt wurde, der auch quadrophonische Audioausgabe beherrscht, ist auch der 3DAudiosevice voll funktionsfähig. Wenn sich dieses Problem nicht sowieso mit einer neueren Version von
SuSe Linux erledigt, muss der Treiber für den CMI8738 Chipsatz installiert werden. Hierbei ist zu beachten, dass bereits der jetzige Treiber von SuSe als voll
funktionsfähig deklariert ist. Dieses Trugbild wird noch durch eine entsprechende
Option im Control-Panel unterstrichen, diese ließ sich aber nicht aktivieren.
A.2
PoseRecorder
Der PoseRecorder wurde als SpinnOff für allgemeine Anwendungen in CAR
und DWARF entwickelt. Er ist Rekorder und zugleich Sender, steuerbar über
eine einfache Tk-GUI. Er hat einen PoseData-Eingang der über DIVE mit der
aufzunehmenden Komponente verschaltet werden muss. Aufgenommen werden
kann immer nur ein Datenfluß je Rekorder. Ist die Aufnahme über den StartRecord Button begonnen, so wird jedes Event in CSV Form in eine temporäre
Datei geschrieben. Wird die Aufnahme beendet muss noch ein Speicherort für
die endgültige Datei angegeben werden, welche einen beliebigen Namen tragen
kann.
A SPINOF - ENTWICKLUNGEN
50
Aufgrund der einfachen Struktur der Aufgezeichneten Daten ist eine beliebige
Auswertung auf Basis dieser Daten sehr einfach und wurde auch im Laufe des
Projektes CAR bereits durchgeführt.
Um eine Aufnahme abzuspielen muss zuerst eine entsprechende Datei ausgewählt und geöffnet werden. Beginnt man mit dem Playback wird ein Playerthread
gestartet, welcher die Datei im rekursiven Loop abspielt. Zwar ist bekannt, dass
einmal ein mögliches Threadproblem aufgetreten ist, jedoch konnte dies nicht reproduziert werden und ist wahrscheinlich nicht auf diese Implementation zurückzuführen. Das Playback kann jederzeit beendet werden.
Ein weiterer Vorteil der einfachen Datenstruktur ist es, dass auch die Positionsdateien einfach maschinell erzeugt werden können. Dies ist ein großer Vorteil
für Viewer- oder sonstige Benchmarktests, da die Daten so mit gleichmäßiger
Frequenz und Änderung gesendet werden können.
Auch zur Erzeugung schöner Datensimulationen als Brücke zur VR oder bei
der Sendung vorher festgelegter Daten zu Forführzwecken ist dieser Service wegen
seiner einfachen Verwendbarkeit die Methode der Wahl.
Die Struktur des PoseRecorders laesst sich wie folgt darstellen:
A SPINOF - ENTWICKLUNGEN
Pose2Pose
need
ability
nPose
aPose
Bar
__init__
IncrememtProgress
playfile
testopen
startService
stopService
getStatus
handleEvent
startrecord
stoprecord
saveAs
51
Pose2PoseObject
parent
1
counte
__init__
push_structured_event
1
Pose2PosePose
count
fh
usrEventtype
parent
consumer
hasconsumer
playthread
__init__
setopenfilename
setConsumer
disconnect_structured_push_supplier
playfile
sendEvent
1
ProgressBar
Height
Width
BarCanvas
__init__
SetProgressPercent
DrawProgress
GetProgressPercent
1
PlayerThread
service
consumer
Threadrun
__init__
run
process
Abbildung 37: Klassenhierarchie der PoseRecorder-Imlementierung
A SPINOF - ENTWICKLUNGEN
A.3
52
TUI
Während des Implementierungsprozesses wurde uns
klar, dass Tangible User Interfaces nicht nur sehr wünschenswert für eine Entwicklung im
Bereich der augmentierten Realität sind, sondern mit den
von uns realisierten Applikationen auch ohne weiteres generiert werden kann. Als kleine Demonstration banden wir
in die CAR-Applikation ein
tangibles Objekt zur Steuerung einer Übersichtsichtskarte ein.
Durch die Mächtigkeit der Abbildung 38: Beispiel einer TUI-Anwendung
Funktionalität und Konfigurierbarkeit des Projektes ist es jedoch möglich auch wesentlich kompliziertere
Zusammenhänge zwischen tangiblen Objekten und Reaktion der AR-Umgebung
herzustellen.
B VERWENDETE/NOTWENDIGE HARDWARE
B
53
Verwendete/Notwendige Hardware
Um die ganze Mächtigkeit des vorgestellten Projektes erkennen zu können ist es
leider notwendig einiges an, teilweise sehr teuerer, Hardware einzusetzen. Diese
Hardware soll hier in aller Kürze vorgestellt werden.
• 2 Laptops: Die Laptops werden nicht direkt für in diesem Projekt eingeführten Applikationen benötigt. Sie sind für das automatische Labeling
(in seiner Implementation für DWARF, welche in [?] eingeführt wird) und
das Central Information Display und seine Ansteuerung mit dem Attentiv
User Interface, welches von Vinko Novak in [?] eingeführt wurde, nötig.
• 2 Beamer: Die Beamer werden für die ’basic Visualisation’, die grundlegenden Visualisierungen, benötigt. Diese wird genauer im Kapitel ’Laboraufbau’ beschrieben.
• 4 PCs (x86): Die Rechner werden für verschiedene DWARF-Services benutzt
• 1 Apple Macintosh dualG4 mit 3D Grafikkarte: Er wird zur Ansteuerung
eines der Beamer benötigt(Abbildung 39).
• 3 ART-Kameras: Das Trackingsystem ist von Wichtigkeit für jedes Detail
der CAR-Applikation. Es versorgt uns mit Positions- und Orientierungsdaten(Abbildung 40).
• 1 Apple Cinema-Display: Das Cinema-Display wird zur Simulation des
HUD(Siehe Kapitel Laboraufbau) benötigt(Abbildung 41).
• 3D Soundkarte Terratec Aureon Fun 5.1: Sie ist Ausstattungsteil eines der
x86-PC’s und für den 3D-Audio-Service von Nöten(Abbildung 42).
• 1 Dolby 5.1 System Terratec Home Arena 5.1: Das Lautsprechersystem ist
ebenfalls für die Anwendung des 3D-Audio-Services nötig(Abbildung 43).
B VERWENDETE/NOTWENDIGE HARDWARE
Abbildung 39: Apple Macintosh G4 dual
Abbildung 40: ART Kamera
54
B VERWENDETE/NOTWENDIGE HARDWARE
Abbildung 41: Apple Cinema-Display
Abbildung 42: 3D Soundkarte Terratec Aureon Fun 5.1
55
B VERWENDETE/NOTWENDIGE HARDWARE
56
Abbildung 43: Dolby 5.1 System Terratec Home Arena 5.1
B.1
Laboraufbau
Der Laboraufbau für das Projekt CAR ist, wie zu Anfang dieses Dokumentes
kurz beschrieben, zweigeteilt. Zum einen wäre da die Simulation der Fahrzeugumgebung zu nennen, welche in Abbildung 45 betrachtet werden kann.
Sie wird erstellt durch die
Projektion eines 3D-Modells
der Umgebung auf einen Tisch.
Auf dem Tisch wird ein Automodell als tangibles Eingabeinstrument zur Generierung von Situationen, auf die
die Simulation des Fahrzeuginneren reagieren soll, benutzt.
Das Innere des Fahrzeuges wird minimalistisch dargestellt. Nämlich ausschließlich durch die Erweiterungen,
Abbildung 44: Die ’Basic Visualisation’
die im Fahrzeug durch Augmentierungen unter anderem im HUD19 , hervorgerufen werden. Diese Beschränkung
19
Ein Head Up Display oder HUD ist eine halbdurchlässig spiegelnde Oberfläche, auf die
Informationen projeziert werden können. Die projezierten Informationen werden als Effekt der
gespiegelten Fokussierung des zur Projektion verwendeten Gerätes nicht in der Ebene der halb-
B VERWENDETE/NOTWENDIGE HARDWARE
57
erlegten wir uns auf, da die Zielsetzung für die Applikation CAR nicht eine exakte
Simulation eines Fahrzeuges, sondern nur eine Simulation der mit Augmentierungen erweiterbaren Anzeigeelemente ist.
In der nebenstehenden Abbildung ist die Umgebung für
das tangible Objekt, welches
das Auto symbolisiert zu erkennen. Des weiteren ist zu
sehen das, durch ein Apple
Studio-Display dargestellte,
HUD und die, durch eine Projektion an die Wand dargestellte, Umgebung des Autos.
Das Zusammenspiel der
Komponenten, also des tangiblen Interfaces und der verAbbildung 45: Das tangible Auto-Objekt
schiedenen Visualisierungskomponenten wird erst ermöglicht durch den Einsatz von Trackingtechnologien. In
unserem Fall gehört ein Trackingsystem der Firma ART zu unserem Laboraufbau,
welches im vorangegangenen Kapitel genauer beschrieben wurde.
durchlässig spiegelnden Oberfläche wahrgenommen, sondern dahinter.
LITERATUR
58
Literatur
[1] R. Azuma. A survey of augmented reality, 1995.
[2] Martin Bauer, Bernd Bruegge, Gudrun Klinker, Asa MacWilliams, Thomas
Reicher, Stefan Riss, Christian Sandor, and Martin Wagner. Design of a
componentbased augmented reality framework. In Proceedings of The Second IEEE and ACM International Symposium onAugmented Reality (ISAR
2001), 2001.
[3] Allen Bierbaum. Vr juggler: A virtual platform for virtual reality application
development. Master’s thesis, Iowa State University, 2000.
[4] Bernd Bruegge and Allen H. Dutoit. Object-Oriented Software Engineering
Using UML, Patterns, and Java. Prentice Hall, Englewood Cliffs, NJ, second
edition, September 2003.
[5] Gerhard Reitmayr Dieter. A platform for location based augmented reality
applications, 2002.
[6] Markus Geipel. Run-time development and configuration of dynamic service
networks, 2004.
[7] Otmar Hilliges. A control component for adaptive augmented reality user
interfaces, 2004.
[8] Poupyrev I. and Billinghurst. Go-go interaction technique: Non-linear mapping for direct manipulation in vr. In Proceedings of UIST’96, pages 79–80,
1996.
[9] Christian Kulas. Usability engineering for ubiquitous computing, 2003.
[10] Steven Dow Maribeth Gandy and Blair MacIntyre. Prototyping applications
with tangible user interfaces in dart,the designer’s augmented reality toolkit.,
2004.
[11] Friedemann Mattern. www.smart-environment.de, März 2004.
[12] Vinko Novak. Attentive user interfaces for dwarf, 2004.
[13] Alex Olwal. Unita modular framework for interaction technique design, development and implementation. Master’s thesis, Royal Institute of Technology
(KTH), Stockholm, Sweden, Mai 2002.
[14] Gerhard Reitmayr and Dieter Schmalstieg. Opentracker-an open software
architecture for reconfigurable tracking based on XML. In VR, pages 285–
286, 2001.
LITERATUR
59
[15] Lothar Richter. Design and practical giudeline to a corba-based communication framework, Aug 2002.
[16] Fabian Sturm. Issues in view management for 3d objects on multiple displays, 2004.
[17] Brygg Ullmer and Hiroshi Ishii. The metadesk: Models and prototypes for
tangible user interfaces. In ACM Symposium on User Interface Software and
Technology, pages 223–232, 1997.
[18] unbekannter Author. CORBA, from wikipedia, the free encyclopedia, März
2004.
[19] unbekannter Author. Echtzeit, from wikipedia, the free encyclopedia, März
2004.
[20] unbekannter Author. GUI, from wikipedia, the free encyclopedia, März 2004.
[21] unbekannter Author. Opensource, from wikipedia, the free encyclopedia,
März 2004.
[22] unbekannter Author. Rapid Prototyping, from wikipedia, the free encyclopedia, März 2004.
[23] unbekannter Author. Virtuelle Realität, from wikipedia, the free encyclopedia, März 2004.