lunedì 27 gennaio 2014

KinectV2: ciclo di vita del device

In questo post cominceremo a dare un’occhiata alle APi messe a disposizione dal nuovo SDK per Kinect.
In particolare ci occuperemo di capire come sia possibile gestire, a livello di codice .NET (nella fattispecie VB.NET), il ciclo di vita del device (o dei device) che intendiamo utilizzare.
Possiamo riassumere il ciclo di vita del device con i seguenti punti:
  • Selezionare il device
  • Aprire la connessione con il device
  • Utilizzare il device
  • Chiudere la connessione con il device

Selezionare il device

In questo passaggio selezioniamo quale Kinect deve essere utilizzato. Una delle novità previste nella V2 del Kinect è quella di poter utilizzare in maniera molto semplice più device contemporaneamente.
La classe KinectSensor, in maniera analoga a quanto succedeva nella versione 1 dell’SDK, fornisce accesso alle funzionalità del singolo device.

image
La collezione statica KinectSensors permette di sapere quali device sono collegati. Questa ci permette, ad esempio, di recuperare quelli connessi:

Public Function GetConnectedDevices() As IEnumerable(Of KinectSensor)
    Dim kinectList = KinectSensor.KinectSensors _
                     .Where(Function(k) k.Status = KinectStatus.Connected)
    Return kinectList
End Function


A differenza di quanto accadeva nella precedente versione, la classe KinectSensor ci fornisce anche una proprietà statica chiamata Default, che restituisce direttamente il device di default, utile nel caso in cui ce ne è connesso uno solamente.

Public Function GetDefaultDevice() As KinectSensor
    Return KinectSensor.Default
End Function

Se non abbiamo Kinect collegati, la proprietà Default contiene Nothing.
Come possiamo vedere le analogie rispetto alla KinectSensor della versione 1 si fermano alla collection KinectSensors. Vedremo in post successivi tutti i dettagli sulle sorgenti dei flussi di stream.
La classe KinectSensor fornisce out-of-the-box le funzionalità per la disconnessione e riconnessione del device: nel momento in cui abbiamo l’istanza della classe KinectSensoe, possiamo gestire l’evento IsAvailableChanged per capire quanto il sensore viene sconnesso o riconnesso.

Aprire la connessione con il device

Il secondo step prevede l’apertura della connessione con il device.
Questa operazione è semplice e coincide con l’invocazione del metodo Open della classe KinectSensor

Sensor = KinectSensor.Default
If Sensor IsNot Nothing Then
    Sensor.Open()
    ' la connessione con il Kinect e' aperta

Else
    ' Kinect non presente
End If


Utilizzare il device

In questo step viene effettivamente utilizzato il device e verrà preso in considerazione negli altri post della serie.

Chiudere la connessione con il device

Analogamente a quanto visto per l’apertura della connessione al device, anche la chiusura altro non è che una chiamata al metodo Close della classe KinectSensor.

If Sensor.IsOpen Then
    Sensor.Close()
End If


La classe KinectSensor ci mette a disposizione le proprietà IsAvailable e IsOpen per capire lo stato del Kinect.
Se abbiamo più sensori collegati, possiano eseguire un loop sulla collezione Sensors esposta dalla classe KinectSensor e aprire, nel modo precedentemente visto, la connessione con ogniuno di essi.
Come già detto, l’SDK e’ ancora in beta e, in questo momento, per poter eseguire il codice visto in precedenza, abbiamo la necessità che il programma KinectService.exe sia attivo.
Possiamo trovare KinectService.exe nella cartella
C:/Windows/System32
Per poter avviare automaticamente il programma all’interno del nostro codice possiamo utilizzare la seguente classe:

Public Class KinectServiceHelper

    Private Const ServiceName As String = "KinectService"

    Public Shared Function IsRunning() As Boolean
        Dim processList = Process.GetProcessesByName(ServiceName)
        Return processList.Any()
    End Function

    Public Shared Sub Start()
        If Not IsRunning() Then
            Dim systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System)
            Dim fileName = System.IO.Path.Combine(systemPath, String.Format("{0}.exe", ServiceName))
            Process.Start(fileName)
        End If
    End Sub

End Class

In questo modo, all’avvio del nostro software ci basta scrivere:

KinectServiceHelper.Start()

Nei prossimi post cominceremo ad entrare nel vivo delle funzionalità di streaming del sensore.

Disclaimer: “This is preliminary software and/or hardware and APIs are preliminary and subject to change.”

Technorati Tags: ,,

lunedì 13 gennaio 2014

Kinect V2: First Look

Questo post vuole essere il primo di una serie (come feci a suo tempo per la versione precedente) dedicata alla nuova versione del Kinect.
La versione in oggetto, la V2, non è ancora in commercio ma è a disposizione di coloro che hanno aderito al Kinect For Windows Developer Preview Program (in breve K4W).
Il prodotto, come il suo SDK, è ancora in Beta, quindi tutto quello che diremo in questi post dovrà essere preso con “le molle” e potrebbe essere susscettibile di cambiamenti futuri.
In questo post, in particolare daremo una prima occhiata al device e a cosa troviamo di differente rispetto alla versione 1.

WP_20140112_18_41_52_Pro
Tanto per cominciare, il dispositivo dispone di un attacco standard per cavalletto il che consente di poterlo utilizzare montato su un normale cavalletto fotografico senza dover acquistare un supporto apposito.
Tra le novità tecniche e relative alle API abbiamo::
  • una color camera con risoluzione fissa di 1920x1080 pixel (full HD) con un frame rate di 30 fps. In realtà il dispositivo adatta il frame rate e, in caso di bassa luminosità, lo porta a 15 fps per garantire una migliore esposizione. Non è possibile scegliere altre risoluzioni o frame rate;
  • un emettitore di infrarossi e relativo sensore con risoluzione di 512x424 pixel e un frame rate (stavolta fisso) di 30 fotogrammi al secondo. Anche in questo caso non ci sono altre risoluzioni e frame rate;
  • possono essere utilizzate le immagini a colori e quelle provenienti dall’infrarosso contemporaneamente;
  • in range operativo del nuovo device va da 0,5 metri a 4,5 metri e non esiste più il concetto di near mode;
  • miglioramenti nella tecnologia utilizzata per il sensore di profondita’;
  • miglioramenti nell’utilizzo della batteria di microfoni con un suono più pulito;
  • per quanto riguarda lo skeletal tracking, sono possibili fino a 6 scheletri contemporanei con dettaglio completo (nella versione Kinect V1 sono due dei sei erano completi) e sono stati aumentati il numero dei join rilevati (25 rispetto ai 20 della versione precedente, ma lo vedremo in dettaglio nel post relativo allo skeletal tracking);
  • eliminata la differenza tra seated mode e full mode ed il device è in grado di rilevare automaticamente la tipologia di scheletro;
  • sono state implementate alcune gesture di base (ad esempio l’apertura e la chiusura della mano) e la possibilità di ricavare il contorno della mano;
  • più applicazioni potranno utilizzare il device contemporaneamente;
  • il device non dispone piu’ della motorizzazione che permetteva alla versione 1 di muoversi verticalmente. Questo perche’ il range del nuovo Kinect passa dai 57,5 gradi orizzintali per 43,5 gradi verticali ai 70 gradi orizzontali per 60 gradi verticali.
Per quel che riguarda l’architettura dell’SDK, avremo la possibilità di utilizzare sia le API .NET che quelle COM così come accadeva nella versione 1 ma queste saranno molto simili tra loro (a differenza di quello che accadeva nella precedente versione).
Purtroppo le applicazioni scritte per la versione 1 non funzionano con la versione 2 in quanto l’architettura, e di conseguenza, le API disponibili sono cambiate.
Infine, il Kinect V2 lavora su USB 3: assieme al device arriva un gran bell’alimentatore (di dimensioni corpose) e una sorta di hub in cui convergono l’alimentazione, il cavo dati proveniente dal Kinect e il cavo USB 3 diretto al pc. Purtroppo tutti gli attacchi non sono standard.
Nei prossimi post andremo in dettaglio delle funzionalita’ con esempi di codice, quindi restate collegati!!!

Disclaimer: “This is preliminary software and/or hardware and APIs are preliminary and subject to change.”

giovedì 2 gennaio 2014

4 in fila!!!

Finalmente dopo una lunga giornata di lavoro, posso dedicarmi a scrivere questo post.

Ieri sono stato nominato per la quarta volta MVP nella categoria VB.NET.

E’ per me un onore far parte di questa “famigghia” fatta prima di tutto di grandi amici e belle persone e, poi, di fantastici professionisti.

Debbo ringraziare tante persone che mi sopportano e supportano (più la prima delle due Smile ): quella santa donna di mia moglie, i ragazzi di DomusDotNet (in particolare il Diumviro Nicolò Carandini, lui sa perchè, mio alter ego e compagno di mille battaglie), Lorenzo Barbieri, Matteo Emili, Matteo Pagani, Alessandro Scardova, Marco Dal Pino, Francesco Baldassarri, Roberto Freato, Alessandro Del Sole, Daniele Bochicchio, Andrea Saltarello, Gian Maria Ricci, Michele Aponte, Raffaele Rialdi, Domenico Avella e chi più ne più ne metta (chiedo scusa in anticipo a chi non ho citato ma sappiate che è solo per il fatto che alla mia età si è un pochino rincoglioniti). Un ringraziamento anche a Cristina Gonzales Herrero e Alessandro Teglia (rispettivamente mio attuale MVP Lead e mio ex MVP Lead) perchè, in tutto questo, c’è anche il loro zampino.

Ogni anno è un’emozione attendere la mail di rinnovo e vi assicuro che essere MVP è assimilabile ad una droga: una volta che lo sei diventato fai del tutto per rimanerlo…….e io sono drogatissimo!!! Smile

Per questo motivo farò del tutto per ottenere di nuovo questo onore il prossimo anno!!!

 

Technorati Tags: ,,,