Una biblioteca de Python para el diseño y control de enjambres artificiales.
Este paquete incluye herramientas para controlar o simular partes de hardware específicas de un robot capaz de (i) locomoción, (ii) detección y (iii) comunicación con el objetivo de realizar investigaciones experimentales en enjambres artificiales. También incluye algunos modelos de comportamiento de enjambre creados con estas herramientas. Para obtener más información, consulte http://journal.frontiersin.org/article/10.3389/frobt.2017.00012/
El diseño de robots utilizando esta biblioteca consta de tres piezas principales:
La biblioteca marabunta sigue esta estructura y proporciona las siguientes clases:
Body
con los métodos necesarios para usarlo como cuerpo de un robot. Cualquier modelo de cuerpo debe heredar de esta clase para ser aceptado por BaseRobot
.Body
para simular el cuerpo de un robot. No requiere ningún hardware para su uso. Se puede cargar un archivo con una lista de coordenadas para incluir obstáculos en la simulación.Body
para controlar un eBot. Requiere conexión bluetooth, un eBot y la eBot-API adecuada instalada.Network
con los métodos necesarios para utilizar como red de un robot. Cualquier modelo de red debe heredar de esta clase para que BaseRobot lo acepte.Network
para simular la comunicación usando archivos normales (se supone que los diferentes robots están en la misma computadora, o al menos pueden acceder a los mismos archivos). No requiere ningún hardware para su uso.Network
utilizando un XBee serie 1. Requiere un XBee conectado a través de un puerto serie.BaseBody
y una instancia de red que hereda de BaseNetwork
.MockBody
. Los obstáculos se cargan desde un archivo y se almacenan en una cuadrícula utilizando "listas Verlet" para un acceso rápido a los datos de obstáculos locales. Para instalar el módulo, escriba:
python setup.py install
(puede requerir sudo
dependiendo de su sistema). Esto instalará el módulo marabunta
y su submódulo marabunta.models
.
Para controlar eBots a través de eBotBody
es necesario tener instalada la API de eBot. La versión oficial se puede encontrar en https://github.com/EdgeBotix/eBot-API. En https://github.com/david-mateo/eBot-API se puede encontrar una bifurcación de esta API que utiliza la CPU del host para calcular la localización del robot mediante la implementación de un filtro de Kalman en lugar de depender de la localización de eBot.
Para diseñar el comportamiento de un robot, se debe definir una nueva clase que herede de BaseRobot
. La inicialización de BaseRobot
requiere de un cuerpo, implementado como una clase heredada de BaseBody
, y una red, una clase heredada de BaseNetwork
.
Para agregar soporte para hardware nuevo, se deben implementar clases heredadas de BaseBody
o BaseNetwork
. Estas clases contienen la lista mínima de métodos que cualquier organismo o red debería implementar.
Para utilizar los métodos proporcionados para hacer que el robot se mueva siguiendo un comportamiento particular, digamos un consenso de encabezado, hay que definir el cuerpo, la red, el robot, encenderlo y llamar iterativamente a su método update
. Un código de ejemplo mínimo es:
from marabunta import eBotBody , XBeeNetwork
from marabunta . models import HeadingConsensusRobot
total_time = 60
ID = "Walle"
init_pos = [ 0. , 0. ]
init_heading = 0.
communication_slot = 0.1
body = ebotBody ( init_pos , init_heading )
network = XBeeNetwork ( communication_slot , communication_slot + 0.1 , 1 , ID )
robot = HeadingConsensusRobot ( body , network )
robot . turn_on ()
# MAIN LOOP
end_time = time () + total_time
while time () < end_time :
robot . update ( dt , speed )
sleep ( dt )
robot . turn_off ()
Cualquier robot que herede de BaseRobot
tiene métodos __enter__
y __exit__
que permiten usar el robot con la instrucción with
en lugar de activarlo y desactivarlo explícitamente. Esta opción proporciona una forma más limpia de operar el robot ante posibles fallas de hardware. Un código de ejemplo mínimo que sigue este enfoque es:
from marabunta import eBotBody , XBeeNetwork
from marabunta . models import HeadingConsensusRobot
total_time = 60
ID = "Walle"
init_pos = [ 0. , 0. ]
init_heading = 0.
communication_slot = 0.1
body = ebotBody ( init_pos , init_heading )
network = XBeeNetwork ( communication_slot , communication_slot + 0.1 , 1 , ID )
with HeadingConsensusRobot ( body , network ) as robot :
# MAIN LOOP
end_time = time () + total_time
while time () < end_time :
robot . update ( dt , speed )
sleep ( dt )
Se pueden encontrar varias formas de operar los robots en los scripts contenidos en examples/
.