Tutoriel sur la découverte de l'API Java de Leap Motion

| Patrick Guillerm (PaloIT) | PaloIT |

Dans le cadre d'une journée de Coding Marathon organisée en interne, Patrick Guillerm, Développeur et Leader de la Communauté Java chez Palo IT, a pris part au développement d'une application Leap Motion permettant de piloter un AR Drone.

Le Leap Motion Controller, commercialisé depuis août 2013, est un capteur de la taille d'un briquet qui constitue une véritable révolution en matière de navigation et de contrôle par détection de mouvements.

Pour réagir au contenu de cet article, un espace de dialogue vous est proposé sur le forum Commentez .

- Titre : Tutoriel sur la découverte de l'API Java de Leap Motion

- Auteurs : Patrick Guillerm (PaloIT), PaloIT

- Parution : 13 septembre 2013

- Mise à jour : 16 septembre 2013

- Licence : Copyright ® 2013 PaloIT. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. API Leap Motion

- II. Les notions de Gestes et d'Outils

- III. Build Process

- IV. Le SDK

- V. Conclusion

- VI. Remerciements

I - API Leap Motion

Leap Motion propose une bibliothèque Java. Cette bibliothèque fonctionne de la même façon que celle des autres langages. C'est tout naturel puisque l'API de Leap Motion se base sur l'API C++. La bibliothèque Java n'est qu'un « wrapper » JNI. Elle ressemble beaucoup à la logique de programmation que des API comme Swing proposent. On retrouve donc un système d'écouteur (Listener) :

// LeapMotion API
Controller controller = new Controller();

// Connect LeapMotion API to listener
MyListerner listener = new MyListerner();
controller.addListener(listener);

La classe Listener doit hériter de la classe mère com.leapmotion.leap.Listener :

class MyListerner extends Listener {

public void onInit(Controller controller)  {//... }

public void onConnect(Controller controller) {
//... initialize gestures controls
}

public void onDisconnect(Controller controller){//... }

public void onExit(Controller controller) {//... }

public void onFrame(Controller controller) {
// Get the most recent frame and report some basic information
Frame frame = controller.frame();
//...
}

public void onFocusGained(Controller controller){//... }

public void onFocusLost(Controller controller) {//... }

}

La classe mère prend en charge différentes actions dont les principales sont :

- onConnect : cette méthode est invoquée au moment où la bibliothèque est connectée au LeapMotion. Elle permet principalement de spécifier les différents gestes auxquels notre écouteur sera appelé ;

- onFrame : cette méthode est invoquée à chaque mesure du capteur. C'est elle qui va nous permettre d'analyser les informations remontées par le capteur. Puisque cette méthode est invoquée à chaque capture, il peut être très difficile à « débugger ». Le capteur nous remonte environ 30 « images » par seconde. Pour nous aider, chaque image contient les gestes qui ont été détectés.

II - Les notions de Gestes et d'Outils

La notion de Gestes est le point central de Leap Motion. On retrouve donc tout naturellement un objet Gesture représentant ces derniers. Cet objet nous donne accès à diverses informations comme :

Type

Méthode

Commentaires

Long

duration()

Durée

HandList

hands()

Liste des mains détectées. Cet objet est malheureusement un iterator. Il est dommage que la bibliothèque n'utilise pas la généricité.

State

state()

L'état du geste (STATE_INVALID, STATE_START, STATE_UPDATE, STATE_STOP). L'objet State est une énumération incluse dans la classe Gesture.

Type

type()

Permet de connaître le type de geste (TYPE_INVALID, TYPE_SWIPE, TYPE_CIRCLE, TYPE_SCREEN_TAP, TYPE_KEY_TAP). C'est également une énumération incluse dans la classe Gesture. Ce choix d'implémentation est très discutable, car il ne permet pas de contribuer de nouveaux types de geste. On est donc limité aux gestes déjà définis par l'API.

On retrouve également dans l'API une classe nous permettant de gérer les « Outils ». En effet, le Leap Motion Controller est capable de détecter si l'utilisateur tient un instrument dans la main (ex. : un stylo). La classe Tool nous permet d'en récupérer les diverses informations (direction, taille, largeur, position, etc.).

Étant donné que la liste des gestes détectables par le capteur est fixe, la seule solution pour interpréter de nouveaux gestes est de les calculer. Pour ce faire, il nous faut analyser le flux des frames avec les différents outils ou mains détectés. Pour ces calculs, le capteur nous remonte également des vecteurs de translations. Ces informations sont stockées dans l'objet Vector.

III - Build Process

L'API Leap Motion n'est pas ancrée dans le monde Java. La bibliothèque n'est donc pas disponible sur les dépôts Maven. Il en est de même pour le SDK. À l'heure actuelle, il n'y a d'ailleurs aucune information sur leur éventuelle intention de déposer la bibliothèque sur le dépôt central de Maven. Il est donc nécessaire d'installer la bibliothèque sur un Nexus (ou Artifactory) pour permettre aux équipes de développer avec cette API.

IV - Le SDK

J'ai testé l'installation du SDK sur Linux : elle fonctionne plutôt bien. Je n'ai remonté aucune problématique particulière. Il est cependant regrettable qu'un script Deamon n'ait pas été envisagé pour démarrer le service Leap Motion.

V - Conclusion

Pour conclure, je dirais que la bibliothèque de Leap Motion fonctionne correctement. Cependant, elle n'a pas été conçue ni architecturée pour le monde Java. Cela se ressent en matière d'implémentation de la bibliothèque, qui n'utilise pas le plein potentiel de Java. L'API ressemble beaucoup à du Swing, ce qui peut rapidement aboutir à du code très verbeux. Il en va de même de l'implémentation des énumérations, qui peut poser problème si on souhaite ajouter de nouveaux gestes. Cependant, sans une libéralisation du code source, il y a peu de chance pour que cette bibliothèque prenne de l'ampleur dans le monde Java. Il risque donc fortement d'être assimilé à l'univers .Net/Windows.

VI - Remerciements

Cet article a été publié avec l'aimable autorisation de la société PaloIT.

Nous tenons à remercier zoom61 pour sa relecture orthographique attentive de cet article puis Mickael Baron et mlny84 pour la mise au gabarit.