Sommario:

Tutorial per il rilevamento di oggetti con robot quadruplo Jetson Nano: 4 passaggi
Tutorial per il rilevamento di oggetti con robot quadruplo Jetson Nano: 4 passaggi

Video: Tutorial per il rilevamento di oggetti con robot quadruplo Jetson Nano: 4 passaggi

Video: Tutorial per il rilevamento di oggetti con robot quadruplo Jetson Nano: 4 passaggi
Video: Jetson Nano Custom Object Detection — как обучить собственный ИИ 2024, Dicembre
Anonim
Image
Image

Nvidia Jetson Nano è un kit per sviluppatori, che consiste in un SoM (System on Module) e una scheda portante di riferimento. È principalmente destinato alla creazione di sistemi embedded che richiedono un'elevata potenza di elaborazione per applicazioni di machine learning, visione artificiale ed elaborazione video. Puoi guardare una recensione dettagliata sul mio canale YouTube.

Nvidia ha cercato di rendere Jetson Nano il più user-friendly e facile da sviluppare con i progetti possibile. Hanno anche lanciato un piccolo corso su come costruire il tuo robot con Jetson Nano, giorni dopo il lancio della scheda. Puoi trovare i dettagli su quel progetto qui.

Tuttavia, io stesso ho avuto alcuni problemi con il Jetbot come progetto:

1) Non era abbastanza EPICO per me. Jetson Nano è una scheda molto interessante con grandi capacità di elaborazione e realizzare un semplice robot su ruote con essa sembrava una cosa molto… deludente da fare.

2) La scelta dell'hardware. Jetbot richiede un hardware costoso/sostituibile con altre alternative, ad esempio utilizzano il joystick per la teleoperazione. Sembra divertente, ma ho davvero bisogno di un joystick per controllare un robot?

Quindi, subito dopo aver messo le mani su Jetson Nano, ho iniziato a lavorare al mio progetto, un Jetspider. L'idea era di replicare le demo di base di Jetbot, ma con hardware più comune e applicabile a una più ampia varietà di progetti.

Passaggio 1: prepara il tuo hardware

Prepara il tuo hardware
Prepara il tuo hardware

Per questo progetto ho utilizzato un primo prototipo di robot quadrupede Zuri, realizzato da Zoobotics. È rimasto a lungo nel laboratorio della nostra azienda. L'ho dotato di un supporto in legno tagliato al laser per Jetson Nano e un supporto per fotocamera. Il loro design è proprietario, quindi se per il tuo robot Jetson Nano vuoi creare qualcosa di simile, puoi dare un'occhiata al progetto Meped, che è un quadrupede simile con un design open source. Infatti, poiché nessuno aveva il codice sorgente per il microcontrollore di Zuri (Arduino Mega) nel nostro laboratorio, ho usato il codice di Meped con alcune piccole modifiche nell'offset gambe/piedi.

Ho usato una normale webcam USB compatibile con Raspberry Pi e un dongle USB Wifi.

Il punto principale è che poiché utilizzeremo Pyserial per la comunicazione seriale tra microcontrollore e Jetson Nano, il tuo sistema essenzialmente può utilizzare qualsiasi tipo di microcontrollore, purché possa essere interfacciato con Jetson Nano con cavo seriale USB. Se il tuo robot utilizza motori DC e un driver del motore (ad esempio basato su L298P) è possibile interfacciare direttamente il driver del motore con Jetson Nano GPIO. Ma, sfortunatamente, per controllare i servi puoi usare solo un altro microcontrollore o un servo driver I2C dedicato, poiché Jetson Nano non ha hardware GPIO PWM.

Per riassumere, puoi utilizzare il tipo di robot con qualsiasi microcontrollore che può essere collegato a Jetson Nano tramite cavo dati USB. Ho caricato il codice per Arduino Mega nel repository github per questo tutorial e la parte relativa all'interfacciamento di Jetson Nano con Arduino è qui:

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

{

caso 1':

inoltrare();

rottura;

caso '2':

Indietro();

rottura;

caso '3':

Girare a destra();

rottura;

caso '4':

Girare a sinistra();

rottura;

Controlliamo se ci sono dati disponibili e, in caso affermativo, li passiamo alla struttura di controllo switch-case. Attenzione che i dati del seriale vengono forniti come caratteri, notare le virgolette singole attorno ai numeri 1, 2, 3, 4.

Passaggio 2: installa i pacchetti necessari

Fortunatamente per noi, l'immagine di sistema Jetson Nano predefinita viene fornita con molte cose preinstallate (come OpenCV, TensorRT, ecc.), Quindi abbiamo solo bisogno di installare un paio di altri pacchetti per far funzionare il codice e abilitare SSH.

Iniziamo abilitando SSH nel caso tu voglia fare tutto il resto del lavoro da remoto.

sudo apt update

sudo apt install openssh-server

Il server SSH si avvierà automaticamente.

Per connetterti alla tua macchina Ubuntu tramite LAN devi solo inserire il seguente comando:

ssh nomeutente@indirizzo_ip

Se hai una macchina Windows, dovrai installare il client SSH, ad esempio Putty.

Iniziamo installando Python Package Manager (pip) e Pillow per la manipolazione delle immagini.

sudo apt install python3-pip python3-pil

Quindi installeremo il repository Jetbot, poiché ci affidiamo ad alcune parti del suo framework per eseguire il rilevamento degli oggetti.

sudo apt install python3-smbus python-pyserial

git clone

cd jetbot

sudo apt-get install cmake

sudo python3 setup.py install

Infine clona il mio repository Github per questo progetto nella tua cartella home e installa Flask e alcuni altri pacchetti per il controllo remoto del robot utilizzando il server web.

git clone

cd

sudo pip3 install -r requisiti-opencv

Scarica il modello SSD (Single Shot Detector) preaddestrato da questo link e posizionalo nella cartella jetspider_demos.

Ora siamo a posto!

Passaggio 3: eseguire il codice

Esegui il codice
Esegui il codice

Ho realizzato due demo per Jetspider, la prima è una semplice teleoperazione, molto simile a quella che ho fatto in precedenza per il rover Banana Pi e la seconda utilizza TensorRT per il rilevamento degli oggetti e invia i comandi di movimento tramite la connessione seriale al microcontrollore.

Poiché la maggior parte del codice di teleoperazione è descritto nell'altro mio tutorial (ho apportato solo alcune modifiche minori, modificando la trasmissione video) qui mi concentrerò sulla parte del rilevamento degli oggetti.

Lo script principale per object following è object_following.py in jetspider_object_following, per teleoperation è spider_teleop.py in jetspider_teleoperation.

Lo script che segue l'oggetto inizia con l'importazione dei moduli necessari e la dichiarazione di variabili e istanze di classe. Quindi avviamo il server Web Flask con questa riga

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

Non appena apriamo l'indirizzo 0.0.0.0 (localhost) nel nostro browser Web o l'indirizzo Jetson Nano sulla rete (puoi verificare con il comando ifconfig), questa funzione verrà eseguita

def indice():

Rende il modello di pagina web che abbiamo nella cartella dei modelli. Il modello ha una sorgente video incorporata al suo interno, quindi una volta terminato il caricamento, verrà eseguito def video_feed():, che restituisce un oggetto Response che viene inizializzato con la funzione generator.

Il segreto per implementare gli aggiornamenti sul posto (aggiornare l'immagine nella pagina web per il nostro flusso video) è utilizzare una risposta in più parti. Le risposte in più parti sono costituite da un'intestazione che include uno dei tipi di contenuto in più parti, seguito dalle parti, separate da un indicatore di confine e ciascuna con il proprio tipo di contenuto specifico per la parte.

In def gen(): function implementiamo la funzione generator in un ciclo infinito che cattura l'immagine, la invia alla funzione def execute(img):, ottenendo un'immagine da inviare successivamente alla pagina web.

def execute(img): la funzione è dove avviene tutta la magia, prende un'immagine, la ridimensiona con OpenCV e la passa all'istanza di classe Jetbot ObjectDetector "model". Restituisce restituisce l'elenco dei rilevamenti e usiamo OpenCV per disegnare rettangoli blu attorno ad essi e scrivere annotazioni con la classe dell'oggetto rilevato. Dopodiché controlliamo se c'è un oggetto di nostro interesse detectmatching_detections = [d for d in rilevamenti[0] if d['label'] == 53]

Puoi cambiare quel numero (53) in un altro numero dal set di dati CoCo se vuoi che il tuo robot segua altri oggetti, 53 è una mela. L'intero elenco è nel file categorie.py.

Infine, se non viene rilevato alcun oggetto per 5 secondi, trasmettiamo il carattere "5" affinché il robot si fermi sul seriale. Se l'oggetto viene trovato calcoliamo la distanza dal centro dell'immagine e agiamo di conseguenza (se vicino al centro, vai dritto (carattere "1" sul seriale), se a sinistra vai a sinistra, ecc.). Puoi giocare con quei valori per determinare il meglio per il tuo particolare setup!

Fase 4: Considerazioni finali

Pensieri finali
Pensieri finali

Questo è il succo della demo di ObjectFollowing, se vuoi saperne di più sullo streaming video del server web Flask, puoi dare un'occhiata a questo fantastico tutorial di Miguel Grinberg.

Puoi anche dare un'occhiata al notebook Nvidia Jetbot Object Detection qui.

Spero che le mie implementazioni delle demo Jetbot ti aiutino a costruire il tuo robot utilizzando il framework Jetbot. Non ho implementato la demo per evitare gli ostacoli, poiché penso che la scelta del modello non produrrà buoni risultati per evitare gli ostacoli.

Aggiungimi su LinkedId se hai qualche domanda e iscriviti al mio canale YouTube per ricevere notifiche su progetti più interessanti che coinvolgono l'apprendimento automatico e la robotica.

Consigliato: