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 ![]()
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.
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.
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.
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.

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 ![]()
Saludos @ Home
El Bruno
Leave a reply to elbruno Cancel reply