Leap-Motion et paramètres gestuels

Porteur(s) du projet : Blandine

Date : 21/01/2019

Logiciel : Processing V3.4

Fichiers : liens éventuels

Liens : Site officiel Leap-Motion https://developer.leapmotion.com/ ; Librairie leap-motion à téléchargerhttps://github.com/nok/leap-motion-processing

Description

Découverte du capteur de mouvement « Leap Motion » à travers la conception d’une affiche interactive. Le leap motion est composé de 3 led et 2 caméras permettant de restituer les gestes de notre avant-bras. Avec la librairie Processing leap motion, 3 exemples sont fournit :

LM_1_BASIC (lien du tuto d'une ancienne étudiante)

LM_2_GESTURE (programme étudié)

LM_3_CAMERA

Objectif

Créer une affiche interactive avec le leap motion. Cette affiche permettrait au prospect de créer son propre dessin sans toucher un médium.

Leap-Motion gesture exemple

Le leap motion détecte plusieurs types de gestes de l’utilisateur, qu'il interprète comme un objet.

Swipe - Un long mouvement linéaire du doigt.

Circle - Un seul doigt traçant un cercle.

Screen Tap - Un tapotement du doigt comme s'il tapait sur un écran d'ordinateur vertical.

Key Tap - Un tapotement du doigt, comme si vous tapotiez sur une touche du clavier.

Le programme exemple LM_2_GESTURES de la librairie Leap Motion n'affiche rien, il détecte seulement les gestes et leurs allouent des espaces mémoire.

Début du programme exemple LM_2_GESTURES

import de.voidplus.leapmotion.*; //importation de la librairie
LeapMotion leap; // déclaration de l'objet leap motion

void setup(){
size(800, 500); //taille de la fenêtre d'affichage
background(255); //couleur d'arrière plan
leap = new LeapMotion(this).allowGestures(); //Création de tout les gestes
//leap = new LeapMotion(this).allowGestures("circle, swipe, screen_tap, key_tap"); //Création des gestes : cercle, swipe,screen_tap et Key_tap
//leap = new LeapMotion(this).allowGestures("swipe"); //Création du geste Swipe uniquement
}

void draw(){
background(255);
}

Début fonction de l'objet Swipe

void leapOnSwipeGesture(SwipeGesture g, int state){//analyse des paramètres d'actions/reconnaissance du geste (objet) Swipe
int id = g.getId();
Finger finger = g.getFinger();//Objet Finger
PVector position = g.getPosition();//Classe PVector décrivant la position des vecteurs de l'objet Swipe
PVector positionStart = g.getStartPosition();//Classe PVector décrivant la position de DEPART des vecteurs de l'objet Swipe
PVector direction = g.getDirection();//Classe PVector décrivant le balayage directionnel des vecteurs (gauche-droite) de l'objet Swipe (parallèle au mouvement de balayage)
float speed = g.getSpeed();//vitesse du geste en ms
long duration = g.getDuration();//Durée écouler du mouvement en microsecondes. !! Variable de type long : stock les grands entiers sur 64 bits (32bits pour les type int) utilisé pour stocker plus d'int sur la durée du geste
float durationSeconds = g.getDurationInSeconds();//Même principe, sauf que l'unité est calculée en seconde et le type est Float (nous avons moins d'infos à stocker)
switch(state){//états du gestes swipe en trois parties : debut/milieu/fin (different de gesture type = type de geste auxquels sont attribué une valeur) relatif à la console
case 1://les données du geste sont recupérées
break;
case 2://Le geste est en cour de dessin
break;
case 3:// Fin/arret du geste
println("SwipeGesture: " + id);//inscription du geste dans la console (paramètre de sortie)
break;
}
}

Début fonction de l'objet Circle

void leapOnCircleGesture(CircleGesture g, int state){//analyse des paramètres d'actions/reconnaissance du geste (objet) Circle
int id = g.getId();
Finger finger = g.getFinger();//Objet Finger
PVector positionCenter = g.getCenter();//Stockage de la position centrale du geste
float radius = g.getRadius();//Rayon de l'objet Circle de type float
float progress = g.getProgress();//Nombre de fois ou l'objet est repassé par le bout du doight
long duration = g.getDuration();//Durée écouler du mouvement en microsecondes. !! Variable de type long
float durationSeconds = g.getDurationInSeconds();//Même principe, sauf que l'unité est calculée en seconde et le type est Float
int direction = g.getDirection();
switch(state){//même principe que SWipe gesture
case 1://Start, début
break;
case 2://Update, milieu
break;
case 3://Stop, fin
println("CircleGesture: " + id);//inscription de ces étapes dans la console (paramètre de sortie)
break;
}
switch(direction){//2 état du geste circle
case 0://Anticlockwise/Left gesture/Geste commencé par la gauche, soit fait à l'inverse du sens des aiguilles d'une montre
break;
case 1://Clockwise/Right gesture//Geste commencé par la droite, soit dans le sens des aiguille d'une montre
break;
}
}

Début fonction de l'objet ScreenTap

void leapOnScreenTapGesture(ScreenTapGesture g){//analyse des paramètres d'actions/reconnaissance du geste (objet) ScreenTap
int id = g.getId();
Finger finger = g.getFinger();//Objet Finger
PVector position = g.getPosition();//Classe PVector décrivant la position des vecteurs de l'objet ScreenTap
PVector direction = g.getDirection();//Classe PVector décrivant le balayage directionnel des vecteurs (gauche-droite) de l'objet ScreenTap
long duration = g.getDuration();//Durée écouler du mouvement en microsecondes. !! Variable de type long
float durationSeconds = g.getDurationInSeconds();//Même principe, sauf que l'unité est calculée en seconde et le type est Float
println("ScreenTapGesture: " + id);//inscription du geste effectué dans la console (paramètre de sortie)
}

Début fonction de l'objet Key Tap

void leapOnKeyTapGesture(KeyTapGesture g){//analyse des paramètres d'actions/reconnaissance du geste (objet) Keytap
int id = g.getId();
Finger finger = g.getFinger();//Objet Finger
PVector position = g.getPosition();//Classe PVector décrivant la position des vecteurs de l'objet Keytap
PVector direction = g.getDirection();//Classe PVector décrivant le balayage directionnel des vecteurs (gauche-droite) de l'objet Keytap
long duration = g.getDuration();//Durée écouler du mouvement en microsecondes. !! Variable de type long
float durationSeconds = g.getDurationInSeconds();//Même principe, sauf que l'unité est calculée en seconde et le type est Float
println("KeyTapGesture: " + id);//inscription du geste effectué dans la console (paramètre de sortie)
}

Fin du programme LM_2_GESTURES

Programme de dessin

L’affiche interactive permet de dessiner sans toucher. L’intégration de la librairie pdf offre la possibilité avec un geste clé (Swipe gesture) d’arrêter le programme. Cet arrêt créer une sauvegarde pdf du dessin, imprimable par la suite.

Début description programme de l'affiche

import processing.pdf.*;//importation librairie PDF
import de.voidplus.leapmotion.*;//importation librairie leap motion
LeapMotion leap;//déclaration de l'objet

void setup() {
size(1080, 720);//taille fenetre d'affichage
smooth(10);//lissage des tracés
leap = new LeapMotion(this);//création de l'objet
leap = new LeapMotion(this).allowGestures("swipe");//créer l'objet SWIPE
beginRecord(PDF, "leap.pdf");//type d'export .pdf
fill(238,222,258);//rectangle fond & couleur rose
rect(100, 100,880, 520);
}

Création d'une boucle for pour dessiner les doigts

void draw() {
for (Finger finger : leap.getFingers ()) {//créer l'objet main
finger.drawBones();//dessin du squellette
}
}

Déclaration de la méthode SWIPE, ayant pour instruction de couper le programme lors du geste

void leapOnSwipeGesture(SwipeGesture g, int state) {
endRecord();//fin enregistrement
exit();//fin du programme
}

Finale

leap_video.mp4

Le programme s'arrête et créer un pdf dans le dossier du programme.

Pistes future : exploiter d'avantage l'exemple gesture afin attribuer une forme de dessin à chaque geste.