Turinys:

„Hearing MeArm“, „Google Coral TPU Accelerator“: 3 žingsniai
„Hearing MeArm“, „Google Coral TPU Accelerator“: 3 žingsniai

Video: „Hearing MeArm“, „Google Coral TPU Accelerator“: 3 žingsniai

Video: „Hearing MeArm“, „Google Coral TPU Accelerator“: 3 žingsniai
Video: 208: What If You Had a Machine Do It 2024, Liepa
Anonim
„Hearing MeArm“, „Google Coral TPU Accelerator“
„Hearing MeArm“, „Google Coral TPU Accelerator“
„Hearing MeArm“, „Google Coral TPU Accelerator“
„Hearing MeArm“, „Google Coral TPU Accelerator“
„Hearing MeArm“, „Google Coral TPU Accelerator“
„Hearing MeArm“, „Google Coral TPU Accelerator“
„Hearing MeArm“, „Google Coral TPU Accelerator“
„Hearing MeArm“, „Google Coral TPU Accelerator“

Toliau norėčiau apibūdinti balsu valdomą „MeArm“versiją, mažą „xyz“roboto ranką su griebtuvu. Aš naudoju „MeArm Pi“iš MIME pramonės šakų, tačiau sistema turėtų būti taikoma bet kuriai „MeArm“versijai ar panašiems servo varomiems įrenginiams.

Naudojant „Google Coral TPU Accelerator“, „Raspberry Pi“galima greitai paleisti neprisijungus naudojamus „TensorFlow“balso atpažinimo scenarijus ir taip valdyti fizinius įrenginius pagal žodinius nurodymus, o delsos trukmė mažesnė nei viena sekundė.

Čia aprašytas prietaisas yra dviejų ankstesnių instrukcijų aprašytų sąvokų derinys ir išplėtimas. Tai yra ankstesnio „Google Coral“balso valdymo, „Jumping Jack“, aprašyto čia, pratęsimas ir čia aprašytas didžiulis „Google AIY“balsu valdomo „MeArm“patobulinimas.

Balso valdomas „MeArm“, naudojant „Google Voice AIY“sistemą, reikalavo internetinės prieigos, nebuvo lengva įdiegti, reikėjo paspausti mygtuką, kad suaktyvintumėte balso nurodymų klausymą, ir turėjo ilgą delsos laiką. Naudojamas „Google Coral TPU Accelerator“dabar leidžia paleisti „TensorFlowLite“modelius neprisijungus dideliu greičiu „Raspberry Pi“ar kituose „Linux“įrenginiuose. Tarp pavyzdžių „Google Coral Github“puslapyje yra pavyzdys, vadinamas „girdinčia gyvate“, skirtas balso atpažinimo sistemai, galinčiai suprasti 140 pagrindinių frazių (2019 m. Rugsėjis), kurios vėliau priskiriamos virtualiems klavišų paspaudimams. Šiuos „klavišų paspaudimus“sujungus su kai kuriomis „Python“programuotomis funkcijomis, galima sukurti balso komandomis valdomą įrenginį. Neseniai aprašiau pirmąjį diegimą-balsu valdomą elektromechaninį šokinėjimo lizdą. Įdiegimas čia yra šiek tiek sudėtingesnis ir leidžia valdyti visas keturias „MeArm“servo sistemas, kad nuolat judėtų „MeArm“arba būtų galima pereiti prie daugelio iš anksto nustatytų pareigas arba atlikti sudėtingesnes užduotis.

Naudojant čia pateiktą scenarijų kaip pavyzdį, turėtų būti gana paprasta sukurti kitus balsu valdomus įrenginius, pvz. robotizuotus automobilius ar pagalbinius technikos įrenginius.

Prekės

  • „MeArm“. Čia naudojamas: „MeArm Pi“iš „MIME Industries“
  • Raspberry Pi 4
  • „Google Coral TPU Accelerator“
  • Adafruit 16 kanalų servo variklio dangtis
  • kai kurie trumpieji kabeliai
  • neprivaloma: kondensatorius servo variklio dangčiui, apie 400 µF 4 servams (rekomenduojama „Adafruit“)
  • 5-6 V maitinimo šaltinis servo variklio dangčiui. Aš čia naudoju seną 6V įkroviklį, taip pat veikia 4x AA baterija
  • Mikrofonas. Kaip mikrofoną naudojau seną „Microsoft HD3000“internetinę kamerą.

1 veiksmas: nustatykite sistemą

Sistemos nustatymas
Sistemos nustatymas
Sistemos nustatymas
Sistemos nustatymas

Atsisiųskite iš anksto sukonfigūruotą „Raspian“vaizdą „Google Coral TPU Accelerator“iš „Google Coral Github“puslapio ir įdiekite jį į µSD kortelę. Paveikslėlyje taip pat yra keletas scenarijų pavyzdžių. Nustatykite „Pi“, kaip nurodyta.

Įdiekite raktinių žodžių stebėjimo pavyzdį iš „Google Coral GitHub“svetainės, jei jis neįtrauktas į vaizdą, ir visas reikalingas programas. Prijunkite mikrofoną prie „Pi“. Rekomenduočiau pažaisti „Klausančios gyvatės“pavyzdžiu, kad įsitikintumėte, jog viskas veikia.

Atsisiųskite ir įdiekite „Adafruit“16 kanalų variklio dangčio programinę įrangą, kaip aprašyta čia. Įdiekite variklio dangtį ir žaiskite su „Adafruit“pavyzdžiais, kad įsitikintumėte, jog viskas veikia tinkamai.

Atsisiųskite prie šios instrukcijos pridėtus failus ir nukopijuokite juos į aplanką „Projekto raktinių žodžių stebėtojas“. Failas „commands_v1_MeArm.txt“turi būti nukopijuotas į poaplankį „config“.

Prijunkite „MeArm“servo prie servo variklio dangčio, kaip nurodyta. Aš naudoju 15 prievadą aukštyn/žemyn, 11 prievadą pirmyn/atgal, 7 prievadą posūkiui ir 3 prievadą griebtuvo servams.

Pagal scenarijų gali tekti koreguoti kiekvieno servo min/centre/max reikšmes pagal savo konfigūraciją. Šie nustatymai padeda išvengti servo pažeidimų. Taip pat gali tekti keisti įtrauktus „pozicijų“, „transport1“ir „transport2“sąrašus.

Paleiskite scenarijų. Iki šiol jį paleidau iš IDE.

Jei norite pagal poreikį keisti pagrindines frazes, kurios sukelia tam tikrą funkciją. Išsamų galimų raktinių frazių sąrašą rasite konfigūracijos pakatalo faile „labels_gc2 raw.txt“.

Sistemos delsos laikas yra apie 1 sekundė, tačiau labai priklauso nuo to, kokie veiksmai atliekami. Kai kuriais atvejais pagrindinis etapas turi būti kartojamas, atpažinimo tikslumas ne visada yra 100%.

2 žingsnis: Įrenginio naudojimas

Jei viskas nustatyta ir patikrinta, galite paleisti įrenginį.

Dabartinis apribojimas yra tas, kad nurodytas pavedimas vykdomas kartotinai, kol jis nėra sustabdomas (naudojant „sustabdyti žaidimą“) arba nurodomas kitas nurodymas. Sudėtingos daugiapakopės užduotys, pvz. „transport1“(kurį sukelia frazė „paleidimo žaidimas“) visada vykdomi iki paskutinio žingsnio.

Taigi, „pasukę į dešinę“, prietaisas mažais žingsniais judės į dešinę, kol sustos arba bus pasiekta iš anksto nustatyta maksimali vertė. „paleisti žaidimą“, „kitas žaidimas“arba „start_video“pradės judesių seriją, apibrėžtą sąrašuose, kuriuose yra kiekvieno servo nustatymas tam tikru žingsniu. „atsitiktinis žaidimas“- tai įrenginys, pereinantis nuo vieno žingsnio prie kito, atsitiktinai pasirinktas iš nustatymų sąrašo.

