Markus Berg
Wissenschaftlicher Mitarbeiter im Natural Language Laboratory

Sprachschnittstelle für den Lego Mindstorms Roboter

Diese beiden Bibliotheken realisieren die einfache Verbindung des Windows-Vista-Spracherkenners mit LEGO Mindstorms und eignen sich für den Informatikunterricht in Schulen. Es existiert eine .NET DLL und eine jar-Datei zur Kapselung des Spracherkenners und der Bluetooth-Kommunikation.

Dabei wird auf dem Roboter mit Lejos programmiert. Eine C#-Desktopapplikation kommuniziert mit dem Roboter und sorgt für die Spracherkennung und -synthese. Die Sprachverarbeitung erfolgt somit auf dem Rechner, der dann per Bluetooth entsprechende Bytesequenzen an den Roboter schickt, die dort in Aktionen umgesetzt werden. Zu Beginn ist es erforderlich, den richtigen COM-Port einzustellen. Dieser wird in der Bluetooth-Umgebung unter Windows angezeigt.

Voraussetzung ist ein SAPI-konformer Spracherkenner (in Windows Vista enthalten) und eine SAPI-konforme Stimme (leider in Vista nur auf Englisch enthalten).

Ich würde mich freuen, wenn Sie mir eine kurze Nachricht schreiben, falls Sie diese Bibliotheken erfolgreich benutzen, denn ohne Feedback ist eine Weiterentwicklung nicht möglich. Falls Sie auf Fehler stoßen oder nicht weiterkommen, versuche ich gerne Ihnen zu helfen.

>> hier kostenlos herunterladen <<

Beispielcode

Die folgenden beiden Quelltextausschnitte zeigen, wie leicht es ist, eine einfache Anwendung zu realisieren, mit der der Roboter per Sprache ferngesteuert werden kann. Der Nutzer hat die Möglichkeit "geradeaus", "stop", "rechts" oder "links" zu sagen und der Roboter reagiert dementsprechend.

C# (Desktopapplikation)

using LegoBibo;
//weitere usings

namespace SpeechNavigator
{
    public partial class Form1 : Form
    {
        private Sprachverarbeiter processor;
        private Kommunikator communicator;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            processor = new Sprachverarbeiter();
            processor.starteErkennung(new String[] { "geradeaus", "stop", "rechts", "links" });
            processor.spracheErkanntEvent += new               Sprachverarbeiter.recognizedHandler(processor_spracheErkanntEvent);

            communicator = new Kommunikator("COM8");
            communicator.starteNachrichtenListener();
            communicator.nachrichtEmpfangenEvent += new               Kommunikator.receivedHandler(communicator_nachrichtEmpfangenEvent);
        }

        void processor_spracheErkanntEvent(object o, recognizedEventArgs args)
        {
            switch (args.erkannterText)
            {
                case ("geradeaus"): communicator.sende(1); break;
                case ("stop"): communicator.sende(2); break;
                case ("rechts"): communicator.sende(3); break;
                case ("links"): communicator.sende(4); break;
            }
        }

        void communicator_nachrichtEmpfangenEvent(object o, receivedEventArgs args)
        {
            switch (args.nachricht)
            {
                case (5): processor.spreche("Da ist was im Weg!"); break;
                default: processor.spreche(args.nachricht.ToString()); break;
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            communicator.sende(Byte.Parse(textBox1.Text));
        }
    }
}

Lejos (Roboter)

package natlab.lego.application;

import natlab.lego.tools.*;
//weitere imports

public class Demo implements NachrichtenVerarbeiter {

    private Kommunikator comm;
    private boolean running;
    
    public static void main(String[] args) {
        
        LCD.drawString("Waiting...",0,0);
        new Demo().start();
    }
    
    private void start(){
        running=true;
        comm=Kommunikator.getInstance();
        comm.start(this);
                
        LCD.clear();
        LCD.drawString("Reading...",0,0);
        
        //Demo: Abstand messen
        UltrasonicSensor ultra=new UltrasonicSensor(SensorPort.S2);
        while(running){
            if(ultra.getDistance()<25){

                try{    
                    comm.sende((byte) 5);  //"da ist was im Weg - Nachricht" senden
                    
                    //Schritt zurück
                    Motor.A.backward();
                    Motor.B.backward();
                    Thread.sleep(650);
                    Motor.A.stop();
                    Motor.B.stop();
                    
                }
                catch(Exception ex){}
            }
        }
    }

    public void verarbeiteNachricht(byte msg) {
            switch(msg){
                case(0): //beenden
                    comm.stop();
                    running=false;
                    break;
                case(1): //geradeaus
                    Motor.A.forward();
                    Motor.B.forward();
                    break;
                case(2): //stop
                    Motor.A.stop();
                    Motor.B.stop();
                    break;
                case(3): //rechts
                    Motor.A.stop();
                    Motor.B.forward();
                    break;
                case(4): //links
                    Motor.A.forward();
                    Motor.B.stop();
                    break;
            }

            comm.sende(msg);
    }
}

FAQ


"In theory, there is no difference between theory and practice. But, in practice, there is."