• Keine Ergebnisse gefunden

Implementierung der Zust¨ ande, Ausl¨ oser und Zustandswechsel

Im Dokument f¨ ur den humanoiden Roboter Myon (Seite 48-51)

4. Verhaltenssteuerung 35

4.2. Implementierung der Zust¨ ande, Ausl¨ oser und Zustandswechsel

Der Fokus dieser Arbeit liegt auf der konzeptuellen Beschreibung der Verhaltenssteue-rung, daher wird die Implementierung umgangssprachlich veranschaulicht. Die Imple-mentierung der Zust¨ande und die Kontrolle dar¨uber, wann ein Zustand gewechselt wird, ist im C-Code beschrieben und wird zentral vom Prozessor im BrainModule ausgef¨uhrt.

Zust¨ande werden durch einen Zustandsautomaten verwaltet, wovon jeweils immer nur ein Zustand aktiv sein kann. Die Analyse von externen Ausl¨osern und internen Zustands-wechseln wird vom Prozessor sequentiell in einer Endlosschleife (MainLoop) betrieben.

Aufgrund von rechenintensiven Nebenprozessen des zentralen Rechenknotens, wie z. B.

weitere Audio- und Bildverarbeitung und die Speicherung von interessanten Sensordaten auf der SD-Karte (vgl. Abschnitt 3.2.3), ben¨otigt ein Durchlauf der MainLoop und somit die Aktualisierung des Zustandsautomaten im Schnitt vier mal l¨anger als die sensomo-torische Schleife mit 100 Hz.

Ein Zustand definiert eine Motorenansteuerung des gesamten Roboters und h¨alt somit entsprechende Parameter f¨ur die verschiedenen Regelschleifen der Motoren vor. Neben den bin¨aren enable-Werten eines Zustands ben¨otigen die meisten Regelungsstrukturen weitere Parameter, die innerhalb eines Zustands dynamisch angepasst werden, wie z. B.

Kp(t) und xs(t) eines P-Reglers. Pro Zustand werden in der Regel zwischen zwei und zehn verschiedene Parameter dynamisch ver¨andert, welche ¨uber den SpinalCord an die Regelungsstrukturen gesendet werden. Die ¨Ubertragung erfolgt ¨uber ein Zeitmultiplex-verfahren, indem pro SpinalCord-Takt ein Wertepaar ¨ubertragen wird, das einerseits aus einem Index zum Demultiplexen5 besteht und andererseits aus dem entsprechenden Pa-rameterwert. Im C-Code kann pro Parameter ein FlagenableValueTransmission gesetzt werden, das dar¨uber entscheidet, ob der Parameter ¨ubertragen werden soll oder nicht. So werden in einer Sendeschleife alle Parameter sukzessiv ¨ubertragen. Um die Sendeschlei-fe kurz zu halten werden Parameter inaktiver Zust¨ande nicht ¨ubertragen. Die enable-Werte hingegen werden stets f¨ur alle Zust¨ande ¨ubertragen, damit die Exklusivit¨at eines Zustands auch an den Regelungsstrukturen gew¨ahrleistet ist. Die in diesem Abschnitt beschriebene Implementierung erlaubt, dass eine hohe Anzahl verschiedener Zust¨ande

5Das Demultiplexen funktioniert ¨uber eine Struktur im BrainDesigner, welche auf einem speziellen SpinalCord-Kanal lauscht und genau in dem Takt aktiviert wird, in dem der Wert auf diesem Kanal dem gegebenen Index der Struktur entspricht. In diesem Takt wird der Parameterwert aus einem weiteren Kanal gelesen und gespeichert. Als Ausgabe gibt die Struktur immer den zuletzt gelesenen Parameterwert zur¨uck.

mit mehreren dynamisch ver¨anderbaren Parametern implementiert werden kann, wo-bei die L¨ange der Sendeschleife kurz gehalten wird, welche linear mit der Anzahl der Zust¨ande skaliert.

Ist ein Zustand aktiv, so wird in der MainLoop der Code der Update-Funktion des Zustands aufgerufen. In diesem Teil des Codes werden die f¨ur den Zustand relevan-ten Sensorwerte analysiert und Parameterwerte angepasst. Beschreibt der Zustand ei-ne Bewegungsabfolge, so sind alle Teilbewegungen in diesem Teil des Codes in eiei-nem weiteren, einfachen Zustandsautomaten aufgef¨uhrt. Wird ein Zustand verlassen – aus-gel¨ost entweder durch eine Interaktion oder einen internen Ausl¨oser – so wird zuerst eine Deaktivierungs-Funktion ausgef¨uhrt, in der Parameterwerte reinitialisiert werden, damit sie keine veralteten Parameterwerte beim Demultiplexen liefern. Anschließend wird die Aktivierungs-Funktion des folgenden Zustands aufgerufen. Dort wird, neben entspre-chenden Initialisierungen, ¨uber die FlagsenableValueTransmission festgelegt, welche Pa-rameter f¨ur diesen Zustand ¨uber den SpinalCord gesendet werden. Die Aktivierungs- und Deaktivierungs-Funktionen werden jeweils einmalig aufgerufen, wohingegen die Update-Funktion innerhalb einer Schleife ausgef¨uhrt wird. Der Zeitpunkt t0 eines Zustands be-schreibt stets den Ausf¨uhrungszeitpunkt, zu dem die Aktivierungs-Funktion aufgerufen wird.

Aus Gr¨unden des Selbstschutzes des Roboters und der Transparenz dem Anwender ge-gen¨uber wurde bei einem Zustandswechsel ein Zwischenschritt mit zus¨atzlichen Abfragen und Best¨atigungen eingef¨uhrt, welcher vor allem vor dynamischen Bewegungen wichtig ist. Im Zustandsautomatengraph ist dieser Schritt als Sicherheitszustand aufgef¨uhrt. Bei diesem Zwischenschritt handelt es sich um das Vorbereiten eines n¨achsten Zustands.

Das bedeutet, dass der aktuelle Zustand zwar weiterhin exklusiv aktiv bleibt, allerdings bei jeder Aktualisierung gepr¨uft wird, ob die entsprechende Aktivierungsbedingung des gew¨unschten Folgezustands erf¨ullt ist. Dadurch ist sichergestellt, dass sicherheitskritische Bewegungen, bei denen der Anwender den Roboter st¨utzen oder festhalten muss, nur genau dann aktiviert werden k¨onnen, wenn der Anwender die Aktivierung auch best¨atigt.

Wie in Abschnitt 3.2.2 beschrieben, ist ein Datum, das ¨uber den SpinalCord gesendet wird, ein vorzeichenbehaftetes 16-Bit-Wort, was dem C99-Integer-Typ

”signed short int“

entspricht. Dieser ganzzahlige Datentyp wird im weiteren Verlauf der Arbeit daher stets mit short16 bezeichnet. Der BrainDesigner hingegen verwendet eine Zahlendarstellung im Wertebereich von −1,0 bis 1,0. Die Skalierung einer Zahl z vom Typ short16 auf

den Wertebereich [−1,0,1,0) erfolgt durch die einfache Multiplikationz·32768−1. Somit ergibt sich ein rationaler Wertebereich. Zur verbesserten Lesbarkeit wird ein Wert und ein Wertebereich im Folgenden stets rational angegeben. Außerdem wird der maximale Positivwert 32767·32768−1 stets gerundet als 1,0 angegeben, weshalb auch ein maxima-ler Wertebereich als geschlossenes Intervall [−1,0,1,0] angegeben wird. Integer werden nur dann zus¨atzlich aufgef¨uhrt, wenn es f¨ur die Implementierung wichtig ist.

4.2.1. ¨Ubersicht ¨uber verwendete mathematische Funktionen

Die im Folgenden verwendeten Funktionen werden zur ¨Ubersicht an dieser Stelle angege-ben und erl¨autert. Eine Auflistung aller minimaler und maximaler Winkelpositionswerte des Roboters Myon findet sich im Anhang in Tabelle A.1.

Funktion Erl¨auterung

φn,ml,r (t) Die Winkelposition eines Gelenksnmit Orientierungm zum Zeitpunkt tder linken (l) oder rechten (r) K¨orperh¨alfte.

φn,m(t) Gemittelte Winkelposition aus linkem und rechtem Gelenknmit Orientierungm zum Zeitpunktt.

clipmaxmin(x)

Einschr¨anken vonx auf den Wertebereich [min,max]. Wird eine Grenze wegelassen, so entspricht die Grenze dem Maximum

1,0= 32767b ·32768−1 bzw. dem Minimum−1,0 =−32768·32768−1. since(t, talt) Anzahl an SpinalCord-Iterationen, die zwischen zwei Ausf¨

uhrungs-zeitpunktent undtalt der MainLoop liegen.

Tabelle 4.2. Ubersicht ¨¨ uber wichtige Funktionen, die im Folgenden verwendet wer-den.

Im Dokument f¨ ur den humanoiden Roboter Myon (Seite 48-51)