Sadržaj:

MeArm za sluh, Google Coral TPU akcelerator: 3 koraka
MeArm za sluh, Google Coral TPU akcelerator: 3 koraka

Video: MeArm za sluh, Google Coral TPU akcelerator: 3 koraka

Video: MeArm za sluh, Google Coral TPU akcelerator: 3 koraka
Video: MeArm Arduino programmable robot 2024, Juli
Anonim
Mearm za sluh, Google Coral TPU Accelerator Driven
Mearm za sluh, Google Coral TPU Accelerator Driven
Mearm za sluh, Google Coral TPU Accelerator Driven
Mearm za sluh, Google Coral TPU Accelerator Driven
Mearm za sluh, Google Coral TPU Accelerator Driven
Mearm za sluh, Google Coral TPU Accelerator Driven
Mearm za sluh, Google Coral TPU akcelerator
Mearm za sluh, Google Coral TPU akcelerator

U nastavku želim opisati glasovnu verziju MeArma, male xyz robotske ruke s hvataljkom. Koristio sam MeArm Pi iz MIME industrije, ali sistem bi trebao biti primjenjiv na bilo koju verziju MeArma ili slične uređaje sa servo pogonom.

Korištenje Google Coral TPU Acceleratora omogućuje pokretanje brzih izvanmrežnih skripti za prepoznavanje glasa TensorFlow na Raspberry Pi -u i na taj način kontrolira fizičke uređaje govornim nalozima, s kašnjenjem ispod jedne sekunde.

Ovdje opisani uređaj kombinacija je i proširenje koncepata opisanih u dva prethodna uputstva. To je produžetak ranije implementacije Google Coral glasovne kontrole, Jumping Jack -a, opisane ovdje, i ogromnog poboljšanja Google AIY glasovno kontroliranog MeArma, opisanog ovdje.

MeArm sa glasovnom kontrolom koji koristi Google Voice AIY sistem zahtijevao je mrežni pristup, nije ga bilo lako implementirati, potrebno je pritisnuti dugme za aktiviranje slušanja glasovnih naloga i imao je dugo vrijeme kašnjenja. Google Coral TPU Accelerator koji se sada koristi omogućuje pokretanje TensorFlowLite modela van mreže velikom brzinom na Raspberry Pi ili drugim Linux uređajima. Među primjerima na stranici Google Coral Github nalazi se primjer nazvan "zmija koja čuje" za sistem prepoznavanja glasa koji može razumjeti 140 ključnih fraza (septembar 2019.), koje se zatim mapiraju u virtualne pritiske na tipke. Spajanje ovih "pritisaka na tipke" s izvršavanjem nekih funkcija programiranih u Pythonu omogućuje izgradnju uređaja kontroliranog glasovnom naredbom. Nedavno sam opisao prvu implementaciju, glasovno upravljanu elektromehaničku utičnicu za preskakanje. Ovdje je implementacija malo složenija i omogućava kontrolu svih četiri servo servera MeArma za neprekidno pomicanje MeArma ili za njegovo prebacivanje na niz unaprijed definiranih pozicije, ili za obavljanje nekih složenijih zadataka.

Koristeći ovdje navedenu skriptu, trebalo bi biti relativno jednostavno konstruirati druge uređaje za upravljanje glasom, npr. robotskih automobila ili pomoćnih tehničkih jedinica.

Supplies

  • MeArm. Koristi se ovdje: MeArm Pi iz MIME Industries
  • Raspberry Pi 4
  • Google Coral TPU Accelerator
  • Adafruit 16 -kanalni servo poklopac
  • neki kratkospojni kablovi
  • opcionalno: kondenzator za servo poklopac, oko 400 µF za 4 servo motora (preporučuje Adafruit)
  • 5-6 V izvor napajanja za servo haubu. Ovdje sam koristio stari 6V punjač, radi i 4x AA baterija
  • Mikrofon. Koristio sam staru Microsoft HD3000 web kameru kao mikrofon.

Korak 1: Postavljanje sistema

Postavljanje sistema
Postavljanje sistema
Postavljanje sistema
Postavljanje sistema

Preuzmite unaprijed konfiguriranu Raspian sliku za Google Coral TPU Accelerator sa stranice Google Coral Github i instalirajte je na µSD karticu. Slika sadrži i brojne primjere skripti. Postavite Pi kako je naznačeno.

Instalirajte primjer programa za pronalaženje ključnih riječi s web lokacije Google Coral GitHub, ako nije uključen u sliku, i sve potrebne programe. Priključite mikrofon na Pi. Preporučio bih da se igrate sa primjerom "Hearing Snake" kako biste bili sigurni da sve radi.

Preuzmite i instalirajte Adafruit 16 -kanalni softver poklopca motora, kako je ovdje opisano. Ugradite poklopac motora i igrajte se s primjerima Adafruit -a kako biste bili sigurni da sve radi ispravno.

Preuzmite datoteke priložene ovom uputstvu i kopirajte ih u mapu "Project Keyword Spotter". Datoteka "commands_v1_MeArm.txt" mora se kopirati u podmapu "config".

Priključite servo sisteme vašeg MeArma na servo haubu kako je naznačeno. Koristio sam port 15 za gore/dolje, port 11 za napred/nazad, port 7 za skretanje i port 3 za servo upravljače.

Unutar skripte ćete možda morati prilagoditi vrijednosti min/center/max za svaki servo vašoj konfiguraciji. Ove postavke pomažu u izbjegavanju oštećenja servomotora. Možda ćete također morati izmijeniti uključene liste "pozicije", "transport1" i "transport2".

Pokrenite skriptu. Do sada sam ga vodio iz IDE -a.

U slučaju da želite promijeniti ključne fraze koje izazivaju određenu funkciju prema vašim potrebama. Potpuna lista dostupnih ključnih fraza nalazi se u datoteci "labels_gc2 raw.txt" u podmapi konfiguracije.

Sistem ima vrijeme kašnjenja od oko 1 sekunde, ali mnogo ovisi o tome koje se radnje izvode. U nekim slučajevima ključnu fazu je potrebno ponoviti, tačnost prepoznavanja nije uvijek 100%.

Korak 2: Upotreba uređaja

Ako je sve postavljeno i provjereno, možete pokrenuti uređaj.

Trenutno ograničenje je da se određeni nalog izvršava ponavljajući sve dok nije zaustavljen (koristeći "stop igru") ili je dat drugi nalog. Složeni višestepeni zadaci, npr. "transport1" (izazvan izrazom "pokretanje igre") uvijek se izvršavaju do posljednjeg koraka.

Dakle, "skrenite desno" uređaj će se kretati malim koracima udesno dok se ne zaustavi ili dok se ne postigne unaprijed zadana maksimalna vrijednost. "start game", "next game" ili "start_video" započet će niz poteza koji su definirani listama koje sadrže postavke za svaki servo u datom koraku. "nasumična igra" će uređaj preskakati s jednog na drugi korak, nasumično odabran s popisa postavki.

Kao što možete vidjeti u priloženom videu, sagradio sam objekt u obliku diabola iz LEGO -a koji može preuzeti MeArm i prenijeti s jedne lokacije na drugu unaprijed definiranim nizom pokreta. Svoje vlastite funkcije možete definirati izmjenom lista 'transport1' ili 'transport2'.

Korak 3: Skripta

Ovdje navedena skripta je modifikacija primjera "Hearing Snake" iz "Project Keyword Spotter". Primjer je sveden na minimum, a zatim je dodan dio za pogon servo pogona, na osnovu softvera i primjera koji su dati za poklopac servo motora Adafruit.

Skripta do sada nije optimizirana. Koristite na vlastitu odgovornost, slobodno izmijenite i optimizirajte.

Osim python skripte, tu je i command-file i korištena labels-file. Stavite ga u podmapu config.

Kao što je već spomenuto, možda će biti potrebno nekoliko prilagodbi parametara za prilagođavanje skripte za vaš poseban MeArm ili neki drugi uređaj.

# Autorsko pravo 2019 Google LLC#

# Licencirano pod Apache licencom, verzija 2.0 ("Licenca"); # ne možete koristiti ovu datoteku osim u skladu s Licencom. # Kopiju licence možete dobiti na # # 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 # # Osim ako to ne zahtijeva važeći zakon ili nije pismeno dogovoreno, softver # distribuiran pod Licencom distribuira se NA OSNOVI "KAKVA JE", # BEZ GARANCIJA ILI USLOVA BILO KAKVE, bilo izričite ili implicitne. # Pogledajte Licencu za posebne jezičke dozvole i # ograničenja pod Licencom. # originalni kod "hear_snake" je izmijenjen za implementaciju za MeArm od strane dr. H. '' 'Upute Moja implementacija koristi Raspbery Pi 4 sa Google Coral akceleratorom i 16 -kanalnim servo poklopcem Adafruit. Servo pogoni MeArm -a (MIME industrija) bili su priključeni na priključke 3, 7, 11 i 15 poklopca motora. Za detalje pogledajte uputstvo "Hearing MeArm". Naredbe: "položaj x", x = 0 do 9, pomiče uređaj na zadani unaprijed definirani položaj. "pomjeri/idi gore", "pomakni se/idi dolje", "idi/okreni se naprijed", "idi/okreni se unatrag", "skreni/idi lijevo" i "skreni/idi desno" izazivaju sporo, postepeno kretanje u danom trenutku smjer, "stop game" zaustavlja pokrete. "open jezičak" i "zatvori jezičak" otvara ili zatvara hvataljku. "start video" izaziva uređaj da slijedi unaprijed postavljeni redoslijed pozicija, definiran popisom "pozicije". "nasumična igra" rezultira nasumičnim uzorkom pokreta, "zaustavi igru" završava. "pokretanje igre" započinje drugu seriju poteza unaprijed definiranih listom 'transport1', "sljedeća igra" obrnutu operaciju unaprijed definiranu sa "transport2" Koristite na vlastitu odgovornost. '' 'iz _future_ uvoz apsolutni_import iz _future_ uvoz podjela iz _future_ uvoz print_function uvoz argparse import os iz slučajnog uvoza randint iz threading import Vrijeme uvoza niti iz edgetpu.basic.basic_engine import BasicEngine model uvoza import pygame iz pygame.locals import * uvoz red iz raspon slučajnog uvoza iz adafruit_servokit uvoz ServoKit uvozna ploča uvoz busio uvoz adafruit_pca9685 vrijeme uvoza i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanali = 16) # postavljeni broj kanala # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, središnje i maksimalne postavke up_l = 145 # servo gore/dolje: gore md_l = 95 dn_l = 45 up_r = 135 # servo naprijed/nazad md_r = 90 dn_r = 50 ri_t = 30 # okretna ruka desno ili lijevo: desni položaj md_t = 90 # okretna ruka desno ili lijevo: središnji položaj le_t = 150 op_g = 65 # hvataljka otvorena md_g = 90 # hvataljka centrirana kl _g = 130 # hvataljka zatvorena vert = 15 # broj servo porta, servo gore/dole forw = 11 # broj servo porta, servo okret prema napred/nazad = 7 # servo port za okretanje servo hvatača = 3 # servo port za hvatanje servo #lista postavki ruke za devet pozicija položaj = [(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, dn, dn), (dn_l, dn_r, le_t, md_g)] # definira 10 osnovnih položaja, označenih cijelim brojevima 0-9 # transportne procedure [vert/forward/turn/grip] 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) # a "ples"

#premještanje MeArm -a na status nulte pozicije = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. angle = status [2] kit.servo [grip].angle = status [3] print (status) class Kontroler (objekt): #Callback funkcija def _init _ (self, q): self._q = q def povratni poziv (self, naredba): self._q.put (naredba) klasa 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): # pokreće MeArm na unaprijed postavljene pozicije, ključne riječi: "position x" key = int (ključevi) p = položaj [ključ] a = p [0] b = p [1] c = p [2] d = p [3] ispis ("Položaji:", ključ, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "stepeni") status = [a, b, c, d] # dokumenti trenutni status ispis (status) # sys.stdout.write ("Pozicija: ", key," left/right: ", a,"/", b," degree ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # kontrolira MeArm dance, ključna riječ: "start_video" dnce = dance1 sp = (len (dnce)) za r u rasponu (sp): #plesni redoslijed pozicija, sp koraci dc = dnce [r] p = položaj [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) # postavlja brzinu kretanja time.sleep (0.5) # pauza na kraju procedure def TransMeArm1 (self): # kontroliše transport MeArm 1, ključna riječ: "pokretanje igre" tr1 = transport1 sp = (len (tr1)) #izračunajte broj koraka za r u rasponu (sp): #idite na bilo koji korak p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] komplet. servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # kompleta brzina kretanja time.sleep (0.5) def TransMeArm2 (self): # kontrolira MeArm dance, ključna riječ: "sljedeća igra" tr2 = transport2 sp = (len (tr2)) za r u rasponu (sp): #redoslijed plesa pozicija, sp koraci 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) # postavlja brzinu kretanja time.sleep (0.5) def RandomMoves (self): # nasumično skače između unaprijed definiranih pozicija, ključna riječ: "slučajna igra" dr = randrange (9) # nasumično bira poziciju p = poziciju [dr] # čita parametre položaja 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) # postavlja brzinu kretanja def MoveUp (self): # hvataljka za podizanje u malim koracima u0 = status [0] # očitavanje trenutnog statusa u1 = u0 + 5 # plus x stepeni if (u1 > up_l): # ispitivanja ako ne prelaze parametre min/max u1 = up_l # u suprotnom podešeno na min/max vrijednost kit.servo [vert].angle = u1 # premještanje servo statusa [0] = u1 # prilagodite vrijednost statusa print (" up ", status) time.sleep (1) # postavlja brzinu def MoveDown (self): d 0 = status [0] d1 = d0 - 5 #minus x stepeni if (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # premještanje servo statusa [1] = f1 ispis ("naprijed", status) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x stepeni if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo status [2] = l1 ispis ("lijevo", status) time.sleep (0,2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x stepeni if (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("desno", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # postavite grip u položaj "open": "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # postavite grip u položaj "closed": " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # ne radi ništa, ali zaustavlja pokrete ispis (" stop ", status) time.sleep (0.25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic ako args.mic nije Ništa drugo int (args.mic) model.classify_audio (mic, engine, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_rate int (args.num_frames_hop)) def on_execute (self, args): ako ne self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) ako nije args.debug_keyboard: t = Nit (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 while self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key. ili item == "stop": self._running = False # if (args.debug_keyboard i ključevi [pygame. K_SPACE]) ili item == "go": # self. MeArmPos (7) # if (args.debug_keyboard i ključevi [pygame. K_RIGHT]) ili stavka == "desno": # okrenite se desno desno. MoveRight () if (args.debug_ke yboard i ključevi [pygame. K_LEFT]) ili stavka == "lijevo": # okrenite lijevo self. MoveLeft () if (args.debug_keyboard i ključevi [pygame. K_UP]) ili item == "gore": self. MoveUp () if (args.debug_keyboard i ključevi [pygame. K_DOWN]) ili item == "dolje": self. MoveDown () if (args.debug_keyboard i ključevi [pygame. K_B]) ili item == "b": # unatrag self. MoveBack () if (args.debug_keyboard i ključevi [pygame. K_F]) ili item == "f": # prosljeđuje self. MoveForw () if (args.debug_keyboard i ključevi [pygame. K_O]) ili item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard i ključevi [pygame. K_C]) ili item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard i keys [pygame. K_S]) ili stavka == "s": # stop pokret: "start_game" self. StopMove () if (args.debug_keyboard i ključevi [pygame. K_0]) ili item == "0": self. MeArmPos (0) if (args.debug_keyboard i ključevi [pygame. K_1]) ili item == "1": self. MeArmPos (1) if (args.debug_keyboard i ključevi [pygame. K_2]) ili item == "2": self. MeArmPos (2) if (args.debug_keyboard i ključevi [pygame. K_3]) ili em == "3": self. MeArmPos (3) if (args.debug_keyboard i ključevi [pygame. K_4]) ili item == "4": self. MeArmPos (4) if (args.debug_keyboard i ključevi [pygame. K_5]) ili stavka == "5": self. MeArmPos (5) if (args.debug_keyboard i ključevi [pygame. K_6]) ili item == "6": self. MeArmPos (6) if (args.debug_keyboard i ključevi [pygame. K_7]) ili stavka == "7": self. MeArmPos (7) if (args.debug_keyboard i ključevi [pygame. K_8]) ili item == "8": self. MeArmPos (8) if (args.debug_keyboard i ključevi [pygame. K_9]) ili stavka == "9": self. MeArmPos (9) if (args.debug_keyboard i ključevi [pygame. K_a]) ili item == "d": self. DancingMeArm () #ples MeArm, na "next_game" if (args.debug_keyboard i tasteri [pygame. K_r]) ili item == "r": self. RandomMoves () #nasumični ples "slučajna igra" if (args.debug_keyboard i ključevi [pygame. K_j]) ili item == "j": self. TransMeArm1 () # transportni objekt: "lunch_game" if (args.debug_keyboard i ključevi [pygame. K_k]) ili item == "k": self. TransMeArm2 () # transportni objekt obrnuti smjer: "next_game" '' 'if (args.debug_keyboard i ključevi [pygame. K_l]) ili stavka == "l": self. JumpingJack2 (1) #LED trepću "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Koristite tastaturu za kontrolu MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Preporučuje se: