QuizRobot
Aus Hansa-Wiki
| QuizRobot | |
|---|---|
| |
| Das offizielle Logo vom Quizrobot | |
| Basisdaten: | |
| Name: | QuizRobot |
| Entwickler: | Lucas Jenß, Peter Hansen, Malte Kantak |
| Status: | Release Candidate |
| Version: | 0.42 RC1 |
| Betriebsystem: | Alle |
| Kategorie: | Sprachprogramm für DialogOS und NXT |
| Offizielle Webseite: | Link |
| Sprache: | Deutsch |
QuizRobot *10.04.2008 in Bergedorf; ist ein von Lego Mindstorm entwickelter, über DialogOS sprachgesteuerter Robotor, der seine ultimative Fähigkeit als Quizmaster von 3 versierten Programmieren erlangt hat. (erlangen wird^^)
Inhaltsverzeichnis |
Idee
Aufgabe war es, mit Hilfe der grafischen Entwicklungsumgebung für Dialogsysteme "DialogOS" und einem programmierbaren "Lego Mindstorm"-Roboter, ein Programm zu erarbeiten, indem die beiden Systeme zusammen mit der Außenwelt interagieren.
Wir haben uns überlegt den Roboter als Quizmaster zu fungieren. Seine hauptsächle Aufgabe bestehen nun darin über die Ein- und Ausgabe, also per Mikrofon und Lautsprecher, Fragen auszugeben und Antworten von bis zu 4 Kandidaten entgegen zu nehmen. DialogOS steuert dabei den Dialog; erfasst die Spieleranzahl und sendet die Fragen, die in einer Datenbank gespeichert werden; wertet die Antworten aus und letztendlich so den Sieger.
Zusätzlich wird der Roboter noch motorische Fähigkeiten bekommen. Dabei beschränken wir uns auf entsprechende Kopfbewegungen bei richtiger oder falscher Antwort, sowie affektive Armbewegungen.
Zu unserem Programm
Im einzelnen wollen wir unser Programm in DialogOS im Detail erläutern:
- Als erstes: Das Programm startet und öffnet den ersten Graphen "Spieleranzahl"...
- Erster Graph: wie der Ordnername andeuten lässt, wird hier ermittelt, wie viele Spieler mitspielen.
- Zunächst sendet das Programm eine Ausgabe zum Roboter, welcher sich erkundigt, wie viele Spieler mitspielen und er fügt hinzu, dass maximal vier Spieler erlaubt sind.
- Daraufhin erfolgt eine Eingabe "Spieleranzahl". Über ein Mikrofon werden die Zahlen von 1 bis 4 entgegengenommen und die erkannte Anzahl an Mitspielern wird dann entsprechend in eine Variable "Spieler" gesetzt. Bei der darauf folgenden Ausgabe, wird die gesetzte Anzahl nochmals zur Bestätigung ausgegeben und der Roboter eröffnet das Spiel.
Folgend wird der Graph geschlossen und wir gelangen weiter zum nächsten Graphen "Quizsystem", oder das Progamm beendet sich mit der Ausgabe, dass keine Mitspieler erkannt werden konnten.
- Zweiter Graph: hier kommt das Programm ins Rollen...
- Zunächst wird die Ausgabe "Runde_var" aufgerufen und die Variable "AktiveRunde" ausgegeben, die logischer Weise erst auf 1 gesetzt ist. Damit gelangen wir in den Loop 1 (der die Runden hochzählt) - es gibt bis zu 10 Frage-Runden.
- Sobalt dies geschehen ist, kommen wir in den Loop 2 (innerhalb des Loop 1, welcher die Spieleranzahl hochzählt), wenden uns den Mitspielern zu und beginnen mit dem ersten Kandidaten, welcher über die Ausgabe "Spieler_var" vom Roboter aufgerufen wird.
- Auch hier steht die Variable "AktiverSpieler" vorerst auf 1.
- Dann werden die Fragen gestellt und die Antworten ausgewertet.
- Diese Prozedur befindet sich in dem Untergraphen "Frage":
- Hier wird als erstes ein externes Java-Programm aufgerufen, welches sich mit einer Datenbank verbindet.
- Zurückgeliefert bekommen wir eine Liste mit:
- - Einer Zufälligen Frage, als String
- - Die vier Antwortmöglichkeiten, als String und
- - Die richtige Antwortmöglichkeit von A - D, als Integer-Wert: 1,2,3 oder 4.
- Dann wird ein Script aufgerufen, welches die Rückgabewerte der Datenbank entgegen nimmt:
Nun baut das Script aus der Liste die Frage, die der Roboter stellt, die Grammatik für die Eingabe "Antwort" des Kandidaten und die Richtige Antwortmöglichkeit, zusammen.
- Die Frage wird in die Variable "output" gespeichert.
- Der richtige Antwortsatz wird in die Variable "r_antwort" gespeichert, um diese gegebenenfalls, bei falscher Beantwortung der Frage seitens des Spielers, als richtige Antwort auszugeben.
- Die Grammatik wird in der Variablen "grammatic" registriert, wobei, für die Eingabe "Antwort" des Kandidaten als "zu erkennende Wörter/Sätze" bzw. "Eingabemuster", hier die richtige und die drei falschen Antwortmöglichkeiten, erzeugt werden.
- Wenn die Beantwortung des Spielers erfolgt ist, wird die Antwort von der Grammatik überprüft. Dabei erwartet die Grammatik eine der vier Antwortmöglichkeiten, in Form der Antwort oder des Antwortbuchstabens. Ist die Antwort richtig, so übergibt die Grammatik "richtig" an die Variable "antwort". Ist die Antwort falsch, so wird "falsch" übergeben.
- Im nächsten Schritt testen wir die Variable "antwort" auf ihren Inhalt und informieren den Spieler über die Richtigkeit seiner Antwort und erhöhen entsprechend für diesen Spieler seine Punktevariable oder nicht.
- Dann geht's wieder zurück in den Graphen 2:
- Nun wird überprüft welcher Kandidat gerade an der Reihe war. Dies geschieht in dem Untergraphen "Prüfe Spieler".
- Dazu werden die Argumente "AktiverSpieler" und "Spieler" übergeben und mit einem Script wird verglichen, ob der Wert des AktivenSpielers noch kleiner ist, als die Gesammtzahl aller Spieler. Gibt es noch weitere, dann beginnt die Prozedur für den neuen Spieler von vorne. Anderen falls, wenn der letzte Kandidat an der Reihe war, wird "AktiverSpieler" wieder auf 1 gesetzt. Dann wird überprüft, in welcher Runde wir uns befinden. Dies geschieht im Untergraphen "Prüfe Runde", wechler im Prinzip dem Untergraphen "Prüfe Spieler" gleicht.
- Sollte es die letzte Runde gewesen sein, wird der Sieger ausgewertet und ausgegeben.
- Im Graphen "Der Sieger" werden, anhand eines Scriptes, alle Spieler und ihre Punktzahl miteinander verglichen. Der Spieler mit der höchsten Punktzahl (es können auch mehrere die gleiche Punktzahl haben) wird in der Variablen "output" registriert und anschließend ausgegeben.
- Weitere Details sind dem Programm zu entnehmen: -> Offizielle Webseite ...
- Ende.
MySQL Connector
Die Installation des MySQL Connectors ist denkbar einfach. In einem DialogOS Projekt öffnen Sie zunächst den Menüpunkt Dialog > Geräte (Strg+D). Hier erstellen Sie ein neues Gerät, bei welchem Sie als Connector "CLT Connector (Rendezvous)" auswählen. Als Service Name geben Sie nun "MySQL" und als Server "localhost" (oder die IP des PCs auf dem der Connector gestartet wurde) ein.
Als nächstes sollten Sie einen Eingabe-Knoten erstellen, und als Ausgabe-Gerät den zuvor erstellen MySQL-Connector auswählen. Nun klicken Sie auf "Neu", um einen neuen Wert zu erstellen der an das Programm gesendet wird. Dieser Wert sollte ein String mit der MySQL-Query sein (e.g. "SELECT 1+1").
Im Reiter "Eingabe" erstellen Sie nun ein neues Eingabemuster, und geben die Variable an, in welcher die Resultierenden Daten gespeichert werden sollen (Diese Variable müssen Sie allerdings vorher unter Graph > Variablen als Listenvariable definiert haben - siehe Abbildung 4).
Nun folgt die Verarbeitung der Resultate. In der Abbildung sehen Sie eine Demonstration anhand eines Sprachausgabe-Knotens. Der Ausdruck für die Ausgabe lautet "str(get(get(output, 0), 0))". Es wird (von innen nach außen) die Erste Zeile des Resultats aus "output" ausgelesen, dann die erste Spalte dieser Zeile ausgelesen, und das ganze dann in einen String umgewandelt, den DialogOS ausgeben kann.
Probleme
Trotz der recht schnellen Umsetzung der Steuerung eines Dialogs mit Hilfe der Software traten bei der Programmierung folgende Probleme auf:
- Zum einen fehlt die Anbindung an eine Datanbank, um Fragen zu speichern.
- Um ein Quiz zu realisieren, ist es wichtig viele Fragen (+Antwortmöglichkeiten) bereitzustellen, die irgendwo gespeichert sein müssen, damit das Programm darauf zugreifen kann.
- In DialogOS gibt es diese Möglichkeit leider nicht, jedoch bietet das Programm noch einen Ausweg.
- So lassen sich externe Programme starten und es werden Rückgabewerte entgegengenommen.
- Diese Option gab uns die Chance selbst eine Anbindung an eine Datenbank zu programmieren.
- Zum anderen wirft der Umgang mit der "Grammatik" fragen auf:
- so bekommen wir bissher keinen Zugriff auf externe Variablen.
- Mit dem Update DialogOSs auf eine neuere Version, sowie durch die Unterstützung vom Hersteller haben wir nun ein Beispiel zur Hand, mit dem wir jetzt mit dynamischen Grammatiken arbeiten können.
- Leider fehlt noch der "else"-Fall...
Zurück zur Projekt-Seite der S4


