Bereits im vorhergehenden Projekt „Hexareinforced“ wurde klar, dass der KI zu wenig Information über die Füße bereitgestellt werden. Da die verwendeten Servos keine Rückmeldung über ihre tatsächliche Position geben, kann die KI die Servos nur ansteuern und hoffen, dass sich die gewünschte Position einstellt. Der Aufbau des Hexa-Pod Beines lässt aber nicht jede von den Servos ansteuerbaren Positionen zu. Dies führt dazu das sich die Servos des Öfteren im Mechanischen Anschlag befinden. Dies ist weder für die KI förderlich, welche eine andere Position annimmt, noch für das Kunststoffgetriebe des Servos. Die verbauten Servos müssen deshalb immer wieder getauscht werden und das Reinforcement-Learning liefert schlechte Ergebnisse: Es wird ein Zustand angestrebt, in dem die Servos sich im mechanischen Anschlag befinden, da sich dort in der Lernphase der höchste Reward eingestellt hat. Außerdem werden oft Zustände angestrebt in dem sich nicht alle Füße am Boden befinden, im Schlechtesten Fall stehen die Füße gerade in die Luft. Dies ist vor allem für die Lidar-Daten schlecht, da die Füße nun als Hindernis erkannt werden.
Ein Beispiel für den ungünstigsten Fall:
Alle Füße des Hexapods befinden sich im mechanischen Anschlag. Vier Beine heben den Körper mit dem Ultraschallsensor in der Luft, die anderen beiden stehen gerade in die Höhe und blockieren die Sicht des Lidar-Sensors. Die KI kann sich aus dieser Situation nicht mehr retten, da das Aufstellen eines der verklemmten Beine zu einem geringeren Reward führen würde: Mithilfe des Accelerometers erkennt die KI, dass der Körper dadurch nur schief wird und entscheidet sich deshalb gegen diese Aktion. Die beiden Beine, welche in der Luft stehen, würden nur bei sehr großen Bewegungen zu einer Änderung führen. Da eine Bewegung dieser Größenordnung sehr viele Schritte benötigt, welche keine Änderungen des Rewards bringen, werden auch diese Füße nicht mehr auf den Boden kommen.
Smart Servos
Die oben genannten Probleme können nur gelöst werden, indem man Servos verwendet, welche mehr Rückmeldung an die Ansteuerung geben. Servos mit verbauter Positionsmessung sind teuer und weisen nicht dieselbe Bauform wie die bereits verwendeten Servos auf. Wollte man andere Servos verwenden, so müssten die Füße des Hexapods komplett neu gezeichnet und am Lasercutter ausgeschnitten werden. Dies stellt einen extremen Aufwand dar, deshalb wurde nach einer Möglichkeit gesucht, welche die bestehenden Servos intelligenter macht.
Die verwendeten Servos verwenden ein einfaches Potentiometer für die Positionsbestimmung im internen Regelkreis. Diese Regler-Platine ist direkt am Motor des Servos angelötet und das Potentiometer ist ungefähr 10 mm darunter im Gehäuse verschraubt. Die vorhandene Regler-Platine zu erweitern ist nicht einfach möglich: Schon allein das Entwerfen des Reglers für den Motor bietet genug Arbeitsaufwand für ein eigenständiges Projekt. Somit muss eine Erweiterung der Funktionalität des Servos mit einer eigenständigen Platine erreicht werden. Diese kann nur im Raum zwischen Potentiometer und Regler-Platine angebracht werden. Somit ist nicht viel Spielraum vorhanden.
Die Smart-Servo-Platine soll einen Mikrocontroller besitzen, der genug IO bietet um:
- alle Ein- / Ausgänge des Potis zu messen
- den Stromverbrauch des Servos mithilfe eines Shunts zu messen
- eine One-Wire Verbindung zum FPGA zu ermöglichen
- ein PWM Signal für die Regler-Platine zu erzeugen
- einen Input des Fuß-Berührung-Sensors auszulesen
und soll dabei noch mitsamt der ganzen externen Schaltung auf eine Platine mit sehr beschränkten Dimensionen passen. Die Entscheidung fiel auf den XMC1100-Q024-F0064A, welcher im Zuge einer großzügigen Spende von Infineon dem Projektteam bereitgestellt wurde.
Die Smart-Servo-Platine soll Positions- und Konfigurationsbefehle vom FPGA entgegennehmen und mit einem Statusbericht antworten. Wird eine Position vom Servo angefahren, so überwacht die Smart-Servo-Platine den aufgenommenen Strom und die Ist-Position des Potentiometers. Wird durch zu hohen Strom oder aufgrund einer Soll/Ist Diskrepanz eine Kollision erkannt, so wird so lange eine gegengesetzte Bewegung durchgeführt bis die Kollision nicht mehr besteht. Dies wird dann beim nächsten Postionsupdate an den FPGA in Form eines Kollisionsflags mitgeteilt. Die Ist-Position wird auch mit Übertragen, damit die KI aus dem „Fehler“ lernen kann. Jene Servos, die den Fuß-Berührung-Sensor verwalten liefern beim Statusupdate auch ein Flag mit, welches angibt, ob sich der Fuß am Boden befindet.
Aus dem oben angeführten Schaltplan wurde folgende Platine erstellt:
Die bereits vorhandenen Kabel des Servos werden für die One Wire Übertragung und die Stromversorgung verwendet. Für den ersten Prototypen werden auch noch zwei zusätzliche Leitungen nach außen geführt, welche zum Debuggen des Mikrocontrollers verwendet werden können. Die Stecker für die Debug Ports sind dann auf der Unterseite des Hexapods angebracht. Jene Servos, welche ganz unten am Bein angebracht sind, führen noch zusätzlich zwei Litzen nach außen, welche mit dem Fuß-Berührungs-Sensor verbunden werden können. Damit diese Kabel nach Außen geführt werden können, muss das Servo-Gehäuse leicht modifiziert werden.
Fuß-Berührungs-Sensor
Im Zuge der Verbesserung der Beine wurde auch ein neuer Fuß entworfen, welcher eine Berührung aus einem möglichst großen Winkelbereich erkennen soll. Sollte der Hexapod in Zukunft auch Hindernisse überwinden können (etwa Stufen) so soll eine Fußberührung erkannt werden, wenn der Fuß fast waagrecht zur Oberfläche des Hindernisses steht. Im weiteren Sinne ist somit auch ein Ertasten von Hindernissen, welche sich außerhalb des Sichtbereichs des Lidar-Sensors befinden. Einfache Taster bieten dafür einen zu geringen Betätigungswinkel (max. 30°).
Dafür wurde ein modularer Schalter erstellt, welches relativ einfach mit einem 3-Drucker, zwei M6-Scheiben, einer Kugelschreiberfeder (ÖH-Kugelschreiber), zwei Heat-Set-Inserts, Superkleber und etwas Geduld beim Anlöten der Litzen, hergestellt werden kann. Die Kugelschreiberfeder wird dabei verwendet, um den Dom in den Kegel zu pressen und dient gleichzeitig als Flexibler Leiter um den oberen Kontakt (M6-Scheibe) zu verbinden. Die Kegelform des Gehäuses sorgt dafür, das bei einer beliebigen Berührung der Dom gedreht wird und die obere Scheibe Kontakt mit der unter Scheibe herstellt.
Kommunikation über F.Port-Protokoll
Die Mikrocontroller in den Smarten Servos und das Linux-System kommunizieren über einen Single-Wire-UART-Bus pro Servo. Es kommt darauf das F.Port-Protokoll aus dem Modellbau zum Einsatz. Die F.Port-Master-Seite im FPGA, die alle Übertragungen initiiert, ist aus Performancegründen für jeden Servo geplant. Somit sind 18 Single-Wire-Leitungen und 18 Pins am FPGA notwendig.
In unserem Protokoll sind 3 Nachrichtenarten implementiert:
- Master fragt aktuellen Status vom Mikrocontroller an (Position des Servos, Überstrom erkannt Ja/Nein, Fuß am Boden Ja/Nein)
- Master sendet gewollte Position des Servo an den Mikrocontroller
- Master sendet Punkte der Kalibrierungskurve an den Mikrocontroller
Die FPGA-Seite ist als IP-Core implementiert und mit einem Mock für den Microcontroller verifiziert, in dem alle 3 Nachrichtenarten grundsätzlich implementiert sind. Die Mikrocontroller-Implementierung ist noch in Arbeit.