Turinys:
- Prekės
- 1 žingsnis: Įrenginio nustatymas
- 2 žingsnis: paleiskite šokinėjantį lizdą
- 3 žingsnis: kodas ir komandų failas
- 4 žingsnis: Kitos idėjos ir kiti pavyzdžiai
Video: „Hearing Jumping Jack“, „Google Coral TPU Accelerator“versija: 4 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:46
Jis judina galūnes, klauso jūsų įsakymų, jį valdo naujausios mašinų mokymosi technologijos
„Hearing Jumping Jack“yra paprastas elektromechaninis šokinėjimo lizdas, varomas dviem mikro servo ir labai paprasta pavara, turintis šviesos diodus kaip „akis“. Jis valdomas paprastomis balso komandomis, nurodančiomis, kurią iš devynių iš anksto nustatytų pozicijų jis užims, ar šviesos diodas turi būti įjungtas ar išjungtas, ar jis turi atlikti iš anksto nustatytą „šokio“ar atsitiktinių judesių rinkinį.
Pagrindinis sistemos elementas yra „Google Coral“TPU greitintuvas, leidžiantis labai dideliu greičiu paleisti „Tensorflow Lite“modelius neprisijungus, net ir „silpname“kompiuteryje, kaip „Raspberry Pi“. Tai leidžia pvz. greitas objektų identifikavimas ir klasifikavimas naudojant RPi kamerą, bet ir paleisti mašininiu mokymu pagrįstas balso atpažinimo funkcijas vietoje.
Mano žiniomis, tai yra pirmasis paskelbtas „Coral Accelerator“balso aptikimo valdomo fizinio „pasidaryk pats“įrenginio pavyzdys, o pridėtas kodo pavyzdys taip pat gali būti naudojamas kitiems sudėtingesniems projektams.
Valdymas balsu pagrįstas pavyzdžiu „girdinčioji gyvatė“„projekto raktinių žodžių stebėtojuose“(https://github.com/google-coral/project-keyword-spotter), kuris neseniai (2019 m. Rugsėjo mėn.) Buvo patalpintas „GitHub“. Mano konfigūracijoje sistemą sudaro „Raspberry Pi 4“su „Adafruit“16 kanalų servo variklio dangčiu, „Google Coral TPU Accelerator“ir interneto kamera, čia naudojama kaip mikrofonas. Šokinėjantis lizdas anksčiau buvo aprašytas ankstesniame nurodyme, kuriame jį valdė „Google Voice“rinkinys balso komandoms skaityti, yra prijungtas prie „Servo“gaubto 2.0 versijos, aprašytos toliau.
Ankstesnėje „Google Voice Kit“versijoje buvo trys pagrindiniai apribojimai: ji priklausė nuo „Google“žiniatinklio balso atpažinimo paslaugų, o sąranka buvo gana sudėtinga, prieš duodant komandą reikėjo paspausti tam tikrą mygtuką ir buvo labai vėluojama tarp komandos pasakymo ir sistemos atsako. „Google Coral“greitintuvo naudojimas sutrumpina atsako laiką iki sekundžių, nepriklauso nuo interneto ryšio ir visą laiką klausosi. Kai kuriuos pakeitimus galite naudoti norėdami valdyti sudėtingesnius įrenginius, pvz., „Jumping Jack“, kaip robotus ar automobilius ar bet ką, ką galite sukurti ir valdyti naudodami „Raspberry Pi“.
Dabartinėje versijoje raktinių žodžių stebėtojas supranta apie 140 trumpų raktinių žodžių/raktinių frazių rinkinį, apibrėžtą pridedamame modelio faile („voice_commands_v0.7_egetpu.tflite“) ir aprašytą atskirame etiketės faile („labels_gc2.raw.txt“). Apibrėžti laisvai keičiamo failo („commands_v2_hampelmann.txt“), raktiniai žodžiai, kuriuos konkrečiai naudoja mūsų scenarijus, virtualioje klaviatūroje susiejami su klavišų paspaudimais, pvz. raidėms, skaičiams, aukštyn/žemyn/kairėn/dešinėn, crtl+c ir kt.
Tada, pvz. naudojant „pygame.key“, šie „klavišų paspaudimai“yra skaitomi ir naudojami valdyti, kokius veiksmus atlieka prietaisas, čia yra šokinėjantis lizdas. Mūsų atveju tai reiškia, kad reikia paleisti du servo į iš anksto nustatytas pozicijas arba įjungti arba išjungti šviesos diodus. Kadangi raktinių žodžių stebėtojas veikia atskiru protektoriumi, jis gali nuolat klausytis jūsų užsakymų.
Versija 2019 m. Rugsėjo 21 d
Prekės
Raspberry Pi 4, per Pimoroni
„Google Coral TPU Accelerator“, per „Mouser Germany“, 72 €
„Adafruit 16 Servo Bonnet“, per „Pimoroni“, apie 10 €
www.adafruit.com/product/3416
learn.adafruit.com/adafruit-16-channel-pwm…
Stacker antraštė (jei reikia)
www.adafruit.com/product/2223
4x AA baterijų paketas (arba kitas 5-6 V maitinimo šaltinis), skirtas „Servo Bonnet“
Sena kamera, kaip mikrofonas
Servo varomas šokinėjimo lizdas, kaip aprašyta ankstesnėje instrukcijoje. Maketavimo brėžiniai pridedami prie kito veiksmo, tačiau gali prireikti koreguoti.
Reikalingos dalys šokinėjimui:
- 3 mm Forex plokštė
- 2 mikro servos
- 2 ir 3 mm varžtai ir veržlės
- 2 balti šviesos diodai ir rezistorius
- truputis kabelio
1 žingsnis: Įrenginio nustatymas
Norėdami sukurti šokinėjimo lizdą, laikykitės nurodymų, pateiktų ankstesnėje instrukcijoje. Savo prototipui naudojau „Forex“, bet jūs galite naudoti lazeriu pjaustytas akrilo arba faneros plokštes. Gali tekti koreguoti išdėstymą pagal savo servo dydį ir pan. Patikrinkite, ar galūnės ir pavara gali judėti be trinties.
Nustatykite „Raspberry Pi“. „Coral Github“svetainėje yra Raspijos vaizdas, kuriame yra viskas, ko reikia norint paleisti „Coral“greitintuvą „Pi“, ir jame yra daug projektų su visais nustatymais.
Gaukite projekto raktinių žodžių stebėtoją iš „Google Coral GitHub“puslapio. Įdiekite visą reikalingą programinę įrangą, kaip nurodyta.
Įdiekite pateiktus failus. Įdėkite „jumping jack python“scenarijų į projekto raktinių žodžių stebėjimo aplanką ir atitinkamų komandų failą konfigūracijos poaplanke.
Pritvirtinkite „Adafruit Servo“gaubtą prie „Pi“. Kadangi naudoju RPI korpusą su ventiliatoriumi, norėdamas prisijungti, turėjau naudoti GPIO kaupiklius (pvz., Įsigyjamus iš „Pimoroni“). Įdiekite visas reikalingas bibliotekas, kaip nurodyta „Adafruit“servo variklio gaubto instrukcijose.
Prie servo variklio gaubto pritvirtinkite 5-6 V maitinimo šaltinį. Pritvirtinkite servo ir šviesos diodus. Mano atveju aš naudoju 0 prievadą šviesos diodams ir 11 ir 15 prievadus servams.
Norėdami viską patikrinti, rekomenduočiau pirmiausia išbandyti projekto raktinio žodžio stebėtojo „girdinčios gyvatės“pavyzdį ir „Adafruit“servo variklio dangčio pavyzdžius.
2 žingsnis: paleiskite šokinėjantį lizdą
Jei visos dalys yra parengtos ir veikia, pabandykite ja naudotis. Galite paleisti scenarijų IDE arba iš komandinės eilutės.
Šaukiant „0 poziciją“į „9 poziciją“, šokinėjantis Džekas užims vieną iš iš anksto nustatytų pozicijų. Aš apibrėžiau „1“kaip abi rankas aukštyn (uu), „3“kaip kairę aukštyn, dešinę žemyn (ud), „9“kaip abi rankas žemyn (dd) ir „5“kaip abi rankas centre (cc).
uu uc ud = 1 2 3
cu cc cd = 4 5 6
du dc dd = 7 8 9
„0“yra identiškas „5“. „3“ir „8“labai gerai neatpažįsta raktinis žodis „spotter“ir gali tekti pakartoti.
Jums gali tekti koreguoti minimalias ir maksimalias kiekvieno servo/šono vertes, kad servos nebūtų užblokuotos ir tada sunaudos per daug energijos.
„kitas žaidimas“pradės „šokį“, t. y. apibrėžtą pozicijų seką, o „atsitiktinis žaidimas“- šokinėjantį Džeką, kad atliktų atsitiktinę judesių seką. Abiem atvejais jie veiks amžinai, todėl gali tekti nutraukti judesius, pvz. su komanda „pozicija nulis“.
„sustabdyti žaidimą“sukels „ctrl + c“ir sustabdys procesą.
„įjungti“ir „išjungti“galima įjungti ir išjungti šviesos diodus.
Keisdami time.sleep reikšmes galite reguliuoti judesių greitį.
3 žingsnis: kodas ir komandų failas
Čia pateiktas kodas yra „klausos gyvatės“kodo, kuris yra projekto raktinių žodžių stebėtojų paketo dalis, modifikacija. Aš tiesiog pašalinau viską, kas nebuvo būtina mano programai, be jokio supratimo apie detales. Bet kokie patobulinimai yra sveikintini.
Tada pridėjau „Adafruit Servo Bonnet“reikalingas dalis, remdamasis jų pavyzdiniais failais.
Norėčiau padėkoti abiejų dalių programuotojams.
Kodą galima rasti pridėtą kaip failą. Naudokitės savo rizika, keiskite, tobulinkite, žaiskite.
# „Google LLC“, 2019 m. Autorių teisės
# # Licencijuota pagal „Apache“licenciją, 2.0 versija („Licencija“); # Jūs negalite naudoti šio failo, tik nesilaikydami licencijos. # Licencijos kopiją galite įsigyti adresu # # https://www.apache.org/licenses/LICENSE-2.0 # # Išskyrus atvejus, kai to reikalaujama pagal galiojančius įstatymus arba nesutinkate raštu, pagal licenciją platinama programinė įranga Nr. „KAIP“PAGRINDAS, # BE GARANTIJŲ IR JOKIŲ RŪŠIŲ SĄLYGŲ, tiesioginių ar numanomų. # Žr. Licenciją, kad sužinotumėte konkrečias kalbas, reglamentuojančias leidimus ir # apribojimus pagal licenciją. iš _future_ importuoti absoliučią_importą iš _future_ importo padalinio iš _future_ importo spausdinimo_funkcijos importuoti argparse importuoti iš atsitiktinio importo randint iš sriegių importo Siūlų importavimo laikas iš edgetpu.basic.basic_engine importo iš „adafruit_servokit“importo „ServoKit“importavimo plokštės importas „busio“importas kanalų #komplekt.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #aukštyn, viduryje ir žemyn kairės ir dešinės rankos nustatymai aukštyn_l = 35 md_l = 90 dn_l = 160 aukštyn_r = 160 md_r = 90 dn_r = 35
lft = 15 # servo prievado numeris, kairysis servo (0-8)
rgt = 11 # servo prievado numeris, dešiniojo servo (0-8) led_channel_0 = hat.channels [0] # šviesos diodas nustatytas 0 prievade = [(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)] # apibrėžia 9 „JumpingJack“pozicijas, nurodomas sveikais skaičiais 0–9 šokis1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # „šokių“klasės valdiklis (objektas): #Callback function 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, event): if event.type == pygame. QUIT: self._running = False def JumpingJack0 (self, keys): # valdo Jumping Jack, raktažodžiai: "position x" key = int (keys) p = position [klavišas] a = p [0] b = p [1] spausdinti („Pozicija:“, klavišas, kairė /dešinėn: ", a,"/", b," laipsnis ") # sys.stdout.write (" Pozicija: ", raktas," kairė/dešinė: ", a,"/", b," laipsnis ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # control Jumping Jack dance, raktinis žodis: "kitas žaidimas" dnce = dance1 sp = (len (dnce)) r diapazone (sp): # šokių pozicijų tvarka, sp žingsniai dc = dnce [r], jei (dc nėra diapazone (10)): # print ("įvesties klaida padėtyje", sp) dc = 4 p = padėtis [dc] a = p [0] b = p [1] rinkinys.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # nustato greitį judesių def „JumpingJack2“(„self“, klavišai): # valdikliai „Jumping Jack“šviesos diodai, raktiniai žodžiai: „įjungti/išjungti“led = int (klavišai), jei yra LED == 1: led_channel_0.duty_cycle = 0xffff # įjungti LED 100% time.sleep (0.1) jei LED == 0: led_channel_0.duty_cycle = 0 # išjunkite LED time.sleep (0.1), jei LED == 2: # mirksi LED_channel_0.duty_cycle = 0xffff # įjungti LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #įjungti LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #įjungti LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #įjungti LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #įjungti LED 100% time.sleep (0.1) def JumpingJack3 (self)): # valdo šokinėjančio Džeko šokį, raktinis žodis: „atsitiktinis žaidimas“# už h diapazone (10): dr = randrange (9) p = padėtis [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # nustato judesių greitį def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic yra Niekas kitas int (args.mic) model.classify_audio (mikrofonas, variklis, 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):
jei ne self.on_init (): self._running = Netiesa q = model.get_queue () self._controler = Kontrolierius (q) jei ne args.debug_keyboard: t = Siūlas (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 while self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (Tiesa, 0,1), išskyrus eilę. Empty: new_item = Nėra, jei new_item nėra Nėra: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) arba item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) arba item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) arba 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]) arba item == " up ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) arba item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) arba elementas == "0": self. JumpingJack0 (0) if (args.debug_keyboard and keys [pygame. K_1]) arba item == "1": self. JumpingJack0 (1) if (args. debug_klaviatūra ir klavišai [pygame. K_2]) arba elementas == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) arba 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]) arba 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]) arba 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]) or item == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. JumpingJack1 () #dance Jack, on "next_game" if (args. debug_klaviatūra ir klavišai [pygame. K_j]) arba elementas == "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]) arba elementas == "l": self. JumpingJack2 (1) #LED mirksi "target" if (args.debug_keyboard and keys [pygame. K_r]) arba item == "r": self. JumpingJack3 () #random dance "atsitiktinis žaidimas" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Naudokite klaviatūrą, kad valdytumėte JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)
Taip pat yra komandų konfigūracijos failas „commands_v2_hampelmann.txt“. Pakeiskite, kaip jums patinka. Tai tik „komandų, raktų, (stiprumo,)“derinių sąrašas, pagrįstas etiketės failu.
pozicijos nulis, 0, pozicija_viena, 1, padėtis_dvi, 2, trečia pozicija, 3, ketvirta pozicija, 4, penkta pozicija, 5, šešta pozicija, 6, septynios pozicijos, 7, aštuonios pozicijos, 8, devynios pozicijos, 9, kilti_ aukštyn, aukštyn, aukštyn, aukštyn, judėti žemyn, žemyn, žemyn, žemyn, judėti atgal, kairėn, judėti pirmyn, dešinėn, eiti atgal, kairėn, eiti pirmyn, dešinėn, 0,8 taikinys, l, nutildyti, z, taip, y, ne, n, perjungti, j, išjungti, k, garsumo didinimas, aukštyn, garsumo mažinimas, žemyn, kitas_žaidimas, d, atsitiktinis_žaidimas, r, pradžios_žaidimas, s, sustabdymo_žaidimas, ctrl+c,
4 žingsnis: Kitos idėjos ir kiti pavyzdžiai
Visiškai akivaizdu, kad šis nustatymas taip pat gali būti naudojamas robotams ar kitiems įrenginiams valdyti. Iš esmės viskas, ką gali valdyti „Raspberry Pi“.
Aš stengiuosi išplėsti scenarijų, kad galėčiau valdyti „MeArm“, ir tikiuosi, kad galėsiu tai pristatyti 2019 m. Spalio mėn.
Aš taip pat svarstau naudoti „Jumping Jack“kaip semaforą ir naudoti „projekto posenet“galūnių padėties atpažinimo programą kaip įrankį perskaityti „Jumping Jack“pozicijas ir išversti jį į skaičių. Tokiu būdu jis netgi gali perduoti tekstą, nes 2x 8 pozicijos gali nurodyti 64 skirtingus skaičius, kurių daugiau nei pakanka abėcėlei, skaičiams ir ženklams. Tai galėtų padėti, nors ir šiek tiek pakeista, fiziškai įgyvendinti siūlomą IETF „IP duomenų schemų perdavimas per semaforo vėliavos signalizacijos sistemą (SFSS)“(https://tools.ietf.org/html/rfc4824).
Bet tai bus dar vienas pamokomas dalykas. Ir kaip pirmieji eksperimentai parodė, kad šokinėjantį lizdą reikės atlikti reikšmingus pakeitimus, kol AI sistema jį pripažins žmogumi, gali prireikti šiek tiek laiko.
Norėčiau atkreipti jūsų dėmesį į šiuos nurodymus: Objektų paieškos-asmeninis asistentas-robotas-Ft-Raspberry, kur aprašytas objektų paieškos robotas, naudojant „Raspberry Pi“ir „Google Coral TPU“derinį.
Rekomenduojamas:
„Google Home Mini Aux Jack Jack Mod“: 9 žingsniai
„Google Home Mini Aux Jack Mod“: jei manote, kad „Google“turėjo pridėti „Aux Out“prie „Google Home Mini“, sutinkate su manimi! Štai kaip tai daroma: D „Google Home Mini“garsiakalbių įsilaužimas - „Aux Out Mod“! leidžia prie „Google“pridėti išorinį garsiakalbį ar ausines
„Hearing MeArm“, „Google Coral TPU Accelerator“: 3 žingsniai
„Hearing MeArm“, „Google Coral TPU Accelerator“: Toliau norėčiau apibūdinti balsu valdomą „MeArm“versiją, mažą „xyz“roboto ranką su griebtuvu. Aš naudoju „MeArm Pi“iš MIME pramonės šakų, tačiau sistema turėtų būti taikoma bet kuriai „MeArm“versijai ar panašiai servo pavarai
Balso valdomas šokinėjimo lizdas- „Google Voice AIY“versija: 3 žingsniai
Balso valdomas šokinėjimo lizdas- „Google Voice AIY“versija: Taigi jūs gavote tą AIY balso rinkinį Kalėdoms ir žaidėte su juo, vadovaudamiesi instrukcijomis. Tai juokinga, bet dabar? Toliau aprašytame projekte pateikiamas paprastas įrenginys, kurį galima sukurti naudojant „AIY“balso skrybėlę „Raspbe“
„Google AIY VoiceHAT“, skirtas „Raspberry Pi Kit“(„MagPi 57“, 2017 m. Versija): 6 žingsniai (su paveikslėliais)
„Google AIY VoiceHAT“, skirta „Raspberry Pi Kit“(„MagPi 57“, 2017 m. Versija): „MagPi“balso rinkinio surinkimo patarimai, kurių nėra pamokose
Atnaujinkite HTTPS peradresavimo 2.0 versiją ESP8266 ir „Google“skaičiuokles: 10 žingsnių
Atnaujinti HTTPS peradresavimo 2.0 versiją ESP8266 ir „Google“skaičiuokles. Ankstesniuose bandymuose mes bendravome su ESP8266 moduliu ir siuntėme dvikryptį duomenų siuntimą į „Google“lapą naudodami „Google“scenarijų. Iš pradžių „Sujay Phadke“dėka „electronicsguy“„HTTPSRedirect“bibliotekos kūrėjas