Table des matières:

Tutoriel de détection d'objets pour robots Jetson Nano Quadruped : 4 étapes
Tutoriel de détection d'objets pour robots Jetson Nano Quadruped : 4 étapes

Vidéo: Tutoriel de détection d'objets pour robots Jetson Nano Quadruped : 4 étapes

Vidéo: Tutoriel de détection d'objets pour robots Jetson Nano Quadruped : 4 étapes
Vidéo: Eureka от Nvidia: 1000-кратно более быстрый агент ИИ-робота на базе OpenAI GPT4 2024, Juin
Anonim
Image
Image

Nvidia Jetson Nano est un kit de développement composé d'un SoM (System on Module) et d'une carte support de référence. Il est principalement destiné à la création de systèmes embarqués nécessitant une puissance de traitement élevée pour les applications d'apprentissage automatique, de vision industrielle et de traitement vidéo. Vous pouvez en regarder une critique détaillée sur ma chaîne YouTube.

Nvidia a essayé de rendre Jetson Nano aussi convivial et facile à développer que possible. Ils ont même lancé un petit cours sur la façon de construire votre robot avec Jetson Nano, quelques jours après le lancement de la planche. Vous pouvez trouver les détails de ce projet ici.

Cependant, j'ai moi-même eu quelques problèmes avec le Jetbot en tant que projet:

1) Ce n'était pas assez ÉPIQUE pour moi. Jetson Nano est une carte très intéressante avec de grandes capacités de traitement et faire un simple robot à roues avec cela semblait être une chose très… décevante à faire.

2) Le choix du matériel. Jetbot nécessite du matériel coûteux/qui peut être remplacé par d'autres alternatives - par exemple, ils utilisent un joystick pour la téléopération. Cela semble amusant, mais ai-je vraiment besoin d'un joystick pour contrôler un robot ?

Donc, immédiatement après avoir mis la main sur Jetson Nano, j'ai commencé à travailler sur mon propre projet, un Jetspider. L'idée était de reproduire les démos de base de Jetbot, mais avec du matériel plus commun et applicable à une plus grande variété de projets.

Étape 1: préparez votre matériel

Préparez votre matériel
Préparez votre matériel

Pour ce projet, j'ai utilisé un premier prototype de robot quadrupède Zuri, fabriqué par Zoobotics. Il traînait depuis longtemps dans le laboratoire de notre entreprise. Je l'ai équipé d'un support en bois découpé au laser pour Jetson Nano et d'un support de caméra. Leur conception est propriétaire, donc si pour votre robot Jetson Nano vous souhaitez créer quelque chose de similaire, vous pouvez jeter un œil au projet Meped, qui est un quadrupède similaire avec une conception open source. En fait, comme personne n'avait le code source du microcontrôleur de Zuri (Arduino Mega) dans notre laboratoire, j'ai utilisé le code de Meped avec quelques ajustements mineurs dans le décalage des jambes/pieds.

J'ai utilisé une webcam USB standard compatible Raspberry Pi et un dongle USB Wifi.

Le point principal est que puisque nous allons utiliser Pyserial pour la communication série entre le microcontrôleur et Jetson Nano, votre système peut essentiellement utiliser n'importe quel type de microcontrôleur, tant qu'il peut être interfacé avec Jetson Nano avec un câble série USB. Si votre robot utilise des moteurs à courant continu et un pilote de moteur (par exemple basé sur L298P), il est possible d'interfacer directement le pilote de moteur avec Jetson Nano GPIO. Mais, malheureusement, pour contrôler les servos, vous ne pouvez utiliser qu'un autre microcontrôleur ou un servomoteur I2C dédié, car Jetson Nano n'a pas de matériel GPIO PWM.

Pour résumer, vous pouvez utiliser un type de robot avec n'importe quel microcontrôleur pouvant être connecté à Jetson Nano à l'aide d'un câble de données USB. J'ai téléchargé le code pour Arduino Mega dans le référentiel github pour ce tutoriel et la partie relative à l'interfaçage de Jetson Nano avec Arduino est ici:

if(Serial.available()) {switch(Serial.read()) {

{

cas 1':

effronté();

Pause;

cas '2':

arrière();

Pause;

cas '3':

Tournez à droite();

Pause;

cas '4':

Tourner à gauche();

Pause;

Nous vérifions si des données sont disponibles et, si elles le sont, les transmettons à la structure de contrôle du boîtier de commutation. Faites attention, que les données de la série se présentent sous forme de caractères, notez le guillemet simple autour des chiffres 1, 2, 3, 4.

Étape 2: Installez les packages nécessaires

Heureusement pour nous, l'image système par défaut de Jetson Nano est livrée avec de nombreux éléments préinstallés (comme OpenCV, TensorRT, etc.), nous n'avons donc besoin d'installer que quelques autres packages pour faire fonctionner le code et activer SSH.

Commençons par activer SSH au cas où vous voudriez faire tout le reste du travail à distance.

mise à jour sudo apt

sudo apt installer openssh-server

Le serveur SSH démarrera automatiquement.

Pour vous connecter à votre machine Ubuntu via LAN, il vous suffit d'entrer la commande suivante:

ssh username@ip_address

Si vous avez une machine Windows, vous devrez installer le client SSH, par exemple Putty.

Commençons par installer Python Package Manager (pip) et Pillow pour la manipulation d'images.

sudo apt installer python3-pip python3-pil

Ensuite, nous installerons le référentiel Jetbot, car nous nous appuyons sur certaines parties de son framework pour effectuer la détection d'objets.

sudo apt installer python3-smbus python-pyserial

git clone

cd jetbot

sudo apt-get install cmake

sudo python3 setup.py installer

Enfin, clonez mon référentiel Github pour ce projet dans votre dossier de départ et installez Flask et quelques autres packages pour le contrôle à distance du robot à l'aide d'un serveur Web.

git clone

CD

sudo pip3 install -r exigences-opencv

Téléchargez le modèle SSD (Single Shot Detector) pré-entraîné à partir de ce lien et placez-le dans le dossier jetspider_demos.

Maintenant, nous sommes prêts à partir !

Étape 3: Exécutez le code

Exécuter le code
Exécuter le code

J'ai fait deux démos pour Jetspider, la première est une téléopération simple, très similaire à celle que j'ai faite plus tôt pour le rover Banana Pi et la seconde utilise TensorRT pour la détection d'objets et envoie les commandes de mouvement via la connexion série au microcontrôleur.

Étant donné que la plupart du code de téléopration est décrit dans mon autre tutoriel (je n'ai fait que quelques ajustements mineurs, regradant la transmission vidéo), je me concentrerai ici sur la partie détection d'objets.

Le script principal pour le suivi d'objet est object_following.py dans jetspider_object_following, pour la téléopération est spider_teleop.py dans jetspider_teleoperation.

L'objet suivant le script commence par importer les modules nécessaires et déclarer les variables et les instances de classe. Ensuite, nous démarrons le serveur Web Flask avec cette ligne

app.run(host='0.0.0.0', threaded=True)

Dès que nous ouvrons l'adresse 0.0.0.0 (localhost) dans notre navigateur Web ou l'adresse Jetson Nano sur le réseau (peut vérifier avec la commande ifconfig), cette fonction sera exécutée

indice def():

Il rend le modèle de page Web que nous avons dans le dossier des modèles. Le modèle a une source vidéo intégrée, donc une fois le chargement terminé, def video_feed(): sera exécuté, ce qui renvoie un objet Response qui est initialisé avec la fonction génératrice.

Le secret pour implémenter les mises à jour sur place (mise à jour de l'image dans la page Web pour notre flux vidéo) consiste à utiliser une réponse en plusieurs parties. Les réponses en plusieurs parties consistent en un en-tête qui comprend l'un des types de contenu en plusieurs parties, suivi des parties, séparées par un marqueur de limite et chacune ayant son propre type de contenu spécifique à une partie.

Dans def gen(): function, nous implémentons la fonction génératrice dans une boucle infinie qui capture l'image, l'envoie à def execute(img): function, produisant une image à envoyer à la page Web après cela.

def execute(img): la fonction est l'endroit où toute la magie se produit, elle prend une image, la redimensionne avec OpenCV et la transmet à l'instance de classe Jetbot ObjectDetector "model". Il renvoie la liste des détections et nous utilisons OpenCV pour dessiner des rectangles bleus autour d'eux et écrire des annotations avec la classe d'objet détecté. Après cela, nous vérifions s'il y a un objet de notre intérêt détectématching_detections = [d pour d dans détections[0] if d['label'] == 53]

Vous pouvez changer ce numéro (53) en un autre numéro de l'ensemble de données CoCo si vous voulez que votre robot suive d'autres objets, 53 est une pomme. La liste complète est dans le fichier categories.py.

Enfin s'il n'y a pas d'objet détecté pendant 5 secondes nous transmettons le caractère "5" pour que le robot s'arrête sur la série. Si l'objet est trouvé, nous calculons à quelle distance il se trouve du centre de l'image et agissons en conséquence (si proche du centre, allez tout droit (caractère "1" sur la série), si à gauche, allez à gauche, etc.). Vous pouvez jouer avec ces valeurs pour déterminer la meilleure pour votre configuration particulière !

Étape 4: Réflexions finales

Dernières pensées
Dernières pensées

C'est l'essentiel de la démo ObjectFollowing, si vous voulez en savoir plus sur le streaming vidéo du serveur Web Flask, vous pouvez jeter un œil à cet excellent tutoriel de Miguel Grinberg.

Vous pouvez également consulter le bloc-notes Nvidia Jetbot Object Detection ici.

J'espère que mes implémentations des démos Jetbot vous aideront à construire votre robot à l'aide du framework Jetbot. Je n'ai pas implémenté de démo d'évitement d'obstacles, car je pense que le choix du modèle ne donnera pas de bons résultats d'évitement d'obstacles.

Ajoutez-moi sur LinkedId si vous avez des questions et abonnez-vous à ma chaîne YouTube pour être informé des projets les plus intéressants impliquant l'apprentissage automatique et la robotique.

Conseillé: