Selbstfahrender GAZ66 Monster Truck 1/16

Habr, hallo!

Ich möchte Ihnen erzählen, wie ich eine selbstverwaltende Maschine gemacht und hergestellt habe :)

Ich könnte sofort sagen, wie es geht, indem ich Schaltkreise und Bash-Befehle trocken anhänge, aber es wird so langweilig. Ich biete Ihnen eine interessante (ich hoffe) Geschichte darüber, wie ich persönlich diesen Weg gegangen bin und wohin ich gekommen bin.

Die Orte, an denen es etwas zu fotografieren gab. Wo ist mit Software - höchstwahrscheinlich ohne Foto.

Es wird wirklich eine Geschichte in einem narrativen Format sein, wie ich Ihnen bei einer Tasse Kaffee erzählen würde. Hier geht es nicht um Bash-Befehle, Python-Skripte und das ist alles.

Beginnen wir mit Fotos und Videos von dem, was passiert ist, und dann der ganzen Geschichte unter dem Schnitt.




Die Geschichte wird diesem Szenario folgen.


  • Warum ich es wollte
  • Funktionsweise einer selbstfahrenden Maschine (Draufsicht)
  • Alter 1 - Gelendwagen aus der Kinderwelt + Raspberry Pi Zero W + Kamera
  • Alter 2 - GAZ66 + NVIDIA Jetson Nano + Kamera für RaspberryPi
  • Alter 3 - Remo Hobby SMAX
  • Alter 4 - Verbindung SMAX und GAZ66
  • Alter 5 - Montage von Komponenten auf einem Monster Truck
  • Alter 6 - Installation von Donkey Car und Umgebung
  • Alter 7 - Gleismontage, Fahrten
  • Alter 8 - Reisen mit dem Joystick
  • Alter 9 - Neuronentraining
  • Alter 10 - Endlich funktioniert alles!
  • Was weiter?
  • Kampfherausforderung
  • Gemeinschaft
  • Das Bild der SD-Karte meiner Schreibmaschine

Kaffee einschenken, wir gehen!

Warum ich es wollte


Alles begann damit, dass ich frustriert war, dass in einem großen IT-Unternehmen in Russland sehr coole Drohnen hergestellt werden. Das ist unglaublich cool, aber ich bin arbeitslos :)

Nein, es ist wirklich so cool - selbstfahrende Autos.) Eine ausgezeichnete Legierung aus Mechanik und Algorithmen :) Die

Frustration hielt an, bis ich verschiedene Fakten über mich in meinem Kopf vereinte, nämlich:

  • Ich kann in Python schreiben
  • Ich verstehe (ungefähr), wie maschinelles Lernen funktioniert
  • Ich weiß, wie man mit Linux auf der Konsole arbeitet
  • Ich habe meine Kindheit mit einem Lötkolben verbracht
  • Ich habe eine ganze Box mit DIY-Komponenten (Himbeer-Pi, Arduino, Sensoren usw.)

Als alles in meinem Kopf klappte, entschied ich mich - selbstfahrendes Auto (sdc) zu sein!

Zunächst habe ich beschlossen, dass es sich lohnt, herauszufinden, wie SDC funktioniert, und dies wird der nächste Abschnitt sein.

Funktionsweise einer selbstfahrenden Maschine (Draufsicht)


Damit das Auto von selbst fahren kann, benötigt es vier Komponenten - einen Wagen, Sensoren, einen Computer, einen Algorithmus.

Lass es uns herausfinden


Trolley

Was wird eigentlich fahren. Räder, Motoren, die Batterie, die alles antreibt.

Es gibt zwei bedingte Kohorten von Autos, die ich nach mir benannt habe - Autos aus der Kinderwelt und Autos für ein Hobby.

Versuchen Sie nicht einmal, mit Autos aus der Kinderwelt zu flirten, ich habe versucht, das ist ein Misserfolg. Ihr Minus ist, dass sie schwache Motoren ohne Rückmeldung haben. Dies bedeutet, dass Sie wahrscheinlich in der Lage sind, jeden Heimteppich anzuhalten, und dass Sie nicht mit der angegebenen Genauigkeit drehen können.

Autos aus der Hobbywelt sind das, was Sie brauchen. Sie haben leistungsstarke Motoren, gute Batterien und Vorderradservos für Kurvenfahrten. Betrachten Sie dies als Eintrittsschwelle. Das billigste und normalste, was ich finden konnte, war Remo Hobby SMAX.



Sensoren

Es sammelt einige Informationen über die Welt um es herum und überträgt sie zur Entscheidungsfindung auf einen Computer.

Grundsätzlich ist ein Gentleman für die DEZA:

  • Kamera. Die Grundlage der DEZA-Grundlagen. Er schaut auf ein Stück Raum vor sich, überträgt das Bild auf einen Computer, der erkennt, was gerade passiert, und entscheidet, was zu tun ist. Es scheint, dass ich keine DEZA-Implementierungen ohne Kamera gesehen habe.
  • IMU-Sensor. Ein Stück, das die Beschleunigung und den Neigungswinkel entlang der Achsen zeigt. Es hilft zu verstehen, wohin wir tatsächlich gehen und wie sich unser Standort relativ zum Startpunkt geändert hat. Wird in fast allen Koptern verwendet.
  • . , , , . , SDC, , . , 75$, SDC Velodyne 4K$. , 3D , 2D.
  • GPS. , , , SDC .
  • . — , . 3D .



Computer

Was Werte von Sensoren erhält, analysiert die Situation, wir übertragen Steuerbefehle auf den Wagen.

In der Welt der Computer für eingebettete Elektronik beherrschen energieeffiziente ARM-Prozessoren (wie in Ihrem Telefon) und darauf basierende Single-Board-Computer den Ball.

Heute gibt es zwei der beliebtesten Single-Board-Optionen - RaspberryPi und NVIDIA Jetson.
RaspberryPi hat einen niedrigeren Preis, eine Vielzahl von Projekten, eine große Community.

NVIDIA hat einen höheren Preis, weniger Projekte, aber mehr Produktivität bei maschinellen Lernaufgaben. Es verfügt über integrierte 128 CUDA-Kerne (wie bei Ihrer großen NVIDIA-Grafikkarte), mit denen Algorithmen für maschinelles Lernen beschleunigt werden.

In meiner Sammlung befinden sich drei Stücke Raspberry Pi (ZeroW, 3, 4) und NVIDIA Jetson Nano. Ich beschloss natürlich, die Maschine auf Jetson zu montieren.



Algorithmus

, der basierend auf Sensorwerten über Aktionen entscheidet. In der Regel wird hierfür eine Kombination aus Computer Vision und neuronalen Netzen verwendet. In der einfachsten Version fahren Sie mit Ihrer Schreibmaschine entlang einiger Markierungen, zeichnen Videos solcher Fahrten mit Gas- / Brems- / Abbiegeverfolgung auf und trainieren dann in diesem neuronalen Netzwerk, sodass Sie die Abhängigkeit der Motorsignale von Bildern von der Kamera feststellen können. Ganz einfach, dies ist die Aufgabe, Markups zu erkennen und darin zu bleiben.

Wenn Sie die Funktionsweise des neuronalen Netzwerks aktualisieren möchten, empfehlen wir Ihnen, dieses Video anzusehen:


Hier habe ich die einfachste Option beschrieben, bei der es nur eine Kamera und eine Markierungsfahrt gibt. Es gibt jedoch Optionen mit mehr Sensoren und einer anderen Arbeitslogik - dazu wird es hier einen separaten Beitrag geben.

Wenn sehr hohes Niveau, dann ist es das.

Es bleibt nur:

  • Wagen zusammenbauen
  • Sensoren aufhängen
  • Computer anschließen
  • Markup zeichnen
  • reite darauf
  • ein neuronales Netzwerk trainieren
  • fahren

Nachdem wir herausgefunden haben, worum es bei einem selbstfahrenden Auto geht, gehen wir zu der Ära der Implementierung über, die ich speziell hatte.

Alter 1 - Gelendwagen aus der Kinderwelt + Raspberry Pi Zero W + Kamera


Ja, mein allererster Ansatz war genau das. Es geschah, weil es in der Nähe meines Hauses eine Kinderwelt gab, in die ich ging, in der ich Gelik mochte und die ich kaufte.

Okay, ich dachte, es gibt eine Helix, jetzt brauche ich einen Computer und einen Sensor. Gedanken gemacht. Ich bestellte ein RPi Zero W und eine Kamera für sie. Während ich auf den Computer und die Kamera wartete, ging ich hinein und kaufte eine Powerbank für dieses Geschäft.
Also, alles ist an Ort und Stelle, es ist Zeit zu sammeln. Ich habe ein solches Projekt gefunden und mich entschlossen, es zu verfolgen.
Gelik zerlegte, zog sein ursprüngliches Gehirn heraus, übertrug sie an die Motorsteuerung, er übertrug sie wiederum an RPi, schloss eine Kamera daran an, versorgte das Ganze mit einer Powerbank und war zufrieden.

Bevor ich zur Selbstverwaltung überging, beschloss ich, zum Spaß durch die Konsole zu fahren, eine Katze zu jagen und das Bild von der Kamera auf meinen Laptop zu übertragen.

Damals erwarteten mich ein paar Fehler.

Erstens ist der Raspberry Pi Zero W in Bezug auf die Leistung sehr schwach.

Zweitens: Die Passierbarkeit der Gelik aus der Kinderwelt ist fast nicht vorhanden, sie wurde durch fast jedes minimale Hindernis gestoppt.

Es wurde bereits klar, dass das Projekt tot geboren war, aber aus Interesse habe ich versucht, Computer Vision (OpenCV) für Raspberry Pi Zero direkt darauf zu montieren. Es dauerte ohne Witze mehr als einen Tag und war der letzte Nagel im Sargdeckel dieser DEZA-Implementierung.
Es wurde klar, dass Sie sowohl den Computer für eine höhere Leistung als auch den Wagen für eine bessere Langlauffähigkeit austauschen müssen.

Es stellte sich als ziemlich lustig heraus:



2 — 66 + NVIDIA Jetson Nano + RaspberryPi


Zu diesem Zeitpunkt wurde klar, dass Sie ein passableres Auto und vorzugsweise einen LKW benötigen, um alle Komponenten in die Karosserie einzubauen. Nachdem ich einen Service für die Auswahl von Waren studiert hatte, wurde klar, dass das Modell unserer einheimischen GAZ66 zu mir passt, es ist auch eine Shishiga unter den Menschen. Okay, ich habe es bestellt, warte, es ist Zeit, über den Computer nachzudenken. Zu diesem Zeitpunkt bereitete NVIDIA gerade den Verkaufsstart seines Jetson Nano vor, und ich gab am ersten Verkaufstag eine Bestellung auf.

Ein Lastwagen kam an, ich wartete weiter auf Jetson, fuhr ungeduldig mit einer Shishiga um das Haus und rollte die Kätzchen, die die oben erwähnte Katze zur Welt brachte. Um nicht zu sagen, dass es den Kätzchen gefallen hat - musste aufhören.

In der Zwischenzeit fuhr Jetson noch und ich bestellte einen Vakuum-Lidar aus China - ich wusste nicht, wie ich ihn speziell verwenden sollte, aber ich verstand, dass ich wollte.

Eines Tages erschien ein Geschäftskurier am Büroeingang, gab mir eine ziemlich große Schachtel NVIDIA-Einzahler, ich unterschrieb auf der Rechnung und fühlte mich wie ein Entwickler-Enthusiast - wow, ein zu Beginn des Verkaufs gekauftes Gerät kam zu mir.

Es ist Zeit zu sammeln! Aber zuerst musst du rummachen, lol. Demontierte die Shishigu, warf ihr einheimisches Gehirn aus, schmierte die Mechanismen, begann sich bereits auf der Basis eines Computers zusammenzubauen.

Ich habe die Kamera, die Motorsteuerung, den Rotationsmotor, den Gas- / Bremsmotor angeschlossen und die Python-Skripte für den Test gestartet - wieder ein Mist!

Diesmal lautet die Geschichte: Ein Shishigi verwendet einen herkömmlichen Motor zum Drehen, keinen Servoantrieb. Er hat also kein Feedback. Daher kann ich sie nicht sicher kontrollieren, was bedeutet, dass sie nicht für die DEZA geeignet sind.

Okay, wieder müssen Sie das irgendwie lösen, etwas tun. Wir gehen zur nächsten Ära über.





Alter 3 - Remo Hobby SMAX


Da zu diesem Zeitpunkt klar war, dass die Maschine nicht nur passabel, sondern auch minimal gut in Komponenten sein musste, fiel die Wahl für diejenigen, die RC haben, in die Läden, dies ist ein Hobby.
Ohne weiteres kam ich in einem solchen Geschäft an und sagte mir ohne mich zu verstecken, was ich tat und welche Art von Maschine ich brauchte. Der Verkäufer sagte mir freundlich, welche Maschine meinen Mindestanforderungen entspricht, und es war ein Remo Hobby SMAX. Ich kaufte es.

Ich kam nach Hause, holte mir einen Shishigu, nahm alles ab und setzte mich, um mich mit SMAX zu verbinden. Und was denkst du? Das ist richtig - wieder scheitern!

Grundsätzlich sind RC-Cars so konzipiert, dass der Motor mit der Motorsteuerung und damit mit dem Funkmodul verbunden ist, das mit der Fernbedienung kommuniziert. Und es war SMAX, das so konzipiert wurde, dass dort die Motorsteuerung und das Funkmodul kombiniert wurden - ich hatte buchstäblich keine Gelegenheit, anstelle des Funkmoduls eine Verbindung zur Motorsteuerung herzustellen.

Okay, du musst wieder etwas tun. Ich kehre zum Standort der RC-Cars zurück und klettere in die Komponenten. Dort stöbern und jubeln, ich finde eine Motorsteuerung, die ein separates Kabel zum Funkmodul hat.

Ich bestelle, bringe, sammle alles neu - es funktioniert, dreht sich aber nur. Aber es gibt kein Gas und umgekehrt! Verdammt, denke ich, aber ich wähle es weiter aus.

Diesmal hat es nicht funktioniert, dass die Konsole einen bestimmten Wert (360) über das Funkmodul senden muss, damit die SMAX-Engine aufwacht. Aber ich wusste nichts davon und gab die Werte direkt für das Bremsgas ein. Und der Motor reagierte nicht und ging von der Logik aus, dass ihn niemand zum Aufwachen aufforderte.

Irgendwann setzte ich mich hin, um buchstäblich alles hintereinander zu sortieren, in der Erwartung, dass es zumindest auf etwas reagieren würde.

Zuerst ging ich über 100 vorbei. Dann 50 von. Und als ich die Suche nach 10 erreichte, hörte ich ein willkommenes Quietschen in 360 - Prost! Funktioniert!

Ich habe Gas / Rückwärts / Links / Rechts von der Konsole aus getestet, alles funktioniert. Das ist Feuer, hier bin ich Programmierer =)

Es scheint, dass es Zeit ist, zusammenzubauen, aber es gibt ein Problem - es gibt absolut keinen Ort, an dem die Komponenten platziert werden können. RC-Cars sind so konstruiert, dass ihr Top eine sehr bedingte Sache ist. Erstens besteht das Verdeck aus sehr dünnem Kunststoff, und zweitens ist es ein Jeep, und es gibt einfach keinen Platz für alles.
In diesem Moment entschied ich mich zu suchen und wie andere es tatsächlich tun.

Ich habe das Eselauto-Projekt gefunden, das alles schlüsselfertig enthält, um Ihre DEZA zusammenzubauen - sowohl Hardware-Beispiele als auch Software-Framework. Es würde cool erscheinen, nimm es und benutze es, aber es gibt Nuancen:

  • Sie drucken die Oberseite des Autos auf einem 3D-Drucker, und dann erinnert es das Auto sehr weit entfernt. hässlich, kurz gesagt, nicht ästhetisch ansprechend
  • Ihre 3D-Modelle sind mit Maschinen kompatibel, die wir nicht verkaufen.

Ok, erinnere dich an Donkey Car, dann nehmen wir das Software-Framework, aber jetzt müssen wir über Hardware nachdenken.

Eines Tages drehte ich meinen Kopf in meiner Wohnung und schaute auf das zerlegte Shishigu, auf SMAX ohne den oberen Teil, und dachte - hmmm, und sie scheinen von der gleichen Größe zu sein (1/16). Er nahm eine Shishiga, nahm eine SMAX, setzte sie einfach nacheinander auf - und das tut es wirklich! Und es sieht cool aus! OK, ich muss es tun! Wir gehen zur nächsten Ära über.







Alter 4 - Verbindung SMAX und GAZ66


Zu Beginn dieser Ära habe ich also ein internes Ziel - die Oberseite von einer Maschine mit der Unterseite von einer anderen zu verbinden. Da meine Kollegen und ich einen Chip in einem 3D-Drucker genommen haben und ich dessen Miteigentümer (ein ernsthafter Investor) bin, wurde beschlossen, eine Verbindung in einem CAD-Programm herzustellen, diese zu drucken und damit zu verbinden.

Mit dieser Idee ging ich ungefähr 2 Monate lang und dachte, ich würde mich gerade hinsetzen, um CAD-Systeme zu verstehen. Lol Nein. Nachdem ich mir eingestanden hatte, dass ich CAD-Systeme nicht verstehen möchte, begann ich zu überlegen, welche anderen Optionen es gibt.

Ich ging zurück in die Kinderwelt, beschloss die Designer zu sehen, plötzlich helfen sie mir irgendwie. Ich kaufte einen klassischen Metallbauer, der bei mir war, als ich in der Schule war (Ash Old School zusammengebracht).

Er schleppte ihn nach Hause, stellte zwei Teile der Maschine nebeneinander und begann, alle möglichen Designerelemente auf sie anzuwenden. Wie lange, kurz, begann sich eine Art Verständnis zu zeigen, wie dies zumindest theoretisch getan werden konnte.

Begann zu tun. Verbrachte mehr als einen Tag mit einem Schraubenschlüssel, Nüssen und räumlichem Denken.

Während ich verband, lernte ich, Plastik mit einem Schraubendreher zu bohren, die überschüssigen Teile vorsichtig abzureißen, um das Gehäuse nicht zu beschädigen, und die Muttern mit anderen Muttern zu sichern (aber trotzdem ohne Unterlegscheiben). Im Allgemeinen wäre mein Trudovik stolz auf mich.

Nach ungefähr drei Änderungen und drei Tagen sah ich diesen Monstertruck vor mir - die GAZ66 SMAX Edition von Beslan.

Es scheint also, dass die Hardware-Basis bereit ist. Fahren Sie mit der nächsten Ära fort.





Alter 5 - Montage von Komponenten auf einem Monster Truck


Zu guter Letzt:

  • Ich habe einen Wagen mit guten Komponenten
  • Ich habe ein ästhetisches und geräumiges Obermaterial
  • Gas / Bremse / Umdrehungen funktionieren bei diesem Wagen normal
  • oben und unten sind sogar miteinander verbunden =)

Es ist Zeit, Komponenten an dieser Schönheit zu montieren.

Mit einem Schraubendreher als Bohrer für Kunststoff und doppelseitigem Klebeband als Universalhalterung für alles bewaffnet, machte ich mich an die Arbeit.

Ich habe eine Halterung für die Kamera an der Kabine angefertigt, mit der Sie den Winkel der Kamera einstellen können. Warf einen langen Zug von der Kamera nach Jetson, der sich wiederum hinten niederließ.

Neben Jetson ließen sich im Hintergrund folgende Personen nieder:

  • Powerbank für die Stromversorgung des Computers (spendete sein Hauptgerät, cool, mit USB-Stromversorgung, damit Jetson nicht ausfällt)
  • PCA9685 (PWM-Controller) zur Motorsteuerung
  • Batterie, um den Motor der Maschine anzutreiben

Da das Projekt zu diesem Zeitpunkt bereits als langfristig angesehen wurde, entschied ich mich, mich noch nicht mit dem Lidar zu beschäftigen und MVP zumindest auf der Kamera und Software von Donkey Car zu machen.

Zum Spaß habe ich meine einheimischen Scheinwerfer von GAZ66 angeschlossen, um sie im Dunkeln schöner und selbstbewusster zu machen.

Okay, meine Maschine schaltet sich ein, die Engines reagieren auf Befehle von der Python, die Kamera gibt ein Bild, die Lichter sind an, alles ist in Ordnung, es ist Zeit, Software zu installieren.





Alter 6 - Installation von Donkey Car und Umgebung


Glücklicherweise habe ich in den letzten Phasen das Donkey Car-Projekt gefunden, und es hat mir das Leben viel leichter gemacht, mich davon abzuhalten, alles selbst zu schreiben. Einfach ausgedrückt ist DonkeyCar ein Framework, das bereits alles enthält, was Sie für die DEZA benötigen. Und sie haben sogar Anleitungen zur Installation von Software. Aber wie es normalerweise bei OpenSource der Fall ist, sind die Anleitungen veraltet und widersprechen sich in wenigen Augenblicken.

Okay, muss es herausfinden. Für den normalen Betrieb des Frameworks werden die folgenden Bibliotheken benötigt:

  • Opencv
  • Tensorflow-GPU (GPU ist für Jetson, denn es gibt einen Cuda-Kernel. Für RPI gibt es Tensorflow-Lite)
  • Tensorrt (Bibliothek zur Beschleunigung der Inferenz von Neuronen)
  • und all das wird automatisch basierend auf der Liste der Umgebung festgelegt

Beginnen wir mit OpenCV.

Das DonkeyCar-Handbuch besagt, dass Sie es aus der Quelle selbst erstellen müssen, da für ARM kein OpenCV in pip vorhanden ist. Ich habe dies sogar getan, OpenCV kompiliert, aber bevor ich es installiert habe, habe ich mich entschlossen zu überprüfen, dass das System plötzlich eine alte Version von OpenCV hat und es abgerissen werden muss. Ich habe eine Python aufgerufen, cv2 importiert, nach einer Version gefragt, aber sie ist bam und relevant. Schnell gesucht und herausgefunden, dass in den neuesten Versionen von linux4tegra (in Jetson) die Jungs von NVIDIA begonnen haben, OpenCV zu installieren. Cool, ich habe weniger zu tun. Gut gemacht, dass ich mich selbst kompilieren konnte :)

Als nächstes Tensorflow-GPU.

Das DonkeyCar-Handbuch zeigt zum einen einen veralteten Versionszweig (1.xx) und zum anderen nicht einmal die neueste Version von veralteten. Ich beschloss, sie nicht anzuhören und die neueste aktuelle Version (2.0) zu veröffentlichen.

Der nächste Schritt ist Tensorrt.

Die Anleitung zum Installieren von Tensrort auf Jetson ist in einer separaten Wiki-Seite geschrieben, und es ist klar, dass der Autor die Hauptanleitung nicht gelesen hat =) Da in der Tensorrt-Anleitung Umgebungsvariablen neu zugewiesen werden und OpenCV nicht mehr funktioniert. Ich drehte es hin und her, rollte alles zurück und beschloss, auf die Umgebung und Umgebungsvariablen zu hämmern - rollte es direkt in die Hauptumgebung.

Zufrieden mit sich selbst öffnete er die Python, die wiederum cv2, tensorflow, tensorrt genannt wurde, und fragte die Python nach ihrer Version - sie wurden alle importiert, alle zeigten die neuesten Versionen. Cool!

Der Installationsprozess für das Eselauto selbst ist recht einfach, ich werde es nicht beschreiben, ich schlage vor, die Anleitung zu lesen. Das einzige, was ich jetzt bemerke, ist, dass Sie in der Eselautokonfiguration die Auflösung des Bildes von 86x86 für RPi auf 224x224 für Jetson erhöhen können (weil es mehr Leistung und Genauigkeit geben wird).

Also ist alles fertig, Zeit zum Laufen und Testen!

Mein Computer wird wirklich eingeschaltet. Er startet den Webserver unter der IP-Adresse, an die der Router den Computer ausgegeben hat. Und Sie können wirklich dorthin gehen und vom Browser aus den Joystick steuern und das Bild von der Kamera betrachten.

Ich musste auch die Werte kalibrieren, die an die PWM (PCA9685) geliefert wurden, um eine vollständige Vorwärts-, vollständige Rückwärts- und maximale Drehung zu den Seiten zu finden.

Hier stellte ich übrigens fest, dass mein Motor falsch angeschlossen war - die Maschine ging viel energischer zurück als vorwärts - ich fand experimentell die Drähte und warf sie umgekehrt. Es war dort so angeordnet, dass alle Drähte vom Motor die gleiche Farbe haben und man sich nicht erinnern kann, wie es war. Aber ich habe es richtig angeschlossen und auf jeden Draht einen Schrumpfschlauch gelegt, damit ich sie später unterscheiden kann.

Cool, es ist Zeit, die Strecke vorzubereiten!

Alter 7 - Gleismontage, Fahrten


Der Donkey-Car-Algorithmus ist so konzipiert, dass ein Neuron von einem Lehrer trainiert wird. Dies bedeutet, dass das Bild von der Kamera verfolgt wird und neben jedem Bild eine JSON-Datei angezeigt wird, in die der Name des Bildes, die Beschleunigung, die Drehung und der Zeitstempel geschrieben sind. Und um ein Neuron zu trainieren, benötigen solche Bild + JSON-Paare mindestens 5K.

Es wurde beschlossen, die Strecke zu Hause zusammenzubauen, sie sagen, die Wohnung sei groß, es gebe einen Ort, an dem man sich umdrehen könne. Aber als ich anfing zu sammeln, wurde klar, dass es keine Fahrt um die Wohnung gab - der Boden hat verschiedene Farben, der Kontrast wird unterschiedlich sein und das Modell kann nicht herausnehmen.

Okay, ich habe beschlossen, es in einen Raum zu stellen. Ich kaufte 4 Rollen Klebeband und klebte sie auf die Schiene auf dem Boden.

Ich stellte das Auto ein, startete es, fuhr los und scheiterte erneut - es stellte sich heraus, dass ein Raum zu klein ist und mein Auto nicht in den Kurven enthalten ist. Genauer gesagt ist es enthalten, aber mit einer solchen Geschwindigkeit, dass es dann eine Schande sein wird =)

Okay, wir müssen die zweite Iteration durchführen und wir brauchen einen großen Raum. Die Wahl fiel auf das Büro - es gibt viele Orte, die Böden sind monophon, rund um die Uhr geöffnet. Das einzige Problem ist, dass die Reiniger nachts arbeiten und die Schiene entfernt werden muss. Das heißt, Sie müssen alles auf einmal erledigen - mit Ihren Händen fahren, um Lehrer zu werden, das Modell trainieren, es zurück in die Schreibmaschine werfen und ohne Handkontrolle auskommen.

Okay, Tag X, nach dem Ereignis über A / B-Experimente wurde beschlossen, im Büro zu bleiben und den Track zu machen.
Der Ort ist ausgewählt, das Band ist fertig, das Team der Erbauer der Strecke im Spiel. Nur eine Stunde, und im Bürokorridor gibt es eine tolle Strecke.

Ich setzte das Auto ein, schaltete es ein, versuchte zu fahren - Hurra, es bog ab und ich musste die Geschwindigkeit auf nur 80% begrenzen.



Alter 8 - Reisen mit dem Joystick


Also, ich habe eine Strecke, ich habe ein Auto und ich brauche 5K Paare Bild + JSON.

Empirisch fand ich heraus, dass eine Runde meiner Strecke 250 Paar Foto + JSON enthält, was bedeutet, dass ich mindestens 20 Runden lassen muss.

Am besten in einer Reihe. Sie können natürlich zeitweise, aber dann wird das geworfene Gas vom Modell abgeklappert, und es kann anfangen, langsamer zu werden, aber ich will das nicht.

Ich habe versucht, in 20 Runden ohne Pause zu fahren, und das ist, muss ich sagen, keine leichte Aufgabe.

Die erste Schwierigkeit trat auf, weil sich in der Mitte der Route eine schwere Säule befand, und als die Maschine danach fuhr, wurde die Verbindung mit dem Laptop, von dem aus sie gesteuert wurde, verzögert, und diese kleine Verzögerung warf mich aus den Grenzen der Route.

Okay, Sie müssen also sicherstellen, dass die Verbindung von dem Gerät hergestellt wird, mit dem ich selbst zur Schreibmaschine gehe, wenn ich fahre. Dies bedeutet, dass Sie über den Browser des Telefons fahren müssen.

Aber es gibt immer noch einen Joystick, und ich halte ihn mit beiden Händen. Wo sonst kann ich das Telefon bekommen? Das Weiterführen einer Schreibmaschine ist keine Option, sie verlangsamt sie und geht dann ohne Telefon schneller und kann aufgrund übermäßiger Beschleunigung in den Ecken verwirrt werden.

Hmm, dann musst du das Telefon und den Joystick irgendwie kombinieren. Okay, ich habe einen Leser, er ist groß genug und passt sowohl auf ein Telefon als auch auf einen Joystick. Er nahm das Band und klebte das Telefon mit Klebeband und direkt unter dem Joystick an den Leser. Ich schaute auf dieses Wunder und dachte - was bist du im Allgemeinen? :-)

Aber es hat funktioniert :) Mit diesem Ding habe ich es geschafft, 20 Runden zu fahren. Aber eigentlich sogar 25, weil ich irgendwo einen Geschmack um 15 Kreis bekommen habe.

Dackel, fertig, ich habe einen Datensatz zum Trainieren eines Neurons, es ist Zeit zu trainieren!

Alter 9 - Neuronentraining


In diesem Moment habe ich ein Auto, eine Strecke, einen Datensatz - ja, ich bin einen Schritt vom Ergebnis entfernt!
Zu Hause drehte sich der PC im Leerlauf mit dem NVIDIA RTX 2070, an dem ich studieren wollte. Glücklicherweise habe ich für ein Smart Home eine externe IP und musste nur Port 22 aus dem Internet auf einen PC übertragen. Es ist gut, dass es Assistenten gab, die dies für mich getan haben, während ich im Büro war.

Also gehe ich mit Ubuntu auf SSH zum Computer, überwache den Home-Ordner auf SSHFS, lade Dateien hoch. Es scheint, dass nur 40 Megabyte, aber es dauerte etwa 30 Minuten. Es ist passiert, wie ich es verstehe, weil es viele von ihnen gab.

Dateien auf Ihrem Computer, Tensorflow-GPU installiert, DonkeyCar-Software installiert, es ist Zeit zu trainieren.
Ich rufe ein Skript von DonkeyCar auf, um ein Neuron zu trainieren. Ich zeige es auf die Ordner mit dem Datensatz - es wurde ausgeführt.
Während das Neuron läuft, zeigt nvtop (Grafikkarten-Lastmonitor) eine Auslastung von 1406%, reguläres htop zeigt 100% CPU-Last für alle 16 Kerne.

Nach ungefähr 20 Minuten habe ich ein geschultes Modell zum Autofahren. Es scheint, nimm es, benutze es. Aber nein :)

Erinnerst du dich, ich habe oben über Tensorrt geschrieben, das die Inferenz von Neuronen optimiert und sie auf Cuda-Kerneln ausführt? Natürlich möchte ich es durchgehen.

Und das bedeutet was ich brauche:

  • friere das Modell ein (du musst alles für das Modell in eine Datei packen)
  • Konvertieren Sie das Fries-Ergebnis in das Tensorrt-Format

Ich versuche das Modell einzufrieren, ich rufe das Skript von DonkeyCar auf, Fehler. Und in der Zwischenzeit ist es bis zur Nacht, bald bauen die Reinigungskräfte meine Spur ab, ich muss schnell.

Die Hypothese wurde geboren, dass dies daran liegt, dass ich den falschen Tensorflow genommen habe, den DonkeyCar hatte. Okay, ich ziehe Tensorflow 2.0, ich setze 1.15, ich versuche es erneut - Erfolg, Prost!

Nun die Umstellung und wieder die Panne - das Team wurde nicht gefunden. Okay, ich werde suchen, was los ist. Es stellte sich heraus, dass NVIDIA diese Funktion als veraltet markiert und die Unterstützung eingestellt hat. Jetzt, sagen sie, müssen Sie von Hand konvertieren. Glücklicherweise habe ich ein Git-Repo gefunden, bei dem es eine ähnliche Anfrage gab, und der Benutzer hat den Ort gefunden, an dem das Python-Skript tatsächlich liegt, wodurch die Modelle konvertiert werden.

Ich rufe das Drehbuch von diesem Ort aus an und die Wahrheit antwortet. Aber, sagt er, keine dritten Pythons für dich, komm an zweiter Stelle.

Okay, ich rufe die zweite Python an. Er sagt mir - ich habe keinen Tensorflow. Nun, ich bitte ihn, Tensorflow-GPU 1.15 zu setzen, und er sagt mir, dass es keine solche Version gibt, es gibt nur 1.14. Okay, ich stimme zu, lassen Sie uns ein Risiko eingehen und die verschiedenen Versionen in verschiedene Python-Umgebungen stellen. Setzen Sie Tensorflow in die zweite Python, die zur Konvertierung aufgerufen wurde - Prost, es hat funktioniert!

Okay, ich habe Modelle für Tensorrt und für gewöhnliche Tensorflow-GPU lasse ich sie in die Maschine fallen.

Ich starte die Maschine mit dem Modell für Tensorrt, einem riesigen Fehler-Trackback, Zeitdruck - ok, ich werde das übliche Modell ausprobieren.

Ich starte den üblichen Fehler erneut, aber diesmal ist es ziemlich klar: Ihre Bildgröße beträgt 224 x 224, während 86 x 86 erwartet wird. Denken Sie daran, irgendwo viel höher habe ich geschrieben, dass die Konfigurationsregeln die Bildauflösung von der Kamera geändert haben?

Also habe ich auf der Schreibmaschine korrigiert, aber nicht auf dem Host-Computer.

Ich kehre zum Host-Computer zurück, korrigiere die Konfigurationen dort, trainiere neu, mache den Fries erneut, konvertiere neu, werfe zurück.



Ich starte die Maschine mit einem Modell für Tensorrt und ...

Alter 10 - Endlich funktioniert alles!


Hurra! Mein Auto ist gefahren! Selbst ohne mich. Sehr cool. Ich bin unglaublich glücklich


Fast ein Jahr lang habe ich das alles gemacht und jetzt)

Was weiter?


Es gibt eine Reihe von Plänen für die weitere Entwicklung, ich werde von einfach zu komplex übergehen.

  • Fügen Sie dem Modell einen IMU-Sensor hinzu, um möglicherweise die Genauigkeit zu erhöhen. Wenn Sie beispielsweise bergauf fahren, muss der Motor stärker beansprucht werden.
  • Übersetzen Sie die Logik in Fahrten nicht auf der Autobahn, sondern fahren Sie nur um Hindernisse herum
  • Lidar hinzufügen und ablesen

Kampfherausforderung


Wenn Sie selbst oder mit einer Gruppe von Freunden das Gefühl haben, dass Sie Rennen fahren möchten, schreiben Sie mir, lassen Sie uns Wettbewerbe veranstalten =)

Gemeinschaft


Ich habe auch einen Interessenschat eingerichtet und bereite einen Kanal vor. Ich bin mir nicht sicher, ob dies nach den Regeln von Habr möglich ist, daher werde ich auf Anfrage an die PM senden.

Das Bild der SD-Karte meiner Schreibmaschine


Auf Anfrage sende ich Ihnen auch ein Bild meines Autos, wenn Sie dies auf einer ähnlichen Basis tun möchten und nicht mit der Einstellung baden möchten.

All Articles