Cuprins:

A Hearing MeArm, Google Coral TPU accelerat acționat: 3 pași
A Hearing MeArm, Google Coral TPU accelerat acționat: 3 pași

Video: A Hearing MeArm, Google Coral TPU accelerat acționat: 3 pași

Video: A Hearing MeArm, Google Coral TPU accelerat acționat: 3 pași
Video: TensorFlow.js Community "Show & Tell" #8 2024, Iulie
Anonim
A Hearing MeArm, accelerator Google Coral TPU condus
A Hearing MeArm, accelerator Google Coral TPU condus
A Hearing MeArm, accelerator Google Coral TPU condus
A Hearing MeArm, accelerator Google Coral TPU condus
A Hearing MeArm, acționat de Google Coral TPU Accelerator
A Hearing MeArm, acționat de Google Coral TPU Accelerator
A Hearing MeArm, accelerator Google Coral TPU condus
A Hearing MeArm, accelerator Google Coral TPU condus

În cele ce urmează aș dori să descriu o versiune controlată de voce a MeArm, un braț mic robot xyz cu un gripper. Am folosit MeArm Pi din industriile MIME, dar sistemul ar trebui să fie aplicabil oricărei versiuni a lui MeArm sau dispozitivelor servo-controlate similare.

Utilizarea Google Coral TPU Accelerator vă permite să rulați scripturi rapide de recunoaștere vocală offline TensorFlow pe Raspberry Pi și să controlați dispozitivele fizice prin ordinele vorbite, cu o latență sub o secundă.

Dispozitivul descris aici este o combinație și extensie de concepte descrise în două instructabile anterioare. Este o extensie a unei implementări anterioare a controlului vocal Google Coral, un Jumping Jack, descris aici și o îmbunătățire vastă a unui MeArm controlat vocal Google AIY descris aici.

MeArm-ul controlat prin voce care utilizează sistemul Google Voice AIY necesita acces online, nu a fost ușor de implementat, a fost necesar să apăsați un buton pentru a activa ascultarea comenzilor vocale și a avut un timp de latență lung. Google Coral TPU Accelerator utilizat acum permite rularea modelelor TensorFlowLite offline cu o viteză mare pe un Raspberry Pi sau alte dispozitive Linux. Printre exemplele de pe pagina Google Coral Github există un exemplu numit „șarpe auditiv” pentru un sistem de recunoaștere vocală care poate înțelege 140 de fraze cheie (septembrie 2019), care sunt apoi mapate la apăsări de taste virtuale. Cuplarea acestor „apăsări de taste” cu executarea unor funcții programate în Python face posibilă construirea unui dispozitiv controlat prin comandă vocală. Recent am descris o primă implementare, o mufă de săritură electromecanică controlată prin voce. Implementarea de aici este puțin mai complexă și permite controlul tuturor celor patru servouri ale MeArm, fie pentru a muta MeArm continuu, fie pentru a-l muta la un număr de predefinite. sau pentru a îndeplini unele sarcini mai complexe.

Folosind scriptul furnizat aici ca exemplu, ar trebui să fie relativ simplu să construiești alte dispozitive controlate prin voce, de ex. mașini robotizate sau unități tehnice de asistență.

Provizii

  • MeArm. Folosit aici: MeArm Pi de la MIME Industries
  • Raspberry Pi 4
  • Accelerator TPU Google Coral
  • Capota servo 16 canale Adafruit
  • niște cabluri jumper
  • opțional: condensator pentru capota servo, aproximativ 400 µF pentru 4 servouri (recomandat de Adafruit)
  • Sursă de alimentare de 5-6 V pentru servomotor. Aici am folosit un încărcător vechi de 6V, funcționează și un pachet de baterii 4x AA
  • Microfon. Am folosit o cameră web Microsoft HD3000 veche ca microfon.

Pasul 1: Configurarea sistemului

Configurarea sistemului
Configurarea sistemului
Configurarea sistemului
Configurarea sistemului

Descărcați imaginea Raspian preconfigurată pentru Google Coral TPU Accelerator de pe pagina Google Coral Github și instalați-o pe un card µSD. Imaginea conține, de asemenea, o serie de exemple de scripturi. Configurați Pi așa cum este indicat.

Instalați exemplul Keyword spotter de pe site-ul Google Coral GitHub, dacă nu este inclus în imagine și toate programele necesare. Atașați microfonul la Pi. Aș recomanda să vă jucați cu exemplul „Șarpele auzitor” pentru a vă asigura că totul funcționează.

Descărcați și instalați software-ul capotei Adafruit 16 canale, așa cum este descris aici. Instalați capota și jucați-vă cu exemplele Adafruit pentru a vă asigura că totul funcționează corect.

Descărcați fișierele atașate la acest instructable și copiați-le în folderul „Project Keyword Spotter”. Fișierul „commands_v1_MeArm.txt” trebuie copiat în subfolderul „config”.

Conectați servo-urile MeArm la capota servo, așa cum este indicat. Am folosit portul 15 pentru sus / jos, portul 11 pentru înainte / înapoi, portul 7 pentru viraj și portul 3 pentru servomotoarele de prindere.

În cadrul scriptului poate fi necesar să ajustați valorile min / centru / max pentru fiecare servo la configurația dvs. Aceste setări ajută la evitarea deteriorării servomotoarelor. Este posibil să fie necesar să modificați listele incluse „poziții”, „transport1” și „transport2”.

Rulați scriptul. Până acum îl rulam de la IDE.

În cazul în care doriți să modificați expresiile cheie care evocă o anumită funcție în funcție de nevoile dvs. O listă completă a frazelor cheie disponibile se găsește în fișierul „labels_gc2 raw.txt” din subfolderul de configurare.

Sistemul are un timp de latență de aproximativ 1 secundă, dar în funcție de acțiunile efectuate. În unele cazuri, faza cheie trebuie repetată, acuratețea recunoașterii nu este întotdeauna 100%.

Pasul 2: Utilizarea dispozitivului

Dacă totul este configurat și verificat, puteți rula dispozitivul.

O limită de curent este că o comandă dată este executată în mod repetat, atâta timp cât nu este oprită (folosind „opri jocul”) sau este dată o altă comandă. Sarcini complexe cu mai multe etape, de ex. „transport1” (evocat prin sintagma „joc de lansare”) sunt întotdeauna executate până la pasul final.

Deci, prin „rotire la dreapta” dispozitivul se va deplasa în pași mici spre dreapta până când se oprește sau se atinge valoarea maximă presetată. „lansează jocul”, „următorul joc” sau „start_video” va începe o serie de mișcări care sunt definite de liste care conțin setarea pentru fiecare servo la un anumit pas. „joc aleatoriu” va face ca dispozitivul să treacă de la un pas la altul, ales aleatoriu dintr-o listă de setări.

După cum puteți vedea în videoclipul însoțitor, am construit un obiect în formă de diabolo din LEGO care poate fi preluat de MeArm și transportat dintr-o locație în alta printr-un set predefinit de mișcări. Puteți defini propriile funcții prin modificarea listelor „transport1” sau „transport2”.

Pasul 3: Scriptul

Scriptul enumerat aici este o modificare a exemplului „Șarpe auditiv” din „Project Keyword Spotter”. Exemplul a fost redus la minimum, apoi a fost adăugată piesa pentru conducerea servomotoarelor, pe baza software-ului și a exemplelor furnizate pentru capota servo Adafruit.

Scriptul nu a fost optimizat până acum. Utilizați pe propriul risc, nu ezitați să modificați și să optimizați.

În plus față de scriptul python există fișierul de comenzi și fișierul de etichete folosit. Plasați-l în subfolderul de configurare.

Așa cum am menționat anterior, ar putea fi necesare mai multe ajustări ale parametrilor pentru a adapta scriptul pentru MeArm-ul dvs. special sau pentru alt dispozitiv.

# Drepturi de autor 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 # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" https://www.apache.org/licenses/LICENSE-2.0 # # Cu excepția cazului în care este cerut de legislația aplicabilă sau este convenit în scris, software-ul # distribuit în baza Licenței este distribuit pe 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ță. # codul original „hearing_snake” a fost modificat pentru o implementare pentru MeArm de către dr. H. Instrucțiuni Implementarea mea folosește un Raspbery Pi 4 cu un accelerator Google Coral și un capot servo Adafruit pe 16 canale atașat. Servoamele unui MeArm (industriile MIME) au fost atașate la porturile 3, 7, 11 și 15 ale capotei. Pentru detalii, aruncați o privire la „Hearing MeArm” instructabil. Comenzi: „poziția x”, x = 0 la 9, mută dispozitivul într-o poziție predefinită dată. „mutați / urcați”, „mutați / coborâți”, „mergeți / rotiți înainte”, „mergeți / întoarceți înapoi”, „rotiți / mergeți la stânga” și „rotiți / mergeți la dreapta” evocă o mișcare lentă, pas cu pas, în direcție, „oprește jocul” oprește mișcările. „deschide filă” și „închide filă” deschide sau închide priză. „pornire video” evocă dispozitivul să urmeze o ordine prestabilită de poziții, definită de lista „poziții”. „joc aleatoriu” are ca rezultat un model aleatoriu de mișcări, „oprire jocului” îl încheie. „joc de lansare” începe o altă serie de mișcări predefinite de lista „transport1”, „joc următor” operațiunea inversă predefinită de „transport2” Utilizați pe propriul risc. '' 'din _future_ import absolut_import din _future_ import diviziune din _future_ import print_function import argparse import os from random random randint from threading import Time thread thread from edgetpu.basic.basic_engine import BasicEngine import model pygame from pygame.locals import * import coadă din import aleatoriu randrange de la adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 import time i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (channels = 16) # set de canale # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # setări min, centru și max up_l = 145 # servo sus / jos: sus md_l = 95 dn_l = 45 up_r = 135 # servo înainte / înapoi md_r = 90 dn_r = 50 ri_t = 30 # rotire braț dreapta sau stânga: poziție dreaptă md_t = 90 # rotire braț dreapta sau stânga: poziție centrală le_t = 150 op_g = 65 # gripper deschis md_g = 90 # gripper centrat cl _g = 130 # priză închisă vert = 15 # numărul de port servo, servo în sus / în jos forw = 11 # numărul de port servo, întoarcere servo în mișcare înainte / înapoi = 7 # port servo pentru rotirea servo grip = 3 # servo port pentru grip servo #list setări braț pentru nouă poziții position = [(md_l, md_r, md_t, op_g), (up_l, md_r, ri_t, op_g), (up_l, md_r, md_t, cl_g), (up_l, md_r, le_t, cl_g), (md_l, md_r, md_t, op_g), (md_l, md_r, md_t, md_g), (md_l, md_r, md_t, cl_g), (dn_l, dn_r, ri_t, op_g), (dn_l, dn_r, m), (dn_l, dn_r, le_t, md_g)] # definește 10 poziții de bază, indicate prin numere întregi 0-9 # proceduri de transport [vert / forward / turn / grip] transport1 = [(140, 70, 65, op_g), (110, 50, 65, op_g), (65, 50, 65, op_g), (65, 70, 65, cl_g), (120, 70, 65, cl_g), #get obiect (100, 70, 135, cl_g), (100, 80, 135, cl_g), (100, 80, 135, md_g), (100, 80, 135, op_g), (140, 70, 135, op_g), (140, 70, 90, op_g), (140, 70, 65, op_g)]

transport2 = [(140, 70, 65, op_g), (140, 70, 135, op_g), (95, 70, 135, op_g), (95, 80, 135, op_g), (95, 80, 135, cl_g), (110, 70, 135, cl_g), (110, 70, 65, cl_g), (70, 70, 65, cl_g), (70, 70, 65, op_g), (80, 50, 65, op_g)]

dans1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "dans"

#moving MeArm to Zero position status = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. angle = status [2] kit.servo [grip].angle = status [3] print (status) class Controler (object): #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 MeArmPos (self, chei): # conduce MeArm la poziții presetate, cuvinte cheie: "poziția x" cheie = int (chei) p = poziție [cheie] a = p [0] b = p [1] c = p [2] d = p [3] print ("Poziții:", cheie, "vert / forw / turn / grip:", a, "/", b, "/", c, "/", d, "grade") status = [a, b, c, d] # documente starea curentă print (status) # sys.stdout.write ("Position: ", cheie", stânga / dreapta: ", a," / ", b," grad ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # controls MeArm dance, keyword: "start_video" dnce = dance1 sp = (len (dnce)) pentru r în intervalul (sp): # ordinea dansului pozițiilor, sp trepte dc = dnce [r] p = poziția [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # setează viteza mișcărilor time.sleep (0,5) # pauză la sfârșitul procedurii def TransMeArm1 (auto): # controlează MeArm transport 1, cuvânt cheie: "lansare joc" tr1 = transport1 sp = (len (tr1)) #calculați numărul de pași pentru r în intervalul (sp): #mai la orice pas p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # sets viteza mișcărilor time.sleep (0,5) def TransMeArm2 (self): # controlează dans MeArm, cuvânt cheie: "joc următor" tr2 = transport2 sp = (len (tr2)) pentru r în interval (sp): #dancing order of positions, sp steps p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # setează viteza mișcărilor time.sleep (0.5)) def RandomMoves (auto): # sare aleatoriu între pozițiile predefinite, cuvânt cheie: "joc aleatoriu" dr = randrange (9) # selectează aleatoriu o poziție p = poziție [dr] # citește parametrii de poziție a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # setează viteza mișcărilor def MoveUp (auto): # gripper de ridicare în pași mici u0 = status [0] # read status curent u1 = u0 + 5 # plus x grade if (u1 > up_l): # testează dacă nu depășește parametrii min / max u1 = up_l # altfel setat la valoarea min / max kit.servo [vert].angle = u1 # move servo status [0] = u1 # ajustați valoarea stării print (" sus ", stare) time.sleep (1) # setează viteza def MoveDown (auto): d 0 = status [0] d1 = d0 - 5 #minus x grade if (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # move servo status [1] = f1 print ("forward", status) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x grade if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo status [2] = l1 print ("left", status) time.sleep (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x grade if (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("right", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # set grip la poziția „open”: „open_tab” time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # set grip la poziția „închis”: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # nu face nimic, dar oprește mișcările print (" stop ", status) time.sleep (0.25) def spotter (self, args): motor = BasicEngine (args.model_file) mic = args.mic dacă args.mic este Nimeni altul int (args.mic) model. int (args.num_frames_hop)) def on_execute (self, args): dacă nu self.on_init (): self._running = False 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 (True, 0.1) except cu coada. Empty: new_item = None dacă new_item nu este None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) sau item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) or item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) sau item == "right": # virează la dreapta self. MoveRight () if (args.debug_ke yboard and keys [pygame. K_LEFT]) or item == "left": # turn left self. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) or item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) or item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) or item == "b": # backwards self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # forward self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) or item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard and keys [pygame. K_C]) or item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) sau item == "s": # stop movement: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) or item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys [pygame. K_1]) or item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) or item == "2": self. MeArmPos (2) if (args.debug_keyboard and keys [pygame. K_3]) or it em == "3": self. MeArmPos (3) if (args.debug_keyboard and keys [pygame. K_4]) or item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) sau item == "5": self. MeArmPos (5) if (args.debug_keyboard and keys [pygame. K_6]) or item == "6": self. MeArmPos (6) if (args.debug_keyboard and chei [pygame. K_7]) sau item == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) or item == "8": self. MeArmPos (8) if (args.debug_keyboard and keys [pygame. K_9]) or item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. DancingMeArm () #dancing MeArm, pe "next_game" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #random dance "random game" if (args.debug_keyboard and keys [arg. pygame. K_j]) sau item == "j": self. TransMeArm1 () # transport object: "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) or item == "k": self. TransMeArm2 () # direcția inversă a obiectului de transport: "jocul_ următor" '' 'if (args.debug_keyboard și tastele [pygame. K_l]) sau element == "l": self. JumpingJack2 (1) #LED clipesc „target” '' '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 MeArm.', action = 'store_true', implicit = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Recomandat: