Snap! + LeapMotion + Ergo -> Pierre-Feuille-Ciseaux

tutorial
ergo-jr
snap
français
Tags: #<Tag:0x00007f5cf0658d90> #<Tag:0x00007f5cf0658c50> #<Tag:0x00007f5cf0658b10> #<Tag:0x00007f5cf06589d0>

#1

Quelques infos concernant la mini-démo (qui a presque marché), faite aujourd’hui à la réunion du projet PoppyEducation.

Idée : utiliser le LeapMotion avec Snap!

Le LeapMotion, c’est un capteur de mouvement des mains, qui se branche en usb.

Snap! propose par défaut une librairie (dans Fichier/Bibliothèque) appelée LeapMotion Controller
Les blocs ajoutés ressemblent à ça

Lorsqu’on édite ces blocs on s’aperçoit qu’ils font appel à une librairie codée en Javascript

Comme les blocs proposés par défaut ne permettent pas de détection sur l’extension ou non des doigts, je suis allé fureter du côté de l’API javascript du LeapMotion.
https://developer.leapmotion.com/documentation/javascript/api/Leap_Classes.html

On y trouve assez facilement que l’objet Finger possède un attribut booléen qui s’apelle extended, et qui indique donc si le doigt est tendu ou pas :

Finger.extended
Type:boolean

True, if the finger is a pointing, or extended, posture.
var extendedFingers = 0;
    for(var f = 0; f < hand.fingers.length; f++){
        var finger = hand.fingers[f];
        if(finger.extended) extendedFingers++;
}

On peut donc s’inspirer d’un bloc existant pour créer un bloc qui détectera si le doigt x est tendu ou pas.

Définition du bloc :

Comme ça marche (à peu près), on peut maintenant choisir ses doigts préférés pour détecter les positions Pierre / Feuille / Ciseaux.
Le reste de la programmation Snap! est très classique.
Juste une tentative d’élégance pour éviter les multiples tests (“si l’humain joue pierre et que le robot joue ciseau”…), grâce à une matrice construite en liste de liste.

Le code est à retrouver ici :
http://snap.berkeley.edu/snapsource/snap.html#present:Username=proficn&ProjectName=chifoumi3

vidéo :