Wie sich Kinect-1-Apps nach Kinect 2 portieren lassen

Know-how  –  0 Kommentare

Microsoft war in der Vergangenheit als Bastion der Abwärtskompatibilität bekannt: Im Rahmen der Auslieferung von Windows 95 arbeitete beispielsweise ein Team daran, störrische Win16-Apps zum Laufen zu bekommen. Kinect-Entwickler empfinden die Bilanz als weniger positiv: Sie stehen mittlerweile vor dem zweiten Bruch mit der Binärkompatibilität.

Zur Nutzung der Version 2 der Hardware zur Steuerung der Videospielkonsole Xbox 360 sind nicht unerhebliche Hardwareanforderungen zu erfüllen. Neben einem kompatiblen USB-3.0-Port zur Bewältigung der Datenmengen brauchen Anwender zwangsweise eine DirectX11-fähige Grafikkarte mit einer Rechenleistung von mehr als 150 GFLOPS/Sec. Dass auf Seiten der Workstation Windows 8 vorausgesetzt wird, folgt aus der (für Entwickler ärgerlichen) Marktlogik.

Mehr Infos

Die folgenden Schritte erfolgen auf einem AMD-FX-8320-Prozessor mit einer Radeon-R7-250-Grafikkarte. Als USB-Controller kommt ein auf einem Motherboard vom Typ M5A78L-M/USB3 fix verlöteter Chip aus dem Hause ASMedia zum Einsatz, als IDE dient Visual Studio 2013 Express for Desktop.

Das vom Autor beim dpunkt.verlag erschienene Lehrbuch zum Thema Kinect enthielt eine witzig gemeinte Anwendung, die die von der Kinect angelieferten Tiefendaten in Form eines Histogramms präsentierte und ausgab. Es ist insofern für die folgenden Schritte geeignet, weil es über das reine Anzeigen von Tiefendaten hinausgehende Logik enthält. Dadurch besteht die Möglichkeit, die (vergleichsweise minimalen) Auswirkungen des neuen Sensors auf die Applikationslogik zu bewerten.

Das Projektbeispiel KinectWPFDHisto lässt sich auf einer Workstation ohne installiertem Visual Studio 2010 nicht per Doppelklick öffnen. Entwickler müssen stattdessen die Öffnen-Funktion der aktuellen Version der IDE zum Importieren nutzen, gefolgt vom Anpassen der Verweise: Die neue Version der Assembly Microsoft.Kinect findet sich unter Assemblys | Erweiterungen.

Mehr Infos

Im Store ist alles anders

Wer "Applikationen für neuartige Technologien" für den Windows Store entwickeln möchte, muss statt Microsoft.Kinect auf WindowsPreview.Kinect zurückgreifen. Leider sind diese Assemblies im Moment noch nicht für die öffentliche Verwendung freigegeben: Hochgeladene Apps werden vom QA-Team des Stores aussortiert.

Die Treiberarchitektur der Kinect 1 ermöglichte das Anschließen mehrerer Sensoren an einer Workstation. Jeder Sensor ließ sich zu jedem Zeitpunkt nur von einer Applikation nutzen: Sie konnte den Farb-, den Tiefen- und den Skelettaldatenstrom durch das Aufrufen der jeweiligen Enabled-Methode aktivieren. Ein als KinectSensorChooser bezeichnetes Steuerelement erlaubte dem Benutzer die Auswahl des zu verwendenden Sensors. Im SDK der Kinect 2 gibt es dieses nicht mehr – der erste Akt besteht nun darin, das Projekt Microsoft.Kinect.Toolkit aus der Solution zu entfernen. Bei MainWindow.xaml ist der Verweis auf den Toolkit-Namensraum und die Einbindung des KinectSensorChooserUI-Elements zu beseitigen. Die neue Version der Datei sieht so aus:

<Window x:Class="KinectWPFDHisto.MainWindow" 
xmlns:toolkit="clr-namespace:Microsoft.Kinect.Toolkit;
assembly=Microsoft.Kinect.Toolkit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="537" Width="843">
<Grid>
<Image Height="480" HorizontalAlignment="Left" Name="image1"
Stretch="Fill" VerticalAlignment="Top" Width="640" />
<toolkit:KinectSensorChooserUI x:Name="SensorChooserUI"
IsListening="True" HorizontalAlignment="Center"
VerticalAlignment="Top" />
<Label Content="Label" Height="28" HorizontalAlignment="Left"
Margin="667,9,0,0" Name="label1" VerticalAlignment="Top"
Width="121" />
</Grid>
</Window>

Sich einen Zeiger auf den zu verwendenden Sensor einzurichten, kann ab sofort im Konstruktor erfolgen. Dazu genügt es, folgendes Snippet anstelle der Umsetzung der SensorChooser-UI zu implementieren:

public MainWindow() 
{
InitializeComponent();

mySensor = KinectSensor.GetDefault();
mySensor.Open();
setupSources();
}

Nutzer können ihren Sensor – zumindest in der Theorie – im laufenden Betrieb abstecken. Das lässt sich durch das Prüfen von IsAvailable und/oder das Anmelden eines Eventlisteners überprüfen – zwei Maßnahmen, die hier nicht gezeigt werden.