I veicoli autonomi stanno lentamente diventando una parte importante dell'industria automobilistica. Molti credono che i veicoli completamente autonomi saranno presto in grado di guidare al fianco degli umani, e le aziende tecnologiche sono in gara per implementare veicoli completamente autonomi. Nel dicembre 2018, Waymo, l'azienda nata dal progetto di auto a guida autonoma di Google, ha ufficialmente avviato il suo servizio commerciale di auto a guida autonoma nei sobborghi di Phoenix. Aziende come May Mobility, Drive.ai e Uber stanno seguendo lo stesso percorso.
I veicoli autonomi possono sembrare una visione grandiosa, ma i veicoli semi-autonomi sono già tra noi. Le nuove auto Tesla hanno la funzione Tesla Autopilot, che è capace di riconoscimento e tracciamento della corsia, controllo adattivo della velocità di crociera e parcheggio autonomo. La capacità di identificare e tracciare le corsie sulla strada è uno dei molti prerequisiti per i veicoli senza conducente. Anche se il riconoscimento delle corsie può sembrare un problema difficile, puoi iniziare a sviluppare algoritmi di riconoscimento e tracciamento delle corsie con la piattaforma hardware NVIDIA Jetson Nano.
Il COM Jetson Nano è leggermente più grande di un Raspberry Pi 3, ma può eseguire reti neurali in parallelo con una potenza di 472 Gflops. Questo è circa 22 volte più potente del Raspberry Pi 3 ed è estremamente efficiente dal punto di vista energetico, consumando appena 5 W. Questa scheda è perfetta per applicazioni di intelligenza artificiale embedded che girano su un kernel Linux ridotto. Ha abbastanza potenza di elaborazione e memoria a bordo per applicazioni di elaborazione di immagini e video di alta qualità. Le caratteristiche chiave di Jetson Nano includono:
Per questo progetto, abbiamo bisogno di un Jetson Nano COM o di una scheda di sviluppo e di una telecamera CSI (una telecamera CSI Raspberry Pi v2 funziona bene). Mostrerò questa applicazione utilizzando la scheda di sviluppo Nano, ma è possibile costruire facilmente una baseboard personalizzata per un Nano COM e distribuire questa applicazione. La telecamera CSI sarà collegata alla porta della telecamera sul Jetson Nano, anche se si potrebbe utilizzare una telecamera USB o telecamere IP. Di seguito sono riportati i requisiti necessari per far funzionare con successo questo progetto:
L'implementazione completa di questo progetto può essere trovata su GitHub. Segui i passaggi successivi per ottenere una demo di questo progetto funzionante. Questi passaggi sono importanti per il processo di elaborazione delle immagini che è inteso a rendere il riconoscimento delle corsie più accurato.
Il primo passo del nostro sistema di rilevamento delle corsie consiste nella capacità di leggere immagini in diretta dalla telecamera. Per i nuovi utenti che lavorano con Jetson Nano, gestire le telecamere potrebbe risultare complicato. Per questo, utilizzeremo la libreria NanoCamera. Questa libreria non è l'opzione migliore per un'applicazione di livello produttivo, ma funziona per un'applicazione più semplice come quella mostrata qui.
Prima di tutto, installa la libreria con pip:
Leggere l'immagine in diretta dalla telecamera:
Per rendere l'immagine più fluida e rimuovere il rumore indesiderato, possiamo applicare una sfocatura gaussiana. Questo comporta il calcolo del valore di ogni pixel come media ponderata dei pixel circostanti.
OpenCV include una funzione per applicare la sfocatura gaussiana a un'immagine:
Dopo la sfocatura gaussiana, l'immagine è ancora in RGB e deve essere trasformata nello spazio colore HSV. La separazione dei colori verrà utilizzata per rimuovere i colori indesiderati dall'immagine. Una volta che l'immagine è in HSV, possiamo "eliminare" tutti i colori non necessari dall'immagine specificando un intervallo di scala di grigi.
La dilatazione aggiunge pixel ai contorni degli oggetti in un'immagine. Applicare la dilatazione all'immagine aiuterà a chiudere eventuali spazi aperti nelle immagini delle linee.
Per rilevare le linee di corsia, possiamo utilizzare una tecnica chiamata rilevamento dei bordi di Canny. Il rilevamento dei bordi di Canny può essere utilizzato per estrarre informazioni strutturali utili da un oggetto. La libreria OpenCV fornisce una funzione di rilevamento dei bordi di Canny che può essere utilizzata per rilevare i bordi in un'immagine. Perché il rilevamento di Canny funzioni, dobbiamo fornire soglie minime e massime. OpenCV di solito raccomanda il valore di (100, 200) o (200, 400), quindi stiamo utilizzando (200, 400).
L'immagine di output del bordo di Canny contiene del rumore. Tutte le informazioni diverse dalle corsie nell'immagine possono essere isolate riducendo la regione di interesse. Quando si esegue il riconoscimento delle corsie e la navigazione, non è necessariamente necessario vedere l'intera immagine. Un modo semplice per fare ciò è semplicemente ritagliare la metà superiore dell'immagine.
Il codice per ridurre la regione di interesse è:
Dopo che la regione di interesse è stata ridotta, le corsie sono chiaramente visibili con quattro linee distinte. Tuttavia, il computer non sa che queste linee rappresentano i confini di due corsie. Quindi, abbiamo bisogno di un modo per estrarre le coordinate per queste linee delle corsie. Una trasformata di Hough è una tecnica utilizzata nel trattamento delle immagini per estrarre caratteristiche come linee, cerchi ed ellissi. Può essere utilizzata per trovare linee rette da un numero di pixel che sembrano formare una linea. Questo può essere fatto con la funzione HoughLinesP in OpenCV. La funzione adatta molte linee attraverso tutti i pixel bianchi e restituisce l'insieme più probabile di linee soggetto ad alcuni vincoli di soglia minima.
Ecco il nostro codice che rileva segmenti di linea utilizzando una trasformata di Hough. La maggior parte dei parametri utilizzati qui può essere determinata tramite tentativi ed errori o selezionando parametri da immagini di riferimento.
L'output della funzione detect_line_segments() produce un insieme di piccole linee con coordinate dei punti finali (x1, y1) e (x2, y2). Abbiamo bisogno di trovare un modo per combinarle in solo due linee per le linee di corsia sinistra e destra, ma come possiamo fare ciò? Un modo è classificare questi segmenti di linea in base alle loro pendenze.
Tutte le linee della corsia di sinistra hanno una pendenza positiva, e i segmenti di linea appartenenti alla corsia di destra hanno una pendenza negativa. Basandoci su questi due nuovi gruppi, possiamo prendere la media delle pendenze e delle intercette dei segmenti di linea per ottenere le pendenze e le intercette delle linee delle corsie di sinistra e destra. Questo è implementato con la funzione average_slope_intercept():
La funzione make_points() è una funzione di supporto per la funzione average_slope_intercept(), che prende la pendenza e l'intercetta di una linea, e restituisce i punti finali del segmento di linea. A questo punto, abbiamo ora le linee delle corsie!
A questo punto, l'output di questa funzione sarebbe l'input per un altro algoritmo per controllare la velocità e la direzione del veicolo. Per fare ciò, può essere calcolato un angolo di sterzata dalle linee delle corsie rilevate e poi passato a un controller PID per minimizzare l'angolo di sterzata e mantenere il veicolo centrato.
Sebbene ciò sia stato fatto con una scheda di sviluppo Nano, lo stesso codice fornisce un punto di partenza per implementare un sistema in un sistema di elaborazione immagini incorporato per un ambiente di produzione. Per fare ciò, avrai bisogno di costruire una vera e propria baseboard per il Jetson Nano. Questo è più semplice quando si utilizzano gli strumenti di progettazione elettronica modulare nell'applicazione Upverter Board Builder. Adottando un approccio modulare, puoi facilmente personalizzare una baseboard per un Jetson Nano, telecamere e altri sensori per il riconoscimento delle corsie.
Gli strumenti di progettazione elettronica modulare in Upverter ti danno accesso a una vasta gamma di COM standard del settore e moduli popolari senza scaricare o installare alcun nuovo software. Puoi creare hardware di grado produttivo per una varietà di applicazioni, inclusi il riconoscimento delle corsie e altri compiti di elaborazione delle immagini con Jetson Nano, utilizzando un'interfaccia utente drag-and-drop. Se il tuo sistema necessita di funzionalità aggiuntive, puoi includere connettività wireless, un array di sensori e molto altro.
Dai un'occhiata ad alcune storie di successo dei clienti Gumstix o contattaci oggi per saperne di più sui nostri prodotti, strumenti di progettazione e servizi.