Uma biblioteca Python para projeto e controle de enxames artificiais.
Este pacote inclui ferramentas para controlar ou simular partes específicas de hardware de um robô capaz de (i) locomoção, (ii) detecção e (iii) comunicação com o objetivo de realizar pesquisas experimentais em enxameação artificial. Também inclui alguns modelos de comportamento de enxameação construídos com essas ferramentas. Para obter mais informações, consulte http://journal.frontiersin.org/article/10.3389/frobt.2017.00012/
O projeto de robôs utilizando esta biblioteca consiste em três peças principais:
A biblioteca marabunta segue esta estrutura e fornece as seguintes classes:
Body
com os métodos necessários para usar como corpo de um robô. Quaisquer modelos de corpo devem herdar desta classe para serem aceitos por BaseRobot
.Body
para simular o corpo de um robô. Não requer nenhum hardware para uso. Um arquivo com uma lista de coordenadas pode ser carregado para incluir obstáculos na simulação.Body
para controlar um eBot. Requer conexão Bluetooth, um eBot e o eBot-API apropriado instalado.Network
com os métodos necessários para usar como rede de um robô. Quaisquer modelos de rede devem herdar desta classe para serem aceitos pelo BaseRobot.Network
para simular a comunicação usando arquivos regulares (assume que os diferentes robôs estão no mesmo computador, ou pelo menos podem acessar os mesmos arquivos). Não requer nenhum hardware para uso.Network
usando um XBee série 1. Requer um XBee conectado através de uma porta serial.BaseBody
e uma instância de rede que herda de BaseNetwork
.MockBody
. Os obstáculos são carregados a partir de um arquivo e armazenados em uma grade usando "listas Verlet" para acesso rápido aos dados locais dos obstáculos. Para instalar o módulo, digite:
python setup.py install
(pode exigir sudo
dependendo do seu sistema). Isto instalará o módulo marabunta
e seu submódulo marabunta.models
.
Para controlar eBots através eBotBody
é necessário ter o eBot-API instalado. A versão oficial pode ser encontrada em https://github.com/EdgeBotix/eBot-API. Uma bifurcação desta API que usa a CPU do host para calcular a localização do robô implementando um filtro Kalman em vez de depender da localização do eBot pode ser encontrada em https://github.com/david-mateo/eBot-API.
Para projetar o comportamento de um robô, deve-se definir uma nova classe que herda de BaseRobot
. A inicialização do BaseRobot
requer um corpo, implementado como uma classe herdada de BaseBody
, e uma rede, uma classe herdada de BaseNetwork
.
Para adicionar suporte para novo hardware, deve-se implementar classes herdadas de BaseBody
ou BaseNetwork
. Essas classes contêm a lista mínima de métodos que qualquer órgão ou rede deve implementar.
Para usar os métodos fornecidos para fazer o robô se mover seguindo um comportamento específico, digamos, consenso de direção, é necessário definir o corpo, a rede, o robô, ligá-lo e chamar iterativamente seu método update
. Um código de exemplo mínimo é:
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 ()
Qualquer robô herdado de BaseRobot
possui métodos __enter__
e __exit__
que permitem usar o robô com a instrução with
em vez de ligá-lo e desligá-lo explicitamente. Esta opção fornece uma maneira mais limpa de operar o robô diante de possíveis falhas de hardware. Um exemplo de código mínimo seguindo esta abordagem é:
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 )
Podem-se encontrar diversas maneiras de operar os robôs nos scripts contidos em examples/
.