Innholdsfortegnelse:

A Hearing Jumping Jack, Google Coral TPU Accelerator Versjon: 4 trinn
A Hearing Jumping Jack, Google Coral TPU Accelerator Versjon: 4 trinn

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator Versjon: 4 trinn

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator Versjon: 4 trinn
Video: The BEST Self-Hosted CCTV Solution With AI Object Detection? 2024, Juli
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

Den beveger lemmer, den lytter til bestillingene dine, den drives av den nyeste maskinlæringsteknologien

"Hearing Jumping Jack" er en enkel elektromekanisk Jumping Jack, drevet av to mikroservoer og et veldig enkelt utstyr, med lysdioder som "øyne". Den styres av enkle talekommandoer som angir hvilken av ni forhåndsdefinerte posisjoner den skal innta, eller om LED -en skal slås på eller av, eller om den skal utføre et forhåndsdefinert "dans" eller tilfeldig sett med trekk.

Kjerneelementet i systemet er Google Coral TPU -akselerator, som gjør det mulig å kjøre Tensorflow Lite -modeller offline med veldig høy hastighet, selv på en "svak" datamaskin som Raspberry Pi. Dette tillater f.eks. rask gjenkjenning og klassifisering av objekt ved bruk av RPi-kameraet, men også for å kjøre maskinlæringsbaserte stemmegjenkjenningsfunksjoner lokalt.

Så vidt jeg vet er dette det første publiserte eksemplet på en Coral Accelerator-stemmedeteksjon-drevet fysisk DIY-enhet, og det vedlagte kodeeksemplet kan også brukes til andre, mer komplekse prosjekter.

Stemmekontrollen er basert på eksemplet "hørselsslangen" i "prosjektets søkeord spotter" (https://github.com/google-coral/project-keyword-spotter) som nylig (september 2019) ble plassert på GitHub. I min konfigurasjon består systemet av en Raspberry Pi 4 utstyrt med en Adafruit 16 kanals servo panser, en Google Coral TPU Accelerator og et webkamera, her brukt som mikrofon. Jumping Jack hadde blitt beskrevet tidligere i en tidligere instruks, der den ble drevet av Google Voice -settet for å lese talekommandoer, er festet til Servo Bonnet i versjonen 2.0 beskrevet i det følgende.

Den forrige versjonen av Google Voice Kit hadde tre sentrale begrensninger: den var avhengig av Googles nettbaserte stemmegjenkjenningstjenester og oppsettet var relativt komplisert, det kreves å trykke på en slags knapp før du kunne gi en kommando, og det var en alvorlig forsinkelse mellom å si kommandoen og systemets respons. Bruk av Google Coral -akseleratoren reduserer responstiden til sekunder, er uavhengig av en internettforbindelse og lytter hele tiden. Med noen modifikasjoner kan du bruke den til å kontrollere enheter som er mye mer komplekse som en Jumping Jack, som roboter eller biler, eller hva du kan bygge og kontrollere med en Raspberry Pi.

I den nåværende versjonen forstår søkeordspotteren et sett med omtrent 140 korte søkeord/nøkkelfraser, definert i den medfølgende modellfilen (“voice_commands_v0.7_egetpu.tflite”) og beskrevet i en egen etikettfil (“labels_gc2.raw.txt”). Definert av en fritt modifiserbar fil (“commands_v2_hampelmann.txt”), blir nøkkelordene som brukes spesielt av skriptet vårt deretter kartlagt til tastetrykk på et virtuelt tastatur, f.eks. for bokstaver, tall, opp/ned/venstre/høyre, crtl+c, og så videre.

Da kan f.eks. ved hjelp av pygame.key, leses disse "tastetrykkene" og brukes til å kontrollere hvilke handlinger en enhet, her hoppekontakten, skal utføre. I vårt tilfelle betyr dette å kjøre de to servoene til forhåndsdefinerte posisjoner, eller å slå LEDene på eller av. Ettersom søkeordet spotter kjører i en egen slitebane, kan det lytte permanent til bestillingene dine.

Versjon 21. september 2019

Rekvisita

Bringebær Pi 4, via Pimoroni

Google Coral TPU Accelerator, via Mouser Tyskland, 72 €

Adafruit 16 Servo Bonnet, via Pimoroni, ca 10 €

www.adafruit.com/product/3416

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

Stablerhodet (hvis nødvendig)

www.adafruit.com/product/2223

4x AA batteripakke (eller annen 5-6V strømkilde) for Servo Bonnet

Gammelt webkamera, som mikrofon

Servodrevet Jumping Jack, som beskrevet i en tidligere instruks. Layouttegninger er vedlagt neste trinn, men kan kreve justeringer.

Nødvendige deler til Jumping Jack:

- 3 mm Forex -plate

- 2 mikroservoer

- 2 og 3 mm skruer og muttere

- 2 hvite lysdioder og en motstand

- litt kabel

Trinn 1: Konfigurere enheten

Sette opp enheten
Sette opp enheten
Sette opp enheten
Sette opp enheten
Sette opp enheten
Sette opp enheten

Følg indikasjonene i en tidligere instruksjon for å bygge Jumping Jack. Jeg brukte Forex for prototypen min, men du kan bruke laserskårne akryl- eller kryssfinerplater. Du må kanskje justere oppsettet i henhold til størrelsen på servoene etc. Test om lemmer og gir kan bevege seg uten friksjon.

Sett opp din Raspberry Pi. På Coral Github -siden er det et Raspian -bilde tilgjengelig som inneholder alt som kreves for å kjøre Coral -akseleratoren på Pi og inneholder mange prosjekter, med alle innstillinger allerede på plass.

Få prosjektet søkeord spotter fra Google Coral GitHub -siden. Installer all nødvendig programvare som angitt.

Installer de medfølgende filene. Plasser hopp -jack -python -skriptet i prosjektordets spotter -mappe og tilhørende kommandofil i konfigurasjonsundermappen.

Fest Adafruit Servo Bonnet til Pi. Siden jeg bruker et RPI -hus med en vifte, måtte jeg bruke GPIO -stablere (f.eks. Tilgjengelig fra Pimoroni) for å muliggjøre tilkobling. Installer alle nødvendige biblioteker, som angitt i Adafruit -instruksjonene for servo panseret.

Fest en 5-6V strømkilde til servo panseret. Fest servoer og lysdioder. I mitt tilfelle brukte jeg port 0 for lysdiodene og portene 11 og 15 for servoene.

For å sjekke alt, vil jeg anbefale å prøve prosjekt søkeordet spotter "hørsel slange" eksempel og Adafruit servo panseret eksempler først.

Trinn 2: Kjøre Jumping Jack

Hvis alle delene er satt opp og kjører, kan du prøve å bruke den. Du kan kjøre skriptet i IDE eller fra kommandolinjen.

Å rope "posisjon 0" til "posisjon 9" vil fremkalle Jumping Jack til å ta en av de forhåndsdefinerte posisjonene. Jeg definerte "1" som begge armer opp (uu), "3" som venstre opp, høyre ned (ud), "9" som begge armer ned (dd) og "5" som begge armer sentrert (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" er identisk med "5". "3" og "8" gjenkjennes ikke godt av søkeordet spotter og må kanskje gjentas.

Du må kanskje justere minimums- og maksimumsverdier for hver servo/side, slik at servoene ikke blir blokkert og deretter trekke for mye strøm.

"neste spill" vil starte "dansen", dvs. en definert sekvens av posisjoner, mens "tilfeldig spill" vil starte Jumping Jack for å utføre en tilfeldig sekvens av trekk. I begge tilfeller vil de løpe for alltid, så du må kanskje stoppe bevegelser, f.eks. med en "posisjon null" kommando.

"stoppspill" vil fremkalle en "ctrl + c" og stoppe prosessen.

"slå på" og "slå av" kan brukes for å slå LEDene på og av.

Ved å endre tid. Soveverdier kan du justere bevegelseshastigheten.

Trinn 3: Koden og kommandofilen

Koden som presenteres her er en modifikasjon av "hørende slange" -koden som er en del av prosjektet søkeord spotterpakke. Jeg fjernet nettopp alt som ikke var nødvendig for søknaden min, uten noen egentlig forståelse av detaljene. Eventuelle forbedringer er velkomne.

Jeg la deretter til delene som kreves for Adafruit Servo Bonnet, basert på deres eksempelfiler.

Jeg vil takke programmererne i begge deler.

Koden finner du vedlagt som fil. Bruk det på din egen risiko, endre det, forbedre det, lek med det.

# Copyright 2019 Google LLC

# # Lisensiert under Apache -lisensen, versjon 2.0 ("lisensen"); # du kan ikke bruke denne filen unntatt i samsvar med lisensen. # Du kan få en kopi av lisensen på # # https://www.apache.org/licenses/LICENSE-2.0 # # Med mindre det kreves av gjeldende lov eller skriftlig avtale, distribueres programvare # som distribueres under lisensen på en "AS IS" BASIS, # UTEN GARANTIER ELLER BETINGELSER FOR NOE SLAG, enten uttrykkelig eller underforstått. # Se lisensen for det spesifikke språket for tillatelser og # begrensninger under lisensen. fra _future_ import absolutt_import fra _future_ import divisjon fra _future_ import print_function import argparse import os fra tilfeldig import randint fra threading import Tråd import tid fra edgetpu.basic.basic_engine import BasicEngine import modell pygame fra pygame.locals import * import kø fra tilfeldig import randrange fra adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 import tid i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frekvens = 60 kit = ServoKit (kanaler = 16) # sett nummer av kanaler #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #opp, midt og ned innstillinger for venstre og høyre arm opp_l = 35 md_l = 90 dn_l = 160 opp_r = 160 md_r = 90 dn_r = 35

lft = 15 # antall servoport, venstre servo (0-8)

rgt = 11 # antall servoport, høyre servo (0-8) led_kanal_0 = hat.kanaler [0] # LED satt på port 0 led_kanal_0.drift_syklus = 0 #tenn LED 100% # liste over arminnstillinger for ni posisjoner posisjon = [(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)] # definerer 9 JumpingJack-posisjoner, angitt med heltall 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # en "dans" -klasse Kontroller (objekt): #Callback -funksjon def _init _ (self, q): self._q = q def callback (self, kommando): self._q.put (kommando) klasse 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): # controls Jumping Jack, keywords: "position x" key = int (keys) p = position [nøkkel] a = p [0] b = p [1] utskrift ("Posisjon:", nøkkel, "venstre /høyre: ", a,"/", b," grad ") # sys.stdout.write (" Posisjon: ", nøkkel," venstre/høyre: ", a,"/", b," grad ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # kontroller Jumping Jack dance, søkeord: "neste spill" dnce = dance1 sp = (len (dnce)) for r i område (sp): # dansende rekkefølge av posisjoner, sp trinn dc = dnce [r] hvis (dc ikke i område (10)): # print ("input error at position", sp) dc = 4 p = posisjon [dc] a = p [0] b = p [1] kit.servo [lft].angle = et kit.servo [rgt].angle = b time.sleep (0,25) # sett hastighet av bevegelser def JumpingJack2 (selv, nøkler): # kontroller Jumping Jack LED, søkeord: "slå på/av" led = int (nøkler) hvis led == 1: led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.1) hvis led == 0: led_channel_0.duty_cycle = 0 # slå av LED time.sleep (0.1) if led == 2: # blink led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #turn LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.1) def JumpingJack3 (self): # kontroller Jumping Jack dance, søkeord: "tilfeldig spill" # for h i rekkevidde (10): dr = randrange (9) p = posisjon [dr] a = p [0] b = p [1] kit.servo [lft].angle = et kit.servo [rgt].angle = b time.sleep (0,25) # setter bevegelseshastigheten def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic er Ingen andre 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):

hvis ikke self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) hvis ikke args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () element = -1 mens self._running: pygame.event.pump () hvis args.debug_keyboard: keys = pygame.key.get_pressed () else: prøv: new_item = q.get (Sant, 0,1) unntatt kø. Empty: new_item = Ingen hvis new_item ikke er None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) or item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) or 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_LEFT]) or item == "left": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_UP]) or item == " up ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) or item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) eller item == "0": self. JumpingJack0 (0) if (args.debug_keyboard and keys [pygame. K_1]) or item == "1": self. JumpingJack0 (1) if (args. debug_keyboard and keys [pygame. K_2]) or item == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) or item == "3": self. JumpingJack0 (3) if (args.debug_keyboard and keys [pygame. K_4]) or item == "4": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_5]) or 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_8]) or item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and keys [pygame. K_9]) or item == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. JumpingJack1 () #dancing Jack, on "next_game" if (args. debug_keyboard and keys [pygame. K_j]) or 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]) eller item == "l": self. JumpingJack2 (1) #LED blink "target" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. JumpingJack3 () #randomom dance "random game" time.sleep (0,05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Bruk tastaturet til å kontrollere JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Det er også kommandokonfigurasjonsfilen "commands_v2_hampelmann.txt". Endre slik du vil. Det er bare en liste over "kommando, tast, (styrke,)" kombinasjoner, basert på etikett-filen.

posisjon_null, 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, move_down, down, go_down, ned, flytte_ bakover, venstre, flytte_forover, høyre, gå_bakover, venstre, gå_forover, høyre, 0,8 mål, l, dempe, z, ja, y, nei, n, switch_on, j, switch_off, k, volume_up, up, volume_down, down, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

Trinn 4: Ytterligere ideer og andre eksempler

Det er ganske åpenbart at denne innstillingen også kan brukes til å kontrollere roboter eller andre enheter. I utgangspunktet alt som kan styres av en Raspberry Pi.

Jeg jobber med en forlengelse av manuset for å kjøre en MeArm, og håper å kunne presentere dette i oktober 2019.

Jeg vurderer også å bruke Jumping Jack som en semafor, og å bruke "project posenet" lemposisjonsgjenkjenningsprogrammet som et verktøy for å lese Jumping Jacks posisjoner og å oversette det tilbake til et tall. På denne måten kan den til og med kommunisere tekst, gitt 2x 8 posisjoner kan indikere 64 forskjellige tall, mer enn tilstrekkelig for alfabet, tall og tegn. Dette kan muliggjøre, selv om det er litt modifisert, en fysisk realisering for det foreslåtte IETF "The Transmission of IP Datagrams over the Semaphore Flag Signaling System (SFSS)" (https://tools.ietf.org/html/rfc4824).

Men dette vil være en annen instruerbar. Og som de første eksperimentene indikerte at hoppejacken vil trenge betydelige modifikasjoner før den kan bli anerkjent som menneskelig av AI -systemet, kan det ta litt tid.

Jeg vil gjerne gjøre deg oppmerksom på følgende instrukserbare: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, der en objekt for å finne en robot som bruker en kombinasjon av en Raspberry Pi og Google Coral TPU er beskrevet.

Anbefalt: