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é PaloITPaloIT.
Nous tenons à remercier zoom61 pour sa relecture orthographique attentive de cet article puis Mickael Baron et mlny84 pour la mise au gabarit.