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, Studeni
Anonim
Mearm za sluh, TPU akcelerator Google Coral
Mearm za sluh, TPU akcelerator Google Coral
MeArm za sluh, TPU akcelerator Google Coral
MeArm za sluh, TPU akcelerator Google Coral
Mearm za sluh, TPU akcelerator Google Coral
Mearm za sluh, TPU akcelerator Google Coral
Mearm za sluh, TPU akcelerator Google Coral
Mearm za sluh, TPU akcelerator Google Coral

U nastavku želim opisati glasovnu verziju MeArma, male xyz robotske ruke s hvataljkom. Koristio sam MeArm Pi iz MIME industrije, ali sustav 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 brzo pokretanje izvanmrežnih skripti za prepoznavanje glasa TensorFlow na Raspberry Pi -u i ovime 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 glasovne kontrole Google Coral, Jumping Jack, opisane ovdje, i veliko poboljšanje Google AIY glasovno kontroliranog MeArma, opisanog ovdje.

Glasovno kontrolirani MeArm koji koristi Google Voice AIY sustav zahtijevao je mrežni pristup, nije ga bilo lako implementirati, morao je pritisnuti gumb 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 offline s velikom brzinom na Raspberry Pi ili drugim Linux uređajima. Među primjerima na stranici Google Coral Github postoji primjer koji se naziva "zmija koja čuje" za sustav prepoznavanja glasa koji može razumjeti 140 ključnih fraza (rujan 2019.), koje se zatim mapiraju u virtualne pritiske tipki. Spajanje ovih "pritisaka tipki" s izvršavanjem nekih funkcija programiranih u Pythonu omogućuje izradu 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ćuje kontrolu nad sva četiri servo pogona 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 s glasovnim upravljanjem, npr. robotskih automobila ili pomoćnih tehničkih jedinica.

Pribor

  • MeArm. Ovdje se koristi: MeArm Pi iz MIME Industries
  • Malina Pi 4
  • Google Coral TPU akcelerator
  • Adafruit 16 -kanalni servo poklopac motora
  • 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 poklopac motora. Ovdje sam koristio stari 6V punjač, radi i 4x AA baterija
  • Mikrofon. Koristio sam staru Microsoft HD3000 web kameru kao mikrofon.

Korak 1: Postavljanje sustava

Postavljanje sustava
Postavljanje sustava
Postavljanje sustava
Postavljanje sustava

Preuzmite unaprijed konfiguriranu Raspian sliku za Google Coral TPU Accelerator sa stranice Google Coral Github i instalirajte je na µSD karticu. Slika također sadrži niz primjera 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 "Zmija koja čuje" 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".

Spojite servo sisteme vašeg MeArm -a na servo poklopac kako je naznačeno. Koristio sam port 15 za gore/dolje, port 11 za naprijed/natrag, port 7 za skretanje i port 3 za servo pogone.

Unutar skripte možda ćete 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 popise "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. Cjelovit popis dostupnih ključnih fraza nalazi se u datoteci "labels_gc2 raw.txt" u podmapi config.

Sustav ima kašnjenje od oko 1 sekunde, ali mnogo ovisi o tome koje se radnje izvode. U nekim se slučajevima ključna faza mora ponoviti, točnost prepoznavanja nije uvijek 100%.

Korak 2: Korištenje uređaja

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

Trenutačno ograničenje je da se određeni nalog izvršava ponavljajući sve dok se ne zaustavi (pomoću "stop igre") ili se da drugi nalog. Složeni višestepeni zadaci, npr. "transport1" (izazvan izrazom "pokretanje igre") uvijek se izvode 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" počet će niz poteza koji su definirani popisima koji sadrže postavke za svaki servo u danom koraku. "slučajna igra" će uređaj preskakati s jednog na drugi korak, nasumično odabran s popisa postavki.

Kao što možete vidjeti u popratnom videu, sagradio sam objekt u obliku diabola iz LEGO -a koji može preuzeti MeArm i prenijeti s jednog mjesta na drugo unaprijed definiranim nizom pokreta. Svoje vlastite funkcije možete definirati izmjenom popisa 'transport1' ili 'transport2'.

Korak 3: Skripta

Ovdje navedena skripta je izmjena primjera "Zmija koja čuje" iz "Projekta za pronalaženje ključnih riječi". Primjer je sveden na minimum, a zatim je dodan dio za pogon servomotora, na temelju 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 su naredbe-datoteka i korištena oznaka-datoteka. Postavite ga u podmapu config.

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

# Autorsko pravo 2019. Google LLC#

# Licencirano pod Apache licencom, verzija 2.0 ("Licenca"); # ne smijete 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 je u pisanom obliku dogovoreno, softver # distribuiran pod Licencom distribuira se NA OSNOVI "KAKVA JE", # BEZ JAMSTAVA ILI UVJETA BILO KAKVE, bilo izričite ili implicitne. # Pogledajte Licencu za posebne jezične dozvole i # ograničenja prema Licenci. # izvorni kôd "hear_snake" izmijenio je dr. H. za implementaciju za MeArm. '' 'Upute Moja implementacija koristi Raspbery Pi 4 s Google Coral akceleratorom i 16 -kanalnim servo poklopcem Adafruit. Servo pogoni MeArm -a (MIME industrija) bili su pričvršćeni na priključke 3, 7, 11 i 15 poklopca motora. Pojedinosti potražite u uputama "Hearing MeArm". Naredbe: "položaj x", x = 0 do 9, pomiče uređaj u zadani unaprijed definirani položaj. "pomakni se/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 kretnje. "open jezičak" i "close jezičak" otvara ili zatvara hvataljku. "start video" izaziva uređaj da slijedi unaprijed postavljeni redoslijed pozicija, definiran popisom "položaji". "slučajna igra" rezultira nasumičnim uzorkom pokreta, "zaustavi igru" završava. "pokretanje igre" započinje drugu seriju poteza unaprijed definiranih popisom "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 Thread import time iz edgetpu.basic.basic_engine import BasicEngine model uvoza import pygame iz pygame.locals import * uvoz red čekanja slučajni uvoz randrange iz adafruit_servokit uvoz ServoKit uvozna ploča uvoz busio uvoz adafruit_pca9685 vrijeme uvoza i2c = busio. I2C (board. SCL, board. SDA) šešir = 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/natrag 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 priključka, servo gore/dolje forw = 11 # broj servo priključka, naprijed/nazad pomični servo okret = 7 # servo priključak za okretanje servo hvatača = 3 # servo priključak za hvat servo #popis 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 # transportni postupci [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 stanje 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): # tjera 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, "stupnjevi") 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) # break na kraju postupka def TransMeArm1 (self): # kontrolira transport MeArm 1, ključna riječ: "pokretanje igre" tr1 = transport1 sp = (len (tr1)) #izračunajte broj koraka za r u rasponu (sp): #prijeđite 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) # seta 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 odabire poziciju p = položaj [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 stupnjeva if (u1 > up_l): # ispitivanja ako ne prelaze parametre min/max u1 = up_l # inače postavljeno na min/max vrijednost kit.servo [vert].angle = u1 # pomakni status serva [0] = u1 # prilagodi vrijednost statusa print (" up ", status) time.sleep (1) # postavlja brzinu def MoveDown (self): d 0 = status [0] d1 = d0 - 5 #minus x stupnjeva 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 stupnjeva 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 stupnjevi if (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("right", 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.get_pressed () else: try: new_item = q.get (True, 0.1) osim u redu. Empty: new_item = Ništa ako new_item nije Nijedan: item = new_item if (args.debug_keyboard i ključevi [pygame. K_ESCAPE]) 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 item == "right": # sami skrenite desno. MoveRight () if (args.debug_ke yboard i tipke [pygame. K_LEFT]) ili item == "left": # okrenite lijevo self. MoveLeft () if (args.debug_keyboard i keys [pygame. K_UP]) ili 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": # 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 and keys [pygame. K_C]) or item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard i keys [pygame. K_S]) ili item == "s": # stop move: "start_game" self. StopMove () if (args.debug_keyboard i keys [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 to 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 item == "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 item == "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 item == "9": self. MeArmPos (9) if (args.debug_keyboard i ključevi [pygame. K_a]) ili item == "d": self. DancingMeArm () #dance MeArm, na "next_game" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #slučajni ples "slučajna igra" if (args.debug_keyboard i tipke [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 and ključevi [pygame. K_l]) ili item == "l": self. JumpingJack2 (1) #LED treptanje "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Koristite tipkovnicu za kontrolu MeArm-a.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Preporučeni: