Une bibliothèque Python pour la conception et le contrôle d'essaims artificiels.
Ce package comprend des outils permettant de contrôler ou de simuler des parties matérielles spécifiques d'un robot capable de (i) locomotion, (ii) détection et (iii) communication dans le but d'effectuer des recherches expérimentales sur l'essaimage artificiel. Il comprend également certains modèles de comportement d’essaimage construits à l’aide de ces outils. Pour plus d'informations, voir http://journal.frontiersin.org/article/10.3389/frobt.2017.00012/
La conception de robots utilisant cette bibliothèque se compose de trois éléments principaux :
La bibliothèque marabunta suit cette structure et propose les classes suivantes :
Body
avec les méthodes requises pour l'utiliser comme corps de robot. Tous les modèles de corps doivent hériter de cette classe pour être acceptés par BaseRobot
.Body
pour simuler un corps de robot. Ne nécessite aucun matériel pour être utilisé. Un fichier avec une liste de coordonnées peut être chargé pour inclure des obstacles dans la simulation.Body
pour contrôler un eBot. Nécessite une connexion Bluetooth, un eBot et l'API eBot appropriée installée.Network
avec les méthodes requises pour l'utiliser comme réseau d'un robot. Tous les modèles de réseau doivent hériter de cette classe pour être acceptés par BaseRobot.Network
pour simuler la communication à l'aide de fichiers normaux (en supposant que les différents robots sont dans le même ordinateur, ou au moins peuvent accéder aux mêmes fichiers). Ne nécessite aucun matériel pour être utilisé.Network
utilisant un XBee série 1. Nécessite un XBee connecté via un port série.BaseBody
et une instance de réseau qui hérite de BaseNetwork
.MockBody
. Les obstacles sont chargés à partir d'un fichier et stockés dans une grille à l'aide de "listes Verlet" pour un accès rapide aux données locales des obstacles. Pour installer le module, tapez :
python setup.py install
(peut nécessiter sudo
selon votre système). Cela installera le module marabunta
et son sous-module marabunta.models
.
Pour contrôler les eBots via eBotBody
il faut que l'eBot-API soit installée. La version officielle peut être trouvée sur https://github.com/EdgeBotix/eBot-API. Un fork de cette API qui utilise le processeur hôte pour calculer la localisation du robot en implémentant un filtre de Kalman au lieu de s'appuyer sur la localisation de l'eBot peut être trouvé sur https://github.com/david-mateo/eBot-API.
Pour concevoir un comportement de robot, il faut définir une nouvelle classe qui hérite de BaseRobot
. L'initialisation de BaseRobot
nécessite un corps, implémenté comme une classe héritant de BaseBody
, et un réseau, une classe héritant de BaseNetwork
.
Pour ajouter la prise en charge du nouveau matériel, il faut implémenter des classes héritant de BaseBody
ou BaseNetwork
. Ces classes contiennent la liste minimale de méthodes que tout organisme ou réseau devrait implémenter.
Pour utiliser les méthodes fournies pour faire bouger le robot selon un comportement particulier, par exemple un consensus de cap, il faut définir le corps, le réseau, le robot, l'allumer et appeler de manière itérative sa méthode update
. Un exemple de code minimal est :
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 ()
Tout robot héritant de BaseRobot
possède les méthodes __enter__
et __exit__
qui permettent d'utiliser le robot avec l'instruction with
au lieu de l'allumer et de l'éteindre explicitement. Cette option offre une manière plus propre de faire fonctionner le robot face à d’éventuelles pannes matérielles. Un exemple de code minimal suivant cette approche est :
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 )
On peut trouver plusieurs manières de faire fonctionner les robots dans les scripts contenus dans examples/
.