Innholdsfortegnelse:

A Hearing MeArm, Google Coral TPU Accelerator Driven: 3 trinn
A Hearing MeArm, Google Coral TPU Accelerator Driven: 3 trinn

Video: A Hearing MeArm, Google Coral TPU Accelerator Driven: 3 trinn

Video: A Hearing MeArm, Google Coral TPU Accelerator Driven: 3 trinn
Video: Gesture control Robot Arm MediaPipe MeArm 2024, Juli
Anonim
A Hearing MeArm, Google Coral TPU Accelerator Driven
A Hearing MeArm, Google Coral TPU Accelerator Driven
A Hearing MeArm, Google Coral TPU Accelerator Driven
A Hearing MeArm, Google Coral TPU Accelerator Driven
A Hearing MeArm, Google Coral TPU Accelerator Driven
A Hearing MeArm, Google Coral TPU Accelerator Driven
A Hearing MeArm, Google Coral TPU Accelerator Driven
A Hearing MeArm, Google Coral TPU Accelerator Driven

I det følgende vil jeg beskrive en stemmestyrt versjon av MeArm, en liten xyz robotarm med en griper. Jeg brukte MeArm Pi fra MIME-bransjer, men systemet burde være aktuelt for alle versjoner av MeArm eller lignende servodrevne enheter.

Ved hjelp av Google Coral TPU Accelerator kan du kjøre raske offline TensorFlow -stemmegjenkjenningsskript på Raspberry Pi, og dermed kontrollere fysiske enheter ved talte ordrer, med en forsinkelse på under ett sekund.

Anordningen beskrevet her er en kombinasjon og forlengelse av konsepter beskrevet i to tidligere instrukser. Det er en forlengelse av en tidligere implementering av Google Coral -talekontroll, en Jumping Jack, beskrevet her og en stor forbedring av en Google AIY -talekontrollert MeArm beskrevet her.

Den stemmestyrte MeArm som bruker Google Voice AIY-systemet krevde online tilgang, var ikke lett å implementere, måtte trykke på en knapp for å aktivere lytting etter talebestillinger og hadde lang ventetid. Google Coral TPU Accelerator som brukes nå gjør det mulig å kjøre TensorFlowLite -modeller offline med høy hastighet på en Raspberry Pi eller andre Linux -enheter. Blant eksemplene på Google Coral Github -siden er det et eksempel kalt "hørselslang" for et talegjenkjenningssystem som kan forstå 140 nøkkelfraser (september 2019), som deretter blir kartlagt til virtuelle tastetrykk. Ved å koble disse "tastetrykkene" til utførelsen av noen funksjoner programmert i Python, er det mulig å bygge en stemmekommando kontrollert enhet. Jeg hadde nylig beskrevet en første implementering, en stemmestyrt elektromekanisk hoppekontakt. Implementeringen her er litt mer kompleks og gjør det mulig å kontrollere alle fire servoene til MeArm for å enten flytte MeArm kontinuerlig eller få den til å flytte til en rekke forhåndsdefinerte stillinger, eller for å utføre noen mer komplekse oppgaver.

Ved å bruke manuset som er gitt her som eksempel, bør det være relativt enkelt å konstruere andre stemmestyrte enheter, f.eks. robotbiler eller hjelpetekniske enheter.

Rekvisita

  • MeArm. Brukes her: MeArm Pi fra MIME Industries
  • Bringebær Pi 4
  • Google Coral TPU Accelerator
  • Adafruit 16 kanals servo panser
  • noen startkabler
  • valgfritt: kondensator for servo panser, ca 400 µF for 4 servoer (anbefalt av Adafruit)
  • 5-6 V strømkilde for servo panser. Jeg brukte her en gammel 6V lader, en 4x AA batteripakke fungerer også
  • Mikrofon. Jeg brukte et gammelt Microsoft HD3000 -webkamera som mikrofon.

Trinn 1: Konfigurere systemet

Sette opp systemet
Sette opp systemet
Sette opp systemet
Sette opp systemet

Last ned det forhåndskonfigurerte Raspian -bildet for Google Coral TPU Accelerator fra Google Coral Github -siden og installer det på et µSD -kort. Bildet inneholder også en rekke eksempelskript. Sett opp Pi som angitt.

Installer eksempelet Keyword spotter fra Google Coral GitHub -området, hvis det ikke er inkludert i bildet, og alle nødvendige programmer. Fest mikrofonen til Pi. Jeg vil anbefale å leke med eksempelet "Hearing Snake" for å være sikker på at alt fungerer.

Last ned og installer Adafruit 16 -kanalers panseret, som beskrevet her. Installer panseret og lek med Adafruit -eksemplene for å sikre at alt fungerer som det skal.

Last ned filene som er vedlagt denne instruksjonsboken, og kopier dem til mappen "Project Keyword Spotter". Filen "commands_v1_MeArm.txt" må kopieres til undermappen "config".

Koble MeArms servoer til servo panseret som angitt. Jeg brukte port 15 for opp/ned, port 11 for forover/bakover, port 7 for sving og port 3 for gripeservoene.

Innen manuset må du kanskje justere min/senter/maks verdier for hver servo til konfigurasjonen din. Disse innstillingene bidrar til å unngå skade på servoene. Du må kanskje også endre listene med posisjoner, transport1 og transport2.

Kjør skriptet. Så langt hadde jeg kjørt den fra IDE.

I tilfelle du ønsker å endre nøkkelfrasene som fremkaller en bestemt funksjon i henhold til ditt behov. En fullstendig liste over tilgjengelige nøkkelfraser finnes i filen "labels_gc2 raw.txt" i undermappen config.

Systemet har en ventetid på omtrent 1 sekund, men avhenger mye av hvilke handlinger som utføres. I noen tilfeller må nøkkelfasen gjentas, nøyaktigheten av gjenkjenning er ikke alltid 100%.

Trinn 2: Bruke enheten

Hvis alt er konfigurert og kontrollert, kan du kjøre enheten.

En gjeldende begrensning er at en gitt ordre utføres gjentagende så lenge den ikke stoppes (ved hjelp av "stoppspill") eller en annen ordre gis. Komplekse flertrinnsoppgaver, f.eks. "transport1" (fremkalt av uttrykket "lanseringsspill") kjøres alltid til det siste trinnet.

Så ved å "svinge til høyre" vil enheten bevege seg i små trinn til høyre til den stoppes, eller den forhåndsinnstilte maksimalverdien er nådd. "lanseringsspill", "neste spill" eller "start_video" starter en serie trekk som er definert av lister som inneholder innstillingen for hver servo på et gitt trinn. "tilfeldig spill" vil enheten hoppe fra ett til et annet trinn, plukket tilfeldig fra en liste over innstillinger.

Som du kanskje ser i den medfølgende videoen, hadde jeg bygget et diaboloformet objekt fra LEGO som kan hentes av MeArm og transporteres fra et sted til et annet med et forhåndsdefinert sett med bevegelser. Du kan definere dine egne funksjoner ved å endre listene 'transport1' eller 'transport2'.

Trinn 3: Skriptet

Skriptet som er oppført her er en modifikasjon av "Hearing Snake" -eksemplet fra "Project Keyword Spotter". Eksemplet er fjernet til et minimum, deretter ble delen for kjøring av servoene lagt til, basert på programvaren og eksemplene som er gitt for Adafruit servo panseret.

Skriptet er ikke optimalisert nå. Bruk på egen risiko, gjerne endre og optimalisere.

I tillegg til python-skriptet er det kommandofilen og den brukte etikettfilen. Plasser den i undermappen config.

Som nevnt tidligere kan det være nødvendig med flere justeringer av parametere for å tilpasse skriptet til din spesielle MeArm eller annen enhet.

# Copyright 2019 Google LLC#

# Lisensiert under Apache -lisensen, versjon 2.0 ("lisensen"); # du kan ikke bruke denne filen unntatt i samsvar med lisensen. # Du kan få en kopi av lisensen på # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" https://www.apache.org/licenses/LICENSE-2.0 # # Med mindre det kreves av gjeldende lov eller er skriftlig avtalt, distribueres programvare # som distribueres under lisensen på en "AS IS" -BASIS, # UTEN GARANTIER ELLER BETINGELSER FOR ALLE typer, enten uttrykkelige eller underforståtte. # Se lisensen for det spesifikke språket for tillatelser og # begrensninger under lisensen. # den originale koden "hearing_snake" ble endret for en implementering av MeArm av Dr. H. '' 'Instruksjoner Min implementering bruker en Raspbery Pi 4 med en Google Coral -akselerator og en Adafruit 16 -kanals servo -panser festet. Servoene til en MeArm (MIME -bransjer) var festet til porter 3, 7, 11 og 15 på panseret. For detaljer, ta en titt på "Hearing MeArm" Instructable. Kommandoer: "posisjon x", x = 0 til 9, flytter enheten til en gitt forhåndsdefinert posisjon. "beveg/gå opp", "beveg/gå ned", "gå/sving forover", "gå/sving bakover", "sving/gå til venstre" og "sving/gå til høyre" fremkaller en sakte, trinnvis bevegelse i det gitte retning, stopper "spill" bevegelsene. "åpen fane" og "lukk fane" åpner eller lukker griperen. "start video" får enheten til å følge en forhåndsinnstilt posisjonsrekkefølge, definert av listen "posisjoner". "tilfeldig spill" resulterer i et tilfeldig bevegelsesmønster, "stoppspill" avslutter det. "lanseringsspill" starter en ny serie trekk som er forhåndsdefinert av listen "transport1", "neste spill" den omvendte operasjonen forhåndsdefinert av "transport2" Bruk på egen risiko. '' 'fra _future_ import absolutt_import fra _future_ import divisjon fra _future_ import print_funksjon import argparse import os fra tilfeldig import randint fra threading import Trådimporttid fra edgetpu.basic.basic_engine import BasicEngine importmodell import pygame fra pygame.locals import * importkø fra tilfeldig import randrange fra adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 import tid i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frekvens = 60 kit = ServoKit (kanaler = 16) # sett antall kanaler # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, senter og maks innstillinger up_l = 145 # servo opp/ned: opp md_l = 95 dn_l = 45 opp_r = 135 # servo forover/bakover md_r = 90 dn_r = 50 ri_t = 30 # svingarm til høyre eller venstre: høyre posisjon md_t = 90 # svingarm til høyre eller venstre: midtstilling le_t = 150 op_g = 65 # åpen griper md_g = 90 # griper sentrert kl _g = 130 # griper lukket vert = 15 # antall servoport, servo opp/ned forw = 11 # antall servoport, fremover/bakover bevegende servovending = 7 # servoport for å snu servogrep = 3 # servoport for grep servo #liste med arminnstillinger for ni posisjoner posisjon = [(md_l, md_r, md_t, op_g), (up_l, md_r, ri_t, op_g), (up_l, md_r, md_t, cl_g), (up_l, md_r, le_t, cl_g), (md_l, md_r, md_t, op_g), (md_l, md_r, md_t, md_g), (md_l, md_r, md_t, cl_g), (dn_l, dn_r, ri_t, op_g), (dn_l, d_,), (dn_l, dn_r, le_t, md_g)] # definerer 10 grunnposisjoner, angitt med heltall 0-9 # transportprosedyrer [vert/fremover/sving/grep] transport1 = [(140, 70, 65, op_g), (110, 50, 65, op_g), (65, 50, 65, op_g), (65, 70, 65, cl_g), (120, 70, 65, cl_g), #get objekt (100, 70, 135, cl_g), (100, 80, 135, cl_g), (100, 80, 135, md_g), (100, 80, 135, op_g), (140, 70, 135, op_g), (140, 70, 90, op_g), (140, 70, 65, op_g)]

transport2 = [(140, 70, 65, op_g), (140, 70, 135, op_g), (95, 70, 135, op_g), (95, 80, 135, op_g), (95, 80, 135, cl_g), (110, 70, 135, cl_g), (110, 70, 65, cl_g), (70, 70, 65, cl_g), (70, 70, 65, op_g), (80, 50, 65, op_g)]

dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # en "dans"

#moving MeArm to Zero position status = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. vinkel = status [2] kit.servo [grip].angle = status [3] print (status) klasse Kontroller (objekt): #Callback -funksjon def _init _ (self, q): self._q = q def callback (self, kommando): self._q.put (kommando) klasse App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (self, event): if event.type == pygame. QUIT: self._running = False def MeArmPos (self, keys): # driver MeArm til forhåndsinnstilte posisjoner, søkeord: "posisjon x" key = int (keys) p = posisjon [nøkkel] a = p [0] b = p [1] c = p [2] d = p [3] utskrift ("Posisjoner:", nøkkel, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "grader") status = [a, b, c, d] # dokumenter nåværende statusutskrift (status) # sys.stdout.write ("posisjon: ", nøkkel," venstre/høyre: ", a,"/", b," grad ") kit.servo [vert].angle = et kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # kontroller MeArm dance, søkeord: "start_video" dnce = dance1 sp = (len (dnce)) for r i område (sp): #dansende rekkefølge av posisjoner, sp trinn dc = dnce [r] p = posisjon [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # angir hastigheten på bevegelsene time.sleep (0.5) # pause ved slutten av prosedyren def TransMeArm1 (self): # kontrollerer MeArm transport 1, søkeord: "lanseringsspill" tr1 = transport1 sp = (len (tr1)) #calculate number of steps for r in range (sp): #gå til et hvilket som helst trinn p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = et kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # sett bevegelseshastighet time.sleep (0,5) def TransMeArm2 (self): # kontrollerer MeArm dance, søkeord: "neste spill" tr2 = transport2 sp = (len (tr2)) for r i området (sp): #dans rekkefølge av posisjoner, sp trinn p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # angir hastigheten på bevegelsene time.sleep (0,5) def RandomMoves (self): # hopper tilfeldig mellom forhåndsdefinerte posisjoner, søkeord: "tilfeldig spill" dr = randrange (9) # velger tilfeldig en posisjon p = posisjon [dr] # leser posisjonsparametere a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grep].angle = d tid. søvn (1) # angir hastigheten på bevegelser def MoveUp (selv): # løfte griper i små trinn u0 = status [0] # les nåværende status u1 = u0 + 5 # pluss x grader hvis (u1 > up_l): # tester hvis ikke min/maks parametere overstiger u1 = up_l # ellers settes til min/max verdi kit.servo [vert].angle = u1 # flytt servostatus [0] = u1 # juster statusverdiutskrift (" opp ", status) time.sleep (1) # angir hastighet def MoveDown (self): d 0 = status [0] d1 = d0 - 5 #minus x grader hvis (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # flytte servostatus [1] = f1 print ("fremover", status) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x grader hvis (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # flytte servo status [2] = l1 utskrift ("venstre", status) time.sleep (0,2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x grader hvis (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("høyre", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # sett grep til "åpen" posisjon: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # sett grep til "lukket" posisjon: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # gjør ingenting, men stopper bevegelser print (" stop ", status) time.sleep (0.25) def spotter (self, args): motor = BasicEngine (args.model_file) mic = args.mic hvis args.mic er Ingen andre int (args.mic) model.classify_audio (mikrofon, motor, labels_file = "config/labels_gc2.raw.txt", command_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_hz), int (args.num_frames_hop)) def on_execute (self, args): if not self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) if not args.debug_keyboard: t = Tråd (mål = self.spotter, args = (args,)) t.daemon = True t.start () element = -1 mens self._running: pygame.event.pump () hvis args.debug_keyboard: keys = pygame.key.get_pressed () else: prøve: new_item = q.get (True, 0.1) unntatt queue. Empty: new_item = None hvis new_item ikke er None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) eller item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) or item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) eller item == "høyre": # sving til høyre self. MoveRight () if (args.debug_ke yboard og nøkler [pygame. K_LEFT]) eller element == "venstre": # sving til venstre self. MoveLeft () hvis (args.debug_keyboard og nøkler [pygame. K_UP]) eller item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) or item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) or item == "b": # backwards self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # videresender self. MoveForw () if (args.debug_keyboard og nøkler [pygame. K_O]) eller element == "o": # open grip: self. OpenGrip () if (args.debug_keyboard and keys [pygame. K_C]) or item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) eller item == "s": # stop movement: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) or item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys [pygame. K_1]) or item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) or item == "2": self. MeArmPos (2) if (args.debug_keyboard and keys [pygame. K_3]) or it em == "3": self. MeArmPos (3) if (args.debug_keyboard and keys [pygame. K_4]) or item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_4]) or item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) eller item == "5": self. MeArmPos (5) if (args.debug_keyboard and keys [pygame. K_6]) or item == "6": self. MeArmPos (6) if (args.debug_keyboard and keys [pygame. K_7]) or item == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) or item == "8": self. MeArmPos (8) if (args.debug_keyboard and keys [pygame. K_9]) or item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. DancingMeArm () #dancing MeArm, på "next_game" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #randomom dance "random game" if (args.debug_keyboard and keys [pygame. K_j]) eller item == "j": self. TransMeArm1 () # transportobjekt: "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) or item == "k": self. TransMeArm2 () # transportobjekt motsatt retning: "next_game" '' 'if (args.debug_keyboard og keys [pygame. K_l]) or item == "l": self. JumpingJack2 (1) #LED blink "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Bruk tastaturet til å kontrollere MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Anbefalt: