Mi sono comprato per circa 20 euro il Leap Motion su un e-commerce cinese (su Amazon costa piu' del doppio) con il dubbio che non fosse l'originale ma un clone.
Il dispositivo funziona perferttamente con i driver originali ed anche la confezione sembra corretta
Il sito web di
Leap Motion riporta il pacchetto .deb per l'installazione sotto Linux e le istruzioni per Ubuntu ma funziona tranquillamente anche su Debian. Peraltro anche i requisiti minimi del sistema sono abbondantemente sorvradimesionati....il dispositivo funziona anche su un Centrino 1GHz (anche se si inizia a notare il ritardo)
dpkg -i Leap-*-.x86.deb
Dal punto di vista hardware il Leap Motion e' costituito da una coppia di telecamere ad infrarossi ad alta velocita' (200 fotogrammi al secondo) ed un illuminatore ad infrarossi. Vista la ridotta potenza dell'illuminatore il raggio d'azione del sensore e' inferiore al metro ma la risoluzione e' stimata a circa 0.7 cm
Non ho capito bene se il sensore usa la visione stereoscopica per determinare la terza dimensione oppure si tratta solo di una coppia di telecamere ed il lavoro di interpretazione e' demandato al PC e' connesso (aggiornamento: leggendo la documentazione tecnica tutto il lavoro di riconoscimento viene fatto dal PC, il sensore manda solo coppie di immagini, peraltro il Leap Motion viene riconosciuto nel syslog come un dispositivo video come una qualunque webcam)
Un aspetto da non sottovalutare e' la disponibilita' dell'SDK che si puo' scaricare direttamente da questo
link.Sono previste librerie per C, Python e Unity
Ho provato ad usare l'esempio per Python (nella directory /samples) ma non riusciva a importare il modulo Leap. Ho riscritto parte del codice, evidenziato in giallo per fare il puntamento alle directory in modo corretto.
(versione ridotta con la sola posizione di pitch, roll e yaw)
--------------------------------------------------------------------------
import os, sys, thread, time,inspect,thread
sys.path += ["/usr/lib/Leap","../lib/x86","../lib"]
import Leap
from Leap import CircleGesture, KeyTapGesture, ScreenTapGesture, SwipeGesture
class SampleListener(Leap.Listener):
finger_names = ['Thumb', 'Index', 'Middle', 'Ring', 'Pinky']
bone_names = ['Metacarpal', 'Proximal', 'Intermediate', 'Distal']
state_names = ['STATE_INVALID', 'STATE_START', 'STATE_UPDATE', 'STATE_END']
def on_init(self, controller):
print "Initialized"
def on_connect(self, controller):
print "Connected"
# Enable gestures
controller.enable_gesture(Leap.Gesture.TYPE_CIRCLE);
controller.enable_gesture(Leap.Gesture.TYPE_KEY_TAP);
controller.enable_gesture(Leap.Gesture.TYPE_SCREEN_TAP);
controller.enable_gesture(Leap.Gesture.TYPE_SWIPE);
def on_disconnect(self, controller):
# Note: not dispatched when running in a debugger.
print "Disconnected"
def on_exit(self, controller):
print "Exited"
def on_frame(self, controller):
# Get the most recent frame and report some basic information
frame = controller.frame()
# Get hands
for hand in frame.hands:
handType = "Left hand" if hand.is_left else "Right hand"
print " %s, id %d, position: %s" % (
handType, hand.id, hand.palm_position)
# Get the hand's normal vector and direction
normal = hand.palm_normal
direction = hand.direction
# Calculate the hand's pitch, roll, and yaw angles
print " pitch: %f degrees, roll: %f degrees, yaw: %f degrees" % (
direction.pitch * Leap.RAD_TO_DEG,
normal.roll * Leap.RAD_TO_DEG,
direction.yaw * Leap.RAD_TO_DEG)
def main():
# Create a sample listener and controller
listener = SampleListener()
controller = Leap.Controller()
# Have the sample listener receive events from the controller
controller.add_listener(listener)
# Keep this process running until Enter is pressed
print "Press Enter to quit..."
try:
sys.stdin.readline()
except KeyboardInterrupt:
pass
finally:
# Remove the sample listener when done
controller.remove_listener(listener)
if __name__ == "__main__":
main()
--------------------------------------------------------------------------
La cosa incredibile e' la quantita' di informazioni fornita.
Per esempio il sensore riesce a distinguere
1) mano destra da mano sinistra
2) vettore normale della mano
3) yaw, pitch e roll della posizione della mano
4) direzione del braccio, direzione del polso
5) per ogni dito vengono forniti 4 valori per ciascuna delle giunzioni delle ossa
--------------------------------------------------------------------------
Frame id: 81414, timestamp: 1461155610589896, hands: 1, fingers: 5, tools: 0, gestures: 0
Right hand, id 19, position: (33.206, 101.55, 31.0056)
pitch: -0.360167 degrees, roll: -19.586099 degrees, yaw: -15.937854 degrees
Arm direction: (-0.539341, -0.159729, -0.8268), wrist position: (56.3493, 103.269, 80.5455), elbow position: (201.971, 146.396, 303.781)
Thumb finger, id: 190, length: 52.116371mm, width: 20.250000mm
Bone: Metacarpal, start: (27.9765, 103.101, 92.2079), end: (27.9765, 103.101, 92.2079), direction: (0, 0, 0)
Bone: Proximal, start: (27.9765, 103.101, 92.2079), end: (-6.82482, 100.813, 56.4951), direction: (0.697175, 0.0458273, 0.715435)
Bone: Intermediate, start: (-6.82482, 100.813, 56.4951), end: (-30.6533, 99.3269, 32.1536), direction: (0.698872, 0.0435907, 0.713917)
Bone: Distal, start: (-30.6533, 99.3269, 32.1536), end: (-50.3944, 104.308, 20.6123), direction: (0.843508, -0.212845, 0.493145)
Index finger, id: 191, length: 58.807510mm, width: 19.342800mm
Bone: Metacarpal, start: (38.8333, 118.553, 77.8819), end: (4.48218, 112.147, 13.1405), direction: (0.46692, 0.0870757, 0.880002)
Bone: Proximal, start: (4.48218, 112.147, 13.1405), end: (-13.782, 110.943, -25.7277), direction: (0.42512, 0.0280223, 0.904703)
Bone: Intermediate, start: (-13.782, 110.943, -25.7277), end: (-25.9697, 93.3597, -36.9743), direction: (0.504241, 0.727484, 0.465305)
Bone: Distal, start: (-25.9697, 93.3597, -36.9743), end: (-31.1777, 77.3075, -34.3053), direction: (0.304817, 0.939512, -0.156218)
Middle finger, id: 192, length: 67.006439mm, width: 18.997200mm
Bone: Metacarpal, start: (49.2811, 115.897, 71.9318), end: (25.0349, 106.497, 7.19131), direction: (0.347527, 0.134729, 0.92794)
Bone: Proximal, start: (25.0349, 106.497, 7.19131), end: (15.6093, 104.469, -40.035), direction: (0.19555, 0.0420621, 0.979791)
Bone: Intermediate, start: (15.6093, 104.469, -40.035), end: (2.5615, 85.8319, -57.0945), direction: (0.458841, 0.655411, 0.599918)
Bone: Distal, start: (2.5615, 85.8319, -57.0945), end: (-6.32149, 69.2732, -56.8969), direction: (0.472701, 0.88116, -0.0105194)
Ring finger, id: 193, length: 64.428482mm, width: 18.077040mm
Bone: Metacarpal, start: (59.6432, 110.65, 67.9288), end: (46.5165, 98.9206, 7.8132), direction: (0.209559, 0.187246, 0.9597)
Bone: Proximal, start: (46.5165, 98.9206, 7.8132), end: (49.952, 104.128, -36.4287), direction: (-0.0768931, -0.116561, 0.990202)
Bone: Intermediate, start: (49.952, 104.128, -36.4287), end: (42.4103, 90.7847, -59.5039), direction: (0.272243, 0.48169, 0.832981)
Bone: Distal, start: (42.4103, 90.7847, -59.5039), end: (33.5572, 75.4563, -65.4834), direction: (0.473833, 0.820404, 0.320031)
Pinky finger, id: 194, length: 50.510735mm, width: 16.057440mm
Bone: Metacarpal, start: (68.5105, 99.5173, 67.8996), end: (64.7404, 88.1882, 11.157), direction: (0.065018, 0.19538, 0.97857)
Bone: Proximal, start: (64.7404, 88.1882, 11.157), end: (75.9784, 92.3616, -22.108), direction: (-0.317824, -0.11803, 0.940775)
Bone: Intermediate, start: (75.9784, 92.3616, -22.108), end: (74.1183, 84.4117, -39.8812), direction: (0.0951014, 0.406461, 0.908705)
Bone: Distal, start: (74.1183, 84.4117, -39.8812), end: (66.4641, 71.7476, -48.7209), direction: (0.444062, 0.734713, 0.51284)
--------------------------------------------------------------------------
fra le altre coste e' possibile impostare anche il riconoscimento delle gesture