Kaip matote pridedamame vaizdo įraše, aš iš LEGO sukūriau diabolo formos objektą, kurį gali pasiimti „MeArm“ir perkelti iš vienos vietos į kitą iš anksto nustatytais judesiais. Savo funkcijas galite apibrėžti pakeisdami „transport1“arba „transport2“sąrašus.

3 žingsnis: scenarijus

Čia išvardytas scenarijus yra „Klausos gyvatės“pavyzdžio iš projekto „Keyword Spotter“modifikacija. Pavyzdys buvo sumažintas iki minimumo, tada buvo pridėta dalis, skirta vairuoti servus, remiantis programine įranga ir pavyzdžiais, pateiktais „Adafruit“variklio dangčiui.

Scenarijus iki šiol nebuvo optimizuotas. Naudokite savo rizika, drąsiai keiskite ir optimizuokite.

Be „python“scenarijaus, yra komandos-failas ir naudojamas etikečių failas. Įdėkite jį į konfigūracijos poaplankį.

Kaip minėta anksčiau, norint pritaikyti scenarijų jūsų specialiam „MeArm“ar kokiam nors kitam įrenginiui, gali prireikti atlikti keletą parametrų koregavimų.

# Autorių teisės 2019 m. „Google LLC“#

# Licencijuota pagal „Apache“licenciją, 2.0 versija („Licencija“); # Jūs negalite naudoti šio failo, tik nesilaikydami licencijos. # Licencijos kopiją galite įsigyti adresu # # 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 # # Išskyrus atvejus, kai to reikalauja galiojantys įstatymai arba nesutinkate raštu, pagal licenciją platinama programinė įranga # platinama „KAIP“PAGRINDU, # BE GARANTIJŲ AR SĄLYGŲ BET KOKI, tiesioginiai ar numanomi. # Žr. Licenciją, kad sužinotumėte konkrečias kalbas, reglamentuojančias leidimus ir # apribojimus pagal licenciją. # originalų „klausos_snake“kodą pakeitė daktaras H. „MeArm“įgyvendinimui. '' 'Instrukcijos Mano diegimui naudojamas „Raspbery Pi 4“su „Google Coral“greitintuvu ir „Adafruit“16 kanalų servo variklio dangčiu. „MeArm“(MIME pramonės) servos buvo pritvirtintos prie variklio dangčio 3, 7, 11 ir 15 prievadų. Norėdami gauti daugiau informacijos, žiūrėkite instrukciją „Hearing MeArm“. Komandos: „pozicija x“, x = nuo 0 iki 9, perkelia įrenginį į tam tikrą iš anksto nustatytą padėtį. „judėti/eiti aukštyn“, „judėti/leistis žemyn“, „eiti/sukti į priekį“, „eiti/sukti atgal“, „pasukti/eiti į kairę“ir „pasukti/eiti į dešinę“sukelia lėtą, laipsnišką judesį tam tikroje situacijoje kryptimi, „sustabdyti žaidimą“sustabdo judesius. „atidaryti skirtuką“ir „uždaryti skirtuką“atidaro arba uždaro griebtuvą. „Pradėti vaizdo įrašą“priverčia įrenginį sekti iš anksto nustatytą pozicijų tvarką, apibrėžtą sąrašo „pozicijose“. „atsitiktinis žaidimas“lemia atsitiktinį judesių modelį, „sustabdo žaidimą“- jį užbaigia. „paleidimo žaidimas“pradeda kitą judesių seriją, iš anksto apibrėžtą sąraše „transport1“, „kitas žaidimas“- atvirkštinė operacija, iš anksto apibrėžta „transport2“. Naudokite savo rizika. '' 'iš _future_ importuoti absoliučią_importą iš _future_ importo skyriaus iš _future_ importo spausdinimo_funkcijos importuoti argparse importuoti os iš atsitiktinio importo randint iš sriegių importavimo Siūlo importavimo laikas iš edgetpu.basic.basic_engine importo „BasicEngine“importo modelio importavimo pygame iš pygame.locals importo * importo eilės iš atsitiktinis importas atsitiktinis importavimas iš „adafruit_servokit“importas „ServoKit“importo valdybos importas „busio“importas adafruit_pca9685 importo laikas i2c = busio. I2C (board. SCL, board. SDA) skrybėlė = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanalų = 16) # nustatykite kanalų skaičių # rink.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min., centras ir maksimalūs nustatymai up_l = 145 # servo aukštyn/žemyn: aukštyn md_l = 95 dn_l = 45 aukštyn_r = 135 # servo į priekį/atgal md_r = 90 dn_r = 50 ri_t = 30 # sukama ranka į dešinę arba į kairę: dešinė padėtis md_t = 90 # pasukimo ranka į dešinę arba į kairę: centrinė padėtis le_t = 150 op_g = 65 # griebtuvas atidarytas md_g = 90 # griebtuvo centre cl _g = 130 # griebtuvas uždarytas vert = 15 # servo prievado skaičius, servo pakėlimas/nuleidimas į priekį = 11 # servo prievado skaičius, į priekį/atgal judantis servo posūkis = 7 # servo prievadas servo rankenos sukimui = 3 # servo prievadas rankenai servo #rankos nustatymų sąrašas devynioms pozicijoms pozicija = [(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, r), (dn_l, dn_r, le_t, md_g)] # apibrėžia 10 bazinių pozicijų, nurodytų sveikais skaičiais 0-9 # transportavimo procedūros [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 objektas (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)]

šokis1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "šokis"

#„MeArm“perkėlimas į nulinę padėtį status = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [posūkis]. kampas = būsena [2] rinkinys.servo [rankena]. kampas = būsena [3] spausdinimo (būsenos) klasė Kontrolierius (objektas): #Callback function def _init _ (self, q): self._q = q def callback (self, komanda): self._q.put (komanda) klasė Programa: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (save, įvykį): if event.type == pygame. QUIT: self._running = False def MeArmPos (self, keys): # varo MeArm į iš anksto nustatytas pozicijas, raktiniai žodžiai: "position x" key = int (keys) p = pozicija [klavišas] a = p [0] b = p [1] c = p [2] d = p [3] spausdinti („Pozicijos:“, raktas, „vert/forw/turn/grip:“, a, "/", b, "/", c, "/", d, "laipsnių") būsena = [a, b, c, d] # dokumentų dabartinė būsena spausdinama (būsena) # sys.stdout.write ("Pozicija: ", raktas," kairė/dešinė: ", a,"/", b," laipsnis ") kit.servo [vert].angle = a kit.servo [forw].angle = b komplekt.servo [posūkis].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # valdo „MeArm“šokį, raktinis žodis: „start_video“dnce = dance1 sp = (len (dnce)) r diapazone (sp): #šokių pozicijų tvarka, sp žingsniai dc = dnce [r] p = padėtis [dc] a = p [0] b = p [1] c = p [2] d = p [3] komplektas.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # nustato judesių greičio laiką. Miego režimas (0,5) #Apskaičiuokite žingsnių skaičių r diapazone (sp): #pereikite prie bet kurio žingsnio p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] rinkinys. servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # rinkiniai judesių greitis laikas. miegas (0,5) def TransMeArm2 (savarankiškai): # valdo „MeArm“šokį, raktinis žodis: „kitas žaidimas“tr2 = transport2 sp = (len (tr2)) r diapazone (sp): #šokių pozicijų tvarka, sp žingsniai 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) # nustato judesių greitį time.sleep (0,5)) def RandomMoves (self): # atsitiktinai šokinėja tarp iš anksto nustatytų pozicijų, raktinis žodis: "atsitiktinis žaidimas" dr = randrange (9) # atsitiktinai pasirenka poziciją p = pozicija [dr] # skaito pozicijos parametrus 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) # nustato judesių greitį def MoveUp (self): # kėlimo griebtuvas mažais žingsniais u0 = statusas [0] # skaityti dabartinę būseną u1 = u0 + 5 # plius x laipsniai, jei (u1 > up_l): # bandymų, jei neviršijami min/max parametrai up ", status) time.sleep (1) # nustato greitį def MoveDown (self): d 0 = būsena [0] d1 = d0 - 5 # minus x laipsniai, jei (d1 aukštyn_r): f1 = aukštyn_ rinkinys.servo [forw].angle = f1 # servo būsenos perkėlimas [1] = f1 spausdinimas („pirmyn“, būsena) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x laipsnių, jei (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo status [2] = l1 spausdinimas („kairė“, būsena) time.sleep (0,2) def „MoveRight“(savarankiškai): r0 = statusas [2] r1 = r0 - 2 #minus x laipsniai, jei (r1 <ri_t): r1 = ri_t kit.servo [posūkis].angle = r1 # perkelti servo būseną [2] = r1 spausdinti ("dešinėje", būsena) time.sleep (0.2) def OpenGrip (savarankiškai): kit.servo [grip].angle = op_g # nustatykite rankeną į „atidaryti“padėtį: „open_tab“time.sleep (0.5) statusas [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # nustatykite rankeną į „uždarytą“padėtį: " close_tab "time.sleep (0.5) statusas [3] = cl_g def StopMove (self): # nieko nedaro, bet sustabdo judesius print (" stop ", status) time.sleep (0.25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic jei args.mic yra None else int (args.mic) model.classify_audio (mikrofonas, variklis, etiketės_failas = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_) int (args.num_frames_hop)) def on_execute (self, args): jei ne self.on_init (): self._running = False q = model.get_queue () self._controler = Kontrolierius (q) jei ne args.debug_keyboard: t = Siūlas (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 (tiesa, 0,1), išskyrus eilę. Empty: new_item = Nėra, jei new_item nėra Nėra: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) arba elementas == "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]) arba elementas == "dešinėn": # pasukite į dešinę. MoveRight () if (args.debug_ke yboard ir klavišai [pygame. K_LEFT]) arba elementas == "left": # pasukite į kairę savarankiškai. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) or item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) arba item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) arba item == "b": # atgal self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # persiunčia self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) arba 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 and keys [pygame. K_S]) arba item == "s": # stop motion: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) arba item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys [pygame. K_1]) arba item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) arba item == "2": self. MeArmPos (2), jei (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_5]) arba elementas == "5": self. MeArmPos (5) if (args.debug_keyboard and keys [pygame. K_6]) or item == "6": self. MeArmPos (6) if (args.debug_keyboard and klavišai [pygame. K_7]) arba elementas == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) arba item == "8": self. MeArmPos (8) if (args.debug_keyboard ir keys [pygame. K_9]) arba item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) arba item == "d": self. DancingMeArm () #dancing MeArm, „next_game“, jei (args.debug_klaviatūra ir klavišai [pygame. K_r]) arba item == "r": self. RandomMoves () #atsitiktinis šokis „atsitiktinis žaidimas“, jei (args.debug_keyboard and keys [pygame. K_j]) arba elementas == "j": self. TransMeArm1 () # transportavimo objektas: "pietų_žaidimas" if (args.debug_keyboard and keys [pygame. K_k]) arba item == "k": self. TransMeArm2 () # transporto objekto atvirkštinė kryptis: "next_game" '' 'if (args.debug_keyboard and klavišai [pygame. K_l]) arba elementas == "l": self. JumpingJack2 (1) #LED mirksi "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': pars. = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Naudokite klaviatūrą, kad valdytumėte MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args the_app = Programa () the_app.on_execute (arg)

Rekomenduojamas: