Hand spåra mekanisk Arm - Pyduino + språng Motion (8 / 11 steg)
Steg 8: Länka språng motion Controller till en servomotor
Nu när du har förhoppningsvis enheten hoppa rörelse upp och kör vi ska skapa vår första program stream data från enheten och sedan ska vi koppla det till våra servomotor med pyduino biblioteket. Helst vi kör ett skript måste vi ha tjänsten leapd. Att veta att den här tjänsten körs bör du kunna se 3 upplysta lysdioder på enheten språng. (Se vidare bilden i föregående steg)
Vårt första steg skript kommer att bestå av flera viktiga komponenter. Det finns en kontrollerklass som ansluts till enhetens språng och en lyssnaren klass som kommer att få data från spårningsprogramvara. För en grundlig tutorial på hur man ställer in en enkel språng script kolla in: https://developer.leapmotion.com/documentation/pyt...
Jag ska ge en kort översikt över vad bit av koden nedan gör och hur det fungerar. I den huvudsakliga delen av koden vi initiera en instans av våra lyssnare och controller klasser efteråt vi lägga till anpassade lyssnaren till vår controller. Den viktigaste delen av skriptet är vad sker inom lyssnaren. Lyssnaren är en klass som kommer att få uppgifter från språng enheten och bedöma vad till gör med den information som direktuppspelas. Lyssnaren har möjlighet att få 60 bilder per sekund från enheten men det är lite för mycket information för vad vi vill. Du är säkert Välkommen att prova och använda 60 bilder per sekund till kontroll din Arduino emellertid hålla i minnet det tar en liten tid att skicka ett meddelande till Arduino enheten och få den svara. För att åtgärda problemet vi kommer endast att fungera med 10 ramar en sekund i stället för 60. Lyssnaren har några grundläggande funktioner: Å initiera på Connect, på koppla från, på avfarten, på ram. De är alla ganska självförklarande namn men kan gå igenom dem en efter en och förklara hur vi ska använda dem för att styra våra servo.
Initiera - vill här vi förklara våra Arduino och upprätta en seriell anslutning till det
På Connect - kan vi aktivera några gester för registeransvarige, utan att behöva göra något med Arduino här
Vid frånkoppling - ingenting verkligen här.
På Exit - ska vi återställa servo position och stäng anslutningen till vår Arduino enhet
På ram - är det första du ska göra får tid eftersom vi bara vill få en ram varje 10ms eller så. När vi fått ramen från registeransvarige berättar det vilken hand är i ramen och vad dess position. Från detta kan vi utvinna finger och gemensamma ståndpunkter. Vi ska använda vår hand normaliserade position i rutan interaktion och multiplicera det med spänna på vår motor. Till exempel om vår hand är hela vägen till vänster, normaliserade position 0 och vinkeln på våra servo kommer alltså 0 också. För mer insikt kan du läsa på rutan interaktion i Leap API-dokumentationen: https://developer.leapmotion.com/documentation/pyt... En annan användbar länk att titta på är en för ramen eftersom ramen lagrar all vår information om hand och positioner av allt. Att se vilken information som är tillgänglig inom vår ram kolla denna länken: https://developer.leapmotion.com/documentation/pyt...
Vi kommer att använda samma Arduino krets som vi skapade tidigare. Om du råkade ändra servo pin till något annat än 2 kommer att du behöva ändra koden nedan (linje 17). Om du inte kan få den Arduino del arbetar se till att har du seriell anslutning på rätt port (linje 23). Linjerna 78,82 är vad kontrollera servomotor. När du kör koden ta tid att flytta handen runt och se vad blir utgång. Positionen för din hand kommer ut i form av normaliserade position i rutan interaktion. Innan du kör den här koden se till att din leapd tjänst körs och att din Arduino är ansluten till datorn.
my_first_leap.py
# Enkel språng motion program för att spåra positionen för din hand och flytta en servo
# importera bibliotek där LeapMotionSDK är
importera sys
sys.Path.INSERT (0, "LeapLib /")
importera Leap, tråd, tid
från steg importera CircleGesture, KeyTapGesture, ScreenTapGesture, SwipeGesture
från pyduino import *
klass SampleListener(Leap.Listener):
oldtime = time.time()
NEWTIME = time.time()
# FIXME servo är inte ansluten till stift 2
SERVO_PIN = # 2 Azimuthal Servo motor pin
AZIMUTHAL_LIMIT = 180 # vi vill att vår motor att gå mellan 0 och 180
def on_init(self, controller):
# om din arduino kördes på en seriell port annat än ' / dev/ttyACM0 / "
# förklara: en = Arduino(serial_port='/dev/ttyXXXX')
Self.a = Arduino()
# sömn så gott om tid för datorn att göra seriell anslutning
Time.Sleep(3)
skriva ut "Initialized"
def on_connect(self, controller):
skriva ut "Ansluten"
# Aktivera gester
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):
# Observera: skickas inte när du kör i ett felsökningsprogram.
skriva ut "Frånkopplad"
def on_exit(self, controller):
# Återställa servo position när du slutar programmet
Self.a.servo_write (själv. SERVO_PIN, 90)
Self.a.Close()
skriva ut "Exited"
def on_frame(self, controller):
# Vi vill bara få ställning som handen varje så ofta
Self.NEWTIME = time.time()
om self.newtime-self.oldtime > 0,1: # om skillnaden mellan gånger 10ms
# Få senaste ramen och rapportera lite grundläggande information
ram = controller.frame()
interaction_box = frame.interaction_box
# Skriv ut lite statistik
skriva ut "ram-id: %d, tidsstämpel: %d, händer: %d, fingrar: %d, verktyg: %d, gester: %d" () %
Frame.ID, frame.timestamp, len(frame.hands), len(frame.fingers), len(frame.tools), len(frame.gestures()))
# Få händer
för hand i frame.hands:
handType = "Vänster hand" om hand.is_left annat "högra hand"
normalized_point = interaction_box.normalize_point(hand.palm_position,True)
skriva ut "%s, id %d, x-position: %s" % (handType, hand.id, normalized_point.x)
skriva ut "%s, id %d, y-position: %s" % (handType, hand.id, normalized_point.y)
skriva ut "%s, id %d, z-position: %s" % (handType, hand.id, normalized_point.z)
# FIXME beroende på läggning av servomotor
# Om motorn är upprätt, hoppa enheten registrerar en 0 graders vinkel om hand är hela vägen till vänster
XPOS_servo = abs(AZIMUTHAL_LIMIT-normalized_point.x*AZIMUTHAL_LIMIT)
skriva ut "Servo vinkel = %d" %(int(XPOS_servo))
# Skriv värdet till servo på arduino
Self.a.servo_write (själv. SERVO_PIN,int(XPOS_servo)) # slå LED på
# uppdatering den gamla tiden
Self.oldtime = self.newtime
annat:
passera # hålla framåt i tiden tills 10 millisekund nås
def main ():
# Skapa en prov lyssnaren och controller
lyssnaren = SampleListener()
Controller = Leap.Controller()
# Har prov lyssnaren ta emot händelser från registeransvarige
Controller.add_listener(Listener)
# Hålla processen igång tills retur trycks
skriva ut "Tryck på Enter för att avsluta..."
försök:
sys.stdin.readline()
Förutom KeyboardInterrupt:
passera
Slutligen:
# Ta bort provet lyssnaren när du är klar
Controller.remove_listener(Listener)
om __name__ == "__main__":
Main)