Comandos de voz para controlar un NXT. MAC + LeJOS

comandos de voz¿Quién no ha querido alguna vez decirle a su NXT qué debía hacer y conseguir que lo hiciera? Pues aquí tenéis un primer paso para conseguirlo. Hasta que lenguajes como ROILA sean plenamente funcionales no podremos conseguir que el robot nos entienda directamente, pero sí tenemos herramientas de reconocimiento de voz para el ordenador, y sabemos como comunicarnos remotamente con el NXT desde el ordenador, así que… con mucha paciencia y algunos trucos podremos conseguir que nuestro robot reconozca nuestras instrucciones y las obedezca.

Comandos de voz para controlar el NXT

Ya hay algunos programas que basan el reconocimiento de voz en la diferente intensidad con la que se dicen las sílabas de la palabra clave, y utilizan el sensor de sonido (NXTPrograms).
Incluso, hay varios programas que permiten control con voz, dos de los más relevantes son:

  • LegoNXTRemote para Mac
  • NXTVoiceCommander para Windows, que utiliza el software de reconocimiento de voz tazti para Windows XP/VistaNosotros queremos enseñaros a programar vuestro propio control de voz en MAC, utilizando LeJOS.Para conseguirlo hemos utilizado el sistema de reconocimiento de voz que viene de serie en MAC OS X. Este programa nos permite, no sólo utilizar comandos predefinidos del sistema, si no crear nuestros propios comandos de voz. Estos comandos, programados en AppleScript, son capaces de ejecutar código en nuestro ordenador, vamos a utilizar esta capacidad para darle las instrucciones en el ordenador.Aquí tenéis un vídeo para que veáis que funciona.Subiremos uno con mejor calidad tan pronto como sea posible…Ahora vamos a lo importante… ¿Cómo funciona?

    Reconocimiento de Comandos de Voz + AppleScript + LeJOS = movimiento del robot

    Utilizamos comandos de voz personalizados que nos permiten ejecutar código, en este caso vamos a ejecutar un programa de LeJOS capaz de conectarse vía bluetooth al NXT, enviando instrucciones a los motores.

    Nuestro robot admite 5 comandos de voz:

  • Adelante: Up
  • Atrás: Down
  • Derecha: Right
  • Izquierda: Left
  • Parar: StopPara que el sistema de reconocimiento de voz pueda entendernos, los comandos deben estar preferiblemente en inglés, además nuestra pronunciación deberá ser razonablemente buena, o no funcionará.Una vez el ordenador ha reconocido el comando de voz, lanza el script con el programa de LeJOS, al cual le debemos pasar los argumentos de entrada adecuados para que realice la acción correspondiente.El programa de LeJOS está compilado para trabajar residente en el ordenador, el decir, no se descarga nada al NXT, sólo se le envía, por bluetooth, información sobre qué motores debe mover y cómo hacerlo, esto acelera la comunicación.Pasos a seguir para implementar el sistema1. Crear un comando de voz personalizado Abrimos el editor de AppleScript (o nuestro editor de código favorito) y guardamos el script en: “/Users/MyUser/Library/Speech/Speakable Items” con formato Script el nombre será el comando de voz que utilizaremos para llamar al script, así que interesa que sea breve y sencillo. Por ejemplo: “Up”
    Este script debe, al ser ejecutado, llamar al programa de LeJOS con el parametro adecuado, es algo así:

    on run
    do shell script "cd ~/lejos_nxj/bin; ./nxjpc Connecting Up"
    end run

    En la linea 2 le pedimos a la shell (no se ejecuta en terminal, no hay feedback visible de la operación) que vaya a la carpeta lejos_nxt/bin –cd ~/lejos_nxj/bin– y luego –;– que ejecute el programa Connecting con el parametro adecuado – ./nxjpc Connecting Up-.

    Haríamos lo mismo para todos los comandos que quisiéramos añadir.

    NOTA: Si quisiéramos ejecutar el comando en el Terminal, tendríamos que escribir lo siguiente:

    on run
    tell application "Terminal"
    activate
    do script "cd ~/lejos_nxj/bin; ./nxjpc Connecting Up"
    end tell
    end run

    Esto ejecutaría el comando en el clásico Terminal, por lo que podríamos ver qué pasa.
    Nótese la desaparición de shell en la línea 4.

    2. Crear un programa para enviar la información al NXT

    Nosotros hemos optado por hacerlo en LeJOS, ya que hemos estado trabajando con LeJOS en Mac durante varios artículos (Instalación LeJOS en MAC, Conexión Bluetooth en MAC, Instalación de Eclipse en MAC).

    Os recomiendo echar un vistazo al artículo sobre Manejo Remoto del NXT desde PC, ya que vamos a trabajar sobre esa misma base.

    Este es el código del programa:

    import lejos.nxt.*;
    import lejos.nxt.remote.NXTCommand;
    import lejos.pc.comm.*;
    
    public class Connecting {
    
    public static void main(String [] args) throws Exception {
    NXTConnector conn = new NXTConnector();
    
    if (!conn.connectTo("Mac", NXTComm.LCP)) {
    System.err.println("Conexión Fallida");
    System.exit(1);
    }
    NXTCommand.getSingleton().setNXTComm(conn.getNXTComm());
    
    if (args[0].equalsIgnoreCase("Up"))
    {
    Motor.A.rotate(720,true);
    Motor.B.rotate(720);
    }
    else if (args[0].equalsIgnoreCase("Down"))
    {
    Motor.A.rotate(-360,true);
    Motor.B.rotate(-360);
    }
    else if (args[0].equalsIgnoreCase("Right"))
    {
    Motor.A.rotate(-360,true);
    Motor.B.rotate(360);
    }
    else if (args[0].equalsIgnoreCase("Left"))
    {
    Motor.A.rotate(360,true);
    Motor.B.rotate(-360);
    }
    else if (args[0].equalsIgnoreCase("Stop"))
    {
    Motor.A.setSpeed(0);
    Motor.B.setSpeed(0);
    conn.close();
    }
    }
    }

    Líneas 8-14: Nos conectamos con el dispositivo
    Líneas 6-40: En función del argumento de entrada, realizamos un movimiento u otro.
    Hemos utilizado una función de comparación de cadenas estándar de Java para comparar el argumento de entrada con nuestro valor de control (“Up”, “Down”, …)

    args[0].equalsIgnoreCase("Up")

    En este caso hemos optado por comprobar la igualdad de las cadenas ignorando la distinción mayúsculas/minúsculas.
    NOTA: Cuando utilizamos el bluetooth para comunicarnos con el NXT desde el PC/MAC, por norma general, debemos utilizar

    conn.close();

    Para asegurarnos que la conexión se cierra correctamente entre ambos dispositivos.
    Pero esto tiene un pequeño problema en un programa como este, y es que: si cerramos la conexión después de cada movimiento, perderemos tiempo de reacción al tener que iniciarla de nuevo.

    Por eso nuestro programa sólo incluye cierre de conexión con la palabra clave Stop.

    Para compilar correctamente este programa (recordemos que se ejecuta en el ordenador, no en el NXT), tendremos que hacer uso del comando:

  • nxjpcc Connecting.java
  • Para ejecutarlo
    nxjpc Connecting ArgumentoDeEntrada

     Esperamos que os haya gustado la idea de controlar el robot mediante comandos de voz, y para cualquier duda, podéis utilizar el foro.

2 thoughts on “Comandos de voz para controlar un NXT. MAC + LeJOS

  1. hola me llamo manuel y me gusta mucho el tema de lego tengo un lego educativo 9797 he realizado algunos experimentos y me gustaria preguntarles ¿es necesario contar con un applet o se puede realizar con con una maquina virtual en VMWARE?

    tambien comento que yo lo intente pero no tuve existo debido a que algunos dispositivos no lo reconoce..

    En el caso que funcione en un VMWARE cual MAC OS X seria el mas recomendable.

  2. Hola a todos soy un novato en esto pero me gusta practicar y hacer experimento con lego yo tengo un lego mindstorn educativo 9797 y tengo la curiosidad de hacer mover un lego atraves de la voz.

    Mi pregunta ¿ es necesario contar con una maquina macintosh o se lo puede realizar atraves de una maquina virtual en el VMWARE ?
    yO estuve intentando pero no tuve exito y quisiera saber como puedo aplicarlo en el caso que se pueda en una maquina virtual VMWARE que sistema operativo seria el recomendable yo tengo el MAC OSX tiger y leopard.

    tengo algunos y requiero una orientacion gracias…….