Sisukord:

Kuulmismeel, Google Coral TPU kiirendi: 3 sammu
Kuulmismeel, Google Coral TPU kiirendi: 3 sammu

Video: Kuulmismeel, Google Coral TPU kiirendi: 3 sammu

Video: Kuulmismeel, Google Coral TPU kiirendi: 3 sammu
Video: Ligipääsetavus, appi! Mis see on? Veebiseminar 2024, Juuli
Anonim
Kuulmismeel, Google Coral TPU kiirendi
Kuulmismeel, Google Coral TPU kiirendi
Kuulmismeel, Google Coral TPU kiirendi
Kuulmismeel, Google Coral TPU kiirendi
Kuulmismeel, Google Coral TPU kiirendi
Kuulmismeel, Google Coral TPU kiirendi
Kuulmismeel, Google Coral TPU kiirendi
Kuulmismeel, Google Coral TPU kiirendi

Järgnevalt tahaksin kirjeldada MeArmi häälega juhitavat versiooni, mis on väike haaratsiga xyz-robotkäsi. Kasutasin MIME tööstusharude MeArm Pi, kuid süsteem peaks olema rakendatav mis tahes MeArmi versiooni või sarnaste servoajamiga seadmete jaoks.

Google Coral TPU kiirendi kasutamine võimaldab Raspberry Pi -l käivitada kiireid võrguühenduseta TensorFlow häältuvastusskripte ja seeläbi hallata füüsilisi seadmeid suuliste korralduste abil, latentsusaeg on alla ühe sekundi.

Siin kirjeldatud seade on kombinatsioon ja laiendus kahes eelmises juhendis kirjeldatud mõistetest. See on Google Corali hääljuhtimise varasema rakenduse laiendus, siin kirjeldatud Jumping Jack ja siin kirjeldatud Google'i AIY hääljuhtimisega MeArmi tohutu täiustamine.

Hääljuhtimisega MeArm, mis kasutas Google Voice AIY süsteemi, nõudis võrguühendust, seda polnud lihtne rakendada, see pidi vajutama nuppu, et aktiveerida häälkäskluste kuulamine, ja sellel oli pikk latentsusaeg. Kasutatav Google Coral TPU kiirendi võimaldab nüüd TensorFlowLite mudeleid suure kiirusega võrguühenduseta käivitada Raspberry Pi või muudes Linuxi seadmetes. Google Coral Githubi lehel olevate näidete hulgas on näide nimega "kuulmismadu" häältuvastussüsteemi jaoks, mis suudab mõista 140 võtmefraasi (september 2019), mis seejärel kaardistatakse virtuaalsete klahvivajutustega. Nende klahvivajutuste sidumine mõne Pythonis programmeeritud funktsiooni täitmisega võimaldab luua häälkäsklusega juhitava seadme. Olin hiljuti kirjeldanud esimest rakendust, hääljuhtimisega elektromehaanilist hüppetõket. Siinne rakendus on natuke keerulisem ja võimaldab juhtida kõiki nelja MeArmi servot, et MeArmi pidevalt liigutada või lasta see liikuda mitmele eelnevalt määratud ametikohtadel või mõne keerukama ülesande täitmiseks.

Kasutades näitena siin toodud skripti, peaks teiste hääljuhtimisega seadmete, nt. robotiautod või tehnilised abiseadmed.

Tarvikud

  • MeArm. Siin kasutatakse: MeArm Pi firmast MIME Industries
  • Vaarika Pi 4
  • Google Coral TPU kiirendi
  • Adafruit 16 kanaliga servokangas
  • mõned hüppajakaablid
  • valikuline: servokapoti kondensaator, umbes 400 µF 4 servo jaoks (soovitab Adafruit)
  • 5-6 V toiteallikas servo kapoti jaoks. Ma kasutasin siin vana 6V laadijat, 4x AA aku töötab samuti
  • Mikrofon. Kasutasin mikrofonina vana Microsoft HD3000 veebikaamerat.

Samm: süsteemi seadistamine

Süsteemi seadistamine
Süsteemi seadistamine
Süsteemi seadistamine
Süsteemi seadistamine

Laadige Google Coral Githubi lehelt alla Google Coral TPU kiirendi jaoks eelseadistatud Raspiani pilt ja installige see µSD -kaardile. Pilt sisaldab ka mitmeid näidiskripte. Seadistage Pi, nagu näidatud.

Installige näidis märksõnade otsija Google Coral GitHubi saidilt, kui see pole pildil, ja kõik vajalikud programmid. Kinnitage mikrofon Pi külge. Ma soovitaksin mängida näitega "Kuulev madu", et veenduda, kas kõik töötab.

Laadige alla ja installige Adafruit 16 kanaliga kapoti tarkvara, nagu siin kirjeldatud. Paigaldage kapott ja mängige Adafruuti näidetega, et kõik toimiks korralikult.

Laadige alla sellele juhendile lisatud failid ja kopeerige need kausta „Projekti märksõna otsija”. Fail "commands_v1_MeArm.txt" tuleb kopeerida alamkausta "config".

Ühendage oma MeArmi servod servo kapotiga, nagu näidatud. Kasutasin porti 15 üles/alla, porti 11 edasi/tagasi, porti 7 pöörde jaoks ja porti 3 haaratsi servode jaoks.

Skripti raames peate võib -olla kohandama iga servo min/kesk/max väärtusi oma konfiguratsiooniga. Need seaded aitavad vältida servode kahjustamist. Samuti peate võib -olla muutma lisatud loendeid "positsioonid", "transport1" ja "transport2".

Käivitage skript. Siiani olin seda käivitanud IDE -st.

Juhul, kui soovite vastavalt vajadusele muuta võtmefraase, mis kutsuvad esile teatud funktsiooni. Saadaolevate võtmesõnade täielik loetelu on konfiguratsiooni alamkausta failis "labels_gc2 raw.txt".

Süsteemi latentsusaeg on umbes 1 sekund, kuid sõltub suuresti sellest, milliseid toiminguid tehakse. Mõnel juhul tuleb võtmefaasi korrata, äratundmise täpsus ei ole alati 100%.

Samm: seadme kasutamine

Kui kõik on seadistatud ja kontrollitud, võite seadme käivitada.

Praegune piirang on see, et antud korraldus täidetakse korduvalt, kuni seda ei peatata (kasutades mängu "stopp") või antakse teine käsk. Keerulised mitmeastmelised ülesanded, nt. "transport1" (kutsub esile fraas "käivitusmäng") täidetakse alati viimase etapini.

Nii et "paremale keerates" liigub seade väikeste sammudega paremale, kuni see peatub või saavutatakse eelseadistatud maksimaalne väärtus. "käivitusmäng", "järgmine mäng" või "start_video" käivitab käigud, mis on määratletud loenditega, mis sisaldavad antud servo iga servo seadeid. "juhuslik mäng" on seade, mis liigub seadete loendist juhuslikult ühelt teisele sammule.

Nagu kaasnevast videost näete, ehitasin LEGO -st diabeoloo kujuga objekti, mille saab MeArm kätte ja mida saab ühest kohast teise etteantud liigutuste abil transportida. Saate oma funktsioone määratleda, muutes loendeid „transport1” või „transport2”.

3. samm: skript

Siin loetletud skript on modifikatsioon näitest "Kuulev madu" projektist "Märksõna märgaja". Näide on viidud miinimumini, seejärel lisati servode juhtimiseks mõeldud osa, tuginedes tarkvarale ja näidetele, mis olid ette nähtud Adafruit'i servokotile.

Skripti pole praeguseks optimeeritud. Kasutage omal vastutusel, muutke ja optimeerige julgelt.

Lisaks pythoni skriptile on käsud-fail ja kasutatud sildid-fail. Asetage see konfiguratsiooni alamkausta.

Nagu varem mainitud, võib teie spetsiaalse MeArmi või mõne muu seadme skripti kohandamiseks vaja minna mitmeid parameetrite kohandusi.

# Autoriõigus 2019 Google LLC#

# Litsentsitud Apache litsentsi versiooni 2.0 ("litsents") alusel; # te ei tohi seda faili kasutada, välja arvatud vastavalt litsentsile. # Litsentsi koopia saate aadressilt # # 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 # # Kui kohaldatav seadus seda ei nõua või pole kirjalikult kokku leppinud, levitatakse litsentsi alusel levitatavat tarkvara # "NAGU", ILMA GARANTIIDE JA TINGIMUSTEGA IGASUGUSED, kas otsesed või kaudsed. # Vaadake litsentsist litsentsist tulenevaid õigusi ja # piiranguid reguleerivat konkreetset keelt. # algset "kuulmis_mao" koodi muutis Dr H. MeArmi rakendamiseks. '' 'Juhised Minu rakenduses kasutatakse Raspbery Pi 4, millele on lisatud Google Coral kiirendi ja Adafruit 16 -kanaliline servokangas. MeArmi (MIME tööstus) servod kinnitati kapoti portide 3, 7, 11 ja 15 külge. Üksikasjade saamiseks vaadake juhendit "Hearing MeArm". Käsud: "positsioon x", x = 0 kuni 9, viib seadme etteantud asukohta. "liiguta/mine üles", "liigu/mine alla", "mine/pööra edasi", "mine/pööra tahapoole", "pööra/mine vasakule" ja "pööra/mine paremale" kutsuvad ette antud etapis aeglase, järkjärgulise liikumise suund, "peata mäng" peatab liigutused. "ava vaheleht" ja "sulge vaheleht" avab või sulgeb haaratsi. "video käivitamine" kutsub seadme üles järgima positsioonide eelseadistatud järjekorda, mis on määratletud loendi "positsioonidega". "juhusliku mängu" tulemuseks on juhuslik liigutuste muster, "lõpetage mäng" lõpetab selle. "käivitusmäng" alustab järjekordset liigutuste seeriat, mille on eelnevalt määratlenud loend "transport1", "järgmine mäng" vastupidine toiming, mis on eelnevalt määratletud kui "transport2". Kasutage omal vastutusel. '' '_future_ import absoluutne_import _future_ impordi osakonnast _future_ impordi print_funktsioon import argparse import os juhuslikust importimisest randint alates keermestamise impordist Lõime importimise aeg saidilt edgetpu.basic.basic_engine import BasicEngine'i impordimudeli importimise pygame saidilt pygame.locals import * impordijärjekord juhuslik import randrange alates adafruit_servokit import ServoKiti impordiplaadi import busio import adafruit_pca9685 impordi aeg i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanalid = 16) # seatud kanalite arv # komplekt.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, keskel ja max seaded up_l = 145 # servo üles/alla: üles md_l = 95 dn_l = 45 üles_r = 135 # servo edasi/tagasi md_r = 90 dn_r = 50 ri_t = 30 # pöörlev käsi paremale või vasakule: parem asend md_t = 90 # pöörlev käsi paremale või vasakule: keskmine asend le_t = 150 op_g = 65 # haarats avatud md_g = 90 # haaratsi keskele cl _g = 130 # haarats suletud vert = 15 # servopordi arv, servo üles/alla pööramine = 11 # servopordi arv, edasi/tagasi liikuv servopööre = 7 # servopesa servokäepideme pööramiseks = 3 # servoport haarde jaoks servo #käe seadistuste loend üheksa positsiooni jaoks positsioon = [(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, ri_t, op_g)), (dn_l, dn_r, le_t, md_g)] # määratleb 10 baaspositsiooni, mis on tähistatud täisarvudega 0-9 # transpordiprotseduurid [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), #saada 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)]

tants1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "tants"

#liigub MeArm nullpositsiooni olekus = [md_l, md_r, md_t, md_g] komplekt.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. nurk = olek [2] komplekt.servo [käepide].nurk = olek [3] print (olek) klass Kontrollija (objekt): #Callback function def _init _ (self, q): self._q = q def callback (self, käsk): ise. (ise, sündmus): if event.type == pygame. QUIT: self._running = Vale def MeArmPos (ise, võtmed): # juhib MeArmi eelseadistatud positsioonidele, märksõnad: "positsioon x" võti = int (võtmed) p = positsioon [võti] a = p [0] b = p [1] c = p [2] d = p [3] print ("Asendid:", võti, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "kraadi") olek = [a, b, c, d] # dokumendi praegune olek print (olek) # sys.stdout.write ("Position: ", võti," vasak/parem: ", a,"/", b," kraad ") komplekt.servo [vert].nurk = komplekt.servo [forw].nurk = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (ise): # juhib MeArmi tantsu, märksõna: "start_video" dnce = dance1 sp = (len (dnce)) r jaoks vahemikus (sp): #positsioonide tantsimise järjekord, sp sammud dc = dnce [r] p = positsioon [dc] a = p [0] b = p [1] c = p [2] d = p [3] komplekt.servo [vert].angle = komplekt.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # määrab liikumiskiiruse aja. Uni (0,5) # vaheaeg protseduuri lõpus def TransMeArm1 (ise): # juhib MeArmi transporti 1, märksõna: "käivitusmäng" tr1 = transport1 sp = (len (tr1)) #kalkuleerige r sammude arv vahemikus (sp): #minge mis tahes sammu juurde p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3]. servo [vert].nurk = komplekt.servo [forw].nurk = b komplekt.servo [pööre].nurk = c komplekt.servo [haare].nurk = d print (p) time.sleep (1) # komplekti liikumiskiirus time.sleep (0.5) def TransMeArm2 (ise): # juhib MeArm tantsu, märksõna: "järgmine mäng" tr2 = transport2 sp = (len (tr2)) r jaoks vahemikus (sp): #positsioonide tantsimise järjekord, sp sammud p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] komplekt.servo [vert].nurk = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # määrab liikumiskiiruse time.sleep (0,5) def RandomMoves (ise): # hüppab juhuslikult eelmääratud positsioonide vahel, märksõna: "juhuslik mäng" dr = randrange (9) # juhuslikult valib positsiooni p = positsioon [dr] # loeb positsiooni parameetreid a = p [0] b = p [1] c = p [2] d = p [3] komplekt.servo [vert].nurk = komplekt.servo [forw].nurk = b komplekt.servo [pööre].nurk = c komplekt.servo [käepide].nurk = d time.sleep (1) # määrab liikumiskiiruse def MoveUp (ise): # tõstehaarats väikeste sammudega u0 = olek [0] # praeguse oleku lugemine u1 = u0 + 5 # pluss x kraadi, kui (u1 > up_l): # katsetab, kui ei ületa min/max parameetreid üles ", olek) time.sleep (1) # määrab kiiruse def MoveDown (ise): d 0 = olek [0] d1 = d0 - 5 # miinus x kraadi, kui (d1 üles_r): f1 = üles_r komplekt.servo [forw].nurk = f1 # servo oleku teisaldamine [1] = f1 print ("edasi", olek) time.sleep (1) def MoveBack (ise): b0 = olek [1] b1 = b0 - 5 # miinus x kraadi, kui (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # servo olek [2] = l1 print ("vasak", olek) time.sleep (0,2) def MoveRight (ise): r0 = olek [2] r1 = r0 - 2 #miinus x kraadi, kui (r1 <ri_t): r1 = ri_t kit.servo [pööra].nurk = r1 # servo oleku liigutamine [2] = r1 print ("õige", olek) time.sleep (0.2) def OpenGrip (ise): kit.servo [grip].angle = op_g # seadke käepide "avatud" asendisse: "open_tab" time.sleep (0.5) olek [3] = op_g def CloseGrip (ise): kit.servo [grip].angle = cl_g # seadke käepide "suletud" asendisse: " close_tab "time.sleep (0.5) olek [3] = cl_g def StopMove (ise): # ei tee midagi, kuid peatab liigutused print (" stop ", status) time.sleep (0,25) def spotter (ise, args): mootor = BasicEngine (args.model_file) mic = args.mic kui args.mic on None else int (args.mic) model.classify_audio (mikrofon, mootor, sildid_fail = "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): kui mitte self.on_init (): self._running = False q = model.get_queue () self._controler = Kontrollija (q) kui mitte args.debug_keyboard: t = Lõng (sihtmärk = ise.spotter, args = (args,)) t.daemon = Tõeline t.start () üksus = -1 samas kui ise._jooks: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (True, 0,1), välja arvatud järjekord. Empty: new_item = Puudub, kui new_item ei ole Puudub: item = new_item if (args.debug_keyboard ja võtmed [pygame. K_ESCAPE]) või item == "stop": self._running = Vale # if (args.debug_keyboard ja võtmed [pygame. K_SPACE]) või item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) või üksus == "paremale": # pöörake paremale ise. MoveRight () if (args.debug_ke yboard ja klahvid [pygame. K_LEFT]) või üksus == "left": # pööra vasakule ise. MoveLeft () if (args.debug_keyboard ja klahvid [pygame. K_UP]) või item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) või item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) or item == "b": # tagurpidi self. MoveBack () if (args.debug_keyboard ja võtmed [pygame. K_F]) või item == "f": # edastab self. MoveForw () if (args.debug_keyboard ja võtmed [pygame. K_O]) või 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]) või item == "s": # stop motion: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) or 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]) või item == "2": self. MeArmPos (2) kui (args.debug_keyboard ja võtmed [pygame. K_3]) või see em == "3": self. MeArmPos (3) if (args.debug_keyboard ja võtmed [pygame. K_4]) või item == "4": self. MeArmPos (4) if (args.debug_keyboard ja klahvid [pygame. K_5]) või üksus == "5": self. MeArmPos (5) kui (args.debug_keyboard ja võtmed [pygame. K_6]) või item == "6": self. MeArmPos (6) if (args.debug_keyboard and võtmed [pygame. K_7]) või üksus == "7": self. MeArmPos (7) if (args.debug_keyboard ja võtmed [pygame. K_8]) või item == "8": self. MeArmPos (8) if (args.debug_keyboard ja võtmed [pygame. K_9]) või item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. DancingMeArm () #dancing MeArm, "järgmisel_mängul", kui (args.debug_keyboard ja klahvid [pygame. K_r]) või item == "r": self. RandomMoves () #random dance "juhuslik mäng" if (args.debug_keyboard and Klahvid [pygame. K_j]) või item == "j": self. TransMeArm1 () # transpordiobjekt: "lunch_game" if (args.debug_keyboard ja võtmed [pygame. K_k]) või item == "k": self. TransMeArm2 () # transpordiobjekti vastupidine suund: "järgmine_mäng" '' 'if (args.debug_keyboard ja võtmed [pygame. K_l]) või üksus == "l": self. JumpingJack2 (1) #LED vilgub "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Kasutage MeArmi juhtimiseks klaviatuuri.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args the_app = Rakendus () the_app.on_execute (args)

Soovitan: