• Keine Ergebnisse gefunden

Architektur Architektur der BibliothekArchitektur der Bibliothek

4 Prototypische Modellimplementierung an einem konkreten Beispiel

4.1 Vorstellung von Segway Robotics Loomo

4.2.1 Architektur Architektur der BibliothekArchitektur der Bibliothek

Um eine Implementierung für zukünftige Nutzer des Modells möglichst einfach zu machen wur-de eine Android Bibliothek erstellt. Diese Bibliothek besteht aus einem bodyParts-, sowie einem helper-Package. Im helper-Package befinden sich die Klassen Util, AppConstants und JsonCon-verter. Util ist eine Klasse in der generelle Helfer-Methoden zu finden sind, wie zum Beispiel, um einen spezifischen Eintrag aus einem JSON-Array zu entfernen. Die Klasse AppConstants ent-hält die Konstanten für die Bewegungsgeschwindigkeiten, sowie die Dauer zwischen den ein-zelnen Bewegungen. Die Aufgabe des JsonConverters besteht darin, die JSON-Datei des Modells zu parsen und den einzelnen Körperteilen Bewegungen, Einschränkungen, etc. zuzuweisen.

Im bodyParts-Package sind die abstrakten Klassen der einzelnen Körperteile vorhanden. Die-se erben alle von der KlasDie-se BodyPart, die für die Initialisierung der Bewegungsverarbeitung und die Verwendung des Modells zuständig ist. Die Körperteile besitzen jeweils eine abstrakte Me-thode für jede Bewegung, die von diesem Körperteil ausgeführt werden kann. Außerdem ent-halten sie Methoden zur Überprüfung, ob verpflichtende Bewegungen von diesem Körperteil ausgeführt werden können und eine switch-case-Verzweigung in der die Befehle des Modells den abstrakten Methoden zugewiesen werden.

Durch die Vererbung der Logik, zur Initialisierung und Überprüfung, die für jeden Körperteil gleich ist, kann die Darstellungslogik leicht an neue Anforderungen angepasst werden, ohne dass die einzelnen Körperteile davon betroffen sind. Die Abstraktion der Körperteile zwingt

4.2 Implementierung

Abbildung 4.3– Vereinfachtes Klassendiagramm der Beziehungen zwischen App und Bibliothek

den Nutzer der Bibliothek dazu, jede mögliche Bewegung des Roboters zu implementieren. Er kann bei der Implementierung der konkreten Klassen aber auf spezielle Fähigkeiten oder Ein-schränkungen seines Roboters Rücksicht nehmen.

Sollte eine Bewegung nicht möglich sein muss diese Methode mit leerem Körper implemen-tiert werden. Außerdem müssen die beiden MethodenexecuteFunctionForName(String name) undcheckIfMandatoryMovementsPossible(String name, boolean checkForFallback) überschrie-ben und die entsprechende Bewegung aus den beiden Methoden entfernt werden. Zusätzlich dazu befindet sich in der Bibliothek noch die Klasse EmotionExecutor, die für die Ausführung der Bewegungen verantwortlich ist.

Verwendung der Bibliothek

Um den Abstrakten Methoden wirkliche Bewegungen zuzuweisen muss, wie Abbildung 4.3 zeigt, in der vom Verwender der Bibliothek erstellten App für jeden Körperteil, den er verwen-den möchte eine Klasse erstellt werverwen-den, die verwen-den jeweiligen Körperteil der Bibliothek erweitert.

In dieser Klasse müssen schließlich alle Methoden des vererbenden Körperteils implementiert und mit genauen Bewegungsbefehlen befüllt werden.

Zur Verwendung der Bibliothek müssen zunächst, in deronCreate()-Methode, Views für die Augen, Augenbrauen und den Mund angegeben werden, falls diese Körperteile verwendet wer-den sollen. Anschließend initialisiert man wer-den JSON-Converter und bindet die Services, die zur Bewegung benötigt werden, wie in 4.1 beschrieben, an die Wheels-, sowie Head-Klasse.

1 head = new MyHead(getBaseContext(), jsonConverter);

2 head.bindHeadService();

Quellcode 4.1– Initialisierung des Kopfes

Es ist wichtig diesen Code in deronCreate()-Methode auszuführen um die Initialisierung nur einmal durchzuführen.

Die nächsten Schritte geschehen alle inonResume()um eine wiederholte Ausführung jedes Mal, wenn die App in den Vordergrund wechselt, zu ermöglichen. Um mit dem Modell arbeiten zu können muss zunächst die JSON-Datei des Modells geladen werden:

1 jsonConverter.getJsonFromFile(emotionName, emotionName);

Quellcode 4.2– Laden des JSON-Objekts aus der Datei Diese JSON-Datei muss sich im raw-Ordner der Android App befinden.

Anschließend werden die restlichen Körperteile, sowie die Klasse MandatoryCheck initiali-siert:

1 eyebrows = new MyEyebrow(leftEyebrowView, rightEyebrowView, getBaseContext(), jsonConverter, mandatoryCheck);

2 try {

3 eyebrows.setConcreteBodyPart(jsonConverter.initializeEyebrow());

4 eyebrowsPresent = true;

5 } catch (jsonException e) {

6 eyebrowsPresent = false;

7 e.printStackTrace();

8 }

Quellcode 4.3– Beispielinitialisierung eines Körperteils

Nach der Initialisierung werden in einer Schleife, die Körperteile initialisiert und die Bewe-gungen ausgeführt, wenn die Überprüfung auf verpflichtende Attribute nicht fehlgeschlagen

ist.

1 handler.postDelayed(new Runnable() {

2 public void run() {

3 // resets the execution as failed because it will be retested for in the next steps

9 // reverse emotions only if mandatory check succeeded because otherwise no emotion was executed

10 if (!mandatoryCheck.isMandatoryFailed() && mandatoryCheck.

getFallbackMovements().size() == 0) {

11 emotionExecutor.reverseMovements();

12

13 // redo the whole loop to execute the emotion again after the timer ended

14 // timer is set to twice the delay + twice the

movementSpeed to have exactly the same time the movement takes between two movements

4.2 Implementierung

15 handler.postDelayed(this, movement.

getDelayBetweenMovements() * 2 + movement.getMovementSpeed() * 2);

16 }

17 }

18 }

19 }, 0);

Quellcode 4.4– Befehl zum Start der Emotionsdarstellung

Verwendung ohne Android

Durch die Entkopplung der Logik des Algorithmus von der Benutzeroberfläche wäre es oh-ne große Probleme möglich die Android-Bibliothek in eioh-nen anderen Java-Code einzubinden.

Dazu müsste die Bibliothek als Standard Java-Bibliothek exportiert werden. Da die Initialisie-rung des Kopfes und der Räder nur für den speziellen Fall von Loomo stattfinden muss, kann dieser Schritt für jeden anderen Roboter übersprungen werden. Die Erstellung der Views in deronCreate()-Methode muss in einer Standard Java Anwendung beim Start der Anwendung vor der Initialisierung der Körperteile und des JsonConverters erfolgen. Um den JsonConverter außerhalb eines Android Projekts zu verwenden muss die MethodegetJsonFromFile() über-schrieben werden, da diese speziell an die Dateistruktur in Android Anwendungen angepasst ist. Die anschließende Initialisierung der Körperteile und das Starten des Algorithmus kann aus der Anleitung für die Android Anwendung übernommen werden.