Integration von Dialogsystem und RCX
| Alexander Koller | |
| Softwareprojekt "Sprechende
Roboter" 29. November 2002 |
| 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 |
| 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. |
| 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> |
| 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. |
| Richtiges Makefile in projects/Lift. | |
| Variablen werden in Makefile.common gesetzt. |
| Kopie von projects/Lift/LiftClient.java mit eigener DialogMessage.java kann vom Wizard angesprochen werden. | |
| Übergib Nachricht in einer Tabelle: |
| 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. |
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. |
| 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! |
| 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. |
| 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. |