Kinect, I mock you so much
Derrière cette formulation humoristique se cache un des fondements de l’industrialisation des développements : le fait de pouvoir tester de manière automatisée tout ou partie d’un système informatique.
Aussi bien dans les architectures complexes que dans les applications les plus simples, il est pertinent de pouvoir tester un composant logiciel unitairement (indépendamment des autres composants duquel il dépend) : les dépendances sont donc "mockées" ou simulées en français.
Il est aussi nécessaire de pouvoir créer un contexte favorable au scénario de test en injectant un jeu de données particulier via un automate de tests ou un injecteur.
Le développement d’applications Kinect n’échappe pas à cette nécessité. Voici comment simuler une Kinect avec la librairie MocKinect.
Ras la Kinect
Pour rappel, la Kinect est un périphérique composé de capteurs optiques (video couleur et infrarouge) permettant de capturer une vue en relief des éléments entrant dans son champ de vision. Le SDK (kit de développement) Kinect intègre une fonctionnalité d'analyse de l'image et de reconnaissance de forme humaine qui génère un "pseudo-squelette".
Capture des flux venant des capteurs | ||
<br><br>Flux video | <br><br>Flux infrarouge | <br><br>Squelette reconnu |
Pour plus d'informations sur le fonctionnement de la Kinect, consultez l'article Kinect : un tour d’horizon tout naturellement.
La détection de mouvement se basant sur des seuils et des distances, il faut souvent travailler par ajustements successifs. Tester un scénario d’utilisation Kinect est d’autant plus long et fastidieux pour un développeur qu’il lui faut :
- Ajuster le code et lancer l’application
- Se lever et se mettre en position face à la Kinect
- Effectuer le ou les mouvements
- (éventuellement se rendre compte qu'il a oublié d’enlever un breakpoint dans le code)
- Vérifier le comportement de l’application
- Constater le bogue
- S’asseoir
- Ajuster le code puis lancer l’application
- Se lever et se mettre en position face à la Kinect
- Et ainsi de suite…
Même si ce type d’exercice est bon pour la santé, cela ne vaut pas une activité sportive au grand air et cela impacte fortement la productivité.
Avec MocKinect, je m’en mock de la Kinect
Pour faciliter mon travail, j’ai développé la librairie MocKinect (http://mockinect.codeplex.com/) qui contrairement à son nom n’est pas un mock mais un injecteur (on ne peut pas toujours résister à un mot-valise).
MocKinect permet d’enregistrer les flux bruts venant des capteurs de la Kinect et de le stocker pour les rejouer ultérieurement. La librairie s’utilise en deux temps :
- Se lever et s’enregistrer en train de faire les gestes qui devront être utilisés dans l’application
- S’asseoir pour coder et tester en rejouant la scène enregistrée autant de fois que nécessaire
Une fois les enregistrements effectués, il est possible d’utiliser MocKinect SANS Kinect. Vous pouvez ainsi intégrer les tests Kinect dans une usine d’intégration continue et même contrôler leur exécution avec des outils de tests fonctionnels tels que FitNesse ou GreenPepper.
MocKonception
Pour favoriser l’utilisation de cette librairie, j’ai voulu limiter les freins inhérents à l’intégration de nouveaux frameworks en suivant ces deux principes :
- Avoir un coût d’intégration quasi nul sur le code de l'application
- Avoir un impact minimum sur les performances en exécution
Pour cela, j’ai opté pour une solution utilisant l’encapsulation. MocKinect est donc composé d’un ensemble de classes reprenant les prototypes des classes du SDK Kinect de Microsoft. Pour l’utiliser, il suffit de remplacer la directive d’inclusion du SDK par celle de MocKinect.
Remplacez:
using Microsoft.Research.Kinect ;
Par:
using MocKinect;
Le déclenchement d’un enregistrement ou d’une injection s’effectue par l’appel à la méthode SetMode.
// Mode proxy
kinectRuntime.SetMode(MocKinectMode.Reality);
// L'application reçoit les informations issues des capteurs de la Kinect
// Enregistrement
kinectRuntime.SetMode(MocKinectMode.Record, "SwipeGesture");
// L'application reçoit les informations issues des capteurs de la Kinect
// Ces informations sont en même temps enregistrées dans le fichier SwipeGesture
// Injection
kinectRuntime.SetMode(MocKinectMode.Replay, "PinchGesture");
// La véritable Kinect est désactivée
// Les flux précédemment enregistrés dans le fichier PinchGesture sont lus et injecter dans l'application
L’impact sur les performances est assez faible et peut être réduit en optimisant la gestion du tampon (buffer) d’enregistrement des flux. Une application recevant 25 images Kinect par seconde peut voir ce débit réduit à 20 images par seconde en utilisant MocKinect.
Appel à MocKontribution
MocKinect est encore en version bêta et beaucoup de fonctionnalités peuvent être rajoutées pour améliorer la productivité des développeurs d’applications Kinect. Parmi celles-ci :
- Mocker plusieurs Kinects simultanément
- Gérer l’enregistrement et l’injection des données de squelettes
- Compresser les données issues de l’enregistrement
- Améliorer la compatibilité avec les modes évènementiels et par échantillonnage
N’hésitez pas à partager vos recommandations ou m’indiquer votre envie d’être contributeur afin de mener ce projet à bien.
Dans la même veine, la Kinect Toolbox de David Catuhe permet d’enregistrer/rejouer un squelette et fournit de plus un socle de reconnaissance de mouvements (Gestures)
Kinews de dernière minute
Au moment de l'écriture de cet article, Microsoft a annoncé la sortie officielle de la Kinect For Windows. Ce périphérique est similaire à la Kinect pour Xbox mais sera dédié à un usage PC. Cette nouvelle Kinect apportera un gain de performance et de précision, elle pourra gérer le "near-mode" (objet à 50 cm des capteurs). Son SDK intégrera la reconnaissance de mouvements types et permettra probablement la détection précise des doigts de la main. Rendez-vous le 1er février lors de la mise sur le marché de ce nouveau périphérique et les 7-8-9 février pour la conférence Microsoft TechDays.