Kazalo:

Mearm za sluh, Google Coral TPU Accelerator Driven: 3 koraki
Mearm za sluh, Google Coral TPU Accelerator Driven: 3 koraki

Video: Mearm za sluh, Google Coral TPU Accelerator Driven: 3 koraki

Video: Mearm za sluh, Google Coral TPU Accelerator Driven: 3 koraki
Video: MeArm Arduino programmable robot 2024, Julij
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 Accelerator Driven
Mearm za sluh, Google Coral TPU Accelerator Driven

V nadaljevanju bi rad opisal glasovno vodeno različico MeArm, majhne robotske roke xyz z prijemalom. Uporabil sem MeArm Pi iz MIME industrije, vendar bi moral sistem veljati za katero koli različico MeArm ali podobne naprave s servo pogonom.

Uporaba Google Coral TPU Accelerator omogoča hiter zagon skriptov za prepoznavanje glasu TensorFlow na Raspberry Pi in s tem nadzor fizičnih naprav z govornimi ukazi z zakasnitvijo manj kot eno sekundo.

Naprava, opisana v tem dokumentu, je kombinacija in razširitev konceptov, opisanih v dveh prejšnjih navodilih. Gre za razširitev prejšnje implementacije glasovnega upravljanja Google Coral, Jumping Jack, opisanega tukaj, in za veliko izboljšavo MeArma, ki ga upravlja Google AIY, opisanega tukaj.

Glasovno vodeni MeArm, ki uporablja sistem Google Voice AIY, je zahteval spletni dostop, ni ga bilo enostavno implementirati, potrebno je bilo pritisniti gumb za aktiviranje poslušanja glasovnih naročil in je imel dolgo zamudo. Zdaj uporabljeni Google Coral TPU Accelerator omogoča izvajanje modelov TensorFlowLite brez povezave z veliko hitrostjo na Raspberry Pi ali drugih napravah Linux. Med primeri na strani Google Coral Github je primer, imenovan "slušna kača" za sistem za prepoznavanje glasu, ki lahko razume 140 ključnih stavkov (september 2019), ki se nato preslikajo v virtualne pritiske tipk. Združevanje teh "pritiskov tipk" z izvajanjem nekaterih funkcij, programiranih v Pythonu, omogoča izdelavo naprave, ki jo upravlja glasovni ukaz. Pred kratkim sem opisal prvo izvedbo, glasovno vodeno elektromehansko skakalno vtičnico, ki je nekoliko bolj zapletena in omogoča krmiljenje vseh štirih servomotorjev MeArma za neprekinjeno premikanje MeArma ali pa za premik na več vnaprej določenih položaje ali za opravljanje nekaterih bolj zapletenih nalog.

Z uporabo tukaj naštetega skripta bi moralo biti razmeroma preprosto sestaviti druge glasovno vodene naprave, npr. robotskih avtomobilov ali pomožnih tehničnih enot.

Zaloge

  • MeArm. Uporablja se tukaj: MeArm Pi podjetja MIME Industries
  • Malina Pi 4
  • Google Coral TPU Accelerator
  • 16 -kanalni servo pokrov Adafruit
  • nekaj mostičnih kablov
  • neobvezno: kondenzator za pokrov motorja, približno 400 µF za 4 servomotorje (priporoča Adafruit)
  • 5-6 V vir napajanja za servo pokrov motorja. Tukaj sem uporabil star polnilec 6V, deluje tudi 4 -kratna baterija AA
  • Mikrofon. Kot mikrofon sem uporabil staro spletno kamero Microsoft HD3000.

1. korak: Nastavitev sistema

Nastavitev sistema
Nastavitev sistema
Nastavitev sistema
Nastavitev sistema

Prenesite vnaprej konfigurirano sliko Raspian za Google Coral TPU Accelerator s strani Google Coral Github in jo namestite na µSD kartico. Slika vsebuje tudi številne primere skriptov. Nastavite Pi, kot je prikazano.

Namestite primer opazovalca ključnih besed s spletnega mesta Google Coral GitHub, če ni vključen v sliko, in vseh potrebnih programov. Priključite mikrofon na Pi. Priporočam, da se igrate s primerom "Hearing Snake", da se prepričate, ali vse deluje.

Prenesite in namestite programsko opremo 16 -kanalnega pokrova Adafruit, kot je opisano tukaj. Namestite pokrov motorja in se poigrajte s primeri Adafruit, da zagotovite, da vse deluje pravilno.

Prenesite datoteke, priložene temu navodilu, in jih kopirajte v mapo »Project Keyword Spotter«. Datoteko "commands_v1_MeArm.txt" je treba kopirati v podmapo "config".

Servomotorje vašega MeArma priključite na pokrov servo motorja, kot je prikazano. Uporabil sem vrata 15 za gor/dol, vrata 11 za naprej/nazaj, vrata 7 za zavoj in vrata 3 za servomotorje prijemala.

V skriptu boste morda morali prilagoditi vrednosti min/center/max za vsak servo vašo konfiguracijo. Te nastavitve pomagajo preprečiti poškodbe servomotorjev. Morda boste morali spremeniti tudi vključene sezname "položaji", "transport1" in "transport2".

Zaženite skript. Doslej sem ga vodil iz IDE.

V primeru, da želite ključne fraze, ki prikličejo določeno funkcijo, spremeniti glede na vaše potrebe. Celoten seznam ključnih fraz, ki so na voljo, najdete v datoteki "labels_gc2 raw.txt" v podmapi config.

Čas zakasnitve sistema je približno 1 sekunda, vendar je veliko odvisen od tega, katera dejanja se izvajajo. V nekaterih primerih je treba ključno fazo ponoviti, natančnost prepoznavanja ni vedno 100%.

2. korak: Uporaba naprave

Če je vse nastavljeno in preverjeno, lahko napravo zaženete.

Trenutna omejitev je, da se določeno naročilo izvaja ponavljajoče se, dokler ni ustavljeno (z uporabo "stop igre") ali je podano drugo naročilo. Kompleksna večstopenjska opravila, npr. "transport1" (izzvana s frazo "zagonska igra") se vedno izvajajo do zadnjega koraka.

Tako se bo naprava z "zavojem v desno" premikala v majhnih korakih v desno, dokler se ne ustavi, ali pa doseže vnaprej nastavljeno največjo vrednost. "start game", "next game" ali "start_video" bo začel niz potez, ki so opredeljene s seznami, ki vsebujejo nastavitve za vsak servo na danem koraku. "naključna igra" bo naprava preskočila iz enega v drug korak, izbran naključno s seznama nastavitev.

Kot lahko vidite v priloženem videoposnetku, sem iz LEGA izdelal predmet v obliki diabola, ki ga lahko prevzame MeArm in ga z vnaprej določenim nizom premikov prenaša z ene lokacije na drugo. Lastne funkcije lahko določite s spreminjanjem seznamov 'transport1' ali 'transport2'.

3. korak: Skript

Tu naveden skript je sprememba primera "Hearing Snake" iz "Project Keyword Spotter". Primer je bil skrčen na minimum, nato pa je bil dodan del za pogon servomotorjev na podlagi programske opreme in primerov, ki so na voljo za pokrov motorja Adafruit.

Skript doslej ni bil optimiziran. Uporabite na lastno odgovornost, spremenite in optimizirajte.

Poleg skripta python obstaja datoteka ukazov in uporabljena datoteka nalepk. Postavite ga v podmapo config.

Kot smo že omenili, bo morda za prilagoditev skripta za vaš poseben MeArm ali kakšno drugo napravo potrebno več prilagoditev parametrov.

# Avtorska pravica 2019 Google LLC#

# Licencirano pod licenco Apache, različica 2.0 ("licenca"); # te datoteke ne smete uporabljati, razen v skladu z licenco. # Kopijo licence lahko dobite 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 # # Razen če to zahteva veljavna zakonodaja ali se s tem pisno dogovori, se programska oprema #, ki se distribuira pod Licenco, distribuira na OSNOVI "KAKŠNA JE", # BREZ GARANCIJ ALI POGOJEV KAKRŠNEGA, bodisi izrecnega ali implicitnega. # Glejte Licenco za določena dovoljenja za jezik in # omejitve pod Licenco. # prvotno kodo "hear_snake" je dr. H. spremenil za izvedbo za MeArm. '' 'Navodila Moja izvedba uporablja Raspbery Pi 4 s pospeševalnikom Google Coral in 16 -kanalnim servo pokrovom Adafruit. Servo motorji MeArm (industrija MIME) so bili pritrjeni na vrata 3, 7, 11 in 15 pokrova motorja. Za podrobnosti si oglejte navodila "Hearing MeArm". Ukazi: "položaj x", x = 0 do 9, premakne napravo v vnaprej določen položaj. "premakni se/pojdi navzgor", "premakni se/pojdi dol", "pojdi/zavij naprej", "pojdi/zavij nazaj", "zavij/pojdi levo" in "zavij/pojdi desno" v danem trenutku vzbudi počasno, postopno gibanje smer, "stop game" ustavi gibanje. "open jeziček" in "close jeziček" odpre ali zapre prijemalo. "start video" prikliče napravo, da sledi vnaprej nastavljenemu vrstnemu redu položajev, ki ga določa "položaji" na seznamu. "naključna igra" ima za posledico naključen vzorec gibov, "stop igra" jo konča. "zagonska igra" začne drugo serijo potez, ki so vnaprej določene s seznamom "transport1", "naslednja igra", obratna operacija, ki je vnaprej določena z "transport2" Uporabite na lastno odgovornost. '' 'iz _future_ uvoz absolutni_import iz _future_ uvozni oddelek iz _future_ uvoz print_function uvoz argparse uvoz os iz naključnega uvoznega randinta iz navoja uvoz uvoz čas uvoza niti iz edgetpu.basic.basic_engine uvoz osnovnega motorja uvoznega uvoza pygame iz pygame.locals uvoz * uvozna čakalna vrsta naključni obseg uvoza iz adafruit_servokit uvoz ServoKit uvozna plošča uvoz busio uvoz adafruit_pca9685 čas uvoza i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanali = 16) # nastavljeno število kanalov # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, sredinske in največje nastavitve up_l = 145 # servo gor/dol: gor md_l = 95 dn_l = 45 up_r = 135 # servo naprej/nazaj md_r = 90 dn_r = 50 ri_t = 30 # obračalna roka desno ali levo: desni položaj md_t = 90 # obračalna roka desno ali levo: sredinski položaj le_t = 150 op_g = 65 # prijemalo odprto md_g = 90 # prijemalo centrirano kl _g = 130 # prijemalo zaprto vert = 15 # število servo vhodov, servo gor/dol forw = 11 # število servo vhodov, premik servo v smeri naprej/nazaj = 7 # servo vhod za obračanje servo oprijema = 3 # servo vhod za oprijem servo #seznam nastavitev roke za devet položajev 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žajev, označenih s celimi števili 0-9 # transportni postopki [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"

#premikanje MeArm v stanje nič položaja = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. kot = status [2] kit.servo [grip].angle = status [3] razred tiskanja (status) Krmilnik (objekt): #Funkcija povratnega klica def _init _ (samo, q): self._q = q def povratni klic (samo, ukaz): self._q.put (ukaz) razred 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): # poganja MeArm na prednastavljene položaje, ključne besede: "position x" key = int (tipke) p = položaj [ključ] a = p [0] b = p [1] c = p [2] d = p [3] tiskanje ("Položaji:", ključ, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "stopinje") status = [a, b, c, d] # dokumenti trenutni status print (status) # sys.stdout.write ("Position: ", key," left/right: ", a,"/", b," degree ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit. len (dnce)) za r v razponu (sp): #plesni vrstni red položajev, koraki sp 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) # nastavi hitrost gibanja time.sleep (0.5) # break na koncu postopka def TransMeArm1 (self): # nadzira transport MeArm 1, ključna beseda: "start game" tr1 = transport1 sp = (len (tr1)) #izračunajte število korakov za r v razponu (sp): #pojdite na kateri koli 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) # sklopov hitrost premikov time.sleep (0.5) def TransMeArm2 (self): # nadzira ples MeArm, ključna beseda: "naslednja igra" tr2 = transport2 sp = (len (tr2)) za r v dosegu (sp): #plesni vrstni red položajev, koraki sp 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) # nastavi hitrost premikov time.sleep (0.5) def RandomMoves (self): # naključno skoči med vnaprej določene položaje, ključna beseda: "naključna igra" dr = randrange (9) # naključno izbere položaj p = položaj [dr] # bere 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. > up_l): # preskusi, če ne presegajo parametrov min/max u1 = up_l # drugače nastavljeno na min/max value kit. up ", status) time.sleep (1) # nastavi hitrost def MoveDown (self): d 0 = status [0] d1 = d0 - 5 #minus x stopinje if (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # premakni stanje servo [1] = f1 print ("naprej", status) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x stopnje if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # premakni servo status [2] = l1 print ("levo", status) time.sleep (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x stopnje if (r1 <ri_t): r1 = ri_t komplet. # nastavite ročaj na "odprt" položaj: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # nastavite ročaj v "zaprto" pozicijo: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # ne naredi nič, vendar ustavi premike print (" stop ", status) time.sleep (0.25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic, če args.mic ni Noben drug 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): če ne self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) če ni args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 medtem ko self._running: pygame.event.pump () če je args.debug_keyboard: keys = pygame.key. or item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) or item == "go": # self. MeArmPos (7) # if (args.debug_keyboard in keys [pygame. K_RIGHT]) ali element == "desno": # samo zavijte desno. MoveRight () if (args.debug_ke yboard in tipke [pygame. K_LEFT]) ali element == "levo": # zavijte levo self. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) ali 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": # nazaj self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # naprej self. MoveForw () if (args.debug_keyboard in keys [pygame. K_O]) ali 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 in keys [pygame. K_S]) ali item == "s": # stop move: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) ali 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]) ali item == "2": self. MeArmPos (2) if (args.debug_keyboard in keys [pygame. K_3]) ali em == "3": self. MeArmPos (3) if (args.debug_keyboard in ključi [pygame. K_4]) ali item == "4": self. MeArmPos (4) if (args.debug_keyboard in ključi [pygame. K_5]) ali element == "5": self. MeArmPos (5) if (args.debug_keyboard in ključi [pygame. K_6]) ali item == "6": self. MeArmPos (6) if (args.debug_keyboard in ključi [pygame. K_7]) ali element == "7": self. MeArmPos (7) if (args.debug_keyboard in ključi [pygame. K_8]) ali item == "8": self. MeArmPos (8) if (args.debug_keyboard in ključi [pygame. K_9]) ali element == "9": self. MeArmPos (9) if (args.debug_keyboard in ključi [pygame. K_a]) ali item == "d": self. DancingMeArm () #dance MeArm, na "next_game" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #naključni ples "naključna igra" if (args.debug_keyboard in keys [pygame. K_j]) ali element == "j": self. TransMeArm1 () # transportni objekt: "lunch_game" if (args.debug_keyboard in ključi [pygame. K_k]) ali item == "k": self. TransMeArm2 () # transportni objekt obratna smer: "next_game" '' 'if (args.debug_keyboard in ključi [pygame. K_l]) ali element == "l": self. JumpingJack2 (1) #LED utripa "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Uporabite tipkovnico za nadzor MeArm.', action = 'store_true', privzeto = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Priporočena: