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, Juli
Anonim
Slušalica koja skače, verzija Google Coral TPU akceleratora
Slušalica koja skače, verzija Google Coral TPU akceleratora
Slušalica koja skače, verzija Google Coral TPU akceleratora
Slušalica koja skače, verzija Google Coral TPU akceleratora
Slušalica koja skače, verzija Google Coral TPU akceleratora
Slušalica koja skače, verzija Google Coral TPU akceleratora

Pokreć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“. Upravlja se jednostavnim glasovnim komandama 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.

Jezgro sistema je Google Coral TPU akcelerator, koji omogućava pokretanje Tensorflow Lite modela van mreže sa velikom brzinom, čak i na "slabom" računaru kao što je Raspberry Pi. To omogućava npr. brza identifikacija i klasifikacija objekata pomoću RPi kamere, ali i lokalno pokretanje funkcija prepoznavanja glasa zasnovanih na mašinskom 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žen primjer koda mogao bi se koristiti i za druge, složenije projekte.

Glasovna kontrola zasnovana je na primjeru „zmija koja čuje“u „spoteru ključnih riječi projekta“(https://github.com/google-coral/project-keyword-spotter) koji je nedavno (rujan 2019.) postavljen na GitHub. U mojoj konfiguraciji, sistem 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. Džek za skakanje je ranije opisan u prethodnom uputstvu, gdje ga je pokretao komplet Google Voice za čitanje glasovnih naredbi, pričvršćen na servo poklopac u verziji 2.0 opisanoj u nastavku.

Prethodna verzija Google Voice Kit-a imala je tri centralna ograničenja: ovisilo je o Googleovim uslugama prepoznavanja glasa zasnovanim na webu, a postavljanje je bilo relativno komplicirano, zahtijevalo je pritiskanje neke vrste tipke prije nego što ste mogli dati naredbu, a došlo je do ozbiljnog kašnjenja između izgovaranja naredbe i odgovora sistema. Korištenje akceleratora Google Coral skraćuje vrijeme odziva 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 poput skakačke utičnice, robota ili automobila ili bilo čega što možete izgraditi i kontrolirati pomoću Raspberry Pi.

U trenutnoj verziji Opažač ključnih riječi razumije skup od oko 140 kratkih ključnih riječi/ključnih fraza, definiranih u priloženoj 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 na tipke na virtualnoj tastaturi, npr. za slova, brojeve, gore/dolje/lijevo/desno, crtl+c, itd.

Zatim, npr. koristeći pygame.key, ovi „pritisci tastera“se č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. septembra 2019

Supplies

Raspberry Pi 4, preko Pimoronija

Google Coral TPU Accelerator, preko Mouser Njemačka, 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 kabla

Korak 1: Postavljanje uređaja

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

Za izgradnju skakaonice slijedite upute date 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 motora itd. Provjerite mogu li se udovi i zupčanik kretati bez trenja.

Postavite svoj Raspberry Pi. Na web mjestu Coral Github dostupna je Raspanska slika koja sadrži sve potrebno za pokretanje Coral akceleratora na Pi -u i sadrži mnogo projekata sa već postavljenim 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 fasciklu za pronalaženje ključnih riječi projekta, a datoteku s odgovarajućim naredbama u podmapu config.

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

Priključite 5-6V izvor napajanja na servo poklopac. Priključite servo i LED diode. U mom slučaju, koristio sam port 0 za LED diode, a portove 11 i 15 za servo pogone.

Da bih provjerio sve, preporučio bih da prvo isprobate primjer ključne riječi projekta "spotter" koji čuje zmiju 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 komandne linije.

Vikanje "položaja 0" na "položaj 9" izazvat će skakaonicu da zauzme jednu od unaprijed definiranih pozicija. Definirao sam "1" 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". "3" i "8" ne prepoznaju dobro ključne riječi spotter 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 potrošiti previše energije.

"sljedeća igra" započet će "ples", tj. definirani slijed pozicija, dok će "nasumična igra" započeti skakaonicu za izvođenje nasumičnog niza poteza. U oba slučaja će trajati zauvijek, pa ćete možda morati zaustaviti kretnje, npr. sa naredbom "pozicija nula".

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

"uključivanje" i "isključivanje" može se koristiti za uključivanje i isključivanje LED dioda.

Izmjenom vrijednosti time.sleep možete podesiti brzinu kretanja.

Korak 3: Kod i datoteka naredbi

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

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

Želeo bih da se zahvalim programerima oba dela.

Kod se nalazi u prilogu datoteke. 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 možete 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 nije dogovoreno, softver # distribuiran pod Licencom distribuira se na OSNOVA "KAKAV JE", # BEZ JAMSTAVA ILI USLOVA BILO KOJE VRSTE, bilo izričite ili implicitne. # Pogledajte Licencu za posebne jezičke dozvole i # ograničenja pod Licencom. iz _future_ uvoz apsolutni_import iz _future_ uvoz podjela iz _future_ uvoz print_function uvoz argparse uvoz os iz nasumičnog uvoza randint iz niti uvoza uvoz Vrijeme uvoza niti iz edgetpu.basic.basic_engine uvoz BasicEngine model uvoza import pygame iz pygame.locals uvoz * 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].actuation_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 porta, lijevi servo (0-8)

rgt = 11 # broj servo porta, desni servo (0-8) led_channel_0 = hat.channels [0] # LED postavljen na portu 0 led_channel_0.duty_cycle = 0 # uključi LED 100% # lista 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, up_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 ("Pozicija:", ključ, "lijevo /desno: ", a,"/", b," stepen ") # sys.stdout.write (" Pozicija: ", ključ," levo/desno: ", a,"/", b," stepen ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (samo): # kontrolira Jumping Jack dance, ključna riječ: "sljedeća igra" dnce = dance1 sp = (len (dnce)) za r u rasponu (sp): # redoslijed plesa pozicija, sp koraci dc = dnce [r] if (dc nije u rasponu (10)): # ispis ("unos greške 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% time.sleep (0,1) ako je LED == 0: led_channel_0.duty_cycle = 0 # isključite LED vrijeme.spavanje (0,1) ako je LED == 2: # treperi led_channel_0.duty_cycle = 0xffff # uključi LED 100% vrijeme.spavanje (0,5) led_channel_0.duty_cycle = 0 #uključi LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #uključi LED 100% time.sleep (0,5) led_channel_0.duty_cycle = 0 #uključi LED 100% time.sleep (0,5) led_channel_0.duty_cycle = 0xffff #uključi 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 = Netačno q = model.get_queue () self._controler = Kontroler (q) ako nije args.debug_keyboard: t = Tema (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 (Tačno, 0.1) osim reda čekanja. Prazno: 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. JumpingJack0 (7) # if (args.debug_keyboard i ključevi [pygame. K_RIGHT]) ili item == "right": self. JumpingJack0 (6) if (args.debug_keyboard i ključevi [pygame. K_LEFT]) ili item == "lijevo": self. JumpingJack0 (4) if (args.debug_keyboard i ključevi [pygame. K_UP]) ili item == " gore ": self. JumpingJack0 (1) if (args.debug_keyboard i ključevi [pygame. K_DOWN]) ili item ==" down ": 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 ključevi [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. tastatura za otklanjanje grešaka i ključevi [pygame. K_j]) ili stavka == "j": self. JumpingJack2 (0) #LED uključeno, ON " switch_on "if (args.debug_keyboard i ključevi [pygame. K_k]) ili item ==" k ": self. JumpingJack2 (1) #LED isključeno, uključeno" isključeno "if (args.debug_keyboard i ključevi [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 () #nasumični ples "random game" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Koristite tastaturu za kontrolu JumpingJacka. ', 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". Izmenite kako želite. To je samo popis kombinacija "naredba, ključ, (snaga,)", zasnovanih na datoteci oznake.

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, pomicanje_nazad, lijevo, pomicanje_naprijed, desno, kretanje_nazad, lijevo, naprijed, desno, 0,8 meta, l, isključivanje zvuka, z, da, y, ne, n, prekidač_on, j, prekidač_isključivanje, k, jačina zvuka gore, gore, jačina zvuka 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 oktobru 2019.

Razmišljam i o tome da iskoristim Jumping Jack kao semafor i 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. Ovo bi moglo omogućiti, iako malo izmijenjeno, fizičku realizaciju za predloženi IETF "Prijenos IP datagrama preko sistema za signalizaciju zastave semafora (SFSS)" (https://tools.ietf.org/html/rfc4824).

Ali ovo će biti još jedno uputstvo. I, kako su prvi eksperimenti pokazali da će skakačici biti potrebne značajne izmjene prije nego što sistem AI prepozna da je čovjek, što može potrajati neko vrijeme.

Želio bih vam skrenuti pažnju 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čuje se: