Sisällysluettelo:

Kuuluva hyppytanko, Google Coral TPU Accelerator -versio: 4 vaihetta
Kuuluva hyppytanko, Google Coral TPU Accelerator -versio: 4 vaihetta

Video: Kuuluva hyppytanko, Google Coral TPU Accelerator -versio: 4 vaihetta

Video: Kuuluva hyppytanko, Google Coral TPU Accelerator -versio: 4 vaihetta
Video: Hubble - 15 years of discovery 2024, Marraskuu
Anonim
Kuuluva hyppytanko, Google Coral TPU Accelerator -versio
Kuuluva hyppytanko, Google Coral TPU Accelerator -versio
Kuuluva hyppytanko, Google Coral TPU Accelerator -versio
Kuuluva hyppytanko, Google Coral TPU Accelerator -versio
Kuuluva hyppytanko, Google Coral TPU Accelerator -versio
Kuuluva hyppytanko, Google Coral TPU Accelerator -versio

Se liikuttaa raajojaan, kuuntelee tilauksiasi, sitä ohjaa uusin koneoppimistekniikka

"Hearing Jumping Jack" on yksinkertainen sähkömekaaninen hyppytanko, jota käyttävät kaksi mikropalvelua ja hyvin yksinkertainen vaihde, ja LEDit ovat "silmiä". Sitä ohjataan yksinkertaisilla äänikomennoilla, jotka osoittavat, mikä yhdeksästä ennalta määritetystä asennosta sen on otettava, tai onko LED -valon kytkettävä päälle tai pois, tai jos sen on suoritettava ennalta määritetty "tanssi" tai satunnainen liike.

Järjestelmän ydin on Google Coral TPU -kiihdytin, jonka avulla Tensorflow Lite -malleja voidaan käyttää offline -tilassa erittäin suurella nopeudella jopa "heikolla" tietokoneella, kuten Raspberry Pi. Tämä mahdollistaa mm. nopeaa objektien tunnistamista ja luokittelua RPi-kameralla, mutta myös koneoppimiseen perustuvien puheentunnistustoimintojen suorittamista paikallisesti.

Tietääkseni tämä on ensimmäinen julkaistu esimerkki Coral Accelerator -äänentunnistusohjatusta fyysisestä DIY-laitteesta, ja liitteenä olevaa koodiesimerkkiä voidaan käyttää myös muihin monimutkaisempiin projekteihin.

Ääniohjaus perustuu esimerkkiin "kuulo käärme" "projektin avainsanatarkkailijassa" (https://github.com/google-coral/project-keyword-spotter), joka julkaistiin äskettäin (syyskuussa 2019) GitHubissa. Minun kokoonpanossani järjestelmä koostuu Raspberry Pi 4: stä, joka on varustettu Adafruit 16 -kanavaisella servokoneella, Google Coral TPU Acceleratorilla ja verkkokameralla, jota käytetään tässä mikrofonina. Jumping Jack oli kuvattu aiemmin edellisessä ohjeessa, jossa Google Voice -paketti ajoi sitä äänikomentojen lukemiseen.

Edellisessä Google Voice Kit -versiossa oli kolme keskeistä rajoitusta: se riippui Googlen verkkopohjaisista puheentunnistuspalveluista ja asennus oli suhteellisen monimutkainen, se vaati jonkinlaisen painikkeen painamista ennen kuin voit antaa komennon, ja se oli vakava viive komennon sanomisen ja järjestelmän vastauksen välillä. Google Coral -kiihdyttimen käyttö lyhentää vastausaikaa sekunteihin, on riippumaton Internet -yhteydestä ja kuuntelee koko ajan. Joidenkin muutosten avulla voit käyttää sitä hallitsemaan paljon monimutkaisempia laitteita, kuten hyppypistoketta, robotteja tai autoja tai mitä tahansa, mitä voit rakentaa ja hallita Raspberry Pi: llä.

Nykyisessä versiossaan Avainsanatarkkailija ymmärtää noin 140 lyhyttä avainsanaa/avainsanaa, jotka on määritetty mukana tulevassa mallitiedostossa ("voice_commands_v0.7_egetpu.tflite") ja kuvattu erillisessä tarratiedostossa ("labels_gc2.raw.txt"). Vapaasti muokattavan tiedoston ("commands_v2_hampelmann.txt") määrittelemät skriptimme käyttämät avainsanat yhdistetään sitten virtuaalinäppäimistön näppäinpainalluksiin, esim. kirjaimille, numeroille, ylös/alas/vasemmalle/oikealle, crtl+c jne.

Sitten esim. Pygame.key -näppäintä käyttämällä nämä”näppäinpainallukset” luetaan ja niitä käytetään ohjaamaan, mitä toimintoja laite, tässä hyppyliitin, suorittaa. Meidän tapauksessamme tämä tarkoittaa kahden servon ajamista ennalta määritettyihin asentoihin tai LED -valojen sytyttämistä tai sammuttamista. Koska avainsanan havaitsija toimii erillisessä kulutuspinnassa, se voi kuunnella tilauksiasi jatkuvasti.

Versio 21. syyskuuta 2019

Tarvikkeet

Vadelma Pi 4, Pimoronin kautta

Google Coral TPU Accelerator, Mouser Saksan kautta, 72 €

Adafruit 16 Servo Bonnet, Pimoronin kautta, noin 10 €

www.adafruit.com/product/3416

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

Pinoajan otsikko (tarvittaessa)

www.adafruit.com/product/2223

4x AA-paristo (tai muu 5-6V virtalähde) Servo-konepellille

Vanha verkkokamera, mikrofonina

Servo -ohjattu hyppytanko, kuten on kuvattu edellisessä ohjeessa. Asettelupiirustukset on liitetty seuraavaan vaiheeseen, mutta ne saattavat vaatia säätöjä.

Tarvittavat osat hyppytangolle:

- 3 mm Forex -levy

- 2 mikropalvelua

- 2 ja 3 mm ruuvit ja mutterit

- 2 valkoista LEDiä ja vastus

- vähän kaapelia

Vaihe 1: Laitteen määrittäminen

Laitteen asentaminen
Laitteen asentaminen
Laitteen asentaminen
Laitteen asentaminen
Laitteen asentaminen
Laitteen asentaminen

Jos haluat rakentaa hyppytangon, noudata edellisessä ohjeessa annettuja ohjeita. Käytin Forexia prototyypissäni, mutta voit käyttää laserleikattuja akryyli- tai vanerilevyjä. Saatat joutua säätämään asettelua servojesi koon jne. Mukaan. Testaa, voivatko raajat ja vaihde liikkua ilman kitkaa.

Määritä Raspberry Pi. Coral Github -sivustolla on saatavana Raspian -kuva, joka sisältää kaiken tarvittavan Coral -kiihdyttimen käyttämiseksi Pi: llä ja sisältää paljon projekteja, joissa kaikki asetukset ovat jo valmiina.

Hanki projektin avainsanatarkkailija Google Coral GitHub -sivulta. Asenna kaikki tarvittavat ohjelmistot ohjeiden mukaan.

Asenna mukana toimitetut tiedostot. Aseta hyppypistoke -python -skripti projektin avainsanatarkkauskansioon ja vastaavat komentojen tiedostot määritysten alikansioon.

Kiinnitä Adafruit Servo konepelti Pi: hen. Koska käytän RPI -koteloa tuulettimella, jouduin käyttämään GPIO -pinoja (esim. Saatavana Pimoronilta) yhteyden muodostamiseksi. Asenna kaikki tarvittavat kirjastot servokoneen Adafruit -ohjeiden mukaisesti.

Kiinnitä 5-6 V: n virtalähde servokoneeseen. Kiinnitä servot ja LEDit. Käytin tapauksessani porttia 0 LEDeille ja portteja 11 ja 15 servoille.

Jos haluat tarkistaa kaiken, suosittelen kokeilemaan projektin avainsanan havaitsijan "kuulokäärme" -esimerkkiä ja Adafruit -servokonepellin esimerkkejä.

Vaihe 2: Hyppytangon käyttäminen

Jos kaikki osat on asennettu ja toimivat, yritä käyttää niitä. Voit suorittaa komentosarjan IDE: ssä tai komentoriviltä.

Huutamalla "asema 0" "asentoon 9" herättää hyppypistokkeen ottamaan jonkin ennalta määritetyistä paikoista. Määritin "1" molempina käsivarsina ylös (uu), "3" vasen ylös, oikea alas (ud), "9" molempina käsivarsina alas (dd) ja "5" molempien käsivarsien keskelle (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" on sama kuin "5". Avainsanan havaitsija ei tunnista "3" ja "8" kovin hyvin, ja ne on ehkä toistettava.

Joudut ehkä säätämään minimi- ja maksimiarvoja kullekin servolle/sivulle, jotta servot eivät tukkeudu ja sitten liikaa virtaa.

"seuraava peli" aloittaa "tanssin" eli määritellyn asemasarjan, kun taas "satunnaispeli" aloittaa hyppypisteen suorittamaan satunnaisen liikesarjan. Molemmissa tapauksissa ne toimivat ikuisesti, joten sinun on ehkä lopetettava liikkeet, esim. "position zero" -komennolla.

"stop game" herättää "ctrl + c" ja pysäyttää prosessin.

"päälle" ja "pois päältä" voidaan kytkeä LED -valot päälle ja pois.

Muuttamalla time.sleep -arvoja voit säätää liikkeiden nopeutta.

Vaihe 3: Koodi ja komentotiedosto

Tässä esitetty koodi on muunnos "kuulokäärme" -koodista, joka on osa projektin avainsanatarkkailupakettia. Poistin juuri kaiken, mikä ei ollut välttämätöntä sovellukselleni, ilman todellista ymmärrystä yksityiskohdista. Kaikki parannukset ovat tervetulleita.

Lisäsin sitten Adafruit Servo Bonnetiin tarvittavat osat niiden esimerkkitiedostojen perusteella.

Haluan kiittää molempien osien ohjelmoijia.

Koodi löytyy tiedostona liitteenä. Käytä sitä omalla riskilläsi, muokkaa sitä, paranna sitä, leiki sen kanssa.

# 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 # # 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" PERUSTA, # ILMAN TAKUITA TAI MITÄ MITÄÄN EHDOTTA, joko nimenomaisia tai epäsuoria. # Katso lisenssistä käyttöoikeuksia ja # rajoituksia koskevat kielet. from _future_ import absoluuttinen_tuonti _future_ tuontiosastolta _future_ tuonti tulosta_toiminto tuonti argparse tuonti os satunnaisesta tuonnista randint from threading tuonti Langan tuonti aika edgetpu.basic.basic_engine tuonti BasicEngine tuontimalli tuonti pygame pygame.locals tuonti * tuontijono satunnaisesta tuonnista randrange alkaen 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) # sarjanumero kanavista #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #ylös, keskelle ja alas vasemman ja oikean käsivarren asetukset ylös_l = 35 md_l = 90 dn_l = 160 ylös_r = 160 md_r = 90 dn_r = 35

lft = 15 # servoportin numero, vasen servo (0-8)

rgt = 11 # servoportin lukumäärä, oikea servo (0-8) led_channel_0 = hat.channels [0] # LED asetettu porttiin 0 led_channel_0.duty_cycle = 0 # sytytä LED 100% # luettelo käsivarren asetuksista yhdeksän asennon asentoon = [(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)] # määrittää 9 JumpingJack-asentoa, jotka on merkitty kokonaislukuilla 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 "tanssi" -luokan ohjain (objekti): #Callback -toiminto def _init _ (self, q): self._q = q def callback (self, 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 = True return True def on_event (itse, tapahtuma): if event.type == pygame. QUIT: self._running = False def JumpingJack0 (self, keys): # ohjaa Jumping Jackia, avainsanat: "position x" key = int (avaimet) p = position [avain] a = p [0] b = p [1] tulosta ("Sijainti:", näppäin, "vasen /oikea: ", a,"/", b," aste ") # sys.stdout.write (" Sijainti: ", näppäin," vasen/oikea: ", a,"/", b," aste ") kit.servo [lft].särmä = paketti.servo [rgt].kulma = b aika.unen (0,1) def JumpingJack1 (itse): # ohjaa Jumping Jack dancea, avainsana: "seuraava peli" dnce = dance1 sp = (len (dnce)) r: lle alueella (sp): #asentojen tanssijärjestys, sp vaiheet dc = dnce [r] jos (dc ei ole alueella (10)): # print ("syöttövirhe paikassa", sp) dc = 4 p = sijainti [dc] a = p [0] b = p [1] pakki.servo [lft]. kulma = sarja. palvelu [rgt]. kulma = b aika.unen (0,25) # asettaa nopeuden liikkeiden def JumpingJack2 (itse, näppäimet): # säätimet Jumping Jack LEDit, avainsanat: "päälle/pois" led = int (näppäimet) jos led == 1: led_channel_0.duty_cycle = 0xffff #kytke LED 100% time.sleep (0.1) jos led == 0: led_channel_0.duty_cycle = 0 # sammuta LED time.sleep (0,1) jos led == 2: # vilkkuu led_channel_0.duty_cycle = 0xffff #kytke LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #sytytä LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #päälle LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #sytytä LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #kytke LED 100% time.sleep (0,1) def JumpingJack3 (itse)): # säätimet Jumping Jack dance, avainsana: "satunnainen peli" # h: lle alueella (10): dr = randrange (9) p = sijainti [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # asettaa liikkeen nopeuden def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic ei ole mikään muu 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 (itse, args):

jos ei self.on_init (): self._running = False q = model.get_queue () self._controler = Controller (q) jos ei args.debug_keyboard: t = Thread (target = self.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 (Totta, 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. JumpingJack0 (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) tai 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]) tai item == " up ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) tai item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) tai item == "0": self. JumpingJack0 (0) if (args.debug_keyboard and keys [pygame. K_1]) tai item == "1": self. JumpingJack0 (1) if (args. debug_näppäimistö ja näppäimet [pygame. K_2]) tai kohde == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) tai item == "3": self. JumpingJack0 (3) if (args.debug_keyboard and keys [pygame. K_4]) tai item == "4": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_5]) tai 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]) tai 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]) tai item == "9": self. JumpingJack0 (9) jos (args.debug_näppäimistö ja näppäimet [pygame. K_a]) tai item == "d": self. JumpingJack1 () #tanssijack, "next_game" if (args. debug_näppäimistö ja näppäimet [pygame. K_j]) tai item == "j": self. JumpingJack2 (0) #LED on, ON " switch_on "if (args.debug_keyboard and keys [pygame. K_k]) or item ==" k ": self. JumpingJack2 (1) #LED off, on" swithch off "if (args.debug_keyboard and keys [pygame. K_l]) tai item == "l": self. JumpingJack2 (1) #LED vilkkuu "kohde" if (args.debug_keyboard and keys [pygame. K_r]) tai item == "r": self. JumpingJack3 () #random dance "satunnainen peli" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Ohjaa JumpingJack näppäimistöllä. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Siellä on myös komento config -tiedosto "commands_v2_hampelmann.txt". Muokkaa haluamallasi tavalla. Se on vain luettelo "komento, avain, (vahvuus,)" yhdistelmistä, joka perustuu tarratiedostoon.

position_zero, 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, up, go_up, up, down_ down, down, go_down, alas, siirrä_taaksepäin, vasemmalle, siirrä_ eteenpäin, oikea, mene_taaksepäin, vasen, siirry eteenpäin, oikea, 0,8 kohde, l, mykistys, z, kyllä, y, ei, n, kytkin_on, j, kytke pois, k, äänenvoimakkuus ylös, ylös, äänenvoimakkuus alas, alas, seuraava_peli, d, satunnaispeli, r, aloituspeli, s, pysäytyspeli, ctrl+c,

Vaihe 4: Muita ideoita ja muita esimerkkejä

On aivan selvää, että tätä asetusta voidaan käyttää myös robottien tai muiden laitteiden ohjaamiseen. Pohjimmiltaan kaikki, mitä Raspberry Pi voi hallita.

Työskentelen käsikirjoituksen laajennuksen kanssa, jotta voin ohjata MeArmia, ja toivon voivani esitellä tämän lokakuussa 2019.

Harkitsen myös Jumping Jackin käyttämistä semaforina ja "project posenet" -raajan asennon tunnistusohjelmaa työkaluna Jumping Jackin asentojen lukemiseen ja kääntämiseen takaisin numeroksi. Tällä tavalla se voi jopa kommunikoida tekstiä, koska 2x 8 paikkaa voi ilmaista 64 eri numeroa, enemmän kuin tarpeeksi aakkosille, numeroille ja merkeille. Tämä voisi mahdollistaa, vaikkakin hieman muokatun, fyysisen toteutuksen ehdotetulle IETF: lle "IP -datagrammien lähettäminen Semaforilippujärjestelmän (SFSS) kautta" (https://tools.ietf.org/html/rfc4824).

Mutta tämä on toinen opettavainen. Ja kuten ensimmäiset kokeet osoittivat, että hyppyliitin vaatii merkittäviä muutoksia, ennen kuin tekoälyjärjestelmä tunnistaa sen ihmiseksi, saattaa kestää jonkin aikaa.

Haluan kiinnittää huomionne seuraavaan ohjeeseen: Objektin etsintä-henkilökohtainen avustaja-robotti-Ft-Vadelma, jossa kuvataan kohteen etsintärobotti, joka käyttää Raspberry Pi: n ja Google Coral TPU: n yhdistelmää.

Suositeltava: