• Keine Ergebnisse gefunden

Algorithmus zur Umwandlung der Modelle in dargestellte Emotionen

4 Prototypische Modellimplementierung an einem konkreten Beispiel

4.1 Vorstellung von Segway Robotics Loomo

4.2.2 Algorithmus zur Umwandlung der Modelle in dargestellte Emotionen

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.

4.2.2 Algorithmus zur Umwandlung der Modelle in dargestellte Emotionen

Um zu verstehen, wie genau die Bibliothek funktioniert und wie aus den Modellen eine darge-stellte Emotion wird soll in diesem Abschnitt der Algorithmus zur Emotionsdarstellung genauer erklärt werden. Das Ziel ist es die JSON-Modelle einzulesen und anschließend für jeden verfüg-baren Körperteil die in dem Modell spezifizierten Bewegungen auszuführen, bzw. zu melden, dass eine Emotion nicht darstellbar ist, wenn ein verpflichtendes Körperteil fehlt, oder eine Bewegung nicht ausführbar ist.

Wie Abbildung 4.4 zeigt, besteht der Algorithmus im Wesentlichen aus vier Teilen. Im ersten Teil wird das Modell aus der JSON-Datei geladen. Anschließend wird überprüft welche Körper-teile im Modell vorhanden sind, also für welche KörperKörper-teile Bewegungen ausgeführt werden müssen. Dazu wird überprüft, ob der Roboter diesen Körperteil besitzt und dieses gegebenen-falls initialisiert. Sollte der Roboter das Körperteil nicht besitzen, dieses aber für die Darstellung zwingend notwendig sein, wird die Emotion nicht dargestellt.

Sind alle erforderlichen Körperteile vorhanden wird für jeden Körperteil überprüft, ob diese verpflichtende Bewegungen ausführen müssen, oder Ersatzbewegungen für andere Körperteile ausführen sollen. Falls sie eine dieser Bewegungen nicht ausführen können und ein Ersatz dafür existiert wird mit der nächsten Bewegung, bzw. dem nächsten Körperteil weitergemacht. Sollte kein Ersatz existieren wird die Emotion als nicht ausführbar gesetzt.

Wurden alle Körperteile auf ihre verpflichtenden Emotionen überprüft, werden alle Ersatz-Bewegungen überprüft und wenn sie ausgeführt werden können aus der Liste der Ersatzbewe-gungen gelöscht und als verpflichtend für den neuen Körperteil gesetzt. Sollte eine der Ersatz-bewegungen nicht ausführbar sein wird die Emotionsdarstellung abgebrochen.

Treffen alle oben genannten Abbruchbedingungen nicht zu wird damit begonnen die Emotion darzustellen. Ein etwas detaillierterer Ablauf dazu kann in 4.5 gefunden werden. Die Emotions-darstellung beginnt in der MethodeexecuteMovements()zuerst damit die verpflichtenden

Be-var emotionObject = readJsonFile();

for each körperteil in emotionObject

displayEmotion();

checkIfRobotHasBodyPart();

initializeBodyPart();

if(mandatoryAttributesExist())

if(!checkIfMandatoryMovementsPosible()) if(!checkIfFallbackPossible())

setEmotionNotDisplayable();

else

addToPoosibleFallbacks();

Abbildung 4.4– Graphische Darstellung des Algorithmus zur Emotionsumwandlung

wegungen auszuführen, wenn oben genannte Bedingungen erfüllt sind. Anschließend wird jede ausgeführte Bewegung zur Liste der ausgeführten Bewegungen hinzugefügt. Dies ist notwen-dig, dass nach der Bewegung alle Körperteile wieder in ihren Ausgangszustand gebracht werden können. Außerdem wird die Bewegung aus der Liste der möglichen Bewegungen entfernt, da-mit diese nicht doppelt ausgeführt wird. Dabei wird außerdem bei jeder Bewegung überprüft ob diese an eine Bedingung geknüpft ist. Bei eineror-Bedingung werden alle anderen Bewegun-gen, die in dieser Bedingung enthalten sind aus der Liste der möglichen Bewegungen entfernt.

Beiandwird die verknüpfte Bedingung ausgeführt. Sollte diese Bewegung nicht ausführbar sein wird die Emotion als nicht ausführbar gesetzt und die Bewegung abgebrochen.

Nach der Ausführung aller verpflichtenden Bewegungen wird außerdem in Abbildung 4.5 in Zeile 56 überprüft, wie viele Bewegungen dieser Körperteil ausführen soll. Ist die Zahl der aus-geführten Bewegungen kleiner als die Mindest-, oder Maximalzahl werden so lange zufällige Bewegungen ausgeführt, bis die maximale Anzahl an Bewegungen erreicht ist. Dadurch ist es möglich für eine Emotion unterschiedliche Bewegungsmuster zu generieren.

Wurden alle Bewegungen erfolgreich ausgeführt wird je nach Bewegungshäufigkeit der Emo-tion ein Countdown gesetzt, nachdem die Bewegungen, wiereverseMovements() zeigt, die in der Liste der ausgeführten Bewegungen sind zurückgesetzt werden. Nach einem erneuten Count-down wird dieser Algorithmus erneut durchlaufen um die Emotion erneut darzustellen.

Quellcode 4.5 zeigt diesen Algorithmus in vereinfachter Form.

4.2 Implementierung

1 var emotionObject = readjsonFile();

2 for each(Körperteil in emotionObject){

3 checkIfRobotHasBodyPart();

4

5 // sets all variables neccesseary eg:

6 // constraints, mandatoryMovements, movementSpeed, delayBetweenMovements

7 initializeBodyPart();

8

9 if(mandatoryAttributesExist()){

10 if(!checkIfMandatoryMovementsPossible()){

11 if(!checkIfFallbackPossible()){

12 // sets a flag that the emotion can be displayed to later prevent execution of movements

13 setEmotionNotDisplayable();

14 } else {

15 // adds the movement specified as fallback to an array with possible fallbackMovements

//---24 // explanation of methods used above

25

26 function displayEmotion(){

27 executeMovements();

28 reverseMovements();

29

30 // wait depending on wether the movement has a high or low movement rate

31 wait delayBetweenMovements

32 displayEmotion();

33 }

34

35 function checkForConstraints() {

36 for each(constraint in movementConstraints){

37 if (constraint is "or"){

38 // remove movements from list of possible movements

39 }

40

41 if( constraint is "and"){

42 // add to mandatory movements

43 }

44 }

45 }

46

47 function executeMovements(){

48 for each(bodyPart in emotionObject){

49 if(fallbackMovements.size() == 0 or !emotionNotDisplayable){

50 executeMandatoryMovements();

51 addExecutedMovementToListOfExecutedMovements();

52 removeExecutedMovementOfListOfPossibleMovements();

53 checkForConstraints();

54 }

55 if(numberOfMaxMovments < numberOfExecutedMovements or numberOfMinMovements >

numberOfExecutedMovements){

63 var randomInt = Randomizer.getInt();

64 var movement = possibleMovements.get(randomInt);

65 executeMovement(movement);

66 }

67

68 function reverseMovements(){

69 for each (bodyPart in emotionObject){

70 for(movment in listOfExecutedMovements){

Quellcode 4.5– Algorithmus zur Umwandlung der Modelle in dargestellte Emotionen