Capitulo V. Sistema Robot dirigido por...
Transcript of Capitulo V. Sistema Robot dirigido por...
Capitulo V. Sistema Robot dirigido por voz.
El propósito principal de este sistema es que el robot ejecute ciertas instrucciones en tiempo
real, lo interesante es que las instrucciones se las da el usuario a la computadora por medio de voz; La
computadora decodifica la voz y la convierte en instrucciones legibles para el robot. Después de esto se
envían las instrucciones al robot por medio de bluetooth. Y el robot al momento de recibirlas las
ejecuta en tiempo real.
Este sistema ha sido programando en el lenguaje de programación java, todas las herramientas
utilizadas en este sistema están previamente analizadas para poder tener una integración completa y
compatible a la hora de la integración del sistema.
El sistema consta de dos estados el primero llamado “Autónomo” este es un estado en el cual el
robot puede tomar sus propias dediciones las cuales están previamente programadas. El segundo estado
llamado “Dirigido” es el estado en el cual el robot ejecuta las instrucciones de voz, previamente
decodificadas por una computadora.
El robot se desenvuelve en un ambiente estático y predefinido por el usuario. Donde el robot se
encontrara con una serie de situaciones que el mismo debe resolver, en dado caso que el robot entre en
una situación de pánico y no la pueda resolver el problema, el robot solicitara la intervención del
usuario para resolver dicho problema
Todo este sistema fue desarrollado con el IDE llamado Eclipse. Este IDE nos permite programar
en Java. Seleccione este IDE porque me permitió integrar varias aplicaciones y herramientas como lo
son Sphinx, Icommand, etc. De tal manera que puedo generar un modulo de reconocimiento de voz, y a
la ves un modulo de instrucciones legibles para el robot y por ultimo un modulo de integración de estas
dos partes.
5.1. Componentes básicos del sistema.
Básicamente el sistema esta formado por tres partes principales, las cuales nos permiten dividir
el sistema en diferentes sectores. Como por ejemplo, existe un sector donde reconocimiento de voz, otro
sector donde se encuentran las instrucciones que el robot va a ejecutar y por ultimo una sección donde
pasamos de voz a comandos legibles para el robot.
Figura 5.1 Diagrama de Contexto
Diagrama de Contexto
USUARIO
Reconocimiento de voz.
Instrucciones legibles
para el robot.
Selección de comando
de voz a instrucción
legible para el robot.
Comando de voz
Comando decodificado
Robot ejecuta comando “Dirigido”
Robot ejecuta comando “Autónomo”
Se ejecuta este comando hasta que el robot se encuentre en una situación crítica o de pánico.
Numero de comando
En la figura 5.1 podemos notar la estructura básica del sistema robot dirigido por voz con todos
sus componentes esenciales. De esta manera tenemos un panorama amplio de cómo esta conformado el
sistema.
Lo primero que debe ocurrir es que el usuario desee decirle al robot que es lo que el quiere que
el robot ejecute, esto por medio de comandos de voz predefinidos, al momento de que el usuario le
mandan a la computadora el comando de voz, este comando se decodificado en una cadena de
caracteres, esto con la ayuda de la herramienta Sphinx 4. Seguido de esto, dicha cadena se compara con
una seria de comandos predefinidos con anterioridad. Y se le asigna un número de comando a dicha
instrucción. Después de tener el número de comando correspondiente, se le indica al robot que
comando de los predefinidos debe ejecutar.
Figura 5.2 Estructura básica de manejo de comandos.
El comando se envía al robot por me dio de Bluetooh y se ejecuta en tiempo real.
d
Comando de voz.Ejemplo. “Go”.
back 1
left 2
go 3
right 4
ETC #
Numero de comando
Si el comando es “go”
Cadena decodificada por el sector de reconocimiento de voz
1 Moto.Backward(700);
2 Motor.a.Backward(25);
3 Moto.Forward(700);
4 Motor.a.Forward(25);
ETC #
Ejemplo del comandos
Para el manejo de comandos que el robot ejecuta, decidí integrar en el sistema un patron de
diseño de software llamando Command Pattern, que me permite manipular los comandos del robot de
manera independiente. La ventaja de utilizar dicho patron es que me permite agregar o eliminar
comandos sin dañar el sistema original.
Figura 5.3 Estructura básica del patrón de diseño llamado Command Pattern.
En la figura 5.3 podemos ver la estructura básica del patron, en un diagrama UML. Que nos
permite ver los componentes principales para poder implementar dicho patron.
Para el sector de reconocimiento de voz, se implemento la herramienta llamada sphinx que
nos permite reconocer la voz utilizando una gramática de tipo BNF, junto con Java Speech API
Grammar Format (JSGF). Esto nos permite definir una gramática adecuada para poder reconocer los
comandos de voz. Esta herramienta procesa la voz y dependiendo de cómo nosotros pronunciemos
el comando decodifica la voz y la compara con la gramática que nosotros definimos previamente,
después nos regresa una cadena de caracteres con el mejor resultado obtenido por la
descodificación del comando de voz.
Invoker Command _Interface Command
Concrete
Receiver
execute()
execute()setCommand()
action()
Client
Command Pattern UML
Figura 5.4 Reconocimiento de voz.
5.2. Diagrama de clases.
Figura 5.5 Diagrama de clase del sector de reconocimiento de voz.
Voz
Decodificación de voz
Comparación con la gramática
Resultado de la comparación con la gramática en forma de cadena de Caracteres (String).
En la figura 5.5 Se muestra como es que se comunican las clases, de esta manera tenemos
un panorama más amplio de que es lo que hace el sistema en este sector.
Para el diagrama de clases, empezamos con la clase principal en la cual inicializamos el
sistema, como el lenguaje de programación es orientado a objetos, tenemos una serie de clases que
heredan y utilizan métodos conectados entre ellos.
Figura 5.6 Diagrama de clase donde inicializamos el sistema.
En la figura 5.6 se muestra la clase que utilizamos para inicializar el sistema, esto mandando a
llamar los métodos Conectar(); TextoReconocido(); que se encuentran el la clase de Reconocedor_voz.
Figura 5.7 Diagrama de clase Reconocedor de voz.
En la figura 5.7 se muestra la clase en la cual tenemos dos métodos principales el primero
llamado Conectar, nos permite activar la herramienta llamada sphinx en la cual nosotros hemos
programado la inicializamos lo que es el micrófono de nuestra computadora y así mismo la conexión
con el robot para que reciba información por medio de vía bluetooth.
En el método llamado TextoReconocido, es donde se decodifica el comando de voz, esto
solicitando la ayuda de la herramienta sphinx, después de que dicha herramienta nos regresa el mejor
resultado en forma de cadena (String), entonces se manda a llamar a las siguientes clases:
• int command_number = Sender.Sender_Voice_Command(res);
• Sender.Number_command(command_number);
Que nos permiten comparar que comando se va a enviar al robot para ser ejecutado en tiempo real.
En el supuesto caso que la herramienta sphinx nos regrese la cadena llamada “Exit”, esto nos indica
que el usuario desea salir del sistema, para esta parte utilice un la clase llamada teclado, esta clase nos
permite leer, desde el teclado cualquier tipo de dato, puede ser String, float, char, integer, etc. Y esto le
sirve al sistema para confirmar la salida del mismo.
Figura 5.8 Diagrama de clase Teclado.
En la figura 5.8 se muestra el diagrama de clase que me ayuda a obtener el carácter de “Y” o “N”
del teclado, dependiendo de que es lo que realmente desee el usuario. En este diagrama podemos ver
que no solo existe para obtener String sino también cualquier tipo de carácter desde el teclado ya sea
Float, String, Boolean, Etc.
Para este sistema nosotros solo utilizamos el método llamado readString() que nos permite leer
dicho dato solicitado por el sistema. Para saber si el usuario realmente desea salir del mismo.
Para la ejecución de comando se creo una clase llamada Sender. Que nos permite compara y definir
el comando que será enviando al robot en tiempo real.
Figura 5.9 clase Sender.
En la figura 5.9 tenemos la estructura básica de la clase Sender. En esta clase como mencione
anteriormente hay dos métodos principales, el primero llamado Sender_Voice_Command(), que
requiere una cadena (String) para ejecutarse, es el que se encarga de hacer la comparación entre
cadenas de caracteres y regresa el número de comando a ejecutar. Este número nos sirve para activar el
método Number_comman que nos permite enviar y ejecutar el comando en tiempo real.
Para el manejo de los comandos utilizamos el patron de diseño de software llamado command
pattern. Que nos permite integrar los comandos de manera independiente y sin afectar el sistema. Al
implementar dicho patron utilice las siguientes clases.
igura 5.10 Diagrama de clase del sector command pattern.
En la figura 5.10 podemos ver como se encuentra implementado el patron de diseño de software
llamado command pattern. También podemos observar en que parte va la lista de comando de una
manera clara, estas clases le permiten al sistema tener por separado lo que son los comandos del robot y
el sistema por completo.
Para implementar este patron de diseño de software en el sistema lo primero que hice fue
generar una clase tipo interfaz llamada Command que nos permita tener el método llamado execute()
para poder acceder a el desde otras clases.
Figura 5.11 Diagrama de clases Command.
Seguido de esto el sistema cuenta con una clase llamada Concrete_Comand_Car que es la clase
encargada de tener todos los métodos de los comandos que el robot debe ejecutar, dentro de estos
métodos es donde ponemos las instrucciones del robot.
Figura 5.12 Diagrama de clase Concrete_Command_Car.
Cada uno de estos métodos tiene las instrucciones que el robot va a ejecutar, como por ejemplo:
public void Go(){
Moto.setSpeed(70);
if(goNum == 1){
if( us.getDistance() > 30){
Moto.forward();
System.out.println("Avanza 30 cm");try {
Thread.sleep(1500);} catch (InterruptedException e) {
e.printStackTrace();}
Moto.stop();}else{
File sound = new File("Alarm.rso");Speaker.playSoundFile(sound.getName());try {
Thread.sleep(1000);} catch (InterruptedException e) {
// TODO Autogenerated catch blocke.printStackTrace();
}}
}
if(goNum == 2){
if(us.getDistance() > 60){
Moto.forward();
System.out.println("Avanza 60 cm");try {
Thread.sleep(3000);} catch (InterruptedException e) {
e.printStackTrace();}
Moto.stop();}else
{File sound = new File("Alarm.rso");Speaker.playSoundFile(sound.getName());try {
Thread.sleep(1000);} catch (InterruptedException e) {
// TODO Autogenerated catch blocke.printStackTrace();
}}
}
if(goNum == 3){
if(us.getDistance() > 90){
Moto.forward();
System.out.println("Avanza 90 cm");try {
Thread.sleep(4500);} catch (InterruptedException e) {
e.printStackTrace();}
Moto.stop();}else{
File sound = new File("Alarm.rso");Speaker.playSoundFile(sound.getName());try {
Thread.sleep(1000);} catch (InterruptedException e) {
// TODO Autogenerated catch blocke.printStackTrace();
}}
}
Moto.flt();System.out.println("Sensor de ultrasonido desactivado");
}
Por cada uno de estos comandos debemos de tener una clase que hereda la ubicación de dicho
método poder así llamarlos de manera independiente y para esto debemos de generar dichas clases de la
siguiente manera.
Figura 3.13 Diagrama de las diferentes clases de cada comandos.
En la figura 5.13 tenemos la colección de diagramas de clases que son las cuales debemos de
generas si deseamos tener un comando mas para que el robot ejecute, estas 6 clases son iguales y si el
usuario así lo desea puede agregar los comandos que el necesita.
Este patron requiere de una clase llamada invoker que se encarga como su nombre lo dice de
invocar cada uno de los métodos mencionados anteriormente, cuenta con un Slot de la clase Command
y con dos métodos llamados SetCommand() y Run() que nos permiten ejecutar los comandos.
Figura 5.14 Diagrama de clase Invoker_Command.
Por ultimo requerimos de un cliente, que en este caso es la clase llamada Sender la cual nos
sirve como pivote dentro del sistema y nos permite conectar la parte de reconocimiento de voz con la
parte de patrones de diseño de software que en este caso son los comandos.
Figura 5.15 Diagrama de clase Sender.
En la figura 5.15 podemos notar que cuenta con dos métodos esenciales el primero llamando
Sender_Voice_Command() la cuan es de tipo entero y nos permite regresar un número preasignado a
los comando que el usuario mencione durante el reconocimiento de voz.
Por ejemplo si el usuario dice Left y dentro de esta clase esta asignado el Left a la instrucción 3
entonces se le asigna dicho numero. Después de conseguir el numero el sistema requiere del método
llamado Number_command. En cual nosotros mandamos a llamar a la clase llamada
Invoker_Command la cual tiene la capacidad de ejecutar el comando en este ejemplo el 3. Para esto
dicho metodo cuenta con un switch que indica que comando debe ejecutar, en este caso es el 3 así que
seria:
case 3://ingresas el comando que quieres que se ejecute w.SetCommand(Left);//se ejecuta el comandow.Run();break;
Como mencione anteriormente si el usuario deseara agregar otros comandos lo único que
tendría que hacer es agregar dicho comando de una manera concreta en la clase llamada
Concrete_Command_Car seguido de esto, se debe generar la clase del comando que el usuario agrego.
De manera independiente y extendiendo la interfaz command, como se vio en la lista de comandos con
que cuenta este sistema. Y por ultimo agregar la instrucción a la gramática del sistema y modificar la
clase Sender agregándole la instrucción dentro de los “if” y “case”. De manera inversa si el usuario
desea eliminar un comando tendría que hacer los mismos pasos mencionado anteriormente pero
eliminado dichos comandos.
Los comandos de este sistema pueden ser tan complejos como el usuario lo desee, en este caso
en especifico el sistema cuenta con un método llamado “Free” que requiere de otros métodos dentro de
la clase command, este método tiene la capacidad de evadir objetos y solicitar la ayuda de el usuario,
esto si el robot se encuentra en una situación critica o de pánico. Como ejemplo aquí les agrego el
método mencionado con anterioridad que es una combinación de los métodos básicos.
public void Free() {
int count = 0;Moto.setSpeed(70);Moto.forward();
while(true){
if(count >= 2 || touch.isPressed() == true){
Alarm();Stop();break;
}else
{if( us.getDistance() <= 30){
Stop();Left();Back();if(touch.isPressed() == true){
Stop();try {
Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}break;
}Center();count++;
System.out.print("La disrancia es: "+ us.getDistance()+ "\n El contador Tiene" + count);
if(us.getDistance() > 31){
Moto.setSpeed(70);Moto.forward();count = 0;System.out.print("Contador = 0;");
}
}
}}
}
Como se puede notar en este método el robot cuenta con una inteligencia artificial reactiva que
le permite comportarse con forme a ciertas situaciones y con reglas que le permiten resolver un cierto
problema. Como por ejemplo en el caso del método free el robot se encuentra a un distancia de 30 cm.
de un objeto cualquiera este se detiene y realiza una serie de movimientos que le permiten evadir el
objeto.
Si al momento que el robot retrocede para evadir el objeto se encuentra con alguno otro objeto
por la parte trasera este se detiene y pide la ayuda del usuario avisándole con una serie de frecuencias
preprogramadas. Así mismo si el robot realiza el movimiento de evadir objetos 4 veces se deduce que
el robot se encuentra encerrado y como no tiene la capacidad de ver pues solicita la ayuda del usuario
para salir del problema utilizando las mismas frecuencias mencionadas anteriormente.
El pionero de este tipo de inteligencia es Dr. Rodney Brooks que actualmente es el director de los
laboratorios de inteligencia artificial en MIT (Massachusetts Institute of Technology). [Web 11]
Ya que el sistema cuenta con todo lo mencionado anteriormente, me atrevo a decir que este
sistema puede ser escalado y modificado al gusto del usuario según lo desee y es muy importante que
al momento de agregar o quitar comandos la estructura básica del sistema no genere ningún problema
es por esto que decidí utilizar el patron mencionado anteriormente.
5.3. Diagrama de Flujo.
Figura 5.16 Diagrama de Flujo del sistema robot dirigido por voz.
UsuarioInicio
Comando de voz Procesamiento de
voz. Selección de comando.
Ejecución de comandoSalida del sistema
Robot ejecutando. Estado Dirigido
Robot ejecutando. Estado Autónomo
Situación crítica o de pánico
Solicitando ayuda del usuario
Finalización de comando ejecutado.