Sadržaj:

A Hearing Jumping Jack, Google Coral TPU Accelerator verzija: 4 koraka
A Hearing Jumping Jack, Google Coral TPU Accelerator verzija: 4 koraka

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator verzija: 4 koraka

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator verzija: 4 koraka
Video: Voice Control with Coral Dev Board Mini 2024, Srpanj
Anonim
Slušalica koja skače, verzija Google Coral TPU Accelerator
Slušalica koja skače, verzija Google Coral TPU Accelerator
Slušalica koja skače, verzija Google Coral TPU Accelerator
Slušalica koja skače, verzija Google Coral TPU Accelerator
Slušalica koja skače, verzija Google Coral TPU Accelerator
Slušalica koja skače, verzija Google Coral TPU Accelerator

Pomiče udove, sluša vaše naredbe, pokreće ga najnovija tehnologija strojnog učenja

„Slušalica za skakanje“je jednostavna elektromehanička utičnica za skakanje, koju pokreću dva mikro servo pogona i vrlo jednostavan zupčanik, sa LED diodama kao „očima“. Njime se upravlja jednostavnim glasovnim naredbama koje pokazuju koji će od devet unaprijed definiranih položaja zauzeti ili treba li LED uključiti ili isključiti ili će izvesti unaprijed definirani "ples" ili nasumični skup pokreta.

Glavni element sustava je Google Coral TPU akcelerator koji omogućuje pokretanje Tensorflow Lite modela offline s velikom brzinom, čak i na "slabom" računalu kao što je Raspberry Pi. To omogućuje npr. brzu identifikaciju i klasifikaciju objekata pomoću RPi kamere, ali i lokalno pokretanje funkcija prepoznavanja glasa temeljenih na strojnom učenju.

Koliko ja znam, ovo je prvi objavljeni primjer za fizički DIY uređaj koji pokreće Coral Accelerator detekcijom glasa, a priloženi primjer koda mogao bi se koristiti i za druge, složenije projekte.

