用於設計和控制人工群體的 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/
中包含的腳本中找到多種操作機器人的方法。