In questo articolo analizzeremo l’architettura della piattaforma Intel® RealSense™ cercando di comprendere il suo funzionamento interno e quali linguaggi possiamo utilizzare per realizzare le nostre applicazioni.
Il post si riferisce alla versione 6.0.x dell’SDK di Intel® RealSense™ attualmente scaricabile all’indirizzo https://software.intel.com/en-us/intel-realsense-sdk/download
Per quel che concerne i linguaggio di sviluppo, focalizzeremo l’attenzione sui linguaggi .NET.
Architettura dell’SDK
Intel® RealSense™ SDK è strutturato a livelli all’interno dei quali trovano posto i building block costituenti lo stesso.
Lo strato di più basso livello è costituito da:
- Le funzionalità core, la gestione dei moduli e tutte quelle funzionalità strettamente infrastrutturali (ad esempio la pipeline di esecuzione o l’interoperabilità con il sistema operativo) che non hanno a che vedere con le funzionalità specifiche per cui la piattaforma è nata e che, sono, però al servizio di queste ultime;
- I moduli di I/O che si occupano di gestire le comunicazioni da e verso i device;
- I moduli algoritmici, al cui interno troviamo tutti gli algoritmi che forniscono le vere funzionalità della piattaforma come face recognition, gesture recognition, speech recognition, etc., etc.
Possiamo avere più implementazioni contemporanee per i moduli di I/O e algoritmici e, potenzialmente, tali moduli possono essere realizzati da terze parti e gestiti all’interno dell’SDK.
Tutto questo strato è implementato in C++ e, per poter essere utilizzato dalle applicazioni o da linguaggi di alto livello (come VB.NET, C# o Java), è necessario fornire una serie di interfacce che sono ospitate in un layer apposito. Le interfacce consentono di accedere alle funzionalità della piattaforma senza doversi preoccupare dell’implementazione effettiva e, nella maggior parte dei casi, le implementazioni effettive sono fornite attraverso delle classi factory.
Salendo verso l’alto troviamo il layer che ospita i differenti wrapper che permettono di utilizzare l’SDK in linguaggi di alto livello come i linguaggi .NET o Java o tramite altri framework come ad esempio Unity.
Al vertice dei livelli troviamo le nostre applicazioni che possono interagire con l’SDK direttamente in C++ o utilizzando uno dei linguaggi di alto livello precedentemente citati
La seguente figura mostra l’architettura:
Le interfacce dell’SDK
Come già detto in precedenza, l’insieme delle funzionalità esposte dall’SDK è accessibile tramite interfacce.
La seguente figura mostra uno schema di massima di quali interfacce abbiamo a disposizione in base al linguaggio desiderato e come la nostra applicazione accede allo strato di implementazione delle stesse.
Prima di entrare in dettaglio delle funzionalità di cui si fanno carico le singole interfacce, osserviamo che:
- Per ogni interfaccia esposta dallo strato C++, esiste una omologa interfaccia nello strato wrapper del linguaggio. Ad esempio la PXCSession dello strato C++ ha l’omologa PXCMSession nello strato C#;
- Le interfacce dei linguaggi managed (ad esempio Java), hanno lo stesso nome delle interfacce native con l’aggiunta della lettera M tra il prefisso PXC (comune a tutte le interfacce dell’SDK) e il nome dell’interfaccia stessa.
Vediamo, ora, brevemente quali sono le interfacce più importanti e di cosa si occupano.
La seguente figura mostra la gerarchia delle interfacce:
L’interfaccia PXCSession permette di gestire i moduli di I/O, quelli algoritmici e qualsiasi altra implementazione di interfacce dell’SDK. Se vogliamo ottenere un’istanza di un particolare modulo, dobbiamo prima ricavare un’istanza dell’interfaccia PXCSession e, quindi tramite essa, ottenere ciò che vogliamo.
La PXCSenseManager ci permette di gestire facilmente scenari di uso comune quali il face tracking o l’hand tracking o semplicemente gli stream video. La PXCSenseManager, a differenza della PXCSession fornisce anche una pipeline che già contiene un modulo di I/O (generalmente quello verso la periferica RealSense predefinita) e i moduli algoritmici nonché le funzionalità per avviare, mettere in pausa e fermare la pipeline. E’ l’interfaccia da utilizzare nelal stragrande maggioranza dei casi.
Internamente, la PXCSenseManager utilizza un’istanza della PXCCaptureManager che si occupa della gestione dell’I/O dal device RealSense.
La PXCSenseManager espone anche la possibilità di accedere diversi moduli algoritmi quali face recognition, hand analysis, etc., etc. tutti esposti tramite la corrispondente interfaccia.
Nei prossimi articoli vedremo come utilizzare, effettivamente, queste interfacce all’interno di progetti .NET Framework.