Glasovna kontrola temelji se na primjeru "zmije koja čuje" u "projektu ključnih riječi za projekt" (https://github.com/google-coral/project-keyword-spotter) koji je nedavno (rujan 2019.) postavljen na GitHub. U mojoj konfiguraciji, sustav se sastoji od Raspberry Pi 4 opremljenog Adafruit 16 -kanalnim servo poklopcem, Google Coral TPU akceleratorom i web kamerom, koja se ovdje koristi kao mikrofon. Jumping Jack je već bio opisan u prethodnim uputama, gdje ga je pokretao Google Voice kit za čitanje glasovnih naredbi, pričvršćen je na Servo poklopac u verziji 2.0 opisanoj u nastavku.

Prethodna verzija Google Voice Kit imala je tri središnja ograničenja: ovisila je o Googleovim uslugama prepoznavanja glasa na webu, a postavljanje je bilo relativno komplicirano, bilo je potrebno pritisnuti neku vrstu gumba prije nego što ste mogli dati naredbu, a došlo je do ozbiljnog kašnjenja između izgovaranja naredbe i odgovora sustava. Korištenje akceleratora Google Coral skraćuje vrijeme odaziva na sekunde, neovisno je o internetskoj vezi i cijelo vrijeme sluša. Uz neke izmjene, možete ga koristiti za upravljanje mnogo složenijim uređajima kao što je skakački priključak, kao roboti ili automobili ili što god možete izgraditi i kontrolirati pomoću Raspberry Pi.

U svojoj trenutnoj verziji Opažač ključnih riječi razumije skup od oko 140 kratkih ključnih riječi/ključnih fraza, definiranih u popratnoj datoteci modela (“voice_commands_v0.7_egetpu.tflite”) i opisanih u zasebnoj datoteci s oznakama (“labels_gc2.raw.txt”). Definirane datotekom koja se može slobodno mijenjati (“commands_v2_hampelmann.txt”), ključne riječi koje koristi naša skripta tada se mapiraju u pritiske tipki na virtualnoj tipkovnici, npr. za slova, brojeve, gore/dolje/lijevo/desno, crtl+c, itd.

Zatim, na pr. koristeći pygame.key, ti se "pritisci tipki" čitaju i koriste za kontrolu koje radnje će uređaj, ovdje skakački priključak, izvesti. U našem slučaju to znači dovesti dva serva do unaprijed definiranih položaja ili uključiti ili isključiti LED diode. Kako se spotter ključne riječi nalazi u zasebnom gazištu, može trajno slušati vaše narudžbe.

Verzija 21. rujna 2019

Pribor

Malina Pi 4, preko Pimoronija

Google Coral TPU Accelerator, putem Mouser Njemačke, 72 €

Adafruit 16 servo poklopac, preko Pimoronija, oko 10 €

www.adafruit.com/product/3416

learn.adafruit.com/adafruit-16-channel-pwm…

Zaglavlje slagača (ako je potrebno)

www.adafruit.com/product/2223

4x AA baterija (ili neki drugi izvor napajanja 5-6V) za servo poklopac

Stara web kamera, kao mikrofon

Jumping Jack sa servo pogonom, kako je opisano u prethodnim uputama. Crteži izgleda priloženi su sljedećem koraku, ali mogu zahtijevati prilagodbe.

Potrebni dijelovi za skakaonicu:

- Forex ploča od 3 mm

- 2 mikro serva

- 2 i 3 mm vijci i matice

- 2 bijele LED diode i otpornik

- malo kabela

Korak 1: Postavljanje uređaja

Postavljanje uređaja
Postavljanje uređaja
Postavljanje uređaja
Postavljanje uređaja
Postavljanje uređaja
Postavljanje uređaja

Za izradu skakaonice slijedite upute navedene u prethodnim uputama. Koristio sam Forex za svoj prototip, ali možete koristiti laserski izrezane akrilne ploče ili ploče od šperploče. Možda ćete morati prilagoditi raspored prema veličini servo servo uređaja itd. Provjerite mogu li se udovi i zupčanik kretati bez trenja.

Postavite svoj Raspberry Pi. Na web mjestu Coral Github dostupna je raspijska slika koja sadrži sve potrebno za pokretanje akceleratora Coral na Pi -u i sadrži puno projekata sa svim postavkama.

Nabavite program za pronalaženje ključnih riječi projekta sa stranice Google Coral GitHub. Instalirajte sav potreban softver prema uputama.

Instalirajte priložene datoteke. Python skriptu za skakanje postavite u mapu za pronalaženje ključnih riječi projekta, a datoteku s odgovarajućim naredbama u podmapu config.

Pričvrstite Adafruit servo poklopac na Pi. Budući da koristim RPI kućište s ventilatorom, morao sam koristiti GPIO slagače (npr. Dostupno od Pimoronija) kako bih omogućio povezivanje. Instalirajte sve potrebne knjižnice, kako je navedeno u uputama Adafruit za poklopac servo motora.

Priključite izvor napajanja 5-6V na poklopac servo motora. Priključite servo i LED diode. U mom slučaju, koristio sam priključak 0 za LED diode, a priključke 11 i 15 za servo upravljače.

Da bih sve provjerio, preporučio bih da prvo isprobate projektni spotter "spotter" koji čuje zmiju "primjer" i primjere Adafruit servo poklopca motora.

Korak 2: Trčanje skakaonice

Ako su svi dijelovi postavljeni i rade, pokušajte ih koristiti. Skriptu možete pokrenuti u IDE -u ili iz naredbenog retka.

Vikanje "položaja 0" do "položaja 9" izazvat će skakaonicu da zauzme jedan od unaprijed definiranih položaja. "1" sam definirao kao obje ruke gore (uu), "3" lijevo gore, desno dolje (ud), "9" kao obje ruke prema dolje (dd) i "5" kao obje ruke centrirane (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" je identično "5". Ključne riječi spotter ključne riječi "3" i "8" ne prepoznaju dobro i možda će se morati ponoviti.

Možda ćete morati prilagoditi minimalne i maksimalne vrijednosti za svaki servo/stranu tako da se servo motori neće blokirati, a zatim izvući previše energije.

"sljedeća igra" počet će "ples", tj. definirani slijed pozicija, dok će "nasumična igra" pokrenuti Jumping Jack kako bi izveo nasumičan slijed poteza. U oba slučaja trajat će zauvijek, pa ćete možda morati zaustaviti kretnje, npr. s naredbom "pozicija nula".

"stop game" će izazvati "ctrl + c" i zaustaviti proces.

"uključivanje" i "isključivanje" mogu se koristiti za uključivanje i isključivanje LED dioda.

Promjenom vrijednosti time.sleep možete prilagoditi brzinu kretanja.

Korak 3: Kod i datoteka naredbi

Ovdje predstavljeni kôd je modifikacija koda "zmije koja čuje" koja je dio paketa za pronalaženje ključnih riječi projekta. Uklonio sam sve što nije bilo potrebno za prijavu, bez ikakvog stvarnog razumijevanja pojedinosti. Sva poboljšanja su dobrodošla.

Zatim sam dodao dijelove potrebne za Adafruit Servo poklopac na temelju njihovih primjera datoteka.

Želio bih zahvaliti programerima oba dijela.

Kôd se nalazi u privitku kao datoteka. Iskoristite ga na vlastitu odgovornost, izmijenite ga, poboljšajte, igrajte se s njim.

# Autorska prava 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 # # https://www.apache.org/licenses/LICENSE-2.0 # # Osim ako to zahtijeva važeći zakon ili u pisanom obliku s tim nije dogovoreno, softver # distribuiran pod Licencom distribuira se na OSNOVA "KAKAV JESTE", # BEZ JAMSTAVA ILI UVJETA BILO KOJE VRSTE, bilo izričite ili implicitne. # Pogledajte Licencu za posebne jezične dozvole i # ograničenja prema Licenci. from _future_ import absolute_import from _future_ import department from _future_ import print_function import 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 iz slučajnog uvoza randrange from adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 vrijeme uvoza i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (Channels = 16) # set number kanala #kit.servo [0].accuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #gore, srednja i donja postavka za lijevu i desnu ruku up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # broj servo priključka, lijevi servo (0-8)

rgt = 11 # broj servo priključka, desni servo (0-8) led_channel_0 = hat.channels [0] # LED postavljen na priključak 0 led_channel_0.duty_cycle = 0 # uključi LED 100% #popis postavki ruke za devet položaja = [(md_l, md_r), (gore_l, gore_r), (gore_l, md_r), (gore_l, dn_r), (md_l, gore_r), (md_l, md_r), (md_l, dn_r), (dn_l, gore_r), (dn_l, md_r), (dn_l, dn_r)] # definira 9 položaja JumpingJacka, označenih cijelim brojevima 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "dance" klasa 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 JumpingJack0 (self, keys): # kontrolira Jumping Jack, ključne riječi: "position x" key = int (ključevi) p = position [ključ] a = p [0] b = p [1] ispis ("Položaj:", ključ, "lijevo /desno: ", a,"/", b," stupanj ") # sys.stdout.write (" Pozicija: ", ključ," lijevo/desno: ", a,"/", b," stupanj ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # kontrolira Jumping Jack dance, ključna riječ: "sljedeća igra" dnce = dance1 sp = (len (dnce)) za r u rasponu (sp): # redoslijed plesa pozicija, koraci sp dc = dnce [r] if (dc nije u rasponu (10)): # ispis ("pogreška unosa na poziciji", sp) dc = 4 p = položaj [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # postavlja brzinu kretanja def JumpingJack2 (self, keys): # kontrole Jumping Jack LED diode, ključne riječi: "uključivanje/isključivanje" led = int (tipke) ako je led == 1: led_channel_0.duty_cycle = 0xffff # uključi LED 100% vrijeme.spavanje (0.1) if led == 0: led_channel_0.duty_cycle = 0 # isključite LED time.sleep (0.1) if led == 2: # trepću led_channel_0.duty_cycle = 0xffff # uključite LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #uključi LED 100% vrijeme.sleep (0,5) led_channel_0.duty_cycle = 0xffff #uključite LED 100% time.sleep (0,5) led_channel_0.duty_cycle = 0 #uključite LED 100% time.sleep (0,5) led_channel_0.duty_cycle = 0xffff #uključite LED 100% time.sleep (0,1) def JumpingJack3 (self): # kontrolira Jumping Jack dance, ključna riječ: "slučajna igra" # za h u rasponu (10): dr = randrange (9) p = položaj [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # postavlja brzinu kretanja def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if 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_v2_hampelmann.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_hz), num_frames_hop = int (args.num_frames_hop))

def on_execute (self, args):

ako nije self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) ako nije args.debug_keyboard: t = Thread (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 (Istina, 0,1) osim reda čekanja. Prazno: new_item = Nema 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. JumpingJack0 (7) # if (args.debug_keyboard i ključevi [pygame. K_RIGHT]) ili item == "right": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_LEFT]) or item == "left": self. JumpingJack0 (4) if (args.debug_keyboard i keys [pygame. K_UP]) ili item == " gore ": self. JumpingJack0 (1) if (args.debug_keyboard i ključevi [pygame. K_DOWN]) ili item ==" dolje ": self. JumpingJack0 (9) if (args.debug_keyboard i ključevi [pygam e. K_0]) ili item == "0": self. JumpingJack0 (0) if (args.debug_keyboard i ključevi [pygame. K_1]) ili item == "1": self. JumpingJack0 (1) if (args. debug_keyboard i ključevi [pygame. K_2]) ili item == "2": self. JumpingJack0 (2) if (args.debug_keyboard i ključevi [pygame. K_3]) ili item == "3": self. JumpingJack0 (3) if (args.debug_keyboard i ključevi [pygame. K_4]) ili item == "4": self. JumpingJack0 (4) if (args.debug_keyboard i ključevi [pygame. K_5]) ili item == "5": self. JumpingJack0 (5) if (args.debug_keyboard i tipke [pygame. K_6]) ili item == "6": self. JumpingJack0 (6) if (args.debug_keyboard i ključevi [pygame. K_7]) ili item == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard i ključevi [pygame. K_8]) ili item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard i ključevi [pygame. K_9]) ili item == "9": self. JumpingJack0 (9) if (args.debug_keyboard i ključevi [pygame. K_a]) ili item == "d": self. JumpingJack1 () #dancing Jack, na "next_game" if (args. tipkovnica za otklanjanje pogrešaka i ključevi [pygame. K_j]) ili stavka == "j": self. JumpingJack2 (0) #LED uključeno, ON " switch_on "if (args.debug_keyboard and keys [pygame. K_k]) or item ==" k ": self. JumpingJack2 (1) #LED off, on" offith off "if (args.debug_keyboard and keys [pygame. K_l]) ili item == "l": self. JumpingJack2 (1) #LED treptanje "target" if (args.debug_keyboard i ključevi [pygame. K_r]) ili item == "r": self. JumpingJack3 () #slučajni ples "random game" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Koristite tipkovnicu za upravljanje JumpingJackom. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Tu je i naredbena konfiguracijska datoteka "commands_v2_hampelmann.txt". Izmijenite kako želite. To je samo popis kombinacija "naredba, ključ, (snaga,)", temeljenih na datoteci oznaka.

položaj_ nula, 0, position_one, 1, position_two, 2, position_three, 3, position_four, 4, position_five, 5, position_six, 6, position_seven, 7, position_eight, 8, position_nine, 9, move_up, gore, go_up, gore, move_down, down, go_down, dolje, pomiči se unatrag, lijevo, pomiči se naprijed, desno, idi unatrag, lijevo, idi naprijed, desno, 0,8 meta, l, isključi zvuk, z, da, y, ne, n, prekidač_u, j, prekidač_isključivanje, k, povećanje glasnoće, gore, glasnoća_dolje, dolje, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

Korak 4: Daljnje ideje i drugi primjeri

Sasvim je očito da se ova postavka može koristiti i za upravljanje robotima ili drugim uređajima. U osnovi sve što bi moglo kontrolirati Raspberry Pi.

Radim na proširenju skripte za pogon MeArma i nadam se da ću to moći predstaviti u listopadu 2019.

Također razmišljam o tome da iskoristim Jumping Jack kao semafor, te da koristim program za prepoznavanje položaja udova "project posenet" kao alat za čitanje položaja Jumping Jacka i njegovo prevođenje natrag u broj. Na ovaj način može čak i komunicirati tekst, s obzirom da 2x 8 pozicija može označiti 64 različita broja, više nego dovoljno za abecedu, brojeve i znakove. To bi moglo omogućiti, iako malo izmijenjeno, fizičku realizaciju predloženog IETF -a "Prijenos IP datagrama preko sustava za signalizaciju zastave Semafor (SFSS)" (https://tools.ietf.org/html/rfc4824).

Ali ovo će biti još jedna pouka. Kako su prvi pokusi pokazali da će skakačici trebati značajne izmjene prije nego što je AI sustav prepozna kao čovjeka, može potrajati neko vrijeme.

Želio bih vam skrenuti pozornost na sljedeće instrukcije: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, gdje je opisan robot za pronalaženje objekata koji koristi kombinaciju Raspberry Pi i Google Coral TPU-a.

Preporučeni: