• Keine Ergebnisse gefunden

4   Software BrainDesigner

4.2   Plugins und Konfigurationen

Abbildung 40: Links: Fünf Monoflops in einer Test-Structure. Rechts:

CurveDisplay-Ausgabe. In der oberen, roten Kurve ist der Eingang dargestellt. Wenn dieser von +1 auf −1 wechselt, werden alle fünf Mono-flop-Ausgänge (untere Kurven) aktiviert, um nach vom Parameter wf abhängigen Zeiten wieder auf −1 zu wechseln.

Die Systemelemente Input und Output wurden hier genutzt, um Ein- und Aus-gänge von Structures zu erstellen. Inputs und Outputs können aber auch andere Funktionen haben. Beispielsweise ist es möglich, Werte aus Dateien zu lesen bzw. in Dateien zu schreiben oder Werte von einem Roboter zu lesen bzw. An-steuerungswerte für einen Roboter zu schreiben. Mittels UDP-Ein- und Ausgän-gen ist es möglich, per UDP mit anderen Desktop-Programmen zu kommuni-zieren. Zusätzlich zu UDP-Ein- und Ausgängen ist es auch möglich, den gesam-ten BrainDesigner per UDP fernzusteuern. Beispielsweise kann eine Evolutions-software Slider-Werte setzen, das Netz eine gewisse Anzahl Schritte berechnen lassen und aus den Ausgabewerten eine Fitness berechnen und somit den Slider-Wert optimieren.

4.2 Plugins und Konfigurationen

Die Software BrainDesigner an sich stellt nur die grafische Oberfläche zur Ver-fügung, mittels derer hierarchische Netze erstellt werden können. Den Elemen-ten der untersElemen-ten Ebene (Units und Synapsen) ist dabei neuronaler Bytecode hinterlegt (siehe Kapitel 4.3). Die Kompilierung oder Interpretierung dieses Bytecodes wird über Plugins festgelegt. Plugins steuern zudem Ein- und Aus-gänge des Netzes. Somit ist es möglich, neue Roboter oder andere Programme an den BrainDesigner anzuschließen. Derzeit existieren Plugins unter anderem für die Roboter A-Serie, Myon und Semni des Labors für Neurorobotik, zum

Input Output

Lesen und Schreiben von Textdateien (CSV-Format), von Audiodateien (WAV) und zum Kommunizieren mit anderen Programmen (via UDP).

Bevor ein Plugin Berechnungen übernimmt, wird der Netzstruktur-Compiler aufgerufen. Dieser erzeugt aus einem hierarchischen Netz eine flache Liste und bestimmt dabei die Parameter jeder Modulinstanz. Parameter können von einer Structure an eingebettete Structures vererbt werden und auch auf unterster Ebene noch aus Berechnungen bestehen. Beispielsweise kann eine Structure ei-nen Parameter x haben, der an einer Standard-Synapse direkt deren Parameter w zugewiesen wird (w = x), an einer anderen aber in eine Berechnung einbezogen wird (w = 1−x). Wurde diese Structure in eine andere Structure eingebunden und dabei der Parameter x gesetzt, wird vom Netzstruktur-Compiler nicht nur die Kapselung der Structures aufgelöst sondern es werden auch die Parameter der Modulinstanzen berechnet.

Plugins werden beim Start im Unterordner „plugins“ gesucht und dynamisch geladen. Jedes Plugin stellt einen sogenannten PlayerHandler zur Verfügung.

PlayerHandler ist ein Interface, das jedes PlayerHandler-Plugin implementie-ren muss. Neben einigen Funktionen, um den PlayerHandler zu konfigurieimplementie-ren, gibt es vor allem folgende:

NewTopology Mit dieser Funktion wird – nach dem Aufruf des Netz-struktur-Compilers – die aktuelle Netztopologie überge-ben. Konkret handelt es sich um eine Liste sämtlicher un-terschiedlicher Modultypen und ihre Instanzen im Netz.

Für jede Instanz ist angegeben, was an ihren Ein- und Ausgängen angeschlossen ist. Hierarchische Netze sind zu diesem Zeitpunkt bereits aufgelöst, alle Modultypen sind also Units oder Synapsen, wobei hier nicht mehr zwischen diesen unterschieden werden muss.

Start Start der Berechnung.

TimeStep Ein Zeitschritt der Berechnung.

Stop Ende der Berechnung.

Pause Berechnung wird pausiert.

Resume Berechnung wird fortgesetzt.

Abbildung 41: UML-Darstellung des Plugin-Typs PlayerHandler. Play-erHandler ist ein Interface, das sich vom allgemeinen Interface BrainDe-signerPlugin ableitet. Jedes PlayerHandler-Plugin ist eine Realisierung dieses Interfaces. Als Beispiel sind drei Realisierungen angegeben.

Ein Beispiel ist das Plugin FileInOut, das die Möglichkeit bietet, Werte aus Da-teien zu lesen und in DaDa-teien zu schreiben. Über die Konfiguration wird dem BrainDesigner mitgeteilt, dass es den Eingangs- und Ausgangstyp „File“ gibt, der die Parameter „Filename“ und „Position“ erwartet. Die Funktion NewTopology nimmt die Liste der Modulinstanzen entgegen, die beim Aufruf von Start nach passenden Ein- und Ausgängen durchsucht wird. In TimeStep wird in jedem Zeitschritt eine Zeile jeder Eingabedatei gelesen und die Werte der Netzeingänge werden entsprechend gesetzt. Umgekehrt werden die Werte der Netzausgänge vom Typ „File“ in jedem Zeitschritt in die entsprechenden Dateien geschrieben.

Das Plugin FileInOut behandelt also ausschließlich Ein- und Ausgänge. Im Ge-gensatz dazu führt das Plugin StandardPlayerHandler ausschließlich Berech-nungen durch. Für jede Modulinstanz wird in jedem Zeitschritt der übergebene

NewTopology(moduleTypes : List<PH_ModuleType>, moduleInstances : List<PH_ModuleInstance>) : void PluginType SetSetting(name : String, value : String) : void SetPlayerInstance(player : Player) : void

Start() : void

TimeStep(functions : String) : void Stop() : void

Pause() : void Resume() : void

MSeriesDeployment FileInOut StandardPlayerHandler

neuronale Bytecode interpretiert. Das Plugin MSeriesDeployment hingegen kompiliert den neuronalen Bytecode für ARM-Prozessoren und speichert das Ergebnis im Programmspeicher der AccelBoard3D-Prozessoren des Roboters Myon.

Abbildung 42: Das Konfigurations-Fenster des BrainDesigners. Die ge-nutzten Plugins werden hier eingestellt. Die Reihenfolge kann mittels der grünen Pfeile rechts verändert werden, das rote X links entfernt den Ein-trag. Mit Klick auf den grünen Haken kann ein Eintrag deaktiviert werden.

Mit dem grünen Plus links unten können neue Einträge hinzugefügt werden.

Es können immer mehrere Plugins aktiv sein, die dann in einer festgelegten Rei-henfolge ausgeführt werden. Dies wird Konfiguration genannt. Abbildung 42 zeigt das Konfigurationsfenster mit einer beispielhaften Konfiguration. In dieser wird das Netz nicht auf den Roboter geflasht sondern lokal im BrainDesigner ausgerechnet. Es werden jedoch sowohl Werte vom Roboter Myon gelesen („MSeries Input“, vor der Berechnung) als auch Werte an ihn geschrieben

(„MSeries Output“, nach der Berechnung). Bei der gezeigten Konfiguration han-delt es sich also um den Transparent Mode. Abbildung 43 zeigt die Abarbeitung im Überblick.

Abbildung 43: Reihenfolge beim Starten der Berechnung eines Netzes.

Der Netzstruktur-Compiler erzeugt eine flache Liste aller Module ohne Hierarchien und eine Liste aller Modultypen. Anschließend werden ent-sprechend der aktuellen Konfiguration alle Plugins aufgerufen.

Die Frequenz der Berechnung (Zeitschritte pro Sekunde) kann von einem Plugin und somit beispielsweise einem angeschlossenen externen Roboter vorgegeben werden. Ist kein Plugin aktiv, das den Takt vorgibt, macht dies der BrainDesig-ner selbst. Die Frequenz kann im Konfigurations-Fenster festgelegt werden (Standardwert sind 100 Hz) oder mittels eines Hakens bei „Maximum Speed“

die Berechnung schnellstmöglich durchgeführt werden.

Grafisches, hierarchisches Netz

Netzstruktur-Compiler

Flache, hierarchiefreie Liste aller Module

+

Liste aller Modultypen

Plugin 1 NewTopology()

Plugin 2 NewTopology()

Plugin n NewTopology() ...

Ausführungsreihenfolge gemäß Konfiguration