Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from __future__ import division
- import math, time
- leap = Runtime.createAndStart("leap","LeapMotion2")
- #inmoov = Runtime.createAndStart("inmoov", "InMoovHand")
- #inmoov.connect("COM3")
- arduinoServiceName = "arduino"
- arduino = Runtime.createAndStart(arduinoServiceName, "Arduino")
- arduino.connect("COM3")
- start_time = time.time()
- counter = 0
- leap.addFrameListener(python)
- class LeapFrame:
- def __init__(self, frame):
- self.pointableOrder = [0 for x in range (5)]
- self.frame = frame
- if self.isValid():
- self.valid = True
- print "Hands count : %d" % self.frame.hands().count()
- self.palmPosition = self._palmPosition(self.frame)
- self.palmDirection = self._palmDirection(self.frame)
- self.palmNormal = self._palmNormal(self.frame)
- self.thumbDirection = self._thumbDirection(self.frame)
- self.indexDirection = self._indexDirection(self.frame)
- self.middleDirection = self._middleDirection(self.frame)
- self.ringDirection = self._ringDirection(self.frame)
- self.littleDirection = self._littleDirection(self.frame)
- self.thumbAngleY = self._thumbAngleY(self.frame)
- self.indexAngleY = self._indexAngleY(self.frame)
- self.middleAngleY = self._middleAngleY(self.frame)
- self.ringAngleY = self._ringAngleY(self.frame)
- self.littleAngleY = self._littleAngleY(self.frame)
- self.thumbAngleX = self._thumbAngleX(self.frame)
- self.indexAngleX = self._indexAngleX(self.frame)
- self.middleAngleX = self._middleAngleX(self.frame)
- self.ringAngleX = self._ringAngleX(self.frame)
- self.littleAngleX = self._littleAngleX(self.frame)
- self.deltaHandFingerThumb = self._deltaHandFingerThumb(self.frame)
- self.deltaHandFingerIndex = self._deltaHandFingerIndex(self.frame)
- self.deltaHandFingerMiddle = self._deltaHandFingerMiddle(self.frame)
- self.deltaHandFingerRing = self._deltaHandFingerRing(self.frame)
- self.deltaHandFingerLittle = self._deltaHandFingerLittle(self.frame)
- else:
- self.valid = False
- def isValid(self):
- # Check valid condition if 1 hand is verified
- if self.frame.hands().count() >= 1 and self.frame.hands().get(0):
- print "Hands count 2 : %d " % self.frame.hands().count()
- # Check valid condition if 5 fingers are verified
- if self.frame.pointables().get(0).isValid() and self.frame.pointables().get(1).isValid() and self.frame.pointables().get(2).isValid() and self.frame.pointables().get(3).isValid() and self.frame.pointables().get(4).isValid():
- return True
- return False
- def _vectorAngle(self, v1_x, v1_y, v1_z, v2_x, v2_y, v2_z):
- vectorProduct = v1_x*v2_x + v1_y*v2_y + v1_z*v2_z
- v1Norm = math.sqrt(v1_x*v1_x + v1_y*v1_y + v1_z*v1_z)
- v2Norm = math.sqrt(v2_x*v2_x + v2_y*v2_y + v2_z*v2_z)
- #print "v1_x %f v1_y %f v1_z %f -- v2_x %f v2_y %f v2_z %f" % (v1_x, v1_y, v1_z, v2_x, v2_y, v2_z)
- cos = math.acos(vectorProduct / (v1Norm * v2Norm))
- return (cos * 180 / math.pi)
- def _palmPosition(self, frame):
- return frame.hands().get(0).palmPosition().getX(), frame.hands().get(0).palmPosition().getY(), frame.hands().get(0).palmPosition().getZ()
- def _palmDirection(self, frame):
- return frame.hands().get(0).direction().getX(), frame.hands().get(0).direction().getY(), frame.hands().get(0).direction().getZ()
- def _palmNormal(self, frame):
- return frame.hands().get(0).palmNormal().getX(), frame.hands().get(0).palmNormal().getY(), frame.hands().get(0).palmNormal().getZ()
- def _thumbPosition(self, frame):
- return frame.hands().get(0).fingers().get(0).tipPosition().getX(), frame.hands().get(0).fingers().get(0).tipPosition().getY(), frame.hands().get(0).fingers().get(0).tipPosition().getZ()
- def _thumbDirection(self, frame):
- return frame.hands().get(0).fingers().get(0).direction().getX(), frame.hands().get(0).fingers().get(0).direction().getY(), frame.hands().get(0).fingers().get(0).direction().getZ()
- def _indexPosition(self, frame):
- return frame.hands().get(0).fingers().get(1).tipPosition().getX(), frame.hands().get(0).fingers().get(1).tipPosition().getY(), frame.hands().get(0).fingers().get(1).tipPosition().getZ()
- def _indexDirection(self, frame):
- return frame.hands().get(0).fingers().get(1).direction().getX(), frame.hands().get(0).fingers().get(1).direction().getY(), frame.hands().get(0).fingers().get(1).direction().getZ()
- def _middlePosition(self, frame):
- return frame.hands().get(0).fingers().get(2).tipPosition().getX(), frame.hands().get(0).fingers().get(2).tipPosition().getY(), frame.hands().get(0).fingers().get(2).tipPosition().getZ()
- def _middleDirection(self, frame):
- return frame.hands().get(0).fingers().get(2).direction().getX(), frame.hands().get(0).fingers().get(2).direction().getY(), frame.hands().get(0).fingers().get(2).direction().getZ()
- def _ringPosition(self, frame):
- return frame.hands().get(0).fingers().get(3).tipPosition().getX(), frame.hands().get(0).fingers().get(3).tipPosition().getY(), frame.hands().get(0).fingers().get(3).tipPosition().getZ()
- def _ringDirection(self, frame):
- return frame.hands().get(0).fingers().get(3).direction().getX(), frame.hands().get(0).fingers().get(3).direction().getY(), frame.hands().get(0).fingers().get(3).direction().getZ()
- def _littlePosition(self, frame):
- return frame.hands().get(0).fingers().get(4).tipPosition().getX(), frame.hands().get(0).fingers().get(4).tipPosition().getY(), frame.hands().get(0).fingers().get(4).tipPosition().getZ()
- def _littleDirection(self, frame):
- return frame.hands().get(0).fingers().get(4).direction().getX(), frame.hands().get(0).fingers().get(4).direction().getY(), frame.hands().get(0).fingers().get(4).direction().getZ()
- def _thumbAngleY(self, frame):
- x1, y1, z1 = self._palmNormal(frame)
- x2, y2, z2 = self._thumbDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _thumbAngleX(self, frame):
- x1, y1, z1 = self._palmDirection(frame)
- x2, y2, z2 = self._thumbDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _indexAngleY(self, frame):
- x1, y1, z1 = self._palmNormal(frame)
- x2, y2, z2 = self._indexDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _indexAngleX(self, frame):
- x1, y1, z1 = self._palmDirection(frame)
- x2, y2, z2 = self._indexDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _middleAngleY(self, frame):
- x1, y1, z1 = self._palmNormal(frame)
- x2, y2, z2 = self._middleDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _middleAngleX(self, frame):
- x1, y1, z1 = self._palmDirection(frame)
- x2, y2, z2 = self._middleDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _ringAngleY(self, frame):
- x1, y1, z1 = self._palmNormal(frame)
- x2, y2, z2 = self._ringDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _ringAngleX(self, frame):
- x1, y1, z1 = self._palmDirection(frame)
- x2, y2, z2 = self._ringDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _littleAngleY(self, frame):
- x1, y1, z1 = self._palmNormal(frame)
- x2, y2, z2 = self._littleDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _littleAngleX(self, frame):
- x1, y1, z1 = self._palmDirection(frame)
- x2, y2, z2 = self._littleDirection(frame)
- return self._vectorAngle(x1, y1, z1, x2, y2, z2)
- def _deltaHandFingerThumb(self, frame):
- x1, y1, z1 = self._palmPosition(frame)
- x2, y2, z2 = self._thumbPosition(frame)
- return (x1-x2), (y1-y2), (z1-z2)
- def _deltaHandFingerIndex(self, frame):
- x1, y1, z1 = self._palmPosition(frame)
- x2, y2, z2 = self._indexPosition(frame)
- return (x1-x2), (y1-y2), (z1-z2)
- def _deltaHandFingerMiddle(self, frame):
- x1, y1, z1 = self._palmPosition(frame)
- x2, y2, z2 = self._middlePosition(frame)
- return (x1-x2), (y1-y2), (z1-z2)
- def _deltaHandFingerRing(self, frame):
- x1, y1, z1 = self._palmPosition(frame)
- x2, y2, z2 = self._ringPosition(frame)
- return (x1-x2), (y1-y2), (z1-z2)
- def _deltaHandFingerLittle(self, frame):
- x1, y1, z1 = self._palmPosition(frame)
- x2, y2, z2 = self._littlePosition(frame)
- return (x1-x2), (y1-y2), (z1-z2)
- class Joint:
- def __init__(self, servo, minPos, maxPos, pin, range, arduinoServiceName):
- self.servo = servo
- self.minPos = minPos
- self.maxPos = maxPos
- self.pin = pin
- self.range = range
- self.servo.attach(arduinoServiceName, self.pin)
- self.servo.setMinMax(self.range[0], self.range[1])
- def translate(self, value, leftMin, leftMax, rightMin, rightMax):
- # Figure out how 'wide' each range is
- leftSpan = leftMax - leftMin
- rightSpan = rightMax - rightMin
- # Convert the left range into a 0-1 range (float)
- valueScaled = float(value - leftMin) / float(leftSpan)
- # Convert the 0-1 range into a value in the right range.
- return rightMin + (valueScaled * rightSpan)
- def scale(self, pos):
- if pos < self.minPos:
- pos = self.minPos
- elif pos > self.maxPos:
- pos = self.maxPos
- return math.floor(self.translate(pos, self.minPos, self.maxPos, self.range[0], self.range[1]))
- def move(self, pos):
- """if constraint in locals():
- pos = constraint(pos)"""
- angle = self.scale(pos)
- self.servo.moveTo(angle)
- # variables
- pouce = Runtime.createAndStart("pouce", "Servo")
- index = Runtime.createAndStart("index", "Servo")
- majeur = Runtime.createAndStart("majeur", "Servo")
- annulaire = Runtime.createAndStart("annulaire", "Servo")
- auriculaire = Runtime.createAndStart("auriculaire", "Servo")
- paume = Runtime.createAndStart("paume", "Servo")
- # servo, minPos, maxPos, pin, range
- j_pouce = Joint(pouce, 0, 50, 2, [50, 170], arduinoServiceName)
- j_index = Joint(index, 0, 50, 3, [50, 170], arduinoServiceName)
- j_majeur = Joint(majeur, 0, 50, 4, [50, 170], arduinoServiceName)
- j_annulaire = Joint(annulaire, 0, 50, 5, [50, 170], arduinoServiceName)
- j_auriculaire = Joint(auriculaire, 0, 50, 6, [50, 170], arduinoServiceName)
- j_paume = Joint(paume, -30, 30, 7, [50, 150], arduinoServiceName)
- def onFrame(fram):
- global start_time
- global counter
- # Track only 40 frames/s
- elapsed_time = time.time() - start_time
- if elapsed_time >= 1 and counter <= 120:
- start_time = time.time()
- counter += 1
- elif counter >= 120:
- counter = 0
- frame = LeapFrame(fram)
- if frame.valid:
- j_pouce.move(int(frame.deltaHandFingerThumb[1]))
- j_index.move(int(frame.deltaHandFingerIndex[1]))
- j_majeur.move(int(frame.deltaHandFingerMiddle[1]))
- j_annulaire.move(int(frame.deltaHandFingerRing[1]))
- j_auriculaire.move(int(frame.deltaHandFingerLittle[1]))
- j_paume.move(int(frame.palmNormal[0] * 50))
- leap.startTracking()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement