Hola!

Dicen que madurar es preocuparse más por lo que te va a cobrar el dentista que por los minutos de dolor y sufrimiento. En nuestra profesión madurar se asocia a dejar de lado las líneas de código y comenzar a hacer tareas más de gestión. A muchas personas esto les parece una aberracion, cuando en realidad no se dan cuenta de que es una excelente oportunidad para poder programar con amigos, trabajar en equipo e intentar pasar un buen rato con un objetivo en común entre varios. Esto es gestión de equipos Winking smile

Ahora bien, cuando te pasas viajando de aqui y no abres el Visual Studio en una semana, pues te queda el mono para el fin de semana. Por eso es que hoy, ya con varias ideas en la cabeza, me pongo de lleno con el juguetito nuevo de estos días: un Leap Motion.

image

La verdad es que por los €99 que cuesta, vale la pena con creces. No me voy a enrollar explicando lo que hace, piensa en Minority Report, o mejor mira este video de Engadget.

Yo lo que haré es descargar el SDK y después:

1. Abrir Visual Studio 2013

2. Crear una applicación de consola

3. Agregar las siguientes referencias a la applicación

  • \LeapDeveloperKit\LeapSDK\lib\LeapCSharp.NET4.0.dll

4. Listo! ya puedo empezar a meter código para ver que nos da el Leap Motion! Antes como siempre con estos devices, tengo que configurar la app para que se compile para un target específico, en este caso X86.

image

5,  En el Main agrego el siguiente código y ya tebgo algo funcionando. En esta sección, lo que hacemos es crear un listener para los eventos que envía el Leap Motion e inicializarlo con un Controller.

   1: using System;

   2: using Leap;

   3:  

   4: namespace LeapConsole1

   5: {

   6:     class Program

   7:     {

   8:         static void Main(string[] args)

   9:         {

  10:             var listener = new ElBrunoListener();

  11:             var controller = new Controller();

  12:             controller.AddListener(listener);

  13:             Console.WriteLine("Press Enter to quit...");

  14:             Console.ReadLine();

  15:             controller.RemoveListener(listener);

  16:             controller.Dispose();

  17:         }

  18:     }

  19: }

6. La clase ElBrunoListener tiene un poco más de código, ya que es la que se encarga de procesar la información que nos envía el Leap. Veamos que tiene dentro

   1: class ElBrunoListener : Listener

   2: {

   3:     private readonly Object _thisLock = new Object();

   4:  

   5:     private void SafeWriteLine(String line)

   6:     {

   7:         lock (_thisLock)

   8:         {

   9:             Console.WriteLine(line);

  10:         }

  11:     }

  12:  

  13:     public override void OnInit(Controller controller)

  14:     {

  15:         SafeWriteLine("Initialized");

  16:     }

  17:  

  18:     public override void OnConnect(Controller controller)

  19:     {

  20:         SafeWriteLine("Connected");

  21:         controller.EnableGesture(Gesture.GestureType.TYPESWIPE);

  22:     }

  23:  

  24:     public override void OnDisconnect(Controller controller)

  25:     {

  26:         SafeWriteLine("Disconnected");

  27:     }

  28:  

  29:     public override void OnExit(Controller controller)

  30:     {

  31:         SafeWriteLine("Exited");

  32:     }

  33:  

  34:     public override void OnFrame(Controller controller)

  35:     {

  36:         var frame = controller.Frame();

  37:         var gestures = frame.Gestures();

  38:         foreach (var swipe in from gesture in gestures where gesture.Type == Gesture.GestureType.TYPESWIPE select new SwipeGesture(gesture))

  39:         {

  40:             var gestureName = GetGestureNameFromSwipe(swipe);

  41:             SafeWriteLine(string.Format("Swipe id: {0}, name: {1}", swipe.Id, gestureName));

  42:             break;

  43:         }

  44:     }

  45:  

  46:     private string GetGestureNameFromSwipe(SwipeGesture swipe)

  47:     {

  48:         var gestureName = "undefined";

  49:         var direction = swipe.Direction;

  50:         if (direction.Yaw > 0)

  51:         {

  52:             gestureName = "left to right";

  53:         }

  54:         if (direction.Yaw < 0)

  55:         {

  56:             gestureName = "right to left";

  57:         }

  58:         return gestureName;

  59:     }

  60: }

7. En primer lugar podemos ver que podemos hacer un override de OnInit, OnConnect, OnDisconnect y OnExit para inicializar el sensor. En este caso, solo quiero que el sensor registre el gesto SWIPE.

8. Luego en el OnFrame, podemos procesar la información que nos retorna un FRAME. La verdad es que es impresionante todo lo que tiene este objeto. En este ejemplo, accedemos a la colección de gestos y en la misma, obtenemos los de tipo SWYPE.

9. Luego tenemos que procesar toda la información de este SWIPE. Por un lado sabemos que es un SWIPE, pero necesitamos averiguar la dirección del mismo. Para esto trabajamos con el objeto SwipeGesture y resumiendo un poco el tema, dentro del mismo identifico si el swipe ha sido de izquierda a derecha procesando la propiedad Direction.

image

Direction es un vector. Un vector tiene mucha información, como la posición inicial y final, siempre asociado a los ejes, X, Y y Z. Con esta información y pensando en el vector en los 3 ejess, podríamos identificar swipes de izquierda a derecha, de arriba hacia abajo, de abajo a izquierda, etc.

En este caso, y para resumir mucho lo que podemos hacer con el LEAP, he decido procesar la propiedad YAW. La misma nos da un valor entero con la diferencia en ángulos desde el eje Z negativo y el eje X positivo.

api/../../../images/Math_Yaw_Angle.png

De esta forma si el ángulo es mayor que 90º será un SWIPE LEFT TO RIGHT y si es menor que 90º será un SWIPE RIGHT TO LEFT.

Nota: Esto siempre pensando en que no seas Terminator y hagas los gestos de swipe en una dirección recta sin variaciones.

10. Pues bien, ahora ya podemos lanzar la app y ver como la consola nos muestra los gestos que vamos realizando sobre el Leap Motion!

Por cierto, me tendré que conseguir unas Google Glases o una cámara deportiva porque lo de filmar acciones en 1ra persona con el mobile phone … pues no queda bien Open-mouthed smile

Saludos @ Home

El Bruno

image image image Google

4 responses to “[#LEAP] Welcome Leap Motion !!! (empezando a pensar en XYZ!)”

  1. Bruno, tienes que ver lo que hemos hecho en Plastic SCM… se puede controlar ya con LeapMotion (en la versión actual, descargable :P) e incluso hicimos un vídeo tipo ‘Elon Musk’, mira:

    Creo que tenemos que estrujarnos más la cabeza para sacarle utilidad, pero para reuniones ya queda molón 😛

    Like

    1. Simplemente genial !!!

      Like

  2. Todo muy bueno, aunque investigando note que es imposible saber el nombre del dedo que estoy moviendo porque estos siempre resetean su id 😦

    Like

    1. Tan así es? todavía no me pegué con dedos en modo individual, pero gracias por el dato ;=)

      Like

Leave a comment

Discover more from El Bruno

Subscribe now to keep reading and get access to the full archive.

Continue reading