Il fenomeno dei maker da un lato costituisce un passatempo popolare, dall’altro ispira i giovani a intraprendere carriere nel campo della scienza, della tecnologia, dell’ingegneria e della matematica. Molti dei progetti all’interno di questo ambito contengono un processore embedded, in genere un membro delle famiglie Arduino o Raspberry PI, che fornisce l’intelligenza richiesta per il sistema. Sia Arduino, sia Raspberry PI sono supportati da un ambiente di sviluppo che fornisce un insieme di librerie software, moduli ed esempi. Questo aiuta lo sviluppatore a interfacciarsi in modo semplice e rapido con una gamma di periferiche che vanno dalle videocamere, agli accelerometri, ai motori. È questa semplicità d›uso che consolida la popolarità di tali processori all’interno dell’universo dei maker. Fino a poco tempo fa i maker ritenevano che i SoC Interamente Programmabili fossero al di fuori della loro portata, come qualcosa più indicata per gli ingegneri più specializzati. Tuttavia, questo non è più il caso con le schede basate sui dispositivi Zynq di Xilinx, come le soluzioni ZynqBerry, Pynq e Snickerdoodle e con le tecniche di sviluppo basate su software. Le schede sono dotate dei dispositivi della famiglia di SoC Interamente Programmabili Zynq 7000, che combinano due processori Arm Cortex A9 con la logica programmabile della gamma di Fpga Interamente Programmabili Artix 7. Ciò fornisce la possibilità di accelerare le funzioni all’interno della matrice in logica programmabile per aumentare in modo significativo le prestazioni a livello di sistema. Lo sviluppo tradizionale tuttavia aveva separato la progettazione in logica programmabile dallo sviluppo software, poiché quest’ultimo richiedeva un’esperienza specifica nello sviluppo per implementare un progetto in logica programmabile: ma oggi non è più così. Quando queste schede sono abbinate agli ultimi ambienti di sviluppo che consentono di definire l’applicazione interamente su software, diventano molto interessanti per il mondo dei maker. In particolare, poiché questi ambienti di sviluppo offrono la possibilità di sfruttare la logica programmabile senza che l’utente sia necessariamente uno specialista di Fpga, consentono di ottenere vantaggi senza compromessi.
Gli ambienti di sviluppo
Esistono due ambienti di sviluppo che possono essere usati per creare applicazioni per queste schede basate su dispositivi Zynq. Il primo di questi è l’ambiente SDSoC, basato su eclipse. Questo ambiente consente lo sviluppo dell’applicazione in C o C++ e trasferisce senza problemi le funzioni dall’esecuzione su processori Arm Cortex A9 all’accelerazione in logica programmabile. L’ambiente SDSoC usa il processo di sintesi ad alto livello per spostare la funzione C selezionata all’interno della logica programmabile. Una volta che il blocco Hls (High-level synthesis) ha completato la connettività, l’ambiente è usato per integrare il modulo Hls con l’applicazione software. Oltre all’aumento di prestazioni fornito dall’accelerazione della funzione ora integrata in logica programmabile, il processo è trasparente all’utente. Lo spostamento di funzioni fra i processori e la logica programmabile è estremamente semplice e controllato all’interno dell’ambiente SDSoC usando la funzione di panoramica progetto. Per quanto riguarda i sistemi operativi, SDSoC supporta Linux, che è comunemente usato all’interno dell’ambiente dei maker, unitamente a un sistema in tempo reale e a un approccio di tipo “bare-metal”. Quest’ultimo approccio è offerto dalla scheda Pynq, che fornisce un ambiente di sviluppo basato su Python e sui notebook Juypter. Entrambi gli approcci sono eseguiti su una distribuzione Linux che gira su processori, mentre la logica programmabile ha uno strato ben determinato che fornisce connessioni alle periferiche fornite sulla scheda Pynq. All’interno della distribuzione Linux è presente un pacchetto Pynq definito per supportare le periferiche e lo strato hardware, che consente di interfacciarsi direttamente con le periferiche usando Python. Poiché la scheda Pynq fornisce due interfacce Pmod, questo pacchetto assicura un valido supporto verso una gamma di moduli Pmod come Adc e Dac, per semplificare l’integrazione con l’applicazione in linguaggio Python. All’interno della scheda Pynq la logica programmabile è caricata con uno dei numerosi strati per offrire l’accelerazione hardware, ed esistono numerosi strati open source in aggiunta agli strati di base forniti. Gli utenti possono programmare la scheda Pynq connettendola al notebook server Juypter attraverso un browser web. Una volta connessi a questo notebook, possono sviluppare e documentare le proprie applicazioni Python da eseguire su scheda Pynq. La possibilità di usare il linguaggio Python e di interfacciarsi direttamente al modulo Pmod attraverso Python offre una piattaforma di sviluppo molto potente.
Per sistemi di visione embedded
Entrambe le metodologie di sviluppo offrono la possibilità di usare ambienti open source per la visione embedded, come OpenCV, per eseguire applicazioni di visione embedded. Queste ultime possono fare uso di videocamere web quando la distribuzione Linux supporta il driver Usb Video Class o videocamere specifiche come la videocamera Raspberry PI supportata dalla scheda ZynqBerry. OpenCV consente di sviluppare sia in C/C++ sia in Python, e usando questo ambiente è possibile eseguire in modo semplice e rapido algoritmi complessi di elaborazione delle immagini usando l’accelerazione della logica programmabile dei dispositivi Zynq per fornire prestazioni significativamente superiori. Tali applicazioni possono elaborare le immagini e riconoscere oggetti o facce e altro, usando questo ambiente. Quando si tratta di implementare un semplice algoritmo di riconoscimento di oggetti, possono girare in ambiente Linux, Python e OpenCV su piattaforme basate sui dispositivi Zynq. Esaminiamo che cosa comporta la realizzazione di un semplice sistema di monitoraggio di oggetti che fa uso di OpenCV e di una webcam.
L’algoritmo da eseguire è il seguente.
- Catturare il primo fotogramma dalla webcam. Questo primo fotogramma serve come immagine di sfondo di riferimento. Qualsiasi modifica che avviene nella scena viene rilevata da questo primo istante.
- Convertire lo spazio colori da Rgb in una scala di grigi. Questa è una tecnica di segmentazione comunemente usata, cui è possibile far ricorso per creare immagini binarie. La segmentazione dell’immagine abbraccia diverse tecniche che dividono un’immagine in più segmenti, spesso chiamati super pixel. Questa tecnica consente di semplificare l’analisi dei contenuti dei segmenti. All’interno dell’applicazione si usano delle soglie per segmentare lo sfondo dall’immagine in primo piano. Ciò produrrà un’immagine binaria.
- Effettuare un filtraggio di sfocatura Gaussiana sull’immagine. L’esecuzione di più applicazioni di elaborazione delle immagini che rilevano oggetti o contorni può ricevere un effetto negativo dal rumore presente all’interno del fotogramma acquisito. Sfocare l’immagine, prima di un’ulteriore elaborazione, riduce il rumore all’interno del fotogramma e questa tecnica è spesso usata per l’elaborazione delle immagini, in particolare negli algoritmi di rilevamento dei bordi (ad esempio, l’algoritmo di rilevamento dei bordi con filtro Laplaciano di Gaussiano). Il risultato di questa operazione diventa l’immagine di riferimento rispetto alla quale viene individuata una modifica.
- Ripetere nuovamente i passaggi da 1 a 3, ossia catturare un’altra immagine dalla webcam, convertire lo spazio di colore in una scala di grigi ed effettuare la sfocatura Gaussiana sull’immagine.
- Calcolare la differenza assoluta fra il fotogramma di riferimento e l’immagine più recente catturata.
- Effettuare un’operazione di soglia sulla differenza assoluta per creare un’immagine binaria.
- Effettuare un’operazione morfologica per espandere l’immagine e amplificare le eventuali differenze.
- Trovare i contorni rimanenti nell’immagine binaria e ignorare tutti i contorni con un’area troppo piccola.
- Disegnare un riquadro attorno a ciascuno dei contorni individuati e visualizzare l’immagine originale catturata attraverso l’uscita Hdmi.
Gli sviluppatori possono eseguire il codice Python risultante direttamente su scheda ZynqBerry o in un notebook Juypter su scheda Pynq. Ciò che vedranno è un’immagine simile a quella di Fig. 3, che identifica le variazioni rispetto all’immagine di riferimento con dei riquadri che evidenziano le differenze. Questo esempio illustra sia le potenzialità, sia la semplicità con cui è possibile usare un dispositivo Zynq per eseguire un’applicazione di visione embedded, usando piattaforme familiari di tipo open source.