Creación y Aplicación de la Arquitectura Subsumption Orientada a Comportamientos, para controlar un robot Lego NXT bajo el ambiente Java-LeJOS
Algunas Arquitecturas Orientadas a comportamientos:
Basada en esquemas:
Permite que cada elemento pueda ser instanciado o finalizado
en cualquier momento, de acuerdo con la tarea a realizar y el estado del entorno,
lo que dota a la arquitectura con una capacidad importante. Cada comportamiento es implementado como un
conjunto de esquemas. Ver mas...
Redes de activación:
En esta arquitectura, un agente es visto como un conjunto de competencias
(comportamientos) módulos, y la selección de acciones se modela como una
propiedad emergente de una dinámica de activación / inhibición entre estos
módulos. El método de coordinación es competitivo, un solo módulo puede estar
activo en cualquier momento. Ver mas...
Distribuida para navegación móvil:
Incluye un modulo de coordinación basado en votación. Cada comportamiento
arroja un número de votos a favor o en contra de un conjunto predefinido de
acciones. Los comportamientos tienen un peso asignado. La acción con más votos
se selecciona y los actuadores se ajustan convenientemente. Cada grado de
libertad (es decir, de giro y velocidad) tiene su propio árbitro, lo que
aumenta la modularidad. Ver mas...
Acerca de la Arquitectura Subsumption:
Rodney Brooks desarrolló la arquitectura Subsumption. La arquitectura Subsumption se presentó en 1986 en el documento "A Robust Layered Control System for a Mobile Robot”. La idea era conectar directamente la percepción y la acción, descartando los modelos internos. El controlador debe ser descompuesto de forma simultánea y asíncrona en capas orientados a tareas, capas que trabajan en distintos objetivos (caminar, evitar los obstáculos, etc.).
Componentes de la Arquitectura Subsumption:
- Comportamientos o capas: Para implementar un algoritmo de control para un robot usando la arquitectura subsumption, se debe descomponer o separar en módulos cada una de las diferentes tareas, objetivos o incluso sensores en comportamientos diferentes. Cada uno de estos comportamientos, debe tener una condición de inicio, algo que se debe satisfacer para determinar el instante en el cual dicho comportamiento tome el control del robot, también se debe definir alguna acción a ejecutar en cuanto el robot termina de ejecutar el comportamiento, esta acción deberá ser lo más corta posible, generalmente se utiliza para cambiar el estado de algún indicador, por último se debe definir la acción a ejecutar en el momento en que el comportamiento toma el control del robot. Adicionalmente a esto, se debe pensar en la importancia o relevancia de cada comportamiento con respecto a los demás, permitiendo saber cuáles comportamientos predominan sobre los otros y cuáles no.
- Árbitro: Este componente, es el encargado de iniciar la ejecución de los comportamientos y de dar el control del robot a cierto comportamiento en el momento en que la condición de inicio indicada en un este se cumpla. En caso de que dos o más comportamientos cumplan sus condiciones de inicio en un instante dado, solo el comportamiento de mayor importancia será el que tome el control.
Acerca de Java-LeJOS:
LeJOS
es un entorno de desarrollo basado en Java, que permite programar
robots Lego NXT bajo el firmware LeJOS, con gran facilidad . Saber mas...
La Arquitectura Subsumption en Java-LeJOS:
Java-LeJOS ofrece la librería Subsumption que hace parte del paquete lejos.robotics.subsumption.
Dicho paquete contiene la clase Arbitrator y la interfaz Behavior, útiles para
la gestión de los comportamientos y la creación de estos con cada uno de sus
componentes respectivamente.
La interfaz Behavior:
Esta interfaz, es la cual nos va a permitir crear cada uno de los módulos
que representarán los diferentes comportamientos que componen nuestro algoritmo
de control. Esta interfaz está compuesta por tres métodos abstractos que nos
permitirán definir todas las características de un comportamiento. Estos son:
- boolean takeControl(): Este método retorna un valor de tipo booleano, de acuerdo al valor de verdad de este, el comportamiento toma el control. Es decir en el momento en que tome un valor verdadero, el árbitro le sede el control del robot a este comportamiento, siempre y cuando no exista otro comportamiento de prioridad mayor que cumpla también su condición de inicio.
- void action(): El código contenido en este método, es el que será ejecutado en cuanto el comportamiento tome el control del robot, representa la tarea a ejecutar por el robot en ese momento, en cuanto la ejecución del código termina, el método retorna.
- void suppress(): Este método debe ser lo más corto posible, es ejecutado en cuanto el método action() termina su ejecución, es usado generalmente para establecer el valor de alguna variable de control del propio comportamiento o de otros, por ejemplo una “flag”.
Para crear un comportamiento solo basta con implementar la interfaz
Behavior y los métodos abstractos.
Ilustración 1 Creación de un comportamiento en Java-LeJOS
En cuanto se tengan creadas las clases correspondientes a cada
comportamiento, se deben crear las instancias correspondientes, y
posteriormente un arreglo de comportamientos ordenados según su importancia,
siendo el de menor índice el menos importante.
Ilustración 2 Instanciación de comportamientos en Java-LeJOS
La Clase Arbitrator:
La clase Arbitrator es encargada de gestionar los comportamientos según su
importancia y dar el control a cada uno en cuanto se cumplan las condiciones de
inicio. Esta clase posee un único método:
- Public void start(): Este método comienza el ciclo de gestión de los comportamientos, hasta que el programa termine en la ejecución de algún comportamiento o todos los comportamientos estén inactivos.
La clase Arbitrator posee dos constructores, para poder instanciar y dar
inicio a la ejecución, ambos reciben como argumento el arreglo de
comportamientos ordenado según su relevancia:
Ilustración 3 Constructor Clase Arbitrator
El segundo constructor recibe un argumento adicional:
Ilustración 4 Constructor Clase Arbitrator con dos argumentos
Si el valor del segundo argumento es verdadero, el árbitro finalizará su
ejecución en el momento en que no exista algún comportamiento activo. Si se
enviara este argumento con valor falso, sería idéntico a utilizar el primer
constructor.
Implementación en un ejemplo real:
Este algoritmo es un evasor de obstaculos, consiste en hacer que el robot este avanzando constantemente hacia adelante hasta encontrar un obstaculo, en ese momento girará a la izquierda y seguira avanzando hasta encontrar otro. Mientras el boton escape no sea presionado.
Este algoritmo es un evasor de obstaculos, consiste en hacer que el robot este avanzando constantemente hacia adelante hasta encontrar un obstaculo, en ese momento girará a la izquierda y seguira avanzando hasta encontrar otro. Mientras el boton escape no sea presionado.
Ilustración 5 Implementación de un ejemplo real.
Videos:
A continuación pondré dos videos con la implementación de este algoritmo linealmente y con la arquitectura Subsumption.
Implementación con Arquitectura Subsumption
Implementación Lineal
Se puede apreciar una diferencia notable en los tiempos que le lleva al robot llegar al final en cada video, sin embargo esta diferencia no tiene nada que ver con la implementacion del algoritmo, sino a factores externos a esto como son friccion, impresicion en los giros, etc.
En la siguiente grafica, se muestran cinco eventos en los que se tomaron los tiempos de cada algoritmo, los tiempos son bastante dispersos, sin embargo el promedio de estos tiempos es muy cercano:
Arquitectura Subsumption VS Algoritmo Lineal:
Conclusiones:
- La arquitectura Subsumption orientada a comportamientos, es una muy buena práctica al momento de programar robots, permitiendo generar buen código, comprensible y modular.
- Implementar un algoritmo controlador en arquitectura Subsumption, abre las puertas a múltiples posibilidades al momento de programar, sin embargo no ofrece mayores cambios en eficiencia con respecto a un algoritmo implementado linealmente.
- En el momento de programar un robot, lo ideal es hacerlo desde un comienzo con una arquitectura orientada a comportamientos y no realizar una implementación lineal para ser transformada luego en dicha arquitectura.
- Al implementar algoritmos en la arquitectura subsumption, es muy posible que no se obtengan mejoras a nivel de eficiencia, sin embargo es importante pensar si esta implementación permitiría llegar a un desempeño más eficaz del robot, permitiendo llevar a cabo tareas que antes no era posible.
- Implementar un algoritmo con la arquitectura Subsumption, permitirá a futuro aumentar la cantidad de comportamientos existentes con gran facilidad, pudiendo así mejorar el alcance y desempeño del robot o incluso eliminar comportamientos que ya no sean útiles.
- Al tener la posibilidad de tener múltiples comportamientos, se podría pensar en la posibilidad de tener un repositorio de comportamientos, que puedan ser utilizados por el robot, dadas ciertas condiciones.
Escrito por: Juan David Meza Gonzalez. Grupo SINTELWEB. Universidad Nacional de Colombia Sede Medellín.
No hay comentarios:
Publicar un comentario