Das Zusammenspiel zwischen einem BehaviourController und einem MetaController funktioniert ganz gut. Abhängig von dem momentanen Zustand kann der MetaController auf alternative Behaviours umschalten.
Aber ich habe folgendes festgestellt:

MetaController
Momentan ist das Aufzeichnen und die Suche nach Ähnlichkeiten im Verhalten direkt an die Behaviours gekopplelt. Das erkennen, ob er z.B. 5 oder 8 Obstacle-Side States zur Verfolgung eines Wandabschnittes beim "FollowWall" benötigt ist schwierig.

Deshalb:

ReflectionController
Ausgehend von den bisherigen Versuchen glaube ich, dass noch ein "Reflection"-Controller zwischen dem BehaviourController un dem MetaController benötigt wird.
Insbesondere das Verhalten des "FollowWall"-Behaviour ist zu komplex um es direkt in der einen oder anderen Schicht zu behandeln. Beispiel sei hier das erkennen, ob der "FollowWall" gerade einer konkave- oder konvexe-Biegung folgt. Für den Behaviour ist es einfach nur eine Wandverfolgung, für die übergeordnete Ebene ist es interessant, welchen Winkel diese gerade hat.
Weitere auf diese Ebene implementierbare Funktionen sind der Zusammenhang zwischen der aktuellen
Ausrichtung des Robots (Odometrie, Licht, Kompass, Kamera-FixingPoint, ...) und seinen Bewegungen.

Speziell beim "FollowWall" fehlt mir eine Zwischenschicht zwischen dem komplexen Bewegungen und dem "was mache ich momentan".
Auch das zum Teil relativ komplexe "Escape" Verhalten wäre hier besser aufgehoben, das eine "Ich sitze in der Falle" Verhalten implementiert.

Ergebnis ist, dass der Meta-Controller nicht ganz so "feingestaffelte" Verhalten beobachen muss, wie momentane und die Suche nach Wiederholungen einfacher wird.

Gruß.
smk