用于设计和控制人工群体的 Python 库。
该软件包包括用于控制或模拟机器人特定硬件部件的工具,该机器人能够(i)运动、 (ii)传感和(iii)通信,目的是在人工集群中进行实验研究。它还包括使用这些工具构建的一些集群行为模型。欲了解更多信息,请参阅http://journal.frontiersin.org/article/10.3389/frobt.2017.00012/
使用该库的机器人设计包括三个主要部分:
marabunta 库遵循此结构并提供以下类:
Body
的最小模型,具有用作机器人身体所需的方法。任何身体模型都应该继承此类才能被BaseRobot
接受。Body
实现。不需要任何硬件即可使用。可以加载包含坐标列表的文件以在模拟中包含障碍物。Body
实现。需要蓝牙连接、eBot 和安装适当的 eBot-API。Network
的最小模型,具有用作机器人网络所需的方法。任何网络模型都应该继承自此类才能被 BaseRobot 接受。Network
实现(假设不同的机器人位于同一台计算机上,或者至少可以访问相同的文件)。不需要任何硬件即可使用。Network
实现。需要通过串行端口连接 XBee。BaseBody
的body实例和一个继承自BaseNetwork
网络实例。MockBody
中的障碍物检测的对象。障碍物从文件中加载并使用“Verlet 列表”存储在网格中,以便快速访问本地障碍物数据。 要安装该模块,请键入:
python setup.py install
(可能需要sudo
具体取决于您的系统)。这将安装marabunta
模块及其marabunta.models
子模块。
要通过eBotBody
控制 eBot,需要安装 eBot-API。官方版本可以在 https://github.com/EdgeBotix/eBot-API 找到。该 API 的一个分支,使用主机 CPU 通过实现卡尔曼滤波器来计算机器人的定位,而不是依赖 eBot 定位,可以在 https://github.com/david-mateo/eBot-API 中找到。
要设计机器人行为,应该定义一个继承自BaseRobot
的新类。 BaseRobot
的初始化需要一个主体(继承自BaseBody
类)和一个网络(继承自BaseNetwork
类)。
要添加对新硬件的支持,应该实现继承自BaseBody
或BaseNetwork
类。这些类包含任何主体或网络应实现的最小方法列表。
要使用提供的方法使机器人按照特定行为移动,例如达成共识,必须定义身体、网络、机器人,将其打开,并迭代调用其update
方法。最小的示例代码是:
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 ()
任何从BaseRobot
继承的机器人都有__enter__
和__exit__
方法,允许通过with
语句使用机器人,而不是显式地打开和关闭它。此选项提供了一种在面临潜在硬件故障时操作机器人的更清洁的方法。采用这种方法的最小示例代码是:
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 )
人们可以在examples/
中包含的脚本中找到多种操作机器人的方法。