Integration von Dialogsystem und RCX
Alexander Koller
Softwareprojekt "Sprechende Roboter"
29. November 2002

Überblick
Struktur des Systems auf dem PC
DialogMessage: Austausch von Nachrichten über Infrarot
Spezifikation von Nachrichtentypen
Verwenden auf PC- und RCX-Seite

Struktur des Systems auf dem PC

Struktur des Systems auf dem PC

Zu einem neuen Projekt gehören:
Dialog-Spezifikation
Programm für RCX
Erkenner-Grammatik
Spezifikation der Nachrichten

DialogMessage
Spezifikation von Nachrichtentypen in XML-Datei
XML-Datei wird in Quelltext für Klasse DialogMessage kompiliert.
Erzeuge Versionen für PC und RCX: Fast gleich, aber RCX viel kleiner (und eingeschränkte Funktionalität).
Binde in RCX-Client auf PC und in Programm auf dem RCX ein.

Ein Beispiel

Struktur der Spezifikation
Spezifikation enthält
Deklarationen von Nachrichten:
<message> ... </message>
Deklarationen von Datenfeldern:
<argdecl> ... </argdecl>
Jede Deklaration muss einen Namen und kann eine Beschreibung enthalten.

Deklarationen von Datenfeldern
Zusätzlich muss jedes Datenfeld einen Datentyp definieren:
Integer (1 Byte): <int/>
String: <string/>
Atome:
<atoms>
 <atom>MOVING</atom>
 <atom>STOPPED</atom>
</atoms>

Deklarationen von Nachrichtentypen
Die Deklaration der Nachricht gibt an, welche Datenfelder die Nachricht enthält:

<message>
    <name>STATUS_IS</name>
    <description>Description of a current
            status.</description>
    <argument>status</argument>
    <argument>floor</argument>
    <argument>direction</argument>
  </message>

Kompilation der Spezifikation
Spezifikation wird mit den Paketen TemplateParser und MessageCompiler in eine Datei DialogMessage.java kompiliert.
Je nach Flags wird für RCX oder PC erzeugt.
Kompilation kann gut ins Makefile ausgelagert und dadurch automatisiert werden.
Verzeichnis muss die XML-Datei mit Spezifikation sowie message.dtd enthalten.

Kompilation für den PC
Richtiges Makefile in projects/Lift.
Variablen werden in Makefile.common gesetzt.

Anbindung an CLT-Wizard
Kopie von projects/Lift/LiftClient.java mit eigener DialogMessage.java kann vom Wizard angesprochen werden.
Übergib Nachricht in einer Tabelle:

Ein GUI für DialogMessage
Aufruf von "make run" in LegoComm/DialogMessageWin:
Anpassung an eigene Nachrichten durch Kopieren in Verzeichnis mit eigener Spezifikation.

Nachrichtenbehandlung auf dem RCX
Auf dem RCX soll ein eigener Thread laufen, der Nachrichten über Infrarot annimmt und verarbeitet.
Implementiert in Klasse MessageProcessor.
Übergebe an ihren Konstruktor eine Instanz von MessageHandler; kapselt Methode, die mit Nachrichten aufgerufen wird.

Beispiel

MessageHandler und DialogMessage
MessageHandler ist ein Interface, dessen Implementierungen die process-Methode überladen müssen.
process() bekommt die eingehende DialogMessage übergeben und soll eine Antwort-Nachricht zurück übergeben. Dazu Felder von out überschreiben.
DialogMessage ist hier die RCX-Version der aus der XML-Spezifikation erzeugten Klasse.

DialogMessage auf dem RCX
Der Typ der Nachricht steht im Feld Type.
Es gibt statische Konstanten TYPE_FOO für jeden Nachrichtentyp FOO.
Für jedes mögliche Argument gibt es ein gleichnamiges Feld in DialogMessage.
Für ein Atom FOO im Argument bar gibt es eine statische Konstante ATOM_bar_FOO.
Achtung: Typüberprüfung selbst implementieren!

Struktur eines Projekts
XML-Nachrichtenspezifikation und DTD.
Kopie von LiftClient.java.
In Unterverzeichnis RCX: RCX-Quellen (incl. Kopie von MessageProcessor.java und MessageHandler.java).
Geeignetes Makefile.
Dialogspezifikation und Erkennergrammatik (irgendwo).

Grammatik für den Spracherkenner
Spracherkenner braucht eine Grammatik.
Definition im Java Speech Grammar Format (JSGF): http://java.sun.com/products/java-media/speech/forDevelopers/JSGF/
Siehe Beispiel in LegoComm/Recognize/fahrstuhl.gram.

Interaktion Spracherkenner-Dialogsystem
Jede grammatische Eingabe soll genau ein JSGF-Tag enthalten:

<ordinal_acc> = ersten {eins} |
                zweiten {zwei};
Dieses eine Tag wird als Schlüsselwort ans Dialogsystem weitergegeben.
Dort ein Ausgang pro Schlüsselwort.

Wie macht man eine eigene Grammatik?
Laden von Grammatiken zur Laufzeit leider noch nicht implementiert, deshalb am sinnvollsten WizardClients/Recognize kopieren.
In recognize.props stehen Parameter für den Erkenner, u.a. der Name der Grammatikdatei.

Zusammenfassung
Aus XML-Spezifikation von Nachrichtentypen werden DialogMessage-Klassen für PC und RCX generiert.
Zugriff auf PC-Seite über LiftClient (dann CLT-Client) oder GUI.
Zugriff auf RCX-Seite über MessageProcessor und MessageHandler.