Automotive Research
Toolbar
header foto

Behavior tree gebaseerde agent implementatie

De DurableCASE software architectuur is beschreven in termen van autonome softwareprocessen, "agents" genaamd. Zo wordt aan elke individuele robot een Vehicle Operating Agent (VOA) toegevoegd om samenwerking met andere robots mogelijk te maken. Op een centrale server draaien we een Cooperativity Agent (CA), die met alle VOA's communiceert om te zorgen dat routes worden herverdeeld als er een robot uitvalt en om te zorgen dat robots niet botsen op gedeelde route segmenten.

We hebben er voor gekozen om dit multi-agent systeem te implementeren in de infrastructuur die geboden wordt door de tweede generatie van het Robot Operating System (ROS2). In ROS2 worden agents geïmplementeerd als communicerende "nodes". Dergelijke nodes (gecodeerd in C++ of Python) kunnen in ROS communiceren via "topics", "services" of "actions". Al deze primitieven zijn in ROS2 gebaseerd op industrie standaard Data Distribution Service (DDS) middleware.

Het gedrag van agents kun je direct vastleggen in de code van agent nodes. Dat zou ons systeem echter erg star maken qua ontwikkeling en onderhoud. We hebben er daarom voor gekozen om het gedrag van de agents te specificeren met behulp van "Behavior Trees". Een Behavior Tree is een boom bestaande uit beslissingsknopen (Sequence, Fallback, Parallel), actie knopen (Actions) en conditie knopen (Conditions). Actions and Conditions zijn de blaadjes van de boom. In een BT leg je vast wanneer en onder welke conditie welke actie moet worden uitgevoerd.

Als eerste stap in de realisatie van de DurableCASE software architectuur hebben we in ROS2 een implementatie gemaakt van een generieke Behavior Tree gebaseerde agent (BT Agent). Voor het inlezen en interpreteren van BTs hebben we daarbij dankbaar gebruik gemaakt van de "BehaviorTree.CPP" bibliotheek die in ROS2 o.a. ook gebruikt wordt in de navigatie stack (Nav2). Deze BT bibliotheek kan BTs inlezen en executeren die gespecificeerd zijn in een XML file. Zo'n XML file kun je met een gewone tekst editor maken of met een speciale grafische BT editor "Groot" genaamd. De in de BT gedefinieerde condities en acties moeten vervolgens als plugins in C++ uitgecodeerd worden.

Uitgaande van de Lely use case hebben we inmiddels een eerste implementatie gemaakt van een VOA. Daarvoor moesten we eerste de communicatie tussen VOAs en CA vastleggen in termen van ROS communicatieprimitieven en ROS messages. Van Lely hebben we de specificatie gekregen van een interface naar hun embedded software. Vervolgens hebben we op basis van de generieke BT Agent software een specifieke VOA agent gerealiseerd. Wij hebben daarbij gekozen om de benodigde C++ BT plugins zo klein mogelijke te houden door taken te delegeren naar specifieke server processen die we in Python hebben gerealiseerd.