syndilights/PoC/leap/HandsPoC.py

198 lines
8.1 KiB
Python
Executable File

#!/usr/bin/python
################################################################################
# Copyright (C) 2012-2013 Leap Motion, Inc. All rights reserved. #
# Leap Motion proprietary and confidential. Not for distribution. #
# Use subject to the terms of the Leap Motion SDK Agreement available at #
# https://developer.leapmotion.com/sdk_agreement, or another agreement #
# between Leap Motion and you, your company or other organization. #
################################################################################
import Leap, sys
import serial, time, os
from Leap import CircleGesture, KeyTapGesture, ScreenTapGesture, SwipeGesture
tty_USB = "/dev/tty.usbserial-A7005FGN"
ser = serial.Serial(port = tty_USB, baudrate=9600)
ser.close()
ser.open()
time.sleep(1)
class SampleListener(Leap.Listener):
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()
##print "Frame id: %d, timestamp: %d, hands: %d, fingers: %d, tools: %d, gestures: %d" % (
## frame.id, frame.timestamp, len(frame.hands), len(frame.fingers), len(frame.tools), len(frame.gestures()))
if not frame.hands.empty:
# Get the first hand
hand = frame.hands[0]
# Check if the hand has any fingers
fingers = hand.fingers
# Check if there is a fist
if hand and fingers.empty:
print "We have a fist, so let's make the ball vanish"
if ser.isOpen():
ser.write(str(0))
time.sleep(0.3)
# if len(frame.hands) == 1 and len(fingers) == 5:
# print "We have a one full hand, so let's make the ball appear"
# if ser.isOpen():
# ser.write(str(1))
# time.sleep(0.3)
if len(frame.hands) == 2 and len(fingers) == 5:
print "We have a two full hands, so let's make the balls appear"
if ser.isOpen():
ser.write(str(2))
time.sleep(0.3)
if len(frame.hands) == 2 and len(fingers) == 2:
print "Bye Bye"
##if ser.isOpen():
## ser.write(str(9))
time.sleep(0.3)
if not fingers.empty:
# Calculate the hand's average finger tip position
avg_pos = Leap.Vector()
for finger in fingers:
avg_pos += finger.tip_position
avg_pos /= len(fingers)
##print "Hand has %d fingers, average finger tip position: %s" % (
## len(fingers), avg_pos)
# Get the hand's sphere radius and palm position
##print "Hand sphere radius: %f mm, palm position: %s" % (
## hand.sphere_radius, hand.palm_position[0])
#print "Number of Hands: %s - Number of fingers: %s - Palm position: %s" % ( len(frame.hands), len(fingers), hand.palm_position[0])
if len(frame.hands) == 1 and len(fingers) == 5 and -170 < hand.palm_position[0] < -85:
print "w5"
if ser.isOpen():
ser.write(str(4))
time.sleep(0.3)
if len(frame.hands) == 1 and len(fingers) == 5 and -84 < hand.palm_position[0] < 0:
print "w10"
if ser.isOpen():
ser.write(str(5))
time.sleep(0.3)
if len(frame.hands) == 1 and len(fingers) == 5 and 1 < hand.palm_position[0] < 85:
print "w15"
if ser.isOpen():
ser.write(str(6))
time.sleep(0.3)
if len(frame.hands) == 1 and len(fingers) == 5 and 86 < hand.palm_position[0] < 170:
print "w20"
if ser.isOpen():
ser.write(str(7))
time.sleep(0.3)
# 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 "Hand 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)
# Gestures
for gesture in frame.gestures():
if gesture.type == Leap.Gesture.TYPE_CIRCLE:
circle = CircleGesture(gesture)
# Determine clock direction using the angle between the pointable and the circle normal
if circle.pointable.direction.angle_to(circle.normal) <= Leap.PI/4:
clockwiseness = "clockwise"
else:
clockwiseness = "counterclockwise"
# Calculate the angle swept since the last frame
swept_angle = 0
if circle.state != Leap.Gesture.STATE_START:
previous_update = CircleGesture(controller.frame(1).gesture(circle.id))
swept_angle = (circle.progress - previous_update.progress) * 2 * Leap.PI
##print "Circle id: %d, %s, progress: %f, radius: %f, angle: %f degrees, %s" % (
## gesture.id, self.state_string(gesture.state),
## circle.progress, circle.radius, swept_angle * Leap.RAD_TO_DEG, clockwiseness)
if gesture.type == Leap.Gesture.TYPE_SWIPE:
swipe = SwipeGesture(gesture)
##print "Swipe id: %d, state: %s, position: %s, direction: %s, speed: %f" % (
## gesture.id, self.state_string(gesture.state),
## swipe.position, swipe.direction, swipe.speed)
if gesture.type == Leap.Gesture.TYPE_KEY_TAP:
keytap = KeyTapGesture(gesture)
print "Key Tap id: %d, %s, position: %s, direction: %s" % (
gesture.id, self.state_string(gesture.state),
keytap.position, keytap.direction )
if ser.isOpen():
ser.write(str(3))
time.sleep(0.3)
if gesture.type == Leap.Gesture.TYPE_SCREEN_TAP:
screentap = ScreenTapGesture(gesture)
##print "Screen Tap id: %d, %s, position: %s, direction: %s" % (
## gesture.id, self.state_string(gesture.state),
## screentap.position, screentap.direction )
#if not (frame.hands.empty and frame.gestures().empty):
# print ""
def state_string(self, state):
if state == Leap.Gesture.STATE_START:
return "STATE_START"
if state == Leap.Gesture.STATE_UPDATE:
return "STATE_UPDATE"
if state == Leap.Gesture.STATE_STOP:
return "STATE_STOP"
if state == Leap.Gesture.STATE_INVALID:
return "STATE_INVALID"
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..."
sys.stdin.readline()
# Remove the sample listener when done
controller.remove_listener(listener)
if __name__ == "__main__":
main()