Kazalo:

A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 koraki
A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 koraki

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 koraki

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 koraki
Video: The BEST Self-Hosted CCTV Solution With AI Object Detection? 2024, Julij
Anonim
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version

Premika okončine, posluša vaša naročila, poganja ga najnovejša tehnologija strojnega učenja

„Hearing Jumping Jack“je preprost elektromehanski skakalni vtič, ki ga poganjata dva mikro servomotorja in zelo preprosta naprava, ki ima LED kot „oči“. Upravlja se z enostavnimi glasovnimi ukazi, ki označujejo, kateri od devetih vnaprej določenih položajev mora zavzeti, ali naj LED vklopi ali izklopi, ali naj izvede vnaprej določen "ples" ali naključni niz gibov.

Osrednji element sistema je Google Coral TPU pospeševalnik, ki omogoča izvajanje modelov Tensorflow Lite brez povezave z zelo veliko hitrostjo, tudi na "šibkem" računalniku, kot je Raspberry Pi. To omogoča npr. hitra identifikacija in razvrščanje predmetov s kamero RPi, pa tudi lokalno izvajanje funkcij prepoznavanja glasu na osnovi strojnega učenja.

Kolikor vem, je to prvi objavljeni primer fizične DIY naprave, ki temelji na zaznavanju glasu Coral Accelerator, priloženi primer kode pa bi lahko uporabili tudi za druge, bolj zapletene projekte.

Glasovni nadzor temelji na primeru "slušne kače" v "opazovalcu ključnih besed projekta" (https://github.com/google-coral/project-keyword-spotter), ki je bil nedavno (september 2019) postavljen na GitHub. V moji konfiguraciji je sistem sestavljen iz Raspberry Pi 4, opremljenega s 16 -kanalnim servo pokrovom Adafruit, pospeševalnikom TPU Google Coral in spletno kamero, ki se tukaj uporablja kot mikrofon. Jumping Jack je bil že opisan v prejšnjem navodilu, kjer ga je za branje glasovnih ukazov poganjal komplet Google Voice, pritrjen na servo pokrov v različici 2.0, opisani v nadaljevanju.

Prejšnja različica kompleta Google Voice Kit je imela tri osrednje omejitve: bila je odvisna od Googlovih spletnih storitev za prepoznavanje glasu, nastavitev pa je bila razmeroma zapletena, zato je bilo treba pritisniti nekakšen gumb, preden ste lahko dali ukaz, prišlo je do resne zamude med izgovarjanjem ukaza in odzivom sistema. Uporaba pospeševalnika Google Coral skrajša odzivni čas na sekunde, je neodvisen od internetne povezave in ves čas posluša. Z nekaterimi spremembami ga lahko uporabite za krmiljenje naprav, ki so veliko bolj zapletene kot skakalna vtičnica, kot roboti ali avtomobili ali karkoli lahko zgradite in nadzirate z Raspberry Pi.

V svoji trenutni različici orodje za iskanje ključnih besed razume niz približno 140 kratkih ključnih besed/ključnih besednih zvez, opredeljenih v priloženi datoteki modela (»voice_commands_v0.7_egetpu.tflite«) in opisanih v ločeni datoteki z oznakami (»labels_gc2.raw.txt«). Določene z datoteko, ki jo je mogoče prosto spreminjati (»commands_v2_hampelmann.txt«), se ključne besede, ki jih uporablja naš skript, nato preslikajo v pritiske tipk na navidezni tipkovnici, npr. za črke, številke, gor/dol/levo/desno, crtl+c itd.

Potem je npr. s pomočjo pygame.key se ti »pritiski na tipke« preberejo in uporabijo za nadzor nad tem, katera dejanja naj izvede naprava, tukaj skakalna vtičnica. V našem primeru to pomeni, da dva servomotorja pripeljete v vnaprej določena položaja ali vklopite ali izklopite LED. Ker iskalnik ključnih besed deluje v ločeni tekalni plasti, lahko trajno posluša vaša naročila.

Različica 21. september 2019

Zaloge

Malina Pi 4, prek Pimoronija

Google Coral TPU Accelerator, prek Mouser Nemčija, 72 €

Adapruit 16 servo pokrov, prek Pimoronija, približno 10 €

www.adafruit.com/product/3416

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

Glava zlaganja (če je potrebno)

www.adafruit.com/product/2223

4x AA baterija (ali drug 5-6V vir napajanja) za servo pokrov

Stara spletna kamera, kot mikrofon

Jumping Jack s servo pogonom, kot je opisano v prejšnjih navodilih. Risbe postavitve so priložene naslednjemu koraku, vendar bodo morda potrebne prilagoditve.

Potrebni deli za skakalnico:

- 3 mm Forex plošča

- 2 mikro servomotorja

- 2 in 3 mm vijaki in matice

- 2 beli LED in upor

- malo kabla

1. korak: Nastavitev naprave

Nastavitev naprave
Nastavitev naprave
Nastavitev naprave
Nastavitev naprave
Nastavitev naprave
Nastavitev naprave

Če želite sestaviti skakalnico, sledite navodilom iz prejšnjih navodil. Za prototip sem uporabil Forex, lahko pa uporabite lasersko rezane akrilne ali vezane plošče. Morda boste morali prilagoditi postavitev glede na velikost servomotorjev itd. Preverite, ali se lahko okončine in orodje premikajo brez trenja.

Nastavite svoj Raspberry Pi. Na spletnem mestu Coral Github je na voljo raspijska slika, ki vsebuje vse, kar je potrebno za zagon pospeševalnika Coral na Pi in vsebuje veliko projektov z vsemi nastavitvami.

Pridobite iskalnik ključnih besed projekta s strani Google Coral GitHub. Namestite vso potrebno programsko opremo, kot je prikazano.

Namestite priložene datoteke. Skript python skakalnega jacka postavite v mapo za iskanje ključnih besed projekta, datoteko z ustreznimi ukazi pa v podmapo config.

Servo pokrov Adafruit pritrdite na Pi. Ker uporabljam ohišje RPI z ventilatorjem, sem moral za povezavo omogočiti zlaganje GPIO (npr. Na voljo pri Pimoroniju). Namestite vse potrebne knjižnice, kot je navedeno v navodilih Adafruit za pokrov motorja.

Na pokrov servo motorja priključite napajalnik 5-6V. Priključite servomotorje in LED. V mojem primeru sem uporabil vrata 0 za LED in vrata 11 in 15 za servomotorje.

Če želite vse preveriti, priporočam, da najprej preizkusite primer opazovalca ključnih besed projekta "slišijo kačo" in primere motornega pokrova Adafruit.

2. korak: Tek s skakalnico

Če so vsi deli nastavljeni in delujejo, jih poskusite uporabiti. Skript lahko zaženete v IDE ali iz ukazne vrstice.

Če vpijete "položaj 0" na "položaj 9", bo skakalni jack zavzel enega od vnaprej določenih položajev. "1" sem definiral kot obe roki navzgor (uu), "3" kot levo navzgor, desno navzdol (ud), "9" kot obe roki navzdol (dd) in "5" kot obe roki na sredini (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" je enako "5". "3" in "8" ključne besede spotter ne prepoznajo dobro in jih bo morda treba ponoviti.

Morda boste morali prilagoditi minimalne in največje vrednosti za vsak servo/stran, da servomotorji ne bodo blokirani in nato porabili preveč energije.

"naslednja igra" bo začela "ples", to je določeno zaporedje položajev, medtem ko bo "naključna igra" začela skakalnico, da izvede naključno zaporedje potez. V obeh primerih bodo delovali večno, zato boste morda morali ustaviti gibanje, npr. z ukazom "položaj nič".

"stop game" bo izzval "ctrl + c" in ustavil postopek.

"vklop" in "izklop" lahko uporabite za vklop in izklop LED.

S spreminjanjem vrednosti time.sleep lahko prilagodite hitrost gibanja.

Korak: Koda in datoteka ukazov

Tu predstavljena koda je sprememba kode "kača, ki sliši", ki je del paketa za iskanje ključnih besed projekta. Odstranil sem vse, kar ni bilo potrebno za prijavo, ne da bi razumel podrobnosti. Vse izboljšave so dobrodošle.

Nato sem dodal dele, ki so potrebni za servo pokrov Adafruit, na podlagi njihovih primerov datotek.

Rad bi se zahvalil programerjem obeh delov.

Kodo lahko najdete priloženo kot datoteko. Uporabite ga na lastno tveganje, ga spremenite, izboljšajte, se igrajte z njim.

# 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 # # https://www.apache.org/licenses/LICENSE-2.0 # # Razen če to zahteva veljavna zakonodaja ali se s tem pisno strinjate, se programska oprema #, distribuirana pod licenco, distribuira na OSNOVA "KAKŠNA JE", # BREZ JAMSTEV ALI POGOJEV KAKRŠNE koli, izrecnih ali implicitnih. # Glejte Licenco za določena dovoljenja za jezik in # omejitve pod Licenco. iz _future_ uvoz absolutni_import iz _future_ uvozni oddelek iz _future_ uvoz print_function uvoz argparse uvoz os iz naključnega uvoza randint iz navojev uvoz Čas uvoza niti iz edgetpu.basic.basic_engine uvoz BasicEngine model uvoza uvoz pygame iz pygame.locals uvoz * uvozna čakalna vrsta iz naključnega uvoza randrange from adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 čas uvoza i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (Channels = 16) # set number kanalov #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #gor, sredina in dol nastavitev za levo in desno roko up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # število servo vrat, levi servo (0-8)

rgt = 11 # število servo vrat, desni servo (0-8) led_channel_0 = hat.channels [0] # LED nastavljena na vratih 0 led_channel_0.duty_cycle = 0 # vklopi LED 100% # seznam nastavitev roke za devet položajev = [(md_l, md_r), (up_l, up_r), (up_l, md_r), (up_l, dn_r), (md_l, up_r), (md_l, md_r), (md_l, dn_r), (dn_l, up_r), (dn_l, md_r), (dn_l, dn_r)] # definira 9 položajev JumpingJacka, označenih s celimi števili 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" razred Krmilnik (objekt): #Callback funkcija def _init _ (self, q): self._q = q def povratni klic (self, 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 JumpingJack0 (self, keys): # nadzor Jumping Jack, ključne besede: "position x" key = int (keys) p = position [ključ] a = p [0] b = p [1] tiskanje ("Položaj:", ključ, "levo" /desno: ", a,"/", b," stopnja ") # sys.stdout.write (" Položaj: ", ključ," levo/desno: ", a,"/", b," stopnja ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # nadzoruje Jumping Jack dance, ključna beseda: "naslednja igra" dnce = dance1 sp = (len (dnce)) za r v območju (sp): # plesni vrstni red položajev, koraki sp dc = dnce [r] če (dc ni v območju (10)): # tiskanje ("napaka pri vnosu na položaju", 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) # nastavi hitrost gibov def JumpingJack2 (self, keys): # nadzor Jumping Jack LED, ključne besede: "vklop/izklop" led = int (tipke) če led == 1: led_channel_0.duty_cycle = 0xffff # vklop LED 100% time.sleep (0,1) če je LED == 0: led_channel_0.duty_cycle = 0 # izklopi čas LED.sleep (0,1) če je LED == 2: # utripa led_channel_0.duty_cycle = 0xffff # vklopi LED 100% time.sleep (0,5) led_channel_0.duty_cycle = 0 #vklopi LED 100% čas.sleep (0.5) led_channel_0.duty_cycle = 0xffff #vklopite LED 100% time.sleep (0,5) led_channel_0.duty_cycle = 0 #vklopite LED 100% time.sleep (0,5) led_channel_0.duty_cycle = 0xffff #vklopite LED 100% time.sleep (0,1) def JumpingJack3 (self): # nadzor Jumping Jack dance, ključna beseda: "naključna igra" # za h v razponu (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) # nastavi hitrost gibov def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic ni Noben drug 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):

če ni 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 while self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (Res je, 0,1) razen čakalne vrste. Prazno: new_item = Brez, če new_item ni None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) ali item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) ali item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) or item == "right": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_LEFT]) or item == "left": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_UP]) or item == " gor ": self. JumpingJack0 (1) if (args.debug_keyboard in tipke [pygame. K_DOWN]) ali item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard in tipke [pygam e. K_0]) ali element == "0": self. JumpingJack0 (0) if (args.debug_keyboard in ključi [pygame. K_1]) ali item == "1": self. JumpingJack0 (1) if (args. debug_keyboard and keys [pygame. K_2]) ali item == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) ali item == "3": self. JumpingJack0 (3) if (args.debug_keyboard in ključi [pygame. K_4]) ali item == "4": self. JumpingJack0 (4) if (args.debug_keyboard in ključi [pygame. K_5]) ali item == "5": self. JumpingJack0 (5) if (args.debug_keyboard and keys [pygame. K_6]) or item == "6": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_7]) or item == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard and keys [pygame. K_8]) or item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and keys [pygame. K_9]) ali item == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. JumpingJack1 () #dancing Jack, na "next_game" if (args. debug_keyboard and keys [pygame. K_j]) ali item == "j": self. JumpingJack2 (0) #LED vklopljeno, ON " switch_on "if (args.debug_keyboard and keys [pygame. K_k]) or item ==" k ": self. JumpingJack2 (1) #LED off, on" off off "if (args.debug_keyboard and keys [pygame. K_l]) ali element == "l": self. JumpingJack2 (1) #LED utripa "target" if (args.debug_keyboard and keys [pygame. K_r]) ali item == "r": self. JumpingJack3 () #naključni ples "naključna igra" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Uporabite tipkovnico za nadzor JumpingJacka. ', action =' store_true ', default = False) model.add_model_flags (razčlenjevalnik) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Obstaja tudi konfiguracijska datoteka ukazov "commands_v2_hampelmann.txt". Spremenite, kot želite. To je le seznam kombinacij "ukaz, ključ, (moč,)", ki temelji na datoteki oznak.

položaj_ nič, 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, gor, go_up, gor, move_down, down, go_down, dol, premakni_nazad, levo, premakni_naprej, desno, pojdi_nazad, levo, pojdi naprej, desno, 0.8 tarča, l, izklopi zvok, z, da, y, ne, n, stikalo_v, j, stikalo_izklop, k, povečanje glasnosti, gor, glasnost_dol, dol, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

4. korak: Nadaljnje ideje in drugi primeri

Očitno je, da se ta nastavitev lahko uporablja tudi za krmiljenje robotov ali drugih naprav. V bistvu vse, kar bi lahko nadzoroval Raspberry Pi.

Delam na razširitvi skripta za pogon MeArm in upam, da bom to lahko predstavil oktobra 2019.

Razmišljam tudi o tem, da bi Jumping Jacka uporabil kot semafor in uporabil program za prepoznavanje položaja udov "project posenet" kot orodje za branje položajev Jumping Jacka in njegovo prevajanje nazaj v številko. Na ta način lahko celo sporoča besedilo, saj 2x 8 mest lahko označuje 64 različnih številk, več kot dovolj za abecedo, številke in znake. To bi lahko, čeprav rahlo spremenjeno, omogočilo fizično uresničitev predlaganega IETF "Prenos podatkovnih gramov IP prek sistema za signalizacijo zastave semaforja (SFSS)" (https://tools.ietf.org/html/rfc4824).

Toda to bo še en pouk. In ker so prvi poskusi pokazali, da bo skakalna vtičnica potrebovala pomembne spremembe, preden jo bo sistem AI prepoznal kot človeka, bo morda trajalo nekaj časa.

Rad bi vas opozoril na naslednje navodilo: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, kjer je opisan robot za iskanje predmetov s kombinacijo Raspberry Pi in Google Coral TPU.

Priporočena: