Cuprins:

Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator: 4 pași
Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator: 4 pași

Video: Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator: 4 pași

Video: Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator: 4 pași
Video: Jean Michel Jarre - Oxygen II 2024, Iulie
Anonim
Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator
Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator
Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator
Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator
Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator
Un jack pentru sărituri auditive, versiunea Google Coral TPU Accelerator

Își mișcă membrele, îți ascultă comenzile, este condus de cea mai recentă tehnologie de învățare automată

„Mufa de săritură auditivă” este un monomotor electromecanic simplu, acționat de două micro servo și un angrenaj foarte simplu, având LED-uri ca „ochi”. Este controlat de comenzi vocale simple care indică care dintre cele nouă poziții predefinite trebuie să ia, sau dacă LED-ul ar trebui să fie aprins sau oprit sau dacă va efectua un "dans" predefinit sau un set aleator de mișcări.

Elementul de bază al sistemului este acceleratorul Google Coral TPU, care permite rularea modelelor Tensorflow Lite offline cu viteză foarte mare, chiar și pe un computer „slab” ca Raspberry Pi. Acest lucru permite de ex. identificarea și clasificarea rapidă a obiectelor folosind camera RPi, dar și pentru a rula la nivel local funcții de recunoaștere vocală bazate pe învățarea automată.

Din câte știu, acesta este primul exemplu publicat pentru un dispozitiv de bricolaj fizic cu detecție vocală Coral Accelerator, iar exemplul de cod atașat ar putea fi folosit și pentru alte proiecte mai complexe.

Controlul vocal se bazează pe exemplul „șarpele auditiv” din „proiectarea cuvântului cheie spotter” (https://github.com/google-coral/project-keyword-spotter) care recent (septembrie 2019) a fost plasat pe GitHub. În configurația mea, sistemul este alcătuit dintr-un Raspberry Pi 4 echipat cu un capot servo Adafruit pe 16 canale, un Google Coral TPU Accelerator și o cameră web, folosită aici ca microfon. Jumping Jack-ul a fost descris anterior într-un instructable anterior, în care a fost condus de kitul Google Voice pentru a citi comenzile vocale, este atașat la Servo Bonnet în versiunea 2.0 descrisă în cele ce urmează.

Versiunea anterioară a Google Voice Kit avea trei limitări centrale: depindea de serviciile de recunoaștere a vocii bazate pe Google, iar configurarea era relativ complicată, era necesar să apăsați un fel de buton înainte de a putea da o comandă și a existat o întârziere gravă. între rostirea comenzii și răspunsul sistemului. Utilizarea acceleratorului Google Coral reduce timpul de răspuns la secunde, este independent de o conexiune la internet și ascultă tot timpul. Cu unele modificări, îl puteți folosi pentru a controla dispozitive mult mai complexe ca Jumping Jack, ca roboți sau mașini sau orice puteți construi și controla cu un Raspberry Pi.

În versiunea sa actuală, Keyword Spotter înțelege un set de aproximativ 140 de cuvinte cheie scurte / fraze cheie, definite în fișierul model însoțitor („voice_commands_v0.7_egetpu.tflite”) și descrise într-un fișier de etichete separat („labels_gc2.raw.txt”). Definite printr-un fișier modificabil în mod liber („comenzi_v2_hampelmann.txt”), cuvintele cheie utilizate în mod specific de scriptul nostru sunt apoi mapate la apăsări de taste pe o tastatură virtuală, de ex. pentru litere, cifre, sus / jos / stânga / dreapta, crtl + c, etc.

Apoi, de ex. folosind pygame.key, aceste „apăsări de taste” sunt citite și utilizate pentru a controla acțiunile pe care le va efectua un dispozitiv, aici jack-ul de sărituri. În cazul nostru, aceasta înseamnă să conduceți cele două servouri în poziții predefinite sau să porniți sau să opriți LED-urile. Deoarece identificatorul de cuvinte cheie rulează într-o bandă de rulare separată, acesta vă poate asculta permanent comenzile.

Versiune 21 septembrie 2019

Provizii

Raspberry Pi 4, prin Pimoroni

Google Coral TPU Accelerator, prin Mouser Germany, 72 €

Adafruit 16 Servo Bonnet, via Pimoroni, aproximativ 10 €

www.adafruit.com/product/3416

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

Antetul stivuitorului (dacă este necesar)

www.adafruit.com/product/2223

Acumulator 4x AA (sau altă sursă de alimentare de 5-6V) pentru Servo Bonnet

Cameră web veche, ca microfon

Jumping Jack servomotor, așa cum este descris într-un instructable anterior. Desenele de aspect sunt atașate la pasul următor, dar pot necesita ajustări.

Piese necesare pentru Jumping Jack:

- Placă Forex de 3 mm

- 2 micro servo

- Șuruburi și piulițe de 2 și 3 mm

- 2 LED-uri albe și un rezistor

- un pic de cablu

Pasul 1: Configurarea dispozitivului

Configurarea dispozitivului
Configurarea dispozitivului
Configurarea dispozitivului
Configurarea dispozitivului
Configurarea dispozitivului
Configurarea dispozitivului

Pentru a construi Jumping Jack, vă rugăm să urmați indicațiile date într-un instructable anterior. Am folosit Forex pentru prototipul meu, dar este posibil să utilizați plăci din acril sau placaj tăiate cu laser. S-ar putea să trebuiască să reglați aspectul în funcție de dimensiunea servoarelor dvs. etc. Testați dacă membrele și uneltele se pot mișca fără frecare.

Configurați Raspberry Pi. Pe site-ul Coral Github, este disponibilă o imagine Raspian care conține tot ce este necesar pentru a rula acceleratorul Coral pe Pi și conține o mulțime de proiecte, cu toate setările deja la locul lor.

Obțineți identificatorul de cuvinte cheie proiect de pe pagina Google Coral GitHub. Instalați toate software-urile necesare conform indicațiilor.

Instalați fișierele furnizate. Plasați scriptul Python jack jumping în dosarul de identificare a cuvântului cheie de proiect și în fișierul de comenzi corespondente din subfolderul de configurare.

Atașați capota servo Adafruit la Pi. Deoarece folosesc o carcasă RPI cu un ventilator, a trebuit să folosesc stivuitoare GPIO (de exemplu, disponibile de la Pimoroni) pentru a permite conexiunea. Instalați toate bibliotecile necesare, așa cum se indică în instrucțiunile Adafruit pentru capota servo.

Atașați o sursă de alimentare de 5-6V la capota servo. Atașați servo și LED-uri. În cazul meu, am folosit portul 0 pentru LED-uri și porturile 11 și 15 pentru servouri.

Pentru a verifica totul, aș recomanda să încercați mai întâi exemplul proiectului de cuvinte cheie spotter „șarpe auditiv” și exemplele de servocuflă Adafruit.

Pasul 2: Rularea Jumping Jack

Dacă toate componentele sunt configurate și rulează, încercați să o utilizați. Puteți rula scriptul în IDE sau din linia de comandă.

Strigarea „poziției 0” la „poziția 9” va evoca Jumping Jack pentru a lua una dintre pozițiile predefinite. Am definit „1” ca ambele brațe în sus (uu), „3” ca stânga sus, dreapta în jos (ud), „9” ca ambele brațe în jos (dd) și „5” ca ambele brațe centrate (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

„0” este identic cu „5”. „3” și „8” nu sunt recunoscute foarte bine de cuvântul cheie spotter și poate fi necesar să fie repetate.

Este posibil să trebuiască să reglați valorile minime și maxime pentru fiecare servo / parte, astfel încât servomotoarele să nu fie blocate și apoi să extrageți prea multă energie.

„următorul joc” va începe „dansul”, adică o secvență definită de poziții, în timp ce „joc aleatoriu” va începe Jumping Jack pentru a efectua o secvență aleatorie de mișcări. În ambele cazuri, acestea vor rula pentru totdeauna, deci este posibil să trebuiască să opriți mișcările, de ex. cu o comandă „poziție zero”.

„opri jocul” va evoca un „ctrl + c” și va opri procesul.

„pornire” și „oprire” pot fi folosite aprindeți și opriți LED-urile.

Prin modificarea valorilor time.sleep puteți regla viteza mișcărilor.

Pasul 3: Codul și fișierul de comenzi

Codul prezentat aici este o modificare a codului „șarpe auditiv” care face parte din pachetul de identificare a cuvintelor cheie a proiectului. Tocmai am eliminat orice nu era necesar pentru cererea mea, fără o înțelegere reală a detaliilor. Orice îmbunătățiri sunt binevenite.

Am adăugat apoi piesele necesare pentru Adafruit Servo Bonnet, pe baza fișierelor exemplare ale acestora.

Aș dori să mulțumesc programatorilor ambelor părți.

Codul poate fi găsit atașat ca fișier. Folosește-l pe propriile riscuri, modifică-l, îmbunătățește-l, joacă-te cu el.

# Copyright 2019 Google LLC

# # Licențiat sub licența Apache, versiunea 2.0 („Licența”); # nu puteți utiliza acest fișier decât în conformitate cu licența. # Puteți obține o copie a Licenței la # # https://www.apache.org/licenses/LICENSE-2.0 # # Cu excepția cazului în care este cerut de legea aplicabilă sau este convenit în scris, software-ul # distribuit sub Licență este distribuit pe un BAZA „CA ESTE”, # FĂRĂ GARANȚII SAU CONDIȚII DE ORICE TIP, fie expresă, fie implicită. # Consultați licența pentru limbajul specific care reglementează permisiunile și # limitările din licență. din _future_ import absolut_import din _future_ import divizie din _future_ import print_function import argparse import os from random random randint from threading import Thread import time from edgetpu.basic.basic_engine import BasicEngine import model pygame from pygame.locals import * coadă de import din random random randrange de la adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 timp import i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (canale = 16) # număr set de canale # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # setări sus, mijloc și jos pentru brațele stânga și dreapta up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # numărul de port servo, servo stânga (0-8)

rgt = 11 # numărul de port servo, servo dreapta (0-8) led_channel_0 = hat.channels [0] # LED setat pe port 0 led_channel_0.duty_cycle = 0 # turn on LED 100% #list of bra settings for nine positions position = [(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)] # definește 9 poziții JumpingJack, indicate prin numere întregi 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # o clasă "dans" Controler (obiect): #Callback function def _init _ (self, q): self._q = q def callback (self, comandă): self._q.put (command) class App: def _init _ (self): self._running = Def adevăr 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 = Def false JumpingJack0 (self, chei): # controls Jumping Jack, cuvinte cheie: "poziție x" cheie = int (chei) p = poziție [cheie] a = p [0] b = p [1] print ("Poziție:", cheie "stânga / dreapta: ", a," / ", b," grad ") # sys.stdout.write (" Poziție: ", cheie," stânga / dreapta: ", a," / ", b," grad ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # controls Jumping Jack dance, cuvânt cheie: "joc următor" dnce = dance1 sp = (len (dnce)) pentru r în intervalul (sp): # ordinea dansului pozițiilor, sp trepte dc = dnce [r] dacă (dc nu este în intervalul (10)): # print ("eroare de intrare la poziție", sp) dc = 4 p = poziția [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # setează viteza de mișcări def JumpingJack2 (auto, taste): # comenzi LED-uri Jumping Jack, cuvinte cheie: "pornire / oprire" led = int (taste) dacă led == 1: led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.1) if led == 0: led_channel_0.duty_cycle = 0 # sting 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 on 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 (auto): # comenzi Jumping Jack dance, cuvânt cheie: "joc aleatoriu" # pentru h în intervalul (10): dr = randrange (9) p = poziția [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # setează viteza mișcărilor def spotter (self, args): motor = BasicEngine (args.model_file) mic = args.mic if args.mic este Nimeni altul int (args.mic) model.classify_audio (microfon, motor, etichete_fișier = "config / labels_gc2.raw.txt", comenzi_fișier = "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):

dacă nu self.on_init (): self._running = Fals q = model.get_queue () self._controler = Controler (q) dacă nu args.debug_keyboard: t = Thread (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 (Adevărat, 0,1), cu excepția cozii. (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 == " sus ": 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]) sau 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_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]) sau item == "l": self. JumpingJack2 (1) #LED clipește "target" dacă (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. JumpingJack3 () #random dance "joc aleatoriu" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Folosiți tastatura pentru a controla JumpingJack. ', action =' store_true ', implicit = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Există, de asemenea, fișierul de configurare a comenzilor „commands_v2_hampelmann.txt”. Modificați după cum doriți. Este doar o listă de combinații „comandă, cheie, (putere,)”, bazată pe fișierul etichetă.

poziție_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, move_down, down, go_down, jos, mutați_înapoi, stânga, mutați_înainte, dreapta, mergeți_înapoi, stânga, mergeți_înapoi, dreapta, 0,8 țintă, l, mute, z, da, y, nu, n, comutați_on, j, comutați_ off, k, volumul sus, sus, volumul jos, jos, next_game, d, random_game, r, start_game, s, stop_game, ctrl + c,

Pasul 4: Idei suplimentare și alte exemple

Este destul de evident că această setare poate fi folosită și pentru a controla roboți sau alte dispozitive. Practic tot ceea ce ar putea fi controlat de un Raspberry Pi.

Lucrez la o extensie a scriptului pentru a conduce un MeArm și sper să pot prezenta acest lucru în octombrie 2019.

De asemenea, mă gândesc să folosesc Jumping Jack ca semafor și să folosesc programul de recunoaștere a poziției membrelor „project posenet” ca instrument pentru a citi pozițiile lui Jumping Jack și a-l traduce înapoi la un număr. În acest fel, poate chiar comunica text, având în vedere că 2x 8 poziții pot indica 64 de numere diferite, mai mult decât suficiente pentru alfabet, numere și semne. Acest lucru ar putea permite, deși ușor modificat, o realizare fizică pentru IETF propus „Transmiterea datagramelor IP prin Semaphore Flag Signaling System (SFSS)” (https://tools.ietf.org/html/rfc4824).

Dar acesta va fi un alt lucru instructiv. Și, așa cum primele experimente au indicat faptul că cricul săritor va avea nevoie de modificări semnificative înainte ca acesta să fie recunoscut ca om de către sistemul AI poate necesita ceva timp.

Aș dori să vă atrag atenția asupra următoarelor instrucțiuni: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, unde este descris un robot de găsire a obiectelor care utilizează o combinație de Raspberry Pi și Google Coral TPU.

Recomandat: