GAZ66 Monster Truck sans conducteur 1/16

Habr, bonjour!

Je veux vous raconter comment j'ai fait et créé une machine autogérée :)

Je pourrais dire tout de suite comment le faire en attachant sèchement les circuits et les commandes bash, mais ce sera tellement ennuyeux. Je vous propose une histoire intéressante (j'espère) sur la façon dont je suis personnellement allé dans cette direction et où je suis venu.

Ces endroits où il y avait de quoi prendre des photos avec des photos. Où en est-il des logiciels - probablement sans photo

Ce sera vraiment une histoire dans un format narratif, comme je vous le dirais autour d'une tasse de café. Il ne s’agit pas de commandes bash, de scripts python, et c’est tout.

Commençons par des photos et des vidéos de ce qui s'est passé, puis toute l'histoire sous la coupe.




L'histoire suivra ce scénario.


  • Pourquoi je le voulais
  • Fonctionnement d'une machine autonome (vue de dessus)
  • Âge 1 - Gelendwagen du monde des enfants + Raspberry Pi Zero W + caméra
  • Age 2 - GAZ66 + NVIDIA Jetson Nano + Camera pour RaspberryPi
  • 3 ans - Remo Hobby SMAX
  • 4 ans - Connexion SMAX et GAZ66
  • 5 ans - Montage de composants sur un Monster Truck
  • 6 ans - Installer Donkey Car et ses environs
  • 7 ans - Montage des rails, voyages
  • 8 ans - Voyager avec le joystick
  • 9 ans - Formation aux neurones
  • 10 ans - Tout fonctionne, enfin!
  • Et après?
  • Défi de bataille
  • Communauté
  • L'image de la carte SD de ma machine à écrire

Versez du café, nous partons!

Pourquoi je le voulais


Tout a commencé avec le fait que j'étais frustré par le fait que dans une grande entreprise informatique en Russie, ils fabriquent des drones très cool, c'est incroyablement cool, mais je suis sans travail :)

Non, eh bien, c'est vraiment trop cool - les voitures autonomes) Un excellent alliage de mécanique et algorithmes :) La

frustration a continué jusqu'à ce que je combine dans ma tête différents faits sur moi-même, à savoir:

  • Je peux écrire en python
  • Je comprends (approximativement) le fonctionnement de l'apprentissage automatique
  • Je sais comment travailler avec Linux sur la console
  • J'ai passé mon enfance avec un fer à souder
  • J'ai une boîte entière avec des composants DIY (Raspberry Pi, Arduino, capteurs, etc.)

Quand tout a fonctionné dans ma tête, j'ai décidé - que la voiture autonome (sdc) soit!

Pour commencer, j'ai décidé qu'il valait la peine de comprendre comment fonctionne sdc, et ce sera la prochaine section.

Fonctionnement d'une machine autonome (vue de dessus)


Pour que la voiture marche seule, elle a besoin de quatre composants - un chariot, des capteurs, un ordinateur, un algorithme.

Voyons ça


Chariot

Qu'est-ce qui conduira réellement. Roues, moteurs, la batterie qui fait tout fonctionner.

Il y a deux cohortes conditionnelles de voitures que j'ai nommées pour moi - des voitures du monde des enfants et des voitures pour un passe-temps.

N'essayez même pas de flirter avec les voitures du monde des enfants, j'ai essayé, c'est un échec. Leur inconvénient est qu'ils ont des moteurs faibles sans rétroaction. Cela signifie que vous pourrez probablement arrêter n'importe quel tapis de maison et que vous ne pourrez pas tourner avec la précision indiquée.

Les voitures du monde des loisirs sont ce dont vous avez besoin. Ils ont des moteurs puissants, de bonnes batteries, des servos avant pour les virages. Considérez cela comme un seuil d'entrée. La chose la moins chère et normale que j'ai pu trouver était Remo Hobby SMAX.



Capteurs

Il recueille des informations sur le monde qui l'entoure et les transfère sur un ordinateur pour la prise de décision.

Fondamentalement, un ensemble gentleman pour la DDC est:

  • Caméra. Les fondements des bases de la DDC. Il regarde un espace devant lui, transfère l'image vers un ordinateur qui reconnaît ce qui se passe et décide quoi faire. Il semble que je n'ai pas vu d'implémentations SDC sans caméra.
  • Capteur IMU. Une pièce montrant l'accélération et l'angle d'inclinaison le long des axes. Cela aide à comprendre où nous allons réellement et comment notre emplacement a changé par rapport au point de départ. Utilisé dans presque tous les hélicoptères.
  • . , , , . , SDC, , . , 75$, SDC Velodyne 4K$. , 3D , 2D.
  • GPS. , , , SDC .
  • . — , . 3D .



Ordinateur

Ce qui reçoit les valeurs des capteurs analyse la situation, nous transférons les commandes de contrôle au chariot.

Dans le monde des ordinateurs pour l'électronique embarquée, les processeurs ARM économes en énergie (comme dans votre téléphone) et les ordinateurs à carte unique basés sur eux, gouvernent la balle.

Aujourd'hui, il existe deux des options de carte unique les plus populaires - RaspberryPi et NVIDIA Jetson.
RaspberryPi a un prix inférieur, une grande variété de projets, une grande communauté.

NVIDIA a un prix plus élevé, moins de projets, mais plus de productivité dans les tâches d'apprentissage automatique. Il dispose de 128 cœurs CUDA (comme dans votre grande carte graphique NVIDIA), qui sont utilisés pour accélérer les algorithmes d'apprentissage automatique.

Il y a trois morceaux de Raspberry Pi (ZeroW, 3, 4) et NVIDIA Jetson Nano dans ma collection. J'ai décidé d'assembler la machine, bien sûr, sur Jetson.



Algorithme

qui décide des actions basées sur les lectures du capteur. Habituellement, une combinaison de vision par ordinateur et de réseaux de neurones est utilisée pour cela. Dans la version la plus basique, vous conduisez vous-même sur votre machine à écrire le long de certains marquages, enregistrez des vidéos de ces trajets avec suivi de gaz / frein / virage, puis entraînez-vous sur ce réseau de neurones pour qu'il vous trouve la dépendance des signaux du moteur sur les images de la caméra. C'est tout simplement la tâche de reconnaître le balisage et d'essayer d'y rester.

Si vous souhaitez rafraîchir le fonctionnement du réseau de neurones, je vous suggère de regarder cette vidéo:


Ici, j'ai décrit l'option la plus simple, où il n'y a qu'un appareil photo et un trajet de marquage. Mais il existe des options avec plus de capteurs et une logique de travail différente - il y aura un article séparé à ce sujet ici.

Si le niveau est très élevé, alors c'est tout.

Il ne reste que:

  • assembler le chariot
  • accrocher les capteurs
  • connecter un ordinateur
  • dessiner le balisage
  • monter dessus
  • pour former un réseau de neurones
  • aller

Maintenant que nous avons compris ce qu'est une voiture autonome, passons à l'ère de la mise en œuvre que j'avais spécifiquement.

Âge 1 - Gelendwagen du monde des enfants + Raspberry Pi Zero W + caméra


Oui, ma toute première approche était juste cela. C'est arrivé parce qu'il y avait un monde d'enfants près de chez moi dans lequel j'allais, dans lequel j'aimais Gelik, et je l'ai acheté.

Bon, je pensais, il y a une hélice, maintenant j'ai besoin d'un ordinateur et d'un capteur. Pensée - fait. Commandé un RPi Zero W et une caméra pour elle. Pendant que j'attendais l'ordinateur et l'appareil photo, je suis entré et j'ai acheté une banque d'alimentation pour cette entreprise.
Donc, tout est en place, il est temps de collecter. J'ai trouvé un tel projet , j'ai décidé de le suivre.
Gelik a démonté, retiré ses cerveaux natifs, les a transférés au contrôleur du moteur, à son tour, les a transférés à RPi, y a connecté une caméra, a alimenté le tout avec une banque d'alimentation et a été satisfait.

Avant de passer à l'autonomie gouvernementale, j'ai décidé de traverser la console pour le plaisir, pourchassant un chat, diffusant l'image de la caméra sur mon ordinateur portable.

C'est alors que quelques échecs m'attendaient.

Tout d'abord, le Raspberry Pi Zero W est très faible en termes de performances.

Deuxième - La viabilité du gelik du monde des enfants est presque nulle, il a été arrêté par presque n'importe quel obstacle minimal.

Déjà, il est devenu clair que le projet était mort-né, mais pour des raisons d'intérêt, j'ai essayé d'assembler la vision par ordinateur (OpenCV) pour Raspberry Pi Zero directement dessus. Cela a pris, sans blagues, plus d'une journée, et a été le dernier clou dans le couvercle du cercueil de cette mise en œuvre de la DDC.
Il est devenu clair que vous devez changer à la fois l'ordinateur pour de meilleures performances et le chariot pour une plus grande capacité de ski de fond.

Cela s'est avéré assez drôle:



2 — 66 + NVIDIA Jetson Nano + RaspberryPi


Donc, à ce stade, il est devenu clair que vous avez besoin d'une voiture plus passable, et de préférence d'un camion, pour mettre tous les composants dans la carrosserie. Après avoir étudié un service pour la sélection des produits, il est devenu clair que le modèle de notre GAZ66 natif me convient, c'est aussi un shishiga parmi les gens. D'accord, je l'ai commandé, attendez, il est temps de penser à l'ordinateur. À ce moment-là, NVIDIA était en train de préparer le début des ventes de son Jetson Nano, et j'ai passé une commande le premier jour de vente.

Un camion est arrivé, j'ai continué d'attendre Jetson, j'ai roulé avec impatience un shishiga autour de la maison, roulé les chatons que le chat mentionné ci-dessus a mis au monde. Pour ne pas dire que les chatons ont aimé - ont dû s'arrêter.

Pendant ce temps, Jetson conduisait toujours et j'ai commandé un lidar sous vide en provenance de Chine - je ne savais pas comment l'utiliser spécifiquement, mais j'ai compris que je le voulais.

Un jour, un coursier d'affaires est apparu à l'entrée du bureau, m'a remis une assez grande boîte de NVIDIA à paiement unique, j'ai signé sur la facture et je me sentais comme un développeur passionné - wow, l'appareil acheté au début des ventes m'est venu.

Il est temps de collecter! Mais d'abord, vous devez comprendre, lol. Démonté le shishigu, jeté son cerveau natal, lubrifié les mécanismes, commencé à se réunir déjà sur la base d'un ordinateur.

J'ai connecté la caméra, le contrôleur de moteur, le moteur rotatif, le moteur à essence / frein, j'ai commencé les scripts Python pour le test - encore une fois!

Cette fois, l'histoire est la suivante: un shishigi utilise un moteur conventionnel pour tourner, pas un servomoteur. Donc, il n'a aucune rétroaction. Donc, je ne peux pas les contrôler à coup sûr, ce qui signifie qu'il ne convient pas à SDC.

D'accord, encore une fois, vous devez résoudre ce problème, faire quelque chose. Nous passons à l'ère suivante.





3 ans - Remo Hobby SMAX


Puisqu'à ce moment-là, il était clair que la machine avait besoin non seulement de passable, mais aussi d'une qualité minimale en composants, le choix s'est porté sur les magasins pour ceux qui ont une RC, c'est un passe-temps.
Sans plus tarder, je suis arrivé dans un de ces magasins, et sans me cacher, il m'a dit ce que je faisais et quel type de machine j'avais besoin. Le vendeur, soyez gentil, m'a dit quelle machine correspond à mes exigences minimales, et c'était un Remo Hobby SMAX. Je l'ai acheté.

Je suis rentré à la maison, j'ai eu un shishigu, j'ai tout retiré, je me suis assis pour me connecter au SMAX. Et qu'en penses-tu? C'est vrai - l'échec encore!

Fondamentalement, les voitures RC sont conçues pour que le moteur se connecte au contrôleur du moteur et que, à son tour, se connecte au module radio qui communique avec la télécommande. Et c'est SMAX qui a été conçu pour que le contrôleur de moteur et le module radio soient combinés - je n'ai littéralement pas eu l'occasion de me connecter au contrôleur de moteur au lieu du module radio.

D'accord, vous devez refaire quelque chose. Je reviens sur le site des voitures RC, je monte dans les composants. En fouillant là-bas, et applaudissements, je trouve un contrôleur de moteur qui a un fil séparé pour le module radio.

Je commande, apporte, ramasse tout à nouveau - ça marche, mais ça tourne seulement. Mais il n'y a pas de gaz et inversez! Eh bien, bon sang, je pense, mais je continue de le choisir.

Cette fois, cela n'a pas fonctionné pour que le moteur SMAX se réveille, la console doit lui envoyer une certaine valeur (360) via le module radio. Mais je ne le savais pas et j'ai entré les valeurs directement pour le gaz de frein. Et le moteur n'a pas réagi, partant de la logique que personne ne lui a demandé de se réveiller.

À un moment donné, je me suis assis pour trier littéralement tout dans une rangée, m'attendant à ce qu'il réagisse à au moins quelque chose.

Au début, j'ai dépassé les 100 ans. Puis 50 par. Et quand j'ai atteint la recherche de 10, j'ai entendu un cri de bienvenue en 360 - cheers! Travaux!

J'ai testé gaz / marche arrière / gauche / droite depuis la console, tout fonctionne. C'est du feu, ici je suis programmeur =)

Il semble qu'il est temps de monter, mais il y a un problème - il n'y a absolument nulle part où mettre les composants. Les voitures RC sont conçues pour que leur toit soit une chose très conditionnelle. Premièrement, le haut est en plastique très fin, et deuxièmement, c'est une jeep, et il n'y a nulle part où mettre tout.
À ce moment, j'ai décidé de chercher, et comment, en fait, d'autres le font.

J'ai trouvé le projet de voiture d'âne, qui a tout sur une base clé en main pour assembler votre SDC - à la fois des exemples de matériel et un cadre logiciel. Cela semblerait cool, prenez-le et utilisez-le, mais il y a des nuances:

  • ils impriment le haut de la voiture sur une imprimante 3D, puis cela rappelle la voiture très loin. moche, bref, pas esthétique
  • leurs modèles 3D sont compatibles avec les machines que nous ne vendons pas.

Ok, souvenez-vous de Donkey Car, alors nous prendrons leur framework logiciel, mais pour l'instant nous devons penser au matériel.

Un jour, tournant la tête dans mon appartement, j'ai regardé le shishigu démonté, au SMAX sans le haut, et j'ai pensé - hmmm, et ils semblent être de la même échelle (1/16). Il a pris un shishiga, a pris un SMAX, a juste mis un par un sur l'autre - et vraiment, ça le fait! Et ça a l'air cool! OK, je dois le faire! Nous passons à l'ère suivante.







4 ans - Connexion SMAX et GAZ66


Donc, au début de cette ère, j'ai un objectif interne - connecter le haut d'une machine au bas d'une autre. Étant donné que mes collègues et moi avons pris une puce dans une imprimante 3D et que je suis son copropriétaire (un investisseur sérieux), il a été décidé d'établir une connexion dans un programme de CAO, d'imprimer et donc de les connecter.

Avec cette idée, j'ai marché pendant environ 2 mois, pensant que j'étais sur le point de m'asseoir pour comprendre les systèmes de CAO. Lol, non. Ayant admis que je ne voulais pas comprendre les systèmes de CAO, j'ai commencé à penser à d'autres options.

Je suis retourné dans le monde des enfants, j'ai décidé de voir les créateurs, soudain ils m'ont aidé. J'ai acheté un constructeur de métal classique, qui était avec moi quand j'étais à l'école (vieille école de frêne réunie).

Il l'a ramené chez lui, a mis deux pièces de la machine côte à côte et a commencé à leur appliquer toutes sortes d'éléments de conception. Combien de temps, brièvement, une sorte de compréhension a commencé à apparaître, comment, au moins en théorie, cela pourrait être fait.

Commencé à faire. J'ai passé plus d'une journée avec une clé pour bébé, des noix et une réflexion spatiale.

Pendant que je me connectais, j'ai appris à percer le plastique avec un tournevis, à déchirer soigneusement les pièces en excès afin de ne pas endommager le boîtier, à bloquer les écrous avec d'autres écrous (mais sans rondelles de toute façon). En général, mon Trudovik serait fier de moi.

Après environ trois modifications et trois jours, j'ai vu ce monstre camion devant moi - le GAZ66 SMAX Edition de Beslan.

Il semble donc que la base matérielle soit prête, passez à l'ère suivante.





5 ans - Montage de composants sur un Monster Truck


Enfin:

  • J'ai un chariot avec de bons composants
  • J'ai une tige esthétique et spacieuse
  • gaz / frein / tours fonctionnent normalement sur ce chariot
  • le haut et le bas sont même connectés ensemble =)

Il est temps de monter des composants sur cette beauté.

Armé d'un tournevis comme perceuse pour le plastique et d'un ruban adhésif double face comme support universel pour tout, je me suis mis au travail.

J'ai fait un support pour la caméra sur la cabine, ce qui vous permet de régler l'angle de la caméra. Jeté un long train de la caméra à Jetson, qui, à son tour, s'est installé dans le dos.

En plus de Jetson, les personnes suivantes se sont installées à l'arrière:

  • powerbank pour alimenter l'ordinateur (a fait don de son alimentation principale, cool, avec une alimentation USB pour que jetson ne tombe pas en panne)
  • PCA9685 (contrôleur PWM) pour la commande du moteur
  • batterie pour alimenter le moteur de la machine

Étant donné que le projet était déjà considéré comme étant à long terme à ce moment-là, j'ai décidé de ne pas encore jouer avec le lidar et de faire MVP au moins sur la caméra et le logiciel de Donkey Car.

Pour le plaisir, j'ai connecté mes phares natifs de GAZ66 pour le rendre plus beau et plus confiant dans l'obscurité.

D'accord, ma machine s'allume, les moteurs répondent aux commandes du python, la caméra donne une image, les lumières sont allumées, tout va bien, il est temps d'installer le logiciel.





6 ans - Installer Donkey Car et ses environs


Heureusement, dans les dernières étapes, j'ai trouvé le projet Donkey Car, et cela m'a beaucoup simplifié la vie, m'évitant d'écrire tout moi-même. Autrement dit, DonkeyCar est un framework qui a déjà tout ce dont vous avez besoin pour SDC. Et ils ont même des guides sur la façon d'installer des logiciels. Mais, comme c'est généralement le cas avec OpenSource, les guides sont obsolètes et se contredisent par moments.

D'accord, je dois le comprendre. Pour le fonctionnement normal du framework, les bibliothèques suivantes sont nécessaires:

  • Opencv
  • tensorflow-gpu (gpu est pour jetson, car il y a un noyau cuda. ​​pour rpi il y a tensorflow-lite)
  • tensorrt (bibliothèque pour accélérer l'inférence des neurones)
  • et tout ce qui est défini automatiquement en fonction de la liste des environnements

Commençons par OpenCV.

Le guide DonkeyCar dit que vous devez le construire à partir de la source elle-même, car pour ARM il n'y a pas d'OpenCV dans pip. J'ai même fait cela, compilé OpenCV, mais avant de l'installer, j'ai décidé de vérifier, tout à coup, le système a une ancienne version d'OpenCV, et elle doit être démolie. J'ai appelé un python, importé cv2, demandé une version, mais c'est bam et pertinent. Rapidement recherché et découvert que dans les dernières versions de linux4tegra (qui est en jetson), les gars de NVIDIA ont commencé à installer OpenCV. Cool, j'ai moins à faire. Bravo, que j'ai pu compiler moi-même :)

Ensuite, tensorflow-gpu.

Le guide DonkeyCar indique, d'une part, une branche de version obsolète (1.xx), et d'autre part, même pas la dernière version des versions obsolètes. J'ai décidé de ne pas les écouter et de mettre la dernière version actuelle (2.0).

La prochaine étape est la tension.

Le guide d'installation de tensrort sur jetson est écrit dans une page wiki séparée, et il ressort clairement que l'auteur n'a pas lu le guide principal =) Parce que dans le guide tensorrt, les variables d'environnement sont réaffectées et OpenCV cesse de fonctionner. Je l'ai tordu de cette façon et cela, j'ai tout annulé et j'ai décidé de marteler l'environnement et les variables d'environnement - de les rouler directement dans l'environnement principal.

Satisfait de lui-même, il ouvrit le python, à son tour appelé cv2, tensorflow, tensorrt, puis demanda au python leur version - ils étaient tous importés, montraient tous les dernières versions. Cool!

Le processus d'installation de la voiture d'âne elle-même est assez simple, je ne le décrirai pas, je suggère de lire leur guide. La seule chose que je note maintenant est que dans la configuration de l'âne, vous pouvez augmenter la résolution de l'image de 86x86 pour RPi à 224x224 pour Jetson (car il y aura plus de performances et de précision sera plus élevée).

Donc, tout est prêt, il est temps de courir et de tester!

Ma machine s'allume vraiment, elle démarre le serveur Web sur cette IP, à laquelle le routeur a émis la machine. Et vous pouvez vraiment y aller, et à partir du navigateur, pilotez le joystick, en regardant l'image de l'appareil photo.

J'ai également dû calibrer les valeurs fournies au PWM (PCA9685) pour trouver un virage maximal vers l'avant, vers l'arrière et vers les côtés.

Ici, en passant, j'ai découvert que mon moteur n'était pas connecté correctement - la machine a reculé beaucoup plus énergiquement qu'avant - j'ai expérimentalement trouvé les fils, les ai jetés dans l'autre sens. Il était disposé de façon à ce que tous les fils du moteur soient de la même couleur, et vous ne vous souvenez plus comment c'était. Mais je l'ai connecté correctement, et j'ai mis un thermorétractable sur chaque fil, afin de pouvoir les distinguer plus tard.

Cool, il est temps de passer à la préparation de la piste!

7 ans - Montage des rails, voyages


L'algorithme Donkey Car est conçu de telle sorte qu'il existe un neurone formé par un enseignant. Et cela signifie que l'image de la caméra suit, et un fichier json apparaît à côté de chaque image dans laquelle le nom de l'image, l'accélération, la rotation, l'horodatage est écrit. Et pour former un neurone, ces paires image + json ont besoin d'au moins 5K.

Il a été décidé d'assembler la piste à la maison, ils disent que l'appartement est grand, il y a où se retourner. Mais en commençant à se rassembler, il est devenu clair qu'il n'y avait pas de tour dans l'appartement - le sol est de différentes couleurs, le contraste sera différent et le modèle ne peut pas sortir.

D'accord, j'ai décidé de le mettre dans une pièce. J'ai acheté 4 rouleaux de ruban adhésif et je les ai collés à la piste au sol.

J'ai mis la voiture, l'ai démarrée, je suis partie et j'ai encore échoué - il s'avère qu'une pièce est trop petite et ma voiture est ringarde et n'est pas incluse dans les virages. Plus précisément, c'est inclus, mais à une vitesse telle que ce sera dommage alors =)

D'accord, nous devons faire la deuxième itération, et nous avons besoin d'une grande pièce. Le choix s'est porté sur le bureau - il y a beaucoup d'endroits, les sols sont monophoniques, ouverts 24h / 24 et 7j / 7. Le seul problème est que les nettoyeurs fonctionnent la nuit, et la piste devra être enlevée. Autrement dit, vous devez tout faire en une seule fois - rouler avec vos mains pour être enseignant, former le modèle, le remettre dans la machine à écrire et aller déjà sans commande manuelle.

D'accord, le jour X, après l'événement sur les expériences A / B, il a été décidé de rester au bureau et de faire la piste.
L'endroit est choisi, la bande est prête, l'équipe de constructeurs de la piste dans le jeu. Juste une heure, et dans le couloir du bureau, il y a une excellente piste.

J'ai mis la voiture dedans, je l'ai allumée, j'ai essayé de rouler - hourra, elle entre dans les virages et j'ai dû limiter la vitesse à seulement 80%.



8 ans - Voyager avec le joystick


Donc, j'ai une piste, j'ai une voiture et j'ai besoin de 5K paires photo + json.

Empiriquement, j'ai découvert qu'un tour de ma piste fait 250 paires de photo + json, ce qui signifie que je dois laisser au moins 20 tours.

De préférence dans une rangée. Vous pouvez, bien sûr, de façon intermittente, mais le gaz projeté est alors secoué par le modèle, et il peut commencer à ralentir, mais je ne veux pas cela.

J'ai commencé à essayer de faire 20 tours sans interruption, et cela, je dois le dire, n'est pas une tâche facile.

La première difficulté est survenue car il y avait une colonne lourde au centre de l'itinéraire, et lorsque la machine roulait après, la connexion avec l'ordinateur portable à partir duquel elle était contrôlée est devenue retardée, et ce petit décalage m'a fait sortir des limites de l'itinéraire.

D'accord, vous devez donc vous assurer que la connexion se fait à partir de l'appareil avec lequel je vais moi-même à la machine à écrire lorsque je conduis. Et cela signifie que vous devez conduire à partir du navigateur du téléphone.

Mais il y a toujours un joystick, et je le tiens à deux mains, où puis-je obtenir le téléphone? Porter une machine à écrire n'est pas une option, cela le ralentira, puis, sans téléphone, cela ira plus vite et peut se confondre dans les coins en raison d'une accélération excessive.

Hmm, alors vous devez en quelque sorte combiner le téléphone et le joystick. D'accord, j'ai un lecteur, il est assez grand, il s'adaptera à la fois à un téléphone et à un joystick - ça ira. Il a pris la cassette et a collé le téléphone au lecteur avec de la cassette et juste en dessous du joystick. J'ai regardé ce miracle et j'ai pensé - qu'êtes-vous, en général? :-)

Mais ça a marché :) Avec cette chose, j'ai réussi à laisser 20 tours. Mais en fait, même 25, parce que j'ai goûté quelque part autour de 15 cercles.

Teckel, prêt, j'ai un jeu de données pour entraîner un neurone, il est temps de m'entraîner!

9 ans - Formation aux neurones


En ce moment, j'ai une voiture, une piste, un jeu de données - oui, je suis à un pas du résultat!
À la maison, le PC tournait au ralenti, avec le NVIDIA RTX 2070, sur lequel j'avais l'intention d'étudier. Heureusement, pour une maison intelligente, j'ai une adresse IP externe et je n'ai eu qu'à obtenir le port 22 d'Internet vers un PC. C'est bien qu'il y ait des assistants qui ont fait ça pour moi pendant que j'étais au bureau.

Donc, je vais sur ssh sur l'ordinateur avec ubuntu, surveille le dossier d'accueil pour sshfs, télécharge des fichiers. Il semblerait que seulement 40 mégaoctets, mais cela a duré environ 30 minutes. C'est arrivé, si je comprends bien, parce qu'il y en avait beaucoup.

Fichiers sur votre ordinateur, tensorflow-gpu installé, logiciel DonkeyCar installé, il est temps de vous entraîner.
J'appelle un script de DonkeyCar pour entraîner un neurone, je le pointe vers les dossiers avec le jeu de données - il a fonctionné.
Pendant que le neurone fonctionne, nvtop (moniteur de chargement de carte vidéo) affiche une utilisation de 1406%, htop normal affiche une charge de 100% cpu pour les 16 cœurs, ça va).

Après environ 20 minutes, j'ai un modèle formé pour conduire une voiture. Il semblerait, prenez-le, utilisez-le. Mais non :)

Rappelez-vous, j'ai écrit ci-dessus à propos de tensorrt, qui optimise l'inférence des neurones et les exécute sur des noyaux de cuda? Bien sûr, je veux le parcourir.

Et cela signifie ce dont j'ai besoin:

  • figer le modèle (vous devez tout emballer pour le modèle dans un fichier)
  • convertir le résultat de la frise au format tensorrt

J'essaie de figer le modèle, j'appelle le script depuis DonkeyCar, échec. En attendant, c'est jusqu'à la nuit, bientôt les nettoyeurs démontent ma piste, je dois vite.

L'hypothèse est née que c'est parce que j'ai pris le mauvais tensorflow que DonkeyCar avait. D'accord, je tire tensorflow 2.0, je fixe 1.15, j'essaie à nouveau - succès, bravo!

Maintenant, la conversion, et encore la panne - l'équipe n'a pas été trouvée. D'accord, je vais chercher quel est le problème. Il s'est avéré que NVIDIA a marqué cette fonctionnalité comme obsolète et a supprimé le support. Maintenant, disent-ils, vous devez vous convertir à la main. Heureusement, j'ai trouvé le dépôt git, où il y avait une demande similaire, et l'utilisateur a trouvé l'endroit où se trouve réellement le script python, qui convertit les modèles.

J'appelle le script de cet endroit, et la vérité répond. Mais, dit-il, pas de troisième python pour vous, venez en deuxième.

D'accord, j'appelle le deuxième python. Il me dit - je n'ai pas de tensorflow. Eh bien, je lui demande de mettre tensorflow-gpu 1.15, et il me dit qu'il n'y a pas une telle version, il n'y en a que 1.14. D'accord, je suis d'accord, prenons une chance et mettons les différentes versions dans différents environnements python. Mettez tensorflow dans le second python, appelé à la conversion - cheers, ça a marché!

D'accord, j'ai des modèles pour tensorrt et pour tensorflow-gpu ordinaire, je le laisse tomber dans la machine.

Je démarre la machine avec le modèle pour tensorrt, un énorme trackback d'erreur, le temps presse - ok, je vais essayer le modèle habituel.

Je recommence l'erreur habituelle, mais cette fois, c'est assez clair - la taille de votre image est 224X224, alors que 86X86 est attendue. Rappelez-vous, quelque part beaucoup plus haut, j'ai écrit que les règles de configuration ont changé la résolution d'image de la caméra?

Donc, sur la machine à écrire, j'ai corrigé, mais pas sur l'ordinateur hôte.

Je reviens à l'ordinateur hôte, corrige les configs là-bas, me réentraîne, refais la frise, reconvertis, rejette.



Je démarre la machine avec un modèle pour tensorrt, et ...

10 ans - Tout fonctionne, enfin!


Hourra! Ma voiture est partie! Lui-même, sans moi. Très cool. Je suis incroyablement heureux)


Pendant presque un an, j'ai fait tout ça, et maintenant)

Et après?


Il y a un certain nombre de projets de développement, je vais passer du simple au complexe.

  • Ajoutez un capteur IMU au modèle pour augmenter éventuellement la précision. Par exemple, lors de la montée, plus d'efforts sont nécessaires sur le moteur.
  • Transformez la logique en déplacements non pas sur l'autoroute, mais contournez simplement les obstacles
  • Ajouter du lidar et en prendre des lectures

Défi de bataille


Si vous-même ou avec une compagnie d'amis vous sentez que vous voulez courir, alors écrivez-moi, organisons des compétitions =)

Communauté


J'ai également mis en place une salle de chat d'intérêt et je prépare une chaîne. Je ne suis pas sûr que, selon les règles de Habr, c'est possible, donc j'enverrai au PM sur demande.

L'image de la carte SD de ma machine à écrire


Sur demande également, je vous enverrai une image img de ma voiture, si vous voulez le faire sur une base similaire, et ne voulez pas vous baigner avec le réglage.

All Articles