Sisällysluettelo:

Kuulokoje, Google Coral TPU -kiihdytin: 3 vaihetta
Kuulokoje, Google Coral TPU -kiihdytin: 3 vaihetta

Video: Kuulokoje, Google Coral TPU -kiihdytin: 3 vaihetta

Video: Kuulokoje, Google Coral TPU -kiihdytin: 3 vaihetta
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Marraskuu
Anonim
Hearing MeArm, Google Coral TPU -kiihdytin
Hearing MeArm, Google Coral TPU -kiihdytin
Hearing MeArm, Google Coral TPU -kiihdytin
Hearing MeArm, Google Coral TPU -kiihdytin
Hearing MeArm, Google Coral TPU -kiihdytin
Hearing MeArm, Google Coral TPU -kiihdytin
Hearing MeArm, Google Coral TPU -kiihdytin
Hearing MeArm, Google Coral TPU -kiihdytin

Seuraavassa haluaisin kuvata MeArmin ääniohjattua versiota, pientä xyz-robottivartta, jossa on tarttuja. Käytin MIME-teollisuuden MeArm Pi -laitetta, mutta järjestelmän pitäisi olla sovellettavissa kaikkiin MeArmin versioihin tai vastaaviin servokäyttöisiin laitteisiin.

Google Coral TPU Acceleratorin avulla voit ajaa nopeita offline -TensorFlow -äänentunnistusskriptejä Raspberry Pi -laitteella ja hallita täten fyysisiä laitteita puhuttujen tilausten avulla, ja niiden viive on alle sekunti.

Tässä kuvattu laite on yhdistelmä ja laajennus kahdessa edellisessä ohjeessa kuvatuista käsitteistä. Se on jatkoa aiemmin kuvatulle Google Coral -ääniohjaukselle, Jumping Jackille, ja tässä kuvatulle Google AIY -ääniohjatun MeArmin suurelle parannukselle.

Ääniohjattu MeArm, joka käytti Google Voice AIY -järjestelmää, vaati verkkokäyttöä, ei ollut helppo toteuttaa, se tarvitsi painikkeen painalluksen äänikomentojen kuuntelun aktivoimiseksi ja sillä oli pitkä viive. Google Coral TPU Accelerator mahdollistaa nyt TensorFlowLite -mallien käytön offline -tilassa suurella nopeudella Raspberry Pi -laitteella tai muilla Linux -laitteilla. Google Coral Github -sivun esimerkkien joukossa on esimerkki nimeltä "kuulokäärme" puheentunnistusjärjestelmälle, joka ymmärtää 140 avainlauseketta (syyskuu 2019), jotka sitten yhdistetään virtuaalisiin näppäinpainalluksiin. Näiden näppäinpainallusten yhdistäminen joidenkin Pythonissa ohjelmoitujen toimintojen kanssa mahdollistaa äänikomento -ohjattavan laitteen rakentamisen. Olin äskettäin kuvannut ensimmäisen toteutuksen, ääniohjatun sähkömekaanisen hyppypistokkeen. Toteutus tässä on hieman monimutkaisempi ja mahdollistaa MeArmin kaikkien neljän servon ohjaamisen joko siirtää MeArmia jatkuvasti tai siirtää sen ennalta määritettyyn joukkoon tai suorittaa monimutkaisempia tehtäviä.

Käyttämällä tässä annettua komentosarjaa esimerkkinä muiden ääniohjattujen laitteiden, esim. robottiautot tai avustavat tekniset yksiköt.

Tarvikkeet

  • MeArm. Käytetään täällä: MIME Industriesin MeArm Pi
  • Raspberry Pi 4
  • Google Coral TPU Accelerator
  • Adafruit 16 -kanavainen servokone
  • joitakin hyppyjohtoja
  • valinnainen: kondensaattori servokoneelle, noin 400 µF 4 servolle (Adafruit suosittelee)
  • 5-6 V virtalähde servokoneelle. Käytin täällä vanhaa 6V laturia, 4x AA -akku toimii myös
  • Mikrofoni. Käytin mikrofonina vanhaa Microsoft HD3000 -verkkokameraa.

Vaihe 1: Järjestelmän asennus

Järjestelmän asentaminen
Järjestelmän asentaminen
Järjestelmän asentaminen
Järjestelmän asentaminen

Lataa Google Coral TPU Acceleratorin esikonfiguroitu Raspian -kuva Google Coral Github -sivulta ja asenna se µSD -kortille. Kuva sisältää myös useita esimerkkiskriptejä. Aseta Pi ohjeiden mukaan.

Asenna esimerkkiavainsanojen paikannin Google Coral GitHub -sivustolta, jos se ei sisälly kuvaan, ja kaikki tarvittavat ohjelmat. Kiinnitä mikrofoni Pi: hen. Suosittelen pelaamaan "Hearing Snake" -esimerkin kanssa varmistaaksesi, että kaikki toimii.

Lataa ja asenna Adafruit 16 -kanavainen konepeltiohjelmisto tässä kuvatulla tavalla. Asenna konepelti ja pelaa Adafruit -esimerkkien avulla varmistaaksesi, että kaikki toimii oikein.

Lataa tähän ohjeeseen liitetyt tiedostot ja kopioi ne "Project Keyword Spotter" -kansioon. Tiedosto "commands_v1_MeArm.txt" on kopioitava "config" -alikansioon.

Liitä MeArmin servot servokoneeseen kuvatulla tavalla. Käytin porttia 15 ylös/alas, porttia 11 eteenpäin/taaksepäin, porttia 7 käännökseen ja porttia 3 tarttujan servoihin.

Skriptin sisällä sinun on ehkä säädettävä kunkin servon min/center/max -arvot kokoonpanollesi. Nämä asetukset auttavat välttämään servojen vaurioitumisen. Saatat joutua myös muuttamaan sisällytettyjä "kantoja", "kuljetus1" ja "kuljetus2" -luetteloita.

Suorita komentosarja. Toistaiseksi olen käyttänyt sitä IDE: stä.

Jos haluat muokata tiettyjä toimintoja herättäviä avainlauseita tarpeen mukaan.

Järjestelmän viiveaika on noin 1 sekunti, mutta riippuu paljon suoritettavista toiminnoista. Joissakin tapauksissa avainvaihe on toistettava, tunnistuksen tarkkuus ei ole aina 100%.

Vaihe 2: Laitteen käyttö

Jos kaikki on määritetty ja tarkistettu, voit käynnistää laitteen.

Nykyinen rajoitus on, että annettu käsky suoritetaan toistuvasti niin kauan kuin sitä ei pysäytetä (käyttämällä "pysäytyspeliä") tai annetaan toinen käsky. Monimutkaiset monimutkaiset tehtävät, esim. "transport1" (ilmaisu "käynnistää peli") suoritetaan aina viimeiseen vaiheeseen.

Joten "käänny oikealle" laite liikkuu pienin askelin oikealle, kunnes se pysähtyy tai asetettu maksimiarvo saavutetaan. "Käynnistä peli", "Seuraava peli" tai "Käynnistä_video" aloittaa sarjan liikkeitä, jotka määritellään luetteloilla, jotka sisältävät kunkin servon asetukset tietyssä vaiheessa. "satunnainen peli" on laite hypätä yhdestä toiseen, valittu satunnaisesti asetusluettelosta.

Kuten saatat nähdä oheisesta videosta, olin rakentanut LEGOsta diabolon muotoisen esineen, jonka MeArm voi noutaa ja joka voidaan kuljettaa paikasta toiseen ennalta määrätyillä liikkeillä. Voit määrittää omat toiminnot muokkaamalla "kuljetus1" - tai "kuljetus2" -luetteloita.

Vaihe 3: Käsikirjoitus

Tässä lueteltu käsikirjoitus on muutos "Hearing Snake" -esimerkistä "Project Keyword Spotter" -ohjelmasta. Esimerkki on riisuttu minimiin, sitten lisätty servojen käyttöosa Adafruit -konepellin ohjelmiston ja esimerkkien perusteella.

Käsikirjoitusta ei ole vielä optimoitu. Käytä omalla vastuullasi, muokkaa ja optimoi.

Python-komentosarjan lisäksi on komennot-tiedosto ja käytetty tarratiedosto. Aseta se config-alikansioon.

Kuten aiemmin mainittiin, komentosarjan mukauttaminen erityistä MeArmia tai jotakin muuta laitetta varten saattaa edellyttää useita parametrien säätöjä.

# Tekijänoikeus 2019 Google LLC#

# Lisensoitu Apache -lisenssillä, versio 2.0 ("lisenssi"); # et saa käyttää tätä tiedostoa muuten kuin lisenssin mukaisesti. # Voit hankkia kopion lisenssistä osoitteessa # # 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 # # Ellei sovellettava laki sitä edellytä tai siitä ei ole kirjallisesti sovittu, lisenssin nojalla jaettu ohjelmisto # jaetaan sellaisenaan, # ILMAN TAKUITA TAI EHDOT KAIKKI, joko nimenomaiset tai epäsuorat. # Katso lisenssistä käyttöoikeuksia ja # rajoituksia koskevat kielet. # tohtori H. muutti MeArmin toteutusta varten alkuperäistä "kuulo_käärme" -koodia. '' 'Ohjeet Toteutuksessani käytetään Raspbery Pi 4: tä, johon on liitetty Google Coral -kiihdytin ja Adafruit 16 -kanavainen servokone. MeArmin (MIME -teollisuus) servot kiinnitettiin konepellin portteihin 3, 7, 11 ja 15. Katso lisätietoja "Hearing MeArm" -ohjeesta. Komennot: "sijainti x", x = 0 - 9, siirtää laitteen tiettyyn ennalta määritettyyn asentoon. "liikkua/mennä ylös", "liikkua/laskea alas", "mennä/kääntyä eteenpäin", "mennä/kääntyä taaksepäin", "kääntyä/mennä vasemmalle" ja "kääntyä/mennä oikealle" herättävät hitaasti, asteittain suuntaan, "pysäytä peli" pysäyttää liikkeet. "Avaa välilehti" ja "Sulje välilehti" avaa tai sulkee tarttujan. "Käynnistä video" saa laitteen seuraamaan esiasetettua sijaintijärjestystä, joka määritetään luettelon "sijainnit". "satunnainen peli" johtaa satunnaiseen liikemalliin, "lopeta peli" lopettaa sen. "Käynnistyspeli" aloittaa uuden liikesarjan, joka on ennalta määritelty luettelolla "transport1", "seuraava peli" käänteinen toiminto, joka on ennalta määritelty "transport2" Käytä omalla vastuullasi. '' '_tulevaisuudesta tuonti absoluuttinen_tuonti _tulevaisuudesta _ tuontiosasto _ _ tulevaisuudesta _ tuonti tulostus_toiminto tuonti argparse tuonti osittain satunnaisesta tuonnista satunnainen tuonti satunnaisesta tuonnista satunnainen tuonti satunnaisesta tuonnista satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnainen tuonti satunnaisesta tuonnista satunnainen tuonti satunnainen tuonti satulan tuonti langan tuonnin aika edgetpu.basic.basic_engine tuonti satunnainen tuonti satunnaisesti tuonti adafruit_servokit tuonti ServoKit tuontilevy tuonti busio tuonti adafruit_pca9685 tuontiaika i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanavat = 16) # aseta kanavien lukumäärä # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, keskikohta ja maksimiasetukset up_l = 145 # servo ylös/alas: ylös md_l = 95 dn_l = 45 ylös_r = 135 # servo eteen/taakse md_r = 90 dn_r = 50 ri_t = 30 # kääntyvä varsi oikealle tai vasemmalle: oikea asento md_t = 90 # kääntövarsi oikealle tai vasemmalle: keskiasento le_t = 150 op_g = 65 # tarttuja auki md_g = 90 # tarttuja keskitetty cl _g = 130 # tarttuja kiinni vert = 15 # servoportin lukumäärä, servo ylös/alas forw = 11 # servoportin lukumäärä, eteenpäin/taaksepäin liikkuva servokääntö = 7 # servoportti servopidikkeen kääntämiseen = 3 # servoportti pitoon servo #list of arm settings for yhdeksän asentoa position = [(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äärittää 10 perusasentoa, jotka ilmaistaan kokonaisluvuilla 0-9 # siirtotoimenpiteet [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), #kohde (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)]

kuljetus2 = [(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)]

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

#siirtämällä MeArm nolla -asemaan status = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. kulma = tila [2] sarja.servo [ote]. kulma = tila [3] tulostus (tila) luokka Ohjain (objekti): #Callback -toiminto def _init _ (itse, q): self._q = q def callback (itse, command): self._q.put (command) class App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = Todellinen paluu True def on_event (itse, tapahtuma): if event.type == pygame. QUIT: self._running = False def MeArmPos (self, keys): # ajaa MeArmin esiasetettuihin paikkoihin, avainsanat: "position x" key = int (avaimet) p = position [key] a = p [0] b = p [1] c = p [2] d = p [3] print ("Asemat:", avain, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "astetta") tila = [a, b, c, d] # asiakirjan nykyinen tila tulosta (tila) # sys.stdout.write ("Sijainti: ", avain," vasen/oikea: ", a,"/", b," aste ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # ohjaa MeArm -tanssia, avainsana: "start_video" dnce = dance1 sp = (len (dnce)) r: lle alueella (sp): #asentojen tanssijärjestys, sp askeleet dc = dnce [r] p = sijainti [dc] 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) # asettaa liikkeen nopeuden ajan. Nukkuminen (0,5) # tauko toimenpiteen lopussa def TransMeArm1 (itse): # hallitsee MeArm -kuljetusta 1, avainsana: "käynnistä peli" tr1 = transport1 sp = (len (tr1)) #laske r: n vaiheiden lukumäärä alueella (sp): #siirry mihin tahansa vaiheeseen p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3]. servo [vert].kallio = sarja. servo [forw]. liikkeen nopeus aika. nukkuminen (0,5) def TransMeArm2 (itse): # ohjaa MeArm -tanssia, avainsana: "seuraava peli" tr2 = transport2 sp = (len (tr2)) r: lle alueella (sp): #asentojen tanssijärjestys, sp askeleet 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) # asettaa liikkeen nopeuden time.sleep (0.5) def RandomMoves (itse): # hyppää satunnaisesti ennalta määritettyjen paikkojen välillä, avainsana: "satunnainen peli" dr = randrange (9) # valitsee satunnaisesti sijainnin p = sijainti [dr] # lukee sijaintiparametrit 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]. kulma = d aika. nukkuminen (1) # asettaa liikkeen nopeuden def MoveUp (itse): # nostokahva pienin askelin u0 = tila [0] # luke nykyinen tila u1 = u0 + 5 # plus x astetta, jos (u1 > up_l): # testiä, jos ne eivät ylitä min/max -parametreja ylös ", tila) time.sleep (1) # asettaa nopeuden def MoveDown (itse): d 0 = tila [0] d1 = d0 - 5 # miinus x astetta, jos (d1 ylös_r): f1 = ylös_r kit.servo [forw].kulma = f1 # siirrä servotilaa [1] = f1 tulosta ("eteenpäin", tila) time.sleep (1) def MoveBack (itse): b0 = tila [1] b1 = b0 - 5 # miinus x astetta, jos (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo tila [2] = l1 tulostus ("vasen", tila) time.sleep (0,2) def MoveRight (itse): r0 = tila [2] r1 = r0 - 2 #miinus x astetta, jos (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # servo status [2] = r1 print ("oikea", tila) time.sleep (0.2) def OpenGrip (itse): kit.servo [grip].angle = op_g # aseta ote "auki" -asentoon: "open_tab" time.sleep (0.5) tila [3] = op_g def CloseGrip (itse): kit.servo [grip].angle = cl_g # aseta kahva "kiinni" -asentoon: " close_tab "time.sleep (0.5) tila [3] = cl_g def StopMove (itse): # ei tee mitään, mutta pysäyttää liikkeet print (" stop ", status) time.sleep (0.25) def spotter (self, args): moottori = BasicEngine (args.model_file) mic = args.mic jos args.mic on None else int (args.mic) model.classify_audio (mikrofoni, moottori, labels_file = "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): jos ei itse.on_init (): self._running = False q = model.get_queue () self._controler = Controller (q) if not args.debug_keyboard: t = Kierre (kohde = itse.spotter, args = (args,)) t.daemon = True t.start () item = -1 itsensä ollessa käynnissä: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (True, 0,1) paitsi jono. Empty: new_item = Ei mitään, jos new_item ei ole Ei mitään: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) tai item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) tai item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) tai item == "right": # käänny itse oikealle. MoveRight () if (args.debug_ke yboard ja näppäimet [pygame. K_LEFT]) tai item == "left": # käänny vasemmalle itse. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) or item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) tai item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) tai item == "b": # taaksepäin self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # eteenpäin self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) tai 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]) tai item == "s": # stop motion: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) or item == "0": self. MeArmPos (0) jos (args.debug_keyboard and keys [pygame. K_1]) tai item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) tai item == "2": self. MeArmPos (2) jos (args.debug_keyboard and keys [pygame. K_3]) tai se em == "3": self. MeArmPos (3) jos (args.debug_keyboard and keys [pygame. K_4]) tai item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) tai item == "5": self. MeArmPos (5) jos (args.debug_keyboard and keys [pygame. K_6]) tai item == "6": self. MeArmPos (6) if (args.debug_keyboard and avaimet [pygame. K_7]) tai item == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) tai item == "8": self. MeArmPos (8) if (args.debug_keyboard ja näppäimet [pygame. K_9]) tai item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) tai item == "d": self. DancingMeArm () #dancing MeArm, seuraavassa_pelissä, jos (args.debug_näppäimistö ja näppäimet [pygame. K_r]) tai item == "r": self. RandomMoves () #random dance "satunnainen peli" if (args.debug_keyboard and keys [pygame. K_j]) tai item == "j": self. TransMeArm1 () # kuljetuskohde: "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) tai item == "k": self. TransMeArm2 () # kuljetuskohteen käänteinen suunta: "next_game" '' 'if (args.debug_keyboard and avaimet [pygame. K_l]) tai item == "l": self. JumpingJack2 (1) #LED vilkkuu "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Käytä näppäimistöä MeArmin hallintaan.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = Sovellus () the_app.on_execute (args)

Suositeltava: