PROGRAMACIÓN DE ROBOTS LEGO MINDSTORMS

Pablo Iván Romero De La Rosa
Leodegario G. Aguilera Hernández
Orlando Meza Zaleta

MÁQUINA DE ESTADO


Las máquinas de estado son una arquitectura de programación en la que rompen las acciones de un robot en una serie de modos, también conocido como estados. La forma de poner en práctica una máquina de estado en LabVIEW ™ es esencialmente una estructura de caso dentro de un ciclo While.
 Recuerda cómo una estructura de caso de LabVIEW: le permite a uno de los muchos casos ejecutarse en un momento dado sobre la base de una condición. Las estructuras de caso que ha visto hasta el momento siempre han utilizado un valor booleano en la entrada. Va a aprender que se puede utilizar una cadena y la entrada al selector de la estructura de casos como una forma de definir más de dos estados diferentes en la estructura del caso.
 El estado de un robot puede estar cambiando constantemente. Las máquinas de estado se ven afectadas por los sensores. En base a esto, el comportamiento de un robot puede ser diferente, basado en lo que ven, oyen o sienten. Por lo tanto, puede tener más de un camino a seguir en la máquina de estados.
 La mejor manera de representar una máquina de estados es con un diagrama de estado. Un ejemplo se muestra en la Figura 122.
En un diagrama de estado, el flujo del programa se muestra con flechas entre  varios estados, representados por círculos. Hay escritura en las transiciones antes de los estados o en los propios Estados para decir lo que está sucediendo, o cuando las situaciones se producen.
Las transiciones son el flujo entre los Estados y están representados por las flechas en  el diagrama de estado. Es importante recordar que no puede haber más de una flecha que sale de un estado en particular, cada uno en representación de muchas condiciones posibles.

Analizará el diagrama de estado en la Figura 122. El círculo con el borde doble  que dice "START" en el interior es donde el programa se inicia. Si sigue la flecha, verá que el programa entra en el Estado "Idle". La razón de que este estado es  llamado inactividad se debe a que no está haciendo nada. Por lo tanto, cada vez que el robot se encuentra en estado de reposo, el robot no debe realizar ninguna acción.
Si se fija en el estado de reposo, verá que hay dos flechas que salen de ella.  Una va al Estado de "STOP", que es el final del  programa, y el otro  pasa a un estado llamado "Forward". Si se fija bien, verá que el Estado "Forward"  sólo se produce cuando se detecta un objeto. Es por eso que la flecha que apunta a  ese estado se denomina "Object Detected". Además, verá otra flecha marcada entre el Estado "Idle" y el Estado "STOP",  que se llama "On Touch". Esto significa que cuando el sensor de contacto es presionado en estado de reposo, el programa va al  Estado "STOP". Las etiquetas en las flechas son un camino corto para representar que va a pasar de un estado a otro.
 Si tuviera que ir a "START" y luego al Estado "Idle", y asumir que un objeto fue detectado por el sensor ultrasónico, y luego ir al Estado "Forward". No tiene información completa sobre el Estado "Forward", pero a partir del nombre, puede suponer que se trata de que el robot mueva hacia delante. Una vez más, tiene dos salidas posibles de este Estado "Forward". Cuando el sensor de contacto es presionado, se va al Estado "STOP" y después de que se ha avanzado durante un segundo, se dirige al Estado "Backward”. El Estado "Backward" implica decirle al robot que se va a mover hacia atrás.
 Desde el Estado "Backward", si el sensor de contacto es presionado, va a "STOP", y después de un segundo, vuelve al Estado "Idle".
Como un dato entero o double, hay otro tipo de datos en LabVIEW llamado cadena. A diferencia de un valor numérico que utiliza números, o un valor booleano que utiliza valor verdadero o falso, en una cadena se pueden utilizar letras y pares de números. Va a utilizar las constantes de cadena para nombrar y describir los estados dentro de una máquina de estados.
Creará una máquina de estados en LabVIEW. Como se mencionó anteriormente, una máquina de estados es simplemente una estructura de caso dentro de un ciclo While.
Para que un robot tome una decisión, tiene que saber en qué estado esta, ya que realiza diferentes acciones en diferentes estados y tiene diferentes transiciones hacia y desde estos estados. Esto lleva al concepto que ha aprendido anteriormente en relación con los registros de desplazamiento. Con el fin de recordar la información de la repetición del ciclo a la siguiente iteración, debe tener un registro de desplazamiento. En este caso, el cambio de registro va a contener el estado actual del robot.
Puede recordar, para crear un registro de desplazamiento haga clic derecho en el borde del ciclo While y haga clic en agregar registro de desplazamiento.
Tiene que iniciar este cambio de registro y dirá que en este caso, quiere que la máquina de estado inicie en el estado “Idle”. Para ello, va a crear una constante String. Esto se puede hacer dando clic derecho sobre el diagrama de bloques, seleccionando la sub-paleta String y haga clic en String Constant. Esto se muestra en la Figura 125.
Ahora puede escribir la palabra “Idle” y cablear la String Constat al registro de desplazamiento de la izquierda.

Recuerde que todavía tiene una estructura de caso dentro del ciclo While. La estructura de caso le permite al robot hacer algo diferente, dependiendo de qué valor se conecta en el selector de caso. Si conecta el Shift Register de la izquierda al selector de caso, tendrá la capacidad para definir código diferente para los diferentes estados. Si el valor inicializado en el Shift Register es la cadena denominada “Idle”, entonces para escribir el código que se ejecutará en el estado “Idle”, necesita cambiar la String en la parte superior de la estructura de caso y denominarla “Idle”. Para renombrar un caso, simplemente haga doble clic sobre su nombre y escriba el nombre deseado.
Ahora puede escribir el código en el estado “Idle” que se ejecutará tan pronto como se inicia el programa en el NXT.
Dirá que tiene una máquina de estados muy simple, donde se pasa del estado “Idle” al estado “2nd” o al estado “STOP”. La verdadera pregunta aquí es ¿Cómo podemos enviar el programa desde el estado “Idle” hasta el estado “2nd”? Para ello, tiene que crear una nueva String Constant en el estado “Idle” y llamar al estado “2nd”. A continuación cablear hasta el shift register de la derecha. Es por eso que tiene el shift register, para almacenar el estado. Esto ahora le permitirá pasar del estado “Idle” al estado “2nd”.
Ahora tiene que añadir un caso para el estado “2nd”. Para ello, haga clic derecho sobre la etiqueta del selector en la parte superior de la estructura de caso y seleccione Add Case After.
Esto agregará una caja con un nombre en blanco, y puede darle el nombre correcto. En este caso se llamará “2nd”.
Ahora tiene que decirle al programa que irá desde el estado “2nd” hasta el estado “STOP”. Una vez más, tiene que crear una String Constant, con un nombre adecuado y conectarlo al shift register en el lado derecho.
La última cosa que necesita hacer es crear un estado “STOP”. Va a observar su selección de casos y ver lo que tiene.
Verá que tiene el estado “Idle” y el estado “2nd” que ha creado. Pero también tiene un tercer estado “False” que estaba allí por defecto cuando creamos la estructura de casos. Además es importante que tenga en cuenta la palabra Default a lado de la etiqueta del estado “False”. El estado Default significa que el programa se destinará ahí si ninguno de los otros estados se aplica.
Utilizará el estado Default y cambiará el nombre para que sea el estado “STOP”. Para cambia el nombre de un caso ya existente, puede hacer doble clic sobre la etiqueta y a continuación, escriba el nombre que le gustaría que tuviera.
En el estado “STOP”, simplemente tiene que crear una manera de terminar el ciclo While. Para ello, creará una constante booleana True y la cableará hasta la terminal condicional.
Usted puede notar que tiene un icono con la flecha rota en la barra de herramientas. Si hace clic en la flecha rota, aparecerá una lista de errores.
Verá que ha cometido el mismo error tres veces. No ha cableado los túneles de todos los casos.
Vuelva al estado “Idle” y corrija el túnel vacío causado por la constante booleana. En el estado “STOP” tiene un valor True cableado a la terminal condicional del ciclo While para finalizar el programa, pero en el estado “Idle” y en el estado “2nd”, no queremos que termine el ciclo, así que será una constante False en el túnel para ambos casos. Hace esto mediante la colocación de constantes False en el túnel, tanto en el estado “Idle” como en el caso “2nd”.
Todavía tiene un tunel vacío que es necesario corregir y que esta en el estado “STOP” porque no esta conectado al shift register del lado derecho. Despues de que el estado “STOP” no esta haciendo la transición a otro estado, sino solo esta finalizando el programa en ese estado. Puede conectar una cadena vacía para el shift register del lado derecho o, simplemente, cablear el chift register desde el lado izquiero hasta el shift register del lado derecho.
Ahora se dará cuenta de que el túnel está lleno y ya no hay ningún error.
Hay un atajo que puede usar cuando tiene un túnel vacío, que es conveniente, pero puede ser algo peligroso. Va a quitar las dos constantes False que añadió en el estado “Idle” y en el estado “2nd” y retire el cable que creo en shift register en el estado “STOP”. El acceso directo es hacer clic derecho en el túnel vacío, y seleccionar Use Default if Unwire. Solo lo hará por el cable verde proveniente de la constante booleana por ahora.
Tenga en cuenta que despues de seleccionar Use Default if Unwired, el cuadro se medio llena.
Si se desplaza a través de los otros estados, el tunel sigue estando medio lleno, a pesar de que en los otros estados no hay nada conectado.
El valor por defecto que se utiliza en los dos casos que no tienen un cable conectado al tunel verde es False. La razón por la cual es False, es porque en los dos estados que no tienen algo conectado al tunel verde, no queremos que nuestro programa se detenga. Si los valores son False y esos datos entran en la terminal condicional eso significa que no se detendrá el ciclo. Solo el estado “STOP” da un True al valor de la terminal, por lo que solo el estado “STOP” terminará el ciclo y detendrá el programa.
Puede hacer lo mismo con el tunel rosa, que obtiene un valor del String y lleva la información al shift register. Debe tener cuidado porque si accidentalmente olvida cablear algo que tenía la intención que estuviera conectado, LabVIEW no le dice que es un error.
Por ejemplo si selecciona la opción Use Default if Unwired para el tunel rosa, y en el estado “2nd”, olvida cablear la String Constan “STOP” al tunel de color rosa.
En este escenario, el programa se iniciará en el estado “Idle”, y luego irá al estado “2nd”, en el estado “2nd”, algo interesante se va a producir. Puesto que la String Constant no esta conectada, como se muestra en la Figura 141, una cadena vacía se pasa al shift register de la derecha. Sin embargo, no tenemos un caso de una cadena vacía, asi que la pregunta es ¿qué ocurrirá?
¡Irá al caso Default¡ Esto significa que se perderá totalmente el estado “2nd” por lo que es muy importante tener cuidado al seleccionar Use Default if Unwired con las cadenas. Se recomienda que no utilice esta opción en todos los cables de color rosa que contienen cadenas, de modo que no se le olvide cablear algo. Para ello basta conectar una String Constant vacía en el shift register en el caso “STOP”.
También se puede notar qe el túnel se ha vuelto a llenar totalmente de color rosa, y que confirma que ha conectado algo a ese túnel en cada caso.

Volver al índice

Enciclopedia Virtual
Tienda
Libros Recomendados


1647 - Investigaciones socioambientales, educativas y humanísticas para el medio rural
Por: Miguel Ángel Sámano Rentería y Ramón Rivera Espinosa. (Coordinadores)

Este libro es producto del trabajo desarrollado por un grupo interdisciplinario de investigadores integrantes del Instituto de Investigaciones Socioambientales, Educativas y Humanísticas para el Medio Rural (IISEHMER).
Libro gratis
Congresos

15 al 28 de febrero
III Congreso Virtual Internacional sobre

Desafíos de las empresas del siglo XXI

15 al 29 de marzo
III Congreso Virtual Internacional sobre

La Educación en el siglo XXI

Enlaces Rápidos

Fundación Inca Garcilaso
Enciclopedia y Biblioteca virtual sobre economía
Universidad de Málaga
PROGRAMACIÓN DE ROBOTS LEGO MINDSTORMS Pablo Iván Romero De La Rosa Leodegario G. Aguilera Hernández Orlando Meza Zaleta Volver al índice Leer más libros Soy autor ¿Como puedo publicar mi libro? Página principal