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
- Welchen COM-Port muss ich einstellen?
Lassen Sie sich unter Windows die Bluetooth-Geräte anzeigen und öffnen Sie die Eigenschaften des NXT. Dort müsste nun der Port angezeigt werden. Falls nicht, fügen Sie einfach den abgebildeten Dienst hinzu.

- Wo bekomme ich eine deutsche Stimme her?
Eine Zeit lang wurde Steffi von ScanSoft kostenlos bei Microsoft als Download angeboten. Inzwischen funktioniert der entsprechende Link nicht mehr. Allerdings ist die Stimme angeblich im Microsoft Reader enthalten, der ebenfalls kostenlos zu beziehen ist.
"In theory, there is no difference between theory and practice. But, in practice, there is."