Obsah:

Hearing MeArm, Google Coral TPU Accelerator Driven: 3 Steps
Hearing MeArm, Google Coral TPU Accelerator Driven: 3 Steps

Video: Hearing MeArm, Google Coral TPU Accelerator Driven: 3 Steps

Video: Hearing MeArm, Google Coral TPU Accelerator Driven: 3 Steps
Video: 208: What If You Had a Machine Do It 2024, Júl
Anonim
Hearing MeArm, Google Coral TPU Accelerator Driven
Hearing MeArm, Google Coral TPU Accelerator Driven
Hearing MeArm, Google Coral TPU Accelerator Driven
Hearing MeArm, Google Coral TPU Accelerator Driven
Hearing MeArm, Google Coral TPU Accelerator Driven
Hearing MeArm, Google Coral TPU Accelerator Driven
Hearing MeArm, Google Coral TPU Accelerator Driven
Hearing MeArm, Google Coral TPU Accelerator Driven

V nasledujúcom texte by som chcel popísať hlasom ovládanú verziu MeArm, malého xyz robotického ramena s chápadlom. Použil som MeArm Pi z priemyslu MIME, ale systém by mal byť použiteľný pre akúkoľvek verziu zariadenia MeArm alebo podobných zariadení poháňaných servomotorom.

Použitie Google Coral TPU Accelerator umožňuje spúšťať rýchle offline skripty rozpoznávania hlasu TensorFlow na Raspberry Pi a týmto spôsobom ovládať fyzické zariadenia pomocou hovorených príkazov s latenciou pod jednu sekundu.

Tu opísané zariadenie je kombináciou a rozšírením konceptov popísaných v dvoch predchádzajúcich pokynoch. Ide o rozšírenie predchádzajúcej implementácie hlasového ovládania Google Coral, Jumping Jack, popísaného tu, a o rozsiahle zlepšenie tu popísaného hlasového ovládania Google AIY MeArm.

Hlasom ovládaný MeArm pomocou systému Google Voice AIY vyžadoval online prístup, jeho implementácia nebola jednoduchá, na aktiváciu počúvania hlasových príkazov bolo potrebné stlačiť tlačidlo a mal dlhý čas latencie. Použitý akcelerátor Google Coral TPU teraz umožňuje prevádzkovať modely TensorFlowLite offline vysokou rýchlosťou na Raspberry Pi alebo iných zariadeniach Linux. Medzi príkladmi na stránke Google Coral Github patrí príklad s názvom „počujúci had“pre systém rozpoznávania hlasu, ktorý dokáže porozumieť 140 kľúčovým frázam (september 2019), ktoré sú potom mapované na virtuálne stlačenia klávesov. Spojenie týchto „stlačení klávesov“s vykonávaním niektorých funkcií naprogramovaných v jazyku Python umožňuje vybudovať zariadenie ovládané hlasovými príkazmi. Nedávno som opísal prvú implementáciu, hlasom ovládaný elektromechanický skákací zdvihák. Implementácia v tomto dokumente je o niečo zložitejšia a umožňuje ovládať všetky štyri servá MeArm, aby sa MeArm buď pohybovalo nepretržite, alebo aby sa presúvalo na niekoľko preddefinovaných. pozíciách alebo vykonávať niektoré zložitejšie úlohy.

Použitím príkladu, ktorý je tu poskytnutý, by malo byť relatívne jednoduché zostrojiť ďalšie zariadenia ovládané hlasom, napr. robotické autá alebo pomocné technické jednotky.

Zásoby

  • MeArm. Tu sa používa: MeArm Pi od MIME Industries
  • Raspberry Pi 4
  • Google Coral TPU Accelerator
  • 16 -kanálová servo kapota Adafruit
  • nejaké štartovacie káble
  • voliteľné: kondenzátor pre kapotu serva, asi 400 µF pre 4 servá (odporúča Adafruit)
  • Napájací zdroj 5-6 V pre servo kapotu. Tu som použil starú 6V nabíjačku, funguje aj batéria 4x AA
  • Mikrofón. Ako mikrofón som použil starú webovú kameru Microsoft HD3000.

Krok 1: Nastavenie systému

Nastavenie systému
Nastavenie systému
Nastavenie systému
Nastavenie systému

Stiahnite si predkonfigurovaný obrázok Raspian pre nástroj Google Coral TPU Accelerator zo stránky Google Coral Github a nainštalujte ho na kartu µSD. Obrázok obsahuje aj niekoľko ukážkových skriptov. Nastavte Pi podľa popisu.

Nainštalujte si príklad vyhľadávača kľúčových slov z webu Google Coral GitHub, ak nie je zahrnutý v obrázku, a všetkých požadovaných programov. Pripojte mikrofón k Pi. Odporúčam vám hrať sa s príkladom „Počúvajúceho hada“, aby ste sa uistili, že všetko funguje.

Stiahnite si a nainštalujte 16 -kanálový softvér kapoty Adafruit, ako je popísané tu. Nainštalujte kapotu a hrajte sa s príkladmi Adafruit, aby ste sa uistili, že všetko funguje správne.

Stiahnite si súbory priložené k tomuto návodu a skopírujte ich do priečinka „Project Keyword Spotter“. Súbor „commands_v1_MeArm.txt“je potrebné skopírovať do podpriečinka „config“.

Pripojte serva svojho MeArmu k kapote serva podľa obrázku. Použil som port 15 na hore/dole, port 11 na dopredu/dozadu, port 7 na otočenie a port 3 na servách chápadla.

V rámci skriptu budete možno musieť prispôsobiť hodnoty min/stred/max pre každé servo svojej konfigurácii. Tieto nastavenia pomáhajú predchádzať poškodeniu serv. Možno budete musieť tiež upraviť zahrnuté zoznamy „pozícií“, „transport1“a „transport2“.

Spustite skript. Doteraz som ho spúšťal z IDE.

V prípade, že by ste chceli upraviť kľúčové frázy, ktoré evokujú určitú funkciu, podľa vašich potrieb. Kompletný zoznam dostupných kľúčových fráz nájdete v súbore „labels_gc2 raw.txt“v podpriečinku config.

Systém má latenciu približne 1 sekundu, ale závisí to od toho, aké akcie sa vykonávajú. V niektorých prípadoch sa musí kľúčová fáza zopakovať, presnosť rozpoznania nie je vždy 100%.

Krok 2: Používanie zariadenia

Ak je všetko nastavené a začiarknuté, môžete zariadenie spustiť.

Aktuálnym obmedzením je, že daný príkaz sa vykonáva opakovane, pokiaľ nie je zastavený (pomocou „zastavovacej hry“) alebo je daný iný príkaz. Zložité viacstupňové úlohy, napr. „Transport1“(vyvolaný výrazom „spustiť hru“) sa vždy vykoná do posledného kroku.

Takže „odbočením doprava“sa zariadenie bude pohybovať po malých krokoch doprava, kým sa nezastaví alebo kým sa nedosiahne predvolená maximálna hodnota. „launch game“, „next game“alebo „start_video“spustí sériu ťahov, ktoré sú definované zoznamami obsahujúcimi nastavenia pre každé servo v danom kroku. „náhodná hra“bude zariadenie preskakovať z jedného do druhého kroku, náhodne vybratého zo zoznamu nastavení.

Ako môžete vidieť v sprievodnom videu, postavil som predmet v tvare diabolky od LEGO, ktorý môže MeArm vyzdvihnúť a transportovať z jedného miesta na druhé pomocou preddefinovanej sady pohybov. Svoje vlastné funkcie môžete definovať úpravou zoznamov „transport1“alebo „transport2“.

Krok 3: Skript

Tu uvedený skript je modifikáciou príkladu „Hearing Snake“z „Spotteru kľúčových slov projektu“. Príklad bol odstránený na minimum a potom bola pridaná časť na pohon serva na základe softvéru a príkladov poskytnutých pre kapotu serva Adafruit.

Skript zatiaľ nie je optimalizovaný. Používajte na vlastné riziko, upravujte a optimalizujte.

Okrem skriptu python existujú aj príkazy-súbor a použitý súbor štítkov. Umiestnite ho do podpriečinka config.

Ako už bolo spomenuté, na prispôsobenie skriptu pre vaše špeciálne zariadenie MeArm alebo iné zariadenie môže byť potrebných niekoľko úprav parametrov.

# Copyright 2019 Google LLC#

# Licencované pod licenciou Apache, verzia 2.0 („licencia“); # Tento súbor nemôžete používať, pokiaľ nie je v súlade s licenciou. # Kópiu licencie môžete získať na # # 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 # # Pokiaľ to nevyžaduje príslušný zákon alebo to nie je písomne dohodnuté, softvér # distribuovaný na základe licencie je distribuovaný na základe „TAK AKÝ JE“, # BEZ ZÁRUK ALEBO PODMIENOK Ľubovoľný druh, vyjadrený alebo implikovaný. # Pozrite si Licenciu pre konkrétny jazyk, ktorým sa riadia povolenia a # obmedzenia v rámci Licencie. # pôvodný kód „Hear_snake“upravil na implementáciu pre MeArm Dr H. '' 'Pokyny Moja implementácia používa Raspbery Pi 4 s akcelerátorom Google Coral a 16 -kanálovou servo kapotou Adafruit. Serva MeArm (priemysel MIME) boli pripevnené k portom 3, 7, 11 a 15 kapoty. Bližšie informácie nájdete v pokyne „Hearing MeArm“. Príkazy: „pozícia x“, x = 0 až 9, presunie zariadenie do danej preddefinovanej polohy. „pohybovať/ísť hore“, „pohybovať sa/klesať“, „ísť/otáčať dopredu“, „ísť/otáčať sa dozadu“, „odbočiť/ísť vľavo“a „odbočiť/ísť doprava“evokuje v danom kroku pomalý, krokový pohyb smere, „stop game“zastaví pohyby. „otvorená záložka“a „zatvorená karta“otvára alebo zatvára chápadlo. „spustenie videa“evokuje zariadenie, aby išiel podľa prednastaveného poradia polôh definovaných v zozname „polohy“. „random game“má za následok náhodný vzorec pohybov, „stop game“to končí. „launch game“spustí ďalšiu sériu ťahov preddefinovaných v zozname „transport1“, „ďalšia hra“opačnú operáciu preddefinovanú v „transport2“Použitie na vlastné riziko. '' 'z _future_ import absolute_import z _future_ divízia importu z _future_ import print_function import argparse import os z random import randint from threading import Thread import time from edgetpu.basic.basic_engine import BasicEngine import model import pygame from pygame.locals import * import queue náhodný import randrange z 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 (kanály = 16) # nastavený počet kanálov # kit.servo [0]. rozsah_aktivity = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min., stred a max. nastavenie up_l = 145 # servo hore/dole: hore md_l = 95 dn_l = 45 hore_r = 135 # servo dopredu/dozadu md_r = 90 dn_r = 50 ri_t = 30 # otočné rameno vpravo alebo vľavo: pravá poloha md_t = 90 # otočné rameno vpravo alebo vľavo: stredová poloha le_t = 150 op_g = 65 # otvorený chapač md_g = 90 # uchopovač sústredený cl _g = 130 # zatvorený chápadlo vert = 15 # počet servo portov, servo hore/dole vpred = 11 # počet servoportov, otáčanie servopohonu dopredu/dozadu = 7 # servo port pre otáčanie servopohonu = 3 # servo port pre grip servo #zoznam nastavení ramien pre deväť polôh poloha = [(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_,), (dn_l, dn_r, le_t, md_g)] # definuje 10 základných pozícií označených celými číslami 0-9 # prepravné postupy [vert/dopredu/otáčanie/uchopenie] 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 objekt (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)]

dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a „tanec“

#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 Ovládač (objekt): #Callback function def _init _ (self, q): self._q = q def callback (self, príkaz): self._q.put (príkaz) trieda Aplikácia: 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, keys): # runs MeArm to preset addresses, keywords: keywords „position x“key = int (keys) p = poloha [kláves] a = p [0] b = p [1] c = p [2] d = p [3] tlač ("Pozície:", kláves, "vert/dopredu/otáčanie/uchopenie:", a, "/", b, "/", c, "/", d, "stupne") stav = [a, b, c, d] # dokumentov aktuálny stav tlač (stav) # sys.stdout.write ("pozícia: ", kľúč," vľavo/vpravo: ", a,"/", b," stupeň ") 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)) pre r v rozsahu (sp): #poradie tancovania polôh, sp kroky dc = dnce [r] p = poloha [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) # nastavuje rýchlosť pohybov čas.spánok (0,5) # prestávka na konci postupu def TransMeArm1 (self): # ovláda transport MeArm 1, kľúčové slovo: „spustiť hru“tr1 = transport1 sp = (len (tr1)) #vypočítajte počet krokov pre r v rozsahu (sp): #prejdite na ľubovoľný krok p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] súprava. 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 rýchlosť pohybov time.sleep (0,5) def TransMeArm2 (self): # controls MeArm dance, keyword: "next game" tr2 = transport2 sp = (len (tr2)) for r in range (sp): #poradie tancovania polôh, sp kroky 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) # sets the speed of pohyby time.sleep (0.5) def RandomMoves (self): # skáče náhodne medzi preddefinovanými pozíciami, kľúčové slovo: „náhodná hra“dr = randrange (9) # náhodne vyberá pozíciu p = poloha [dr] # číta parametre polohy 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 čas.spánok (1) # nastaví rýchlosť pohybov def MoveUp (vlastné): # zdvíhanie chápadla v malých krokoch u0 = stav [0] # čítanie aktuálneho stavu u1 = u0 + 5 # plus x stupňov, ak (u1 > up_l): # testy, ak nepresahujú min/max parametre u1 = up_l # inak nastavené na min/max hodnotu kit.servo [vert].angle = u1 # move servo status [0] = u1 # adjust status value print (" hore ", stav) time.sleep (1) # nastaví rýchlosť def MoveDown (self): d 0 = stav [0] d1 = d0 - 5 # mínus x stupňov, ak (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 stupňů 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 stupňů 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 # nastavte grip do „otvorenej“polohy: „open_tab“time.sleep (0,5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # nastavte grip do „zatvorenej“polohy: " close_tab "time.sleep (0,5) status [3] = cl_g def StopMove (self): # nerobí nič, ale zastaví pohyby, tlač (" stop ", stav) time.sleep (0.25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic is None else int (args.mic) model.classify_audio (mic, engine, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_rz), int (args.num_frames_hop)) def on_execute (self, args): if not self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) if not 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) okrem queue. Empty: new_item = None if new_item is not None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) alebo položka == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) alebo item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) alebo item == "right": # odbočiť vpravo self. MoveRight () if (args.debug_ke yboard a klávesy [pygame. K_LEFT]) alebo 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": # Forwards self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) or item == "o": # otvorený úchop: self. OpenGrip () if (args.debug_keyboard and keys [pygame. K_C]) alebo item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) alebo item == "s": # stop moving: "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]) alebo item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) alebo položka == "5": self. MeArmPos (5) if (args.debug_keyboard and keys [pygame. K_6]) alebo item == "6": self. MeArmPos (6) if (args.debug_keyboard and kľúče [pygame. K_7]) alebo položka == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) alebo 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, na "next_game" if (args.debug_keyboard and keys [pygame. K_r]) alebo item == "r": self. RandomMoves () #random dance "random game" if (args.debug_keyboard and keys [pygame. K_j]) alebo item == "j": self. TransMeArm1 () # transportný objekt: "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) alebo item == "k": self. TransMeArm2 () # transportný objekt v opačnom smere: „next_game“'' 'if (args.debug_keyboard a keys [pygame. K_l]) or item == "l": self. JumpingJack2 (1) #LED blink "target" '' '' time.sleep (0,05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Ovládať MeArm pomocou klávesnice.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Odporúča: