Inhaltsverzeichnis:

Selbstlernender chaotischer Roboter - Gunook
Selbstlernender chaotischer Roboter - Gunook

Video: Selbstlernender chaotischer Roboter - Gunook

Video: Selbstlernender chaotischer Roboter - Gunook
Video: Chaotische Roboter-Utopie | Atomic Heart Let's Play #02 2024, Juli
Anonim
Selbstlernender chaotischer Roboter
Selbstlernender chaotischer Roboter

Interessieren Sie sich für maschinelles Lernen, KI und Roboter? Sie müssen nicht an einer schicken Universität arbeiten. Dies ist eine Beschreibung meines chaotischen Roboters. Es ist ein sehr einfacher Roboter, um zu demonstrieren, wie man selbstlernenden Code verwendet und in eine Arduino-Plattform implementiert, in diesem Fall ein Arduino. Es ist eine sehr günstige Plattform!

Der Code entwickelt den Roboter weiter, sodass der Roboter das Crawlen lernt. Es erhält Feedback von der Maus, die hinterher gezogen wird. Der Code ist "genetisch". Dies bedeutet, dass eine Reihe von Individuen getestet werden und die besten behalten werden und Babys bekommen. Das bedeutet, dass sich der Code evolutionär weiterentwickelt.

Schritt 1: Hardware AKA der Roboter

Hardware AKA der Roboter
Hardware AKA der Roboter
Hardware AKA der Roboter
Hardware AKA der Roboter
Hardware AKA der Roboter
Hardware AKA der Roboter

Du brauchst:

- 1 Arduino Due

- 8 Mikroservos

- 1 PS/2-Maus

- 1 Levelshifter

- irgendeine Variante eines Sensor-Shields o.ä., ich war des Sensor-Shields müde und habe mein eigenes geschweißt.

-Drähte

-externe 5V Stromversorgung für die Servos

- einige Schrottstücke, etwas Kleber und einige Stahlfäden. Und Klebeband!

Legen Sie also das Due auf den Boden. Legen Sie die Servos in einen Ring darum. Setzen Sie sie mit Altmetall, Kleber und Faden zusammen. Das ist der Chaos-Teil! Da es in seinem Design chaotisch ist, ist es unvorhersehbar, wie es sich bewegen muss, um es zum Kriechen zu bringen. Deshalb ist selbstlernender Code der richtige Weg!

Tipps: Verwenden Sie einige ziemlich schwere Metallteile, damit sich der Roboter leichter bewegen kann.

Schließen Sie die Servos an die Fälligkeit an, in meinem Fall sind sie an D39, 41, 43, 45, 47, 49, 51, 53 angeschlossen.

Verbinden Sie die Servos mit der externen 5V-Stromversorgung. Bauen Sie dazu eine Art Schild oder verwenden Sie ein Sensorschild oder ähnliches. Füttern Sie die Servos NICHT über den 5V-Pin von Dues, es reicht nicht, Due wird brennen. Ich habe eine kleine Prototypenplatine verwendet, um die 5 V auf alle Servos zu verteilen. Diese Platine enthält auch den Pegelumsetzer für den PS/2-Maustakt und die Datenleitungen. Das Board speist die Maus auch mit 5V. Denken Sie daran, die Masse von der externen Stromversorgung mit der Arduino-Masse zu verbinden! Schaltpläne zeigt, wie man alles verbindet.

Verbinden Sie das PS/2 mit Strom (5V) und Masse. Verbinden Sie die Takt- und Datenleitung des PS/2 über einen Pegelumsetzer mit dem Due. (da geht 3,3V, PS/2 geht 5V). Verbinden Sie die Uhr mit D12 und die Daten mit D13.

Für Details zum PS/2-Protokoll ist dies eine sehr gute Anleitung:

www.instructables.com/id/Optical-Mouse-Od…

Die von mir verwendete PS/2-Bibliothek von jazzycamel:

Schritt 2: Der Code

Der Code
Der Code

Lassen Sie mich zunächst sagen: Ich bin KEIN Programmierer. Manche Teile sind sehr umfangreich, ein geübter Programmierer könnte es natürlich kürzen und so und so.

Der Code ist selbstlernend und das ist der Kern des Projekts. Das ist der lustige Teil davon! Es bedeutet, dass sich der Roboter weiterentwickelt und immer besser wird, in diesem Fall wird er beim Krabbeln besser. Das Erstaunliche daran ist, dass sich der Roboter zu dem entwickelt, was auch immer Sie ihm zurückgeben. In diesem Fall wird eine PS/2-Maus gezogen und je länger die Maus gezogen wird, desto höher sind die Punkte.

Dies bedeutet auch, dass Sie diesen Code verwenden können, um Ihrem Roboter beizubringen, etwas anderes zu tun, solange er gemessen und an den Roboter zurückgegeben wird!

Wie Sie in den Bildern sehen können, wird die Maus an einer dünnen Schnur gezogen. Zuerst wurde es im Mauskabel gezogen. Das Kabel ist jedoch etwas steif, sodass der Roboter gelernt hat, die Maus zu schütteln, anstatt sie zu ziehen. Schütteln brachte Höhepunkte…

Der Code verwendet 50 Individuen. Der Kern davon ist ein Array von 50x50 Bytes.

Ein Individ ist ein Array von Bytes. Wenn das Individuum zum Ausführen des Roboters verwendet wird, wird dieses Individuum an eine Funktion im Code namens "tolken" gesendet.

Zu Beginn einer Fahrt gibt es 8 Variablen m1, m2, m3, m4, m5, m6, m7 und m8 (eine für jedes Servo). In diesem Roboter haben sie alle konstante Startwerte. In "tolken" werden die mś in Abhängigkeit von den Werten des Individuums in eine Case/Swich-Schleife transformiert. beispielsweise führt ein Wert von "1" Folgendes aus: m1 = m1 + m2.

Ist ein Individuum: 1, 2, 3, 0, 0, 0, 0….. dann wird mś wie folgt transformiert:

m1 = m1 + m2;

m1 = m1 + m3;

m1 = m1 + m4;

Tolken ist eine Liste von 256 verschiedenen mathematischen Operationen, sodass jeder mögliche Wert des individs-Arrays eine mathematische Änderung der m Werte darstellt.

Der Tolken-Prozess wird viermal durchgeführt, mit Auslesen zwischen jeder Runde, wobei vier verschiedene Motorcodes für jedes "m" generiert werden. Die Motorcodes sind die Werte, die später an die Servos gesendet werden.

In jedem Schritt der Entwicklung konkurrieren 4 Individuen beim Crawlen. Die besten zwei Individuen werden Eltern von zwei Babys, die Babys werden die beiden schlechtesten Individuen ersetzen. Wenn Babys geboren werden, wird ein Stück des "genetischen Codes" von einem Elternteil gegen ein Stück vom anderen Elternteil eingetauscht, wodurch zwei neue Individuen entstehen.

Wenn überhaupt kein Individuum eine Leistung erbringt, findet eine Mutation der Individuen statt, um neue zu generieren.

Den Code findest du auf GitHub:

Schritt 3: Wie trainiere ich es?

Dies ist der schwierige Teil. Um richtig zu trainieren, musst du es nach jedem Lauf "zurücksetzen". Dies bedeutet, dass Sie es jedes Mal in die gleiche Position bringen müssen.

Ich habe ein paar Kontrollpunkte in den Code eingefügt, um sicherzustellen, dass sich der Roboter in seiner Ausgangsposition befindet.

Also Roboter ausrichten und laufen lassen.

Es testet 4 Individuen und wählt dann die besten 2 als Eltern aus. Nachdem das Schlimmste durch die Babys ersetzt wurde, druckt es einige Daten über die Leistung der einzelnen Personen. Es druckt auch das 50x50-Array. Es ist ratsam, dies in eine Excel-Tabelle oder ähnliches zu kopieren. (oder schreibe einen Bedarfscode in die Verarbeitung) Wenn der Due zurückgesetzt wird (dies geschieht aus verschiedenen Gründen), wirst du deine Trainingsarbeit nicht verlieren. Sie können das Array kopieren / in den Code einfügen und dort weiter trainieren, wo Sie noch übrig sind.

Mein Roboter hat nach ein paar Stunden das Krabbeln gelernt. Laden Sie das Video herunter, um es zu crawlen. Es ging nicht in die Richtung, die ich mir vorgestellt hatte!

Probieren Sie auch verschiedene Böden aus! Mein Roboter schnitt am besten auf einem Nylonteppich ab.

Mögliche Verbesserungen:

1. Es wäre besser, einen separaten Nano zu haben, um die PS/2-Maus zu lesen und die verarbeitete Entfernung seriell an den Nano zu senden. Beim Lesen meiner PS/2-Maus ist es etwas wackelig. Dies ist der Grund dafür, dass die Maus Teile des Codes liest/löscht.

2. eine Art Prüfstand, der den Roboter in seine Ausgangsposition zurückzieht, würde das Training beschleunigen.

3. Ich denke, es ist ratsam, es etwas langsamer zu trainieren, als ich es getan habe. Ein langsameres Training stellt sicher, dass es "in die richtige Richtung" trainiert wird. Die mittlere Leistung mehrerer Testläufe könnte ein möglicher Weg sein.

Empfohlen: