INHOUDSOPGAWE:
- Voorrade
- Stap 1: Stel die toestel op
- Stap 2: Hardloop die Jumping Jack
- Stap 3: Die kode en die opdraglêer
- Stap 4: Verdere idees en ander voorbeelde
Video: N Gehoorspring, weergawe van Google Coral TPU -versneller: 4 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:25
Dit beweeg sy ledemate, dit luister na u bestellings, dit word aangedryf deur die nuutste masjienleertegnologie
Die "Hearing Jumping Jack" is 'n eenvoudige elektromeganiese Jumping Jack, aangedryf deur twee mikroservo's en 'n baie eenvoudige rat, met LED's as "oë". Dit word beheer deur eenvoudige stemopdragte wat aandui watter van die nege vooraf gedefinieerde posisies dit moet inneem, of die LED moet aan- of uitgeskakel word, of as dit 'n vooraf gedefinieerde "dans" of willekeurige stel bewegings moet uitvoer.
Die kernelement van die stelsel is die Google Coral TPU -versneller, waarmee u Tensorflow Lite -modelle met 'n baie hoë snelheid vanlyn kan gebruik, selfs op 'n 'swak' rekenaar as die Raspberry Pi. Dit laat bv. vinnige voorwerpidentifikasie en klassifikasie met behulp van die RPi-kamera, maar ook om masjienleer-gebaseerde stemherkenningsfunksies plaaslik uit te voer.
Na my wete is dit die eerste gepubliseerde voorbeeld vir 'n Coral Accelerator-stemopsporing-aangedrewe fisiese selfdoenapparaat, en die aangehegte kodevoorbeeld kan ook vir ander, meer ingewikkelde projekte gebruik word.
Die stembeheer is gebaseer op die voorbeeld "die horingslang" in die "projek navraag spotter" (https://github.com/google-coral/project-keyword-spotter) wat onlangs (September 2019) op GitHub geplaas is. In my konfigurasie bestaan die stelsel uit 'n Raspberry Pi 4 wat toegerus is met 'n Adafruit 16 -kanaals servo -enjinkap, 'n Google Coral TPU -versneller en 'n webkamera, hier gebruik as mikrofoon. Die Jumping Jack is voorheen beskryf in 'n vorige instruksies, waar dit deur die Google Voice -kit gedryf is om stemopdragte te lees, is in die weergawe 2.0 wat in die volgende beskryf is, aan die Servo Bonnet gekoppel.
Die vorige weergawe van Google Voice Kit het drie sentrale beperkings: dit was afhanklik van Google se webgebaseerde stemherkenningsdienste en die opstelling was relatief ingewikkeld, dit was nodig om op 'n knoppie te druk voordat u 'n opdrag kon gee, en daar was 'n ernstige vertraging tussen die opdrag sê en die reaksie van die stelsel. Die gebruik van die Google Coral -versneller verminder die reaksietyd tot sekondes, is onafhanklik van 'n internetverbinding en luister voortdurend. Met 'n paar wysigings kan u dit gebruik om toestelle wat baie meer kompleks is as 'n Jumping Jack, as robotte of motors, of wat u ook al kan bou en beheer met 'n Raspberry Pi.
In die huidige weergawe verstaan die Keyword Spotter 'n stel van ongeveer 140 kort sleutelwoorde/sleutelfrases, gedefinieer in die meegaande modellêer ("voice_commands_v0.7_egetpu.tflite") en beskryf in 'n aparte etiketlêer ("labels_gc2.raw.txt"). Die sleutelwoorde wat spesifiek deur ons skrif gebruik word, word gedefinieer deur 'n lêer wat vrylik verander kan word ('command_v2_hampelmann.txt'), en word dan op toetsaanslagen op 'n virtuele sleutelbord gekarteer, bv. vir letters, syfers, op/af/links/regs, crtl+c, ensovoorts.
Dan, bv. Met behulp van pygame.key word hierdie "toetsaanslagen" gelees en gebruik om te beheer watter aksies 'n toestel, hier die springkrag, moet uitvoer. In ons geval beteken dit om die twee servo's na vooraf gedefinieerde posisies te dryf, of om die LED's aan of uit te skakel. Aangesien die sleutelwoord spotter in 'n aparte loopvlak loop, kan dit permanent na u bestellings luister.
Weergawe 21 September 2019
Voorrade
Framboos Pi 4, via Pimoroni
Google Coral TPU -versneller, via Mouser Duitsland, 72 €
Adafruit 16 Servo Bonnet, via Pimoroni, ongeveer 10 €
www.adafruit.com/product/3416
learn.adafruit.com/adafruit-16-channel-pwm…
Stapelkop (indien nodig)
www.adafruit.com/product/2223
4x AA battery pack (of ander 5-6V kragbron) vir Servo Bonnet
Ou webkamera, as mikrofoon
Servo -aangedrewe Jumping Jack, soos beskryf in 'n vorige instruksie. Uitlegtekeninge word by die volgende stap aangeheg, maar dit kan aanpassings vereis.
Vereiste onderdele vir die Jumping Jack:
- 3 mm Forex bord
- 2 mikroservos
- 2 en 3 mm skroewe en moere
- 2 wit LED's en 'n weerstand
- 'n bietjie kabel
Stap 1: Stel die toestel op
Volg die aanduidings wat in 'n vorige instruksie gegee is om die Jumping Jack te bou. Ek het Forex gebruik vir my prototipe, maar u mag lasergesnyde akriel- of laaghoutplate gebruik. Miskien moet u die uitleg aanpas volgens die grootte van u servo's, ens. Toets of die ledemate en rat sonder wrywing kan beweeg.
Stel u Raspberry Pi op. Op die Coral Github -webwerf is daar 'n Raspian -beeld beskikbaar wat alles bevat wat nodig is om die Coral -versneller op die Pi uit te voer en baie projekte bevat, met alle instellings reeds in plek.
Kry die projek navraag spotter van die Google Coral GitHub -bladsy. Installeer alle nodige sagteware soos aangedui.
Installeer die gegewe lêers. Plaas die jumping jack python -script in die spotwoord -lêergids van die projek en die lêer met die ooreenstemmende opdragte in die config -submap.
Bevestig die Adafruit Servo Bonnet aan die Pi. Aangesien ek 'n RPI -behuizing met 'n waaier gebruik, moes ek GPIO -stapelaars gebruik (bv. Beskikbaar by Pimoroni) om verbinding moontlik te maak. Installeer alle vereiste biblioteke, soos aangedui op die Adafruit -instruksies vir die servo -enjinkap.
Koppel 'n 5-6V kragbron aan die servo-enjinkap. Heg servo's en LED's aan. In my geval gebruik ek poort 0 vir die LED's en poort 11 en 15 vir die servo's.
Om alles na te gaan, sou ek aanbeveel om eers die projek -sleutelwoord spotter "horende slang" en die voorbeelde van die Adafruit servo -enjinkap te probeer.
Stap 2: Hardloop die Jumping Jack
Probeer om dit te gebruik as alle dele gereed is. U kan die script in die IDE of vanaf die opdragreël uitvoer.
As u "posisie 0" na "posisie 9" skree, sal die Jumping Jack een van die vooraf gedefinieerde posisies inneem. Ek het "1" gedefinieer as albei arms omhoog (uu), "3" as links bo, regs af (ud), "9" as albei arms af (dd) en "5" as beide arms gesentreer (cc).
uu uc ud = 1 2 3
cu cc cd = 4 5 6
du dc dd = 7 8 9
"0" is identies aan "5". "3" en "8" word nie baie goed deur die sleutelwoord spotter herken nie en moet moontlik herhaal word.
Miskien moet u die minimum en maksimum waardes vir elke servo/sy aanpas sodat die servo's nie geblokkeer word nie en dan te veel krag trek.
"volgende wedstryd" begin die "dans", dit wil sê 'n gedefinieerde reeks posisies, terwyl 'ewekansige spel' die Jumping Jack sal begin om 'n ewekansige reeks bewegings uit te voer. In albei gevalle sal dit vir ewig werk, dus moet u moontlik bewegings stop, bv. met 'n "posisie nul" opdrag.
'stopspel' sal 'n 'ctrl + c' veroorsaak en die proses stop.
"skakel aan" en "afskakel" kan gebruik word, skakel die LED's aan en uit.
Deur die verandering van tyd. Slaapwaardes kan u die snelheid van bewegings aanpas.
Stap 3: Die kode en die opdraglêer
Die kode wat hier aangebied word, is 'n wysiging van die "horingslang" -kode wat deel uitmaak van die projek -sleutelwoord spotter -pakket. Ek het net iets verwyder wat nie vir my aansoek nodig was nie, sonder dat ek die besonderhede werklik verstaan het. Enige verbeterings is welkom.
Ek voeg toe die dele by wat nodig is vir die Adafruit Servo Bonnet, gebaseer op hul voorbeeldlêers.
Ek wil die programmeerders van albei dele bedank.
U kan die kode as lêer aangeheg vind. Gebruik dit op u eie risiko's, verander dit, verbeter dit, speel daarmee.
# Kopiereg 2019 Google LLC
# # Gelisensieer onder die Apache -lisensie, weergawe 2.0 (die "lisensie"); # u mag hierdie lêer nie gebruik nie, behalwe in ooreenstemming met die lisensie. # U kan 'n afskrif van die lisensie verkry by # # https://www.apache.org/licenses/LICENSE-2.0 # # Tensy dit deur die toepaslike wet vereis word of skriftelik ooreengekom word, word sagteware # wat onder die lisensie versprei word, versprei op 'n BASIS "AS IS", # SONDER GARANTIES OF VOORWAARDES VAN ENIGE SOORT, hetsy uitdruklik of stilswyend. # Sien die lisensie vir die spesifieke taal vir toestemmings en # beperkings onder die lisensie. van _future_ invoer absolute_import van _future_ invoerafdeling van _future_ invoerafdrukfunksie invoer argparse invoer os van ewekansige invoer randint van threading invoer Draad invoer tyd van edgetpu.basic.basic_ engine invoer BasicEngine invoer model invoer pygame.lokale invoer * invoerwaglys van ewekansige invoer randrange vanaf adafruit_servokit invoer ServoKit invoerbord invoer busio invoer adafruit_pca9685 invoertyd i2c = busio. I2C (bord. SCL, bord. SDA) hoed = adafruit_pca9685. PCA9685 (i2c) hoed.frekwensie = 60 kit = ServoKit (kanale = 16) # stel nommer van kanale #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #op, middel en onder instellings vir linker en regter arms up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35
lft = 15 # aantal servopoort, linker servo (0-8)
rgt = 11 # aantal servo-poort, regs servo (0-8) led_channel_0 = hat.channels [0] # LED op poort 0 led_channel_0.duty_cycle = 0 # skakel LED 100% aan # lys van arminstellings vir nege posisies = [(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)] # definieer 9 JumpingJack-posisies, aangedui deur heelgetalle 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # 'n "dans" klas Beheerder (voorwerp): # Terugroepfunksie 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 (self, gebeurtenis): as event.type == pygame. QUIT: self._running = Valse def JumpingJack0 (self, sleutels): # kontrole Jumping Jack, sleutelwoorde: "posisie x" sleutel = int (sleutels) p = posisie [sleutel] a = p [0] b = p [1] druk ("Posisie:", sleutel, "links /regs: ", a,"/", b," graad ") # sys.stdout.write (" Posisie: ", sleutel," links/regs: ", a,"/", b," graad ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # kontroles Jumping Jack dance, trefwoord: "volgende wedstryd" dnce = dance1 sp = (len (dnce)) vir r in reeks (sp): # dansorde van posisies, sp stappe dc = dnce [r] as (dc nie binne bereik (10)): # druk ("invoerfout op posisie", sp) dc = 4 p = posisie [dc] a = p [0] b = p [1] kit.servo [lft].angle = 'n kit.servo [rgt].angle = b tyd. slaap (0,25) # stel snelheid van bewegings def JumpingJack2 (self, sleutels): # kontrole Jumping Jack LED's, sleutelwoorde: "skakel aan/uit" led = int (sleutels) as led == 1: led_channel_0.duty_cycle = 0xffff #turn LED 100% time.sleep (0.1) as led == 0: led_channel_0.duty_cycle = 0 # skakel LED time.sleep (0.1) if led == 2: # blink led_channel_0.duty_cycle = 0xffff #turn 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 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): # kontroles Jumping Jack dance, trefwoord: "random game" # vir h in reeks (10): dr = randrange (9) p = posisie [dr] a = p [0] b = p [1] kit.servo [lft].angle = 'n kit.servo [rgt].angle = b tyd. slaap (0.25) # stel bewegingsnelheid def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic is niks anders nie int (args.mic) model.classify_audio (mikrofoon, enjin, labels_file = "config/labels_gc2.raw.txt", command_file = "config/command_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):
indien nie self.on_init (): self._running = Onwaar q = model.get_queue () self._controler = Beheerder (q) indien nie args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 terwyl self._running: pygame.event.pump () as args.debug_keyboard: keys = pygame.key.get_pressed () anders: probeer: new_item = q.get (True, 0.1) behalwe queue. Empty: new_item = Geen as new_item nie None is nie: item = new_item if (args.debug_keyboard en sleutels [pygame. K_ESCAPE]) of item == "stop": self._running = Onwaar # as (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_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]) of 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]) of item == "l": self. JumpingJack2 (1) #LED knip "teiken" as (args.debug_keyboard en sleutels [pygame. K_r]) of item == "r": self. JumpingJack3 () #willekeurige dans "random game" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Gebruik die sleutelbord om die JumpingJack te beheer. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)
Daar is ook die opdrag config lêer "commands_v2_hampelmann.txt". Verander soos u wil. Dit is slegs 'n lys van kombinasies van "command, key, (strength,)", gebaseer op die etiket-lêer.
posisie_nul, 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, af, skuif_ agteruit, links, skuif_ vorentoe, regs, gaan_ agtertoe, links, gaan_waarts, regs, 0,8 teiken, l, demp, z, ja, y, nee, n, skakel_aan, j, skakel_af, k, volume_op, op, volume_af, af, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,
Stap 4: Verdere idees en ander voorbeelde
Dit is duidelik dat hierdie instelling ook gebruik kan word om robotte of ander toestelle te beheer. Eintlik alles wat deur 'n Raspberry Pi beheer kan word.
Ek werk aan 'n uitbreiding van die script om 'n MeArm te bestuur, en hoop om dit in Oktober 2019 te kan aanbied.
Ek oorweeg dit ook om die Jumping Jack as 'n semafoor te gebruik, en om die "project posenet" ledeposisieherkenningsprogram te gebruik as 'n hulpmiddel om die Jumping Jack se posisies te lees en dit na 'n getal te vertaal. Op hierdie manier kan dit selfs teks kommunikeer, gegewe 2x 8 posisies kan 64 verskillende getalle aandui, meer as voldoende vir alfabet, getalle en tekens. Dit kan, hoewel dit effens gewysig is, 'n fisiese besef moontlik maak vir die voorgestelde IETF "The Transmission of IP Datagrams over the Semaphore Flag Signaling System (SFSS)" (https://tools.ietf.org/html/rfc4824).
Maar dit sal nog 'n opdrag wees. En soos die eerste eksperimente aangedui het dat die springkrag aansienlike aanpassings nodig sal hê voordat dit deur die AI -stelsel as mens erken sal word, kan dit 'n geruime tyd verg.
Ek vestig u aandag op die volgende instruksies: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, waar 'n voorwerp-vindende robot met 'n kombinasie van 'n Raspberry Pi en Google Coral TPU beskryf word.
Aanbeveel:
E-dohicky die elektroniese weergawe van Russ's Laser Power Meter Dohicky: 28 stappe (met foto's)
E-dohicky die elektroniese weergawe van Russ's Laser Power Meter Dohicky: Laser kraggereedskap. E-dohicky is die elektroniese weergawe van die dohicky van Russ SADLER. Russ animeer die baie goeie SarbarMultimedia youtube kanaal https://www.youtube.com/watch?v=A-3HdVLc7nI&t=281sRuss SADLER bied 'n maklike en goedkoop bykomstigheid
Modellering en weergawe van konsep -skaatsplanke in Fusion 360: 7 stappe
Model- en weergawes van konsep -skateboards in Fusion 360: ek het gevind dat dit eintlik lekker en lonend is om 'n fisiese masjien, soos 'n skaatsplank, te bou, maar soms wil ons net op een plek sit en wonderlike resultate toon … sonder enige gereedskap, materiaal of enigiets anders! Dit is presies wat
Is 'n draadlose weergawe van Is my garagedeur oop of toe ?: 7 stappe
N Draadlose weergawe van … Is my garagedeur oop of toe?: Ons wou 'n eenvoudige, goedkoop en betroubare aanduidingstelsel hê wat ons kan wys of ons motorhuisdeure oop of toe is. Daar is baie " Is my motorhuisdeur oop " projekte. Die grootste meerderheid van hierdie projekte is hardkoppig. In my geval hardloop
Maak realistiese 3D -weergawe van u PCB -ontwerp in 5 minute: 6 stappe
Maak realistiese 3D-weergawe van u PCB-ontwerp binne 5 minute: Aangesien ek gereeld dokumentasie lêers met 'n beskrywing van 'n Printed Circuit Board (PCB) onderdeel en komponente gemaak het, was ek verward oor nie-realistiese skermkiekies van PCBA-lêers. Ek het dus 'n maklike manier gevind om dit meer realisties en mooier te maak
My eie weergawe van die nuttelose boks: 4 stappe
My eie weergawe van die nuttelose boks: Vir die aandklasse oor Arduino (CVO Volt - Arduino) wat ek volg, moes ons 'n persoonlike projek maak. Ek het besluit om twee tegnieke te kombineer, naamlik Arduino en laser sny. Ek het geleer om 'n lasersnyer te gebruik tydens 'n ander aandklas, CVO