Kinect

Microsoft Embedded Conference 2014 : un evento dedicato alle tecnologie embedded di casa Microsoft e sull’Internet of Things

mec2014

L’associazione culturale DotNetCampania, costituita da un team di persone del territorio campano ed appassionate delle tecnologie Microsoft, ha organizzato a Napoli per il giorno 15 Febbraio 2014 la seconda edizione della Microsoft Embedded Conference, una giornata completamente gratuita dedicata alle tecnologie embedded del mondo Microsoft. Quest’anno, il cuore dell’evento sarà caratterizzato dall’Internet Of Things e dalla M2M Communication, considerando che il 2014 sarà l’anno della consacrazione dell’interconnessione di tutte le tipologie di device e dispositivi embedded alla grande rete. Vedremo in che modo la Microsoft permetta la realizzazione di soluzioni di questo tipo, dando vita ai cosiddetti “Intelligent Systems”, ossia di sistemi fortemente interconnessi a partire da sensori ed attuatori posti ai “bordi” della rete che permettono in primo luogo di alimentare i centri di calcolo con una enorme mole di dati in tempo reale ed in secondo luogo di attuare delle azioni in seguito alle decisioni prese a valle dell’elaborazione dei dati stessi.

Si partirà da un’introduzione del concetto dell’Internet delle Cose per capire in che modo l’interconnessione dei device possa migliorare notevolmente la qualità della nostra vita. Successivamente, ci sarà un’interessantissima sessione su uno dei principali protocolli adottati nella M2M Communication, l’MQTT, e caratterizzata da una demo di un sistema di “Smart Home” e “Smart Factory”, ossia dell’applicazione delle principali tecnologie Microsoft alla domotica ed all’automazione industriale, anche attraverso la Natural User Interface del Kinect. Il pomeriggio, inizierà con l’esplorazione dell’innovativo progetto “Sense3”, che rappresenta un esempio di “Intelligent System” per showroom, fiere e congressi e grazie al quale poter intrattenere il pubblico sfruttando l’integrazione di molteplici servizi. Successivamente, nell’ambito del mercato del Retail, approfondiremo le principali novità delle POS API in Windows 8.1 per lo sviluppo di sistemi Point of Service in modo semplice e rapido. Infine, la giornata sarà conclusa dall’intervento di uno dei principali MVP Microsoft su Windows Embedded, Samuel Phung, che direttamente dagli Stati Uniti ci parlerà del futuro dell’Internet Of Things e delle opportunità che la Microsoft mette a disposizione in questo mercato in forte espansione che rappresenta il futuro anche per le applicazioni Cloud.

Tutti i dettagli sulle sessioni e la logistica sono disponibili sul sito dell’evento raggiungibile all’indirizzo http://mec2014.dotnetcampania.org/. Un evento da non perdere per tutti gli appassionati e professionisti del mondo embedded !

Tra gli organizzatori ci sono ovviamente anche io !!

 

Online slide e demo della Microsoft Embedded Conference 2013 !

4162.mec_52223747

Sono disponibili online le slide ed i codici sorgenti delle demo mostrate alla Microsoft Embedded Conference che si è tenuta a Napoli il 26 Gennaio 2013.

Per tutti coloro che hanno partecipato c’è tutto il materiale da poter utilizzare come punto di partenza per eventuali approfondimenti su quanto hanno già visto, per tutti gli altri c’è la possibilità di valutare ciò che si sono persi !

Microsoft Embedded Conference : una fantastica giornata !

Sabato 26 Gennaio, è andata in scena la prima Microsoft Embedded Conference che si è tenuta in quel di Napoli ed organizzata dalla nostra community DotNetCampania insieme aTinyCLR.it. Nonostante fosse Sabato, l’affluenza di pubblico è stata “interessante”, con molte persone che sono giunte addirittura da altre regioni (e ringraziamo anche Marco Dal Pino di DotNetToscana per la sua presenza); ciò ha confermato l’interesse che poteva suscitare l’organizzazione di un evento del genere.

2313.DSC_0004_2357B29C 4010.DSC_0008_6823D6D0
3463.DSC_0010_6B55BEB8 5228.DSC_0011_51818889
4527.DSC_0056_69A4F2E4 4341.DSC_0037_7DBE0F6D

Alle ore 8:30 il team era già all’Holiday Inn per i preparativi e per poter accogliere egregiamente i partecipanti; per fortuna l’evento è iniziato quasi in perfetto orario. La mattinata è iniziata con la keynote del nostro presidente Michele Aponte, che ha presentato la nostra community, e con me che ho presentato l’agenda della giornata oltre alla community TinyCLR.it di cui faccio parte.

2251.DSC_0017_23B3BFC4

5488.DSC_0063_54D2FA64

2538.DSC_0022_61CCDA75

1538.DSC_0061_1A0B518E

Subito dopo, quasi in perfetto orario, siamo partiti con due interessantissime sessioni diBeppe Platania sugli Intelligent Systems e l’offerta completa di Microsoft per il mondo embedded oltre ad un approfondimento su Windows Embedded Compact 7. Dopo il coffee break ed una breve presentazione dello sponsor Platinum “Adeneo” da parte di Valter Minute, Beppe è ritornato in scena per affrontare gli argomenti Windows Embedded Standard 2009 e 7. Subito dopo, ancora Valter per una panoramica sul concetto di sistema embedded, facendo toccare anche con mano alcuni prodotti “made in Italy”. I presenti hanno seguito con molto interesse le sessioni, partecipando attivamente e ponendo numerose domande ai nostri due speaker.

1586.DSC_0052_1213AF2C 3007.DSC_0088_4332E9CC
8741.DSC_0104_295EB39D 6835.DSC_0120_2FA58A2B

Giunta l’ora di pranzo, abbiamo gustato tutti insieme una buonissima pizza, riprendendo l’evento alle 14:15 circa. La prima sessione pomeridiana è toccata a me con un’introduzione ed una panoramica generale sul .Net Micro Framework che ha fatto da apripista per le sessioni successive sul medesimo argomento. La sessione di Mirco Vanini su .Net Gadgeteer ha suscitato notevole interesse nei presenti, grazie anche al forte contenuto pratico oltre che teorico. A conclusione degli interventi per la community TinyCLR.it, il suo ideatore Lorenzo Maiorfi che, insieme a Gianluca Ruta, ha parlato di “Internet of Things” facendo anche divertire le persone in sala, ciascuna dotata del proprio smartphone, nel pilotare via web una piattaforma ricca di attuatori e sensori portata con se per la demo (luci che si accendevano e bazzer che suonavano l’hanno fatta da padrona).

4762.DSC_0137_0EB21784 7206.DSC_0169_46F08E9C
1780.DSC_0167_461828B2 0777.DSC_0099_0C28E5C6

A fine giornata, la ciliegina sulla torta, con la sessione di Clemente Giorio (e me) su Kinect e la demo finale che ha visto protagonista un robot, messo in movimento grazie ai comandi vocali (addirittura in napoletano) ed alle gestures.

Un ringraziamento particolare va a tutti i ragazzi del DotNetCampania per l’organizzazione impeccabile, partendo da Antonio Liccardi per la logistica fino a Massimiliano Amendola ed Umberto Collina per il “servizio fotografico”, passando per Gaetano Criscuolo e Giulio D’Angelo che hanno portato con se la loro fantastica attrezzatura grazie alla quale è stata resa possibile la registrazione audio/video dell’evento.

Dopo una giornata così impegnativa ma ben organizzata grazie all’aiuto di tutti, la soddisfazione più grande l’abbiamo ricevuta dai numerosi complimenti che ci sono stati fatti dai partecipanti che come ben sappiamo rappresentano il vero cuore di una community !

A breve saranno messe a disposizione tutte le slide e le demo delle sessioni sul sito ufficiale dell’evento e per questo…stay tuned !

Microsoft Embedded Conference : una giornata con le tecnologie embedded di casa Microsoft !

7532.mec_70F3942A

L’associazione culturale DotNetCampania, costituita da un team di persone del territorio campano ed appassionate delle tecnologie Microsoft, ha organizzato a Napoli per il giorno 26 Gennaio 2013 la Microsoft Embedded Conference, una giornata completamente gratuita dedicata alle tecnologie embedded del mondo Microsoft. Si partirà da una panoramica di tutte le soluzioni offerte da Microsoft per la realizzazione dei cosiddetti “Intelligent Systems”, attraverso il .Net Micro Framework ed i prodotti della famiglia Windows Embedded. Questi ultimi saranno analizzati nel dettaglio, partendo con Windows Embedded Compact 7 ed i relativi strumenti di sviluppo per la realizzazione di una BSP e dei drivers di un sistema OEM fino ad arrivare alla famiglia Windows Embedded Standard attraverso la quale è possibile definire un sistema operativo personalizzato, protetto, affidabile ed aggiornabile. La mattina si concluderà con un’introduzione sul .Net Micro Framework, fratello minore della famiglia .Net, per lo sviluppo di applicazioni su sistemi caratterizzati da una disponibilità di risorse limitate ma pur sempre con le potenzialità del codice managed e soprattutto con il paradigma della programmazione ad oggetti. Il pomeriggio inizierà con la presentazione della piattaforma .Net Gadgeteer che la Microsoft mette a disposizione per la realizzazione di dispositivi e prototipi anche in ambiente visuale attraverso Visual Studio. Si proseguirà con un’analisi della situazione attuale e futura sull’interconnessione dei dispositivi embedded nel mondo attraverso l’Internet Of Things e come sia possibile lo scambio di dati e di informazioni su scala mondiale tra di essi. La giornata si concluderà con una interessantissima sessione dedicata allo sviluppo con Kinect, alla Natural User Interface e su come, attraverso ques’ultima, sia possibile interagire con dispositivi embedded che ci circondano. Tutti i dettagli sulle sessioni e la logistica sono disponibili sul sito dell’evento raggiungibile all’indirizzo www.microsoftembeddedconference.it. Un evento da non perdere per tutti gli appassionati e professionisti del mondo embedded !

Tra gli organizzatori ci sono ovviamente anche io !!

Il gate per salire a bordo del Kinect : la classe Runtime

Tra tutte le classi messe a disposizione dal Kinect SDK, quella sicuramente più importante è la classe Runtime. Attraverso quest’ultima è possibile gestire tutti i sottosistemi, quali la video camera, il sensore di profondità ed il riconoscitore della figura umana. Di seguito riporto il relativo class diagram :

6153.Runtime-Class_56547733

Inizializzazione e deinizializzazione

Per poter utilizzare il Kinect, la prima cosa da fare è istanziare la classe Runtime.

nui = new Runtime();
Oltre al costruttore di default, senza alcun parametro, è previsto un suo overload che ha in ingresso un index che rappresenta l’identificativo del Kinect da inizializzare nel caso in cui al PC ve ne fosse collegato più di uno. Tale indice è inoltre accessibile successivamente attraverso la property InstanceIndex di sola lettura.
Successivamente, è necessario eseguirne l’inizializzazione, in modo che vengano allocate tutte le risorse unmanaged che sono necessarie per utilizzare i sottosistemi del dispositivo stesso. Per fare ciò, è necessario invocare il metodo Initialize().
nui.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseDepth);
Tale metodo prevede in ingresso un parametro di tipo RuntimeOptions, ossia un enumerativo attraverso il quale specificare quali sensori vogliamo utilizzare. Ovviamente, i valori possibili possono essere messi in OR tra loro in modo da utilizzare più sensori contemporaneamente. Più precisamente, sono i seguenti :
  • UseDepthAndPlayerIndex : utilizzo del sensore di profondità con riconoscimento del giocatore (ciascuna giocatore viene individuato attraverso un index diverso);
  • UseColor : utilizzo della video camera;
  • UseSkeletalTracking : riconoscimento della figura umana di ciascun giocatore;
  • UseDepth : utilizzo del sensore di profondità;
Una volta inizializzato ed utilizzato, l’istanza della Runtime va deinizializzata attraverso l’utilizzo del metodo Uninitialize() per poter permettere la deallocazione di tutte le risorse unmanaged.
nui.Uninitialize();
Gli stream, lo skeleton e la video camera
La classe Runtime dispone di alcune proprietà attraverso le quali è possibile accedere a tutte le funzionalità del Kinect.
In primo luogo, vi sono i due seguenti stream :
  • VideoStream : rappresenta lo stream della video camera, fornendo allo sviluppatore i fotogrammi ripresi da quest’ultima;
  • DepthStream : rappresenta lo stream del sensore di profondità, in cui ciascun pixel non esprime un punto di un’immagine (in termini RGB, come nel caso del VideoStream) ma fornisce l’informazione della distanza di quel punto rispetto al Kinect;

Entrambe le property rappresentano un riferimento alla classe ImageStream.

Per poter utilizzare tali stream, è necessario la loro apertura invocando su ciascuno di essi il relativo metodo Open() della classe ImageStream. Tale metodo prevede i seguenti parametri :

  • streamType : di tipo ImageStreamType che permette di dichiarare il tipo di stream al quale siamo interessati (Invalid, Depth o Video);
  • poolSize : dimensione del buffer (espresso in numero di frame) che il runtime dovrà utilizzare. Tipico valore è 2;
  • resolution : di tipo ImageResolution che indica la risoluzione da adottare per lo stream;
  • image : di tipo ImageType che indica il tipo di contenuto nell’immagine. Alcuni possibili valori sono ad esempio Depth per indicare un’immagine che contiene informazioni sulla distanza, Color per indicare un’immagine ripresa dalla video camera in formato RGB oppure ColorYuv per indicare un’immagine ripresa dalla video camera in formato YUV;
nui.VideoStream.Open(ImageStreamType.Video, 2,
ImageResolution.Resolution640x480, ImageType.Color);
nui.DepthStream.Open(ImageStreamType.Depth, 2,
ImageResolution.Resolution640x480, ImageType.Depth);

Per accedere al motore per il riconoscimento della figura umana, è disponibile la propertySkeletonEngine che rappresenta un riferimento alla classe SkeletonEngine. Infine, attraverso la property NuiCamera si ottiene un riferimento alla classe Camera, con la quale poter accedere alla video camera e modificarne per esempio l’inclinazione.

Intercettazione delle frame : gli eventi

Per evitare un utilizzo in modalità polling del Kinect, la classe Runtime mette a disposizione alcuni eventi che vengono sollevati quando sono disponibili nuove frame dalla video camera, dal sensore di profondità e dal riconoscitore della figura umana.

nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_VideoFrameReady);
nui.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_DepthFrameReady);
nui.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady);

Essi rappresentano :

  • VideoFrameReady : sollevato quando è disponibile, nel buffer, una frame dello stream video (VideoStream);
  • DepthFrameReady : sollevato quando è disponibile, nel buffer, una frame dello stream di profondità (DepthStream);
  • SkeletonFrameReady : sollevato quando è disponibile un’immagine della figura umana rilevata dallo skeleton engine;

Kinect : il dispositivo, l’installazione dell’SDK ed i primi passi

Tutti i possessori o meno di una console XBOX sono a conoscenza dell’esistenza del Kinect, un fantastico dispositivo attraverso il quale la Microsoft ha iniziato a fare concorrenza alla Nintendo Wii, relativamente ai giochi che non prevedono l’utilizzo di un normale gamepad ma che si basano sui movimenti del corpo del giocatore.

Va sottolineato, però, che nel caso del Kinect il solo uso con la XBOX è piuttosto riduttivo ed infatti la Microsoft ha rilasciato ultimamente un SDK attraverso il quale poter sviluppare delle applicazioni che prevedono l’utilizzo del dispositivo collegandolo al PC.

Prima di poter iniziare ad esplorare gli strumenti messi a disposizione nell’SDK, è utile comprendere le funzionalità del dispositivo e preparare il nostro PC con il relativo ambiente di sviluppo.

Il Kinect visto da vicino

Il Kinect è costituito dai quattro seguenti dispositivi principali :

  • Videocamera RGB (RGB camera) : una normale video camera con una risoluzione di 640 x 480 a 30 fps (frames per second);
  • Sensore di profondità (3D Depth Sensors) : costituito da una trasmettitore ad infrarossi ed il corrispondente ricevitore attraverso i quali è possibile calcolare le distanze degli oggetti;
  • Un motore per l’inclinazione (Motorized Tilt) : un piccolo motore che permette di variare l’inclinazione della video camera fino ad un massimo di 27 gradi (in alto o in basso);
  • Una serie di microfoni (Multi-Array Mic) : una serie di quattro microfoni per l’audio;

6406.kinect_69CB3395

Installazione : SDK e driver Kinect

L’ambiente necessario per lo sviluppo è Visual Studio 2010, almeno nella sua versione Express (nel mio caso è la Ultimate che uso quotidianamente).

Ad esso vanno aggiunti ed installati :

  • Kinect SDK (ovviamente ancora in versione Beta) che possiamo scaricare al seguentelink (in entrambe le versioni 32 o 64 bit);
  • DirectX Software Development Kit che possiamo scaricare al seguente link:

Al termine dell’installazione, per verificare che il tutto sia avvenuto correttamente, possiamo collegare il Kinect al nostro PC attraverso il cavo USB e verificarne la sua presenza attraversoGestione Dispositivi nel Pannello di Controllo.

2703.kinect_device_manager_3DDA940C

Inoltre, il gruppo dei microfoni dovrebbe essere visibile nella scheda dei Dispositivi di Registrazione.

8507.kinect_mic_array_6A171AF0

Per quanto riguarda il cavo di collegamento del Kinect al PC, va sottolineato che quest’ultimo non ha nativamente un connettore USB ma è necessario acquistare un adattatore con relativo alimentatore. Sul Microsoft Store, al seguente link, è riportata la versione per gli Stati Uniti ma è ovviamente possibile acquistare anche la versione Italiana.

Sviluppo : i primi passi

Affrontiamo adesso i primi passi per poter iniziare a sviluppare con il Kinect SDK, introducendo la classe principale di quest’ultimo : la Runtime.

Creiamo un nuovo progetto WPF (ovviamente possiamo utilizzare anche le Windows Forms) e per prima cosa aggiungiamo il riferimento al seguente assembly :Microsot.Research.Kinect.

6457.assembly_2A3D0E9E

Inoltre, per poter utilizzare tutte le classi disponibili nell’SDK è necessario aggiungere lo using dei seguenti namespace.

using Microsoft.Research.Kinect.Audio;
using Microsoft.Research.Kinect.Nui;

Definiamo un campo privato nella classe MainWindow di tipo Runtime ed istanziamolo.

public partial class MainWindow : Window
{
    private Runtime nui = new Runtime();

    public MainWindow()
    {
...
...

Infine, utilizzando i due eventi di Loaded ed Unloaded della Window, aggiungiamo nei corrispondenti event handlers le istruzioni per poter inizializzare e deinizializzare l’instanza della Runtime.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.nui.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseDepth);
}

private void Window_Unloaded(object sender, RoutedEventArgs e)
{
    this.nui.Uninitialize();
}

Attraverso il metodo Initialize() vengono specificate quale features vogliamo utilizzare del Kinect (in questo caso la video camera ed il sensore di profondità). Il metodo Uninitialize()è invece necessario per rilasciare tutte le risorse unmanaged che il sistema ha allocato per l’utilizzo del Kinect.

Eseguendo questa banalissima applicazione, che non fa assolutamente nulla, noteremo solamente che all’esecuzione del metodo Initialize(), il dispositivo accenderà il trasmettitore ad infrarossi del sensore di profondità; già questo indica che l’inizializzazione è andata a buon fine. Viceversa, chiudendo la finestra dell’applicazione, il trasmettitore verrà spento (in quanto viene eseguito il metodo Uninitialize()); la deallocazione delle risorse è avvenuta correttamente.