3.2 Automated blind spectral line detection: main assumptions and choices
3.2.4 The issue of calibration and normalization of spectral data for
El primer comportamiento que se definió fue un portero. La figura 4.1 muestra la gráfica de la máquina de estados más general de este jugador, el cual se conceptualizó de la siguiente manera: inicialmente debe de colocarse en su portería (estado inicial Ubicarse), una vez en posición busca el balón (Buscar balón), cuando lo encuentra simplemente se coloca frente a él (Defender portería), si éste se encuentra cerca va tras él e intenta realizar un despeje; una vez realizado un despeje el jugador regresaría a su posición al centro de la portería de nuevo para defenderla, en caso de que este no pudiera alcanzar el balón en determinado tiempo entonces regresaría a su posición original.
En la figura 4.1 se muestran las transiciones entre los estados junto con los eventos que las disparan. La prioridad se indica con el número entre paréntesis de cada transición, un número menor significa una prioridad mayor.
Figura 4.1 Máquina de estados básica de un jugador de tipo portero.
La descripción en XML que define la máquina de estados más general de este jugador es:
<behavior name="Portero" isInitialBehavior="true"> <state name="ubicarse" action="ubicarse"> <transition state="salirADespejar"> <event name="ballVeryNear"></event> </transition>
<transition state="salirADespejar">
<event name="ballOnOwnPenaltyArea"></event> </transition>
<transition state="buscarBalon"> <event name="onPosition"></event> </transition>
</state>
<state name="defenderPorteria" action="observarBalon"> <transition state="despejar">
</transition>
<transition state="salirADespejar"> <event name="ballNear"></event> </transition>
<transition state="buscarBalon">
<event name="ballFound" operator="not"></event> </transition>
<transition state="ubicarse"> <event name="ballFound"/>
<event name="onPosition" operator="not"/> </transition>
</state>
<state name="salirADespejar" action="aproachToBall"> <transition state="buscarBalon">
<event name="ballFound" operator="not"></event> </transition>
<transition state="ubicarse">
<analogEvent name="timer" value="4000"/> </transition>
<transition state="despejar">
<event name="shootDistance"></event> </transition>
</state>
<state name="despejar" action="despeja"> <transition state="ubicarse"> </transition>
</state>
<state name="buscarBalon" action="turnLeft" iterate="true"> <transition state="defenderPorteria">
<event name="ballFound"></event> </transition>
</state>
Como se puede observar las prioridades están dadas implícitamente por el orden en que son definidas las transiciones una transición definida con anterioridad implica una prioridad mayor.
Existen además dos opciones como se señalo en la sección de implementación, que las acciones sean básicas o complejas, en caso de ser complejas debe de existir una máquina de estados de XML que las defina. Por ejemplo el estado ubicarse tiene asociado una acción del mismo nombre ubicarse, puede ser que se tenga ya implementado algún algoritmo para posicionar al robot en un punto determinado del terreno de juego de ser así se puede ocupar como una acción básica, pero también existe la posibilidad de que no se tenga tal implementación, si este es el caso podemos generar una nueva máquina de estado como la mostrada en la figura 4.2 que sólo resuelva este problema de ubicase.
Figura 4.2 Máquina de estados para ubicarse en determinada posición.
Una vez definida entonces se puede trasladar a XML, agregarlo a nuestro archivo de definición de comportamiento y automáticamente el robot cuando se encuentre en un estado de ubicarse en realidad estará corriendo esta máquina de estado. La definición en XML del comportamiento ubicarse es la siguiente:
<behavior name="ubicarse">
<transition state="movDerecha">
<event name="PositionAtRight"></event> </transition>
<transition state="movIzquierda">
<event name="PositionAtLeft"></event> </transition>
</state>
<state name="irAdelante" action="goForward"> <transition state="movDerecha">
<event name="PositionAtRight"></event> </transition>
<transition state="movIzquierda">
<event name="PositionAtLeft"></event> </transition>
</state>
<state name="movDerecha" action="lateralRight"> <transition state="irAdelante">
<event name="PositionAtFront"></event> </transition>
<transition state="irAtras">
<event name="PositionAtBack"></event> </transition>
</state>
<state name="movIzquierda" action="lateralLeft"> <transition state="irAdelante">
<event name="PositionAtFront"></event> </transition>
<transition state="irAtras">
<event name="PositionAtBack"></event> </transition>
</state> </behavior>
Con esta misma técnica se pueden generar construcciones complejas para cada una de las acciones que se encuentran asociadas a nuestra máquina de estados general de la figura 4.1.
En la secuencia de la figura 4.2 se muestran algunos de los movimientos del agente portero, la figura fue tomada directamente del simulador activando la función de visualización de trayectorias tanto para el robot como para el balón. En la figura 4.3 se observa que el portero rojo salió a despejar ante un tiro a gol del equipo azul, posteriormente al ver la pelota lejos regresa a su posición dentro de la portería. Se observa también como el equipo azul no ha dejado de seguir el balón.
Figura 4.3 Secuencia de movimientos del agente portero.
En la ventana de comportamientos se puede navegar dentro de la máquina de estados jerárquica de este agente, ver en que estado se encuentra y el por qué de cada una de las acciones que realiza, inclusive se puede suspender el juego para analizar con detalle a cada uno de los jugadores y hacer propuestas para mejorar la estrategia de juego. En la figura 4.4 se muestra la máquina de estados generada por el simulador, en ese momento el robot se encontraba en el estado ubicarse (único con color de fondo), es bueno comparar este diagrama con el generado originalmente y ver que la congruencia es excelente. Los colores de las transiciones entre los estados brindan mayor claridad ya que tienen el mismo color que el estado del cual se originan.
Figura 4.4 Máquina de estados del jugador portero.
Si se desea consultar con mayor detalle cuales son las transiciones del estado, se puede presionar el botón izquierdo del mouse el cual mostrará a detalle las transiciones y los eventos que estas contienen, además de información del estado como la acción atómica, o la acción compleja según sea el caso, el la figura 4.5 se muestra la ventana de detalle del estado “Ubicarse”.
Figura 4.5 Detalle del estado “Ubicarse”, de un jugador tipo portero.
Las transiciones con mayor prioridad tienen un índice menor, si todas las transiciones se activaran la transición “0” hacia el estado “salir a despejar” es la que provocaría un cambio de estado.
El detalle indica que su acción es compleja es decir esta formada por otra máquina de estados, al dar clic sobre este estado se mostrará la máquina de estados asociada a este estado, en este ejemplo al dar clic sobre el estado ubicarse se muestra la ventana de la figura 4.6. Nótese la similitud entre la máquina de estados generada automáticamente y la máquina de estados propuesta inicialmente.
Figura 4.6 Máquina de estados del sub-estado ubicarse de un jugador tipo portero.
Todos los estados de esta máquina de estados son atómicos, por lo que al dar clic sobre cualquiera de estos sólo mostrarán el detalle de cada estado. Por ejemplo al dar clic sobre el estado “ir adelante” se mostrará la ventana de la figura 4.7.
Figura 4.7 Máquina de estados del sub-estado ubicarse de un jugador tipo portero.
Al encontrarse activo este estado el robot caminará hacia adelante, la cual es una acción previamente programada en el robot.
Al igual que el estado ubicarse “salir a despejar”, “despejar” y “defender portería” son a su vez máquinas de estado definidas a través de XML. En la figura 4.8 se muestran estas sub- máquinas de estado.
a) Comportamiento para acercarse al balón.
b) Comportamiento para observar el balón sin seguirlo.
c) Comportamiento atómico para patear el balón.
Figura 4.8 Ejemplos de sub-máquinas de estado.
La figura 4.8a corresponde a la máquina de estado que se muestra al dar clic sobre el estado salir a despejar esta máquina de estado intenta seguir el balón. Este comportamiento como se verá más adelante puede ser reutilizado por otros jugadores. La figura 4.8b muestra el comportamiento del estado “defender portería” el cual espera a que el balón esté cerca para tomar alguna acción. En la figura 4.8c se muestra una máquina de estados atómica, como se explicó en la implementación no se puede salir de esta hasta que se encuentre en un estado final, se distingue de los demás ya que presenta un fondo de color, si al momento de consultar este comportamiento no se encuentra dentro de un estado final el fondo será de color rojo en caso contrario el fondo será de color azul. Este último comportamiento realiza una patada hacia la derecha o hacia la izquierda dependiendo de la combinación de eventos que se haya dado he inmediatamente pasa a un estado final para terminar con la secuencia de la patada.