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, Červenec
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 následujícím textu bych chtěl popsat hlasem ovládanou verzi MeArm, malého xyz robotického ramene s chapadlem. Použil jsem MeArm Pi z odvětví MIME, ale systém by měl být použitelný pro jakoukoli verzi zařízení MeArm nebo podobných servopohonů.

Použití Google Coral TPU Accelerator umožňuje spouštět rychlé offline skripty rozpoznávání hlasu TensorFlow na Raspberry Pi a tímto způsobem ovládat fyzická zařízení pomocí hlasových příkazů s latencí pod jednu sekundu.

Zde popsané zařízení je kombinací a rozšířením konceptů popsaných ve dvou předchozích pokynech. Jedná se o rozšíření dřívější implementace hlasového ovládání Google Coral, Jumping Jack, popsaného zde, a obrovské vylepšení zde popsaného hlasového ovládání Google AIY MeArm.

Hlasem ovládaná MeArm využívající systém Google Voice AIY vyžadovala online přístup, nebyla snadno implementovatelná, vyžadovala stisknutí tlačítka pro aktivaci poslechu pro hlasové příkazy a měla dlouhou dobu latence. Použitý Google Coral TPU Accelerator nyní umožňuje spouštět modely TensorFlowLite offline vysokou rychlostí na Raspberry Pi nebo jiných zařízeních Linux. Mezi příklady na stránce Google Coral Github patří příklad s názvem „sluchový had“pro systém rozpoznávání hlasu, který dokáže porozumět 140 klíčovým frázím (září 2019), které jsou poté mapovány na virtuální stisknutí kláves. Spojením těchto „úhozů“s prováděním některých funkcí naprogramovaných v Pythonu je možné vybudovat zařízení ovládané hlasovými povely. Nedávno jsem popsal první implementaci, hlasem ovládaný elektromechanický skákací konektor. Implementace zde je o něco složitější a umožňuje ovládat všechna čtyři serva MeArm, aby buď MeArm pohybovala nepřetržitě, nebo aby se přesunula na řadu předdefinovaných pozice, nebo provádět některé složitější úkoly.

Pomocí zde uvedeného skriptu jako příkladu by mělo být relativně jednoduché sestrojit další zařízení ovládaná hlasem, např. robotická auta nebo pomocné technické jednotky.

Zásoby

  • MeArm. Zde použité: MeArm Pi od MIME Industries
  • Raspberry Pi 4
  • Google Coral TPU Accelerator
  • 16kanálová servo kapota Adafruit
  • nějaké propojovací kabely
  • volitelně: kondenzátor pro kapotu serva, asi 400 µF pro 4 serva (doporučuje Adafruit)
  • Napájení 5-6 V pro servo kapotu. Zde jsem použil starou 6V nabíječku, funguje také baterie 4x AA
  • Mikrofon. Jako mikrofon jsem použil starou webovou kameru Microsoft HD3000.

Krok 1: Nastavení systému

Nastavení systému
Nastavení systému
Nastavení systému
Nastavení systému

Stáhněte si předkonfigurovaný obrázek Raspian pro Google Coral TPU Accelerator ze stránky Google Coral Github a nainstalujte jej na kartu µSD. Obrázek obsahuje také řadu příkladů skriptů. Nastavte Pi podle pokynů.

Nainstalujte si ukázku klíčových slov z webu Google Coral GitHub, pokud není součástí obrázku, a všech požadovaných programů. Připojte mikrofon k Pi. Doporučil bych si pohrát s příkladem „Hearing Snake“, abyste se ujistili, že vše funguje.

Stáhněte a nainstalujte 16kanálový software kapoty Adafruit, jak je popsáno zde. Nainstalujte kapotu a hrajte s příklady Adafruit, abyste se ujistili, že vše funguje správně.

Stáhněte si soubory připojené k tomuto pokynu a zkopírujte je do složky „Project Keyword Spotter“. Soubor "commands_v1_MeArm.txt" musí být zkopírován do podsložky "config".

Připojte serva MeArm k servo kapotě, jak je naznačeno. Použil jsem port 15 pro nahoru/dolů, port 11 pro dopředu/dozadu, port 7 pro otočení a port 3 pro serva chapadel.

V rámci skriptu možná budete muset upravit hodnoty min/center/max pro každé servo podle vaší konfigurace. Tato nastavení pomáhají předcházet poškození serv. Možná budete muset také upravit zahrnuté seznamy „pozice“, „transport1“a „transport2“.

Spusťte skript. Doposud jsem to provozoval z IDE.

V případě, že byste chtěli upravit klíčové fráze, které vyvolávají určitou funkci, podle vaší potřeby. Kompletní seznam dostupných klíčových frází najdete v souboru „labels_gc2 raw.txt“v podsložce config.

Systém má dobu latence přibližně 1 sekundu, ale hodně závisí na tom, jaké akce se provádějí. V některých případech je třeba klíčovou fázi opakovat, přesnost rozpoznávání není vždy 100%.

Krok 2: Používání zařízení

Pokud je vše nastaveno a zaškrtnuto, můžete zařízení spustit.

Aktuální omezení spočívá v tom, že se daný příkaz provádí opakovaně, pokud není zastaven (pomocí „stop hry“) nebo je zadán jiný příkaz. Složité vícestupňové úkoly, např. „Transport1“(evokovaný frází „launch game“) jsou vždy provedeny až do posledního kroku.

Takže „odbočením doprava“se zařízení bude pohybovat po malých krocích doprava, dokud se nezastaví nebo dokud nebude dosaženo přednastavené maximální hodnoty. „spustit hru“, „další hra“nebo „start_video“zahájí sérii tahů, které jsou definovány seznamy obsahujícími nastavení pro každé servo v daném kroku. "náhodná hra" bude zařízení přeskakovat z jednoho do druhého kroku, náhodně vybraného ze seznamu nastavení.

Jak můžete vidět v doprovodném videu, nechal jsem postavit předmět ve tvaru ďábla od LEGO, který může MeArm vyzvednout a transportovat z jednoho místa na druhé pomocí předdefinované sady pohybů. Své vlastní funkce můžete definovat úpravou seznamů „transport1“nebo „transport2“.

Krok 3: Skript

Zde uvedený skript je modifikací příkladu "Hearing Snake" z "Spotteru klíčových slov projektu". Příklad byl odstraněn na minimum a poté byla přidána část pro pohon serva na základě softwaru a příkladů poskytnutých pro kapotu serva Adafruit.

Skript již nebyl optimalizován. Používejte na vlastní riziko, upravujte a optimalizujte.

Kromě skriptu pythonu existuje soubor příkazů a použitý soubor štítků. Umístěte jej do podsložky config.

Jak již bylo zmíněno dříve, k přizpůsobení skriptu pro vaše speciální MeArm nebo jiné zařízení může být zapotřebí několik úprav parametrů.

# Copyright 2019 Google LLC#

# Licencováno pod licencí Apache, verze 2.0 („licence“); # tento soubor nesmíte používat, pokud to není v souladu s licencí. # Kopii licence můžete získat 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 # # Pokud to nevyžaduje příslušný zákon nebo to není písemně dohodnuto, je software # distribuovaný na základě licence distribuován na základě „JAK JE“, # BEZ ZÁRUK NEBO PODMÍNEK JAKÝKOLI DRUH, výslovný nebo implikovaný. # Viz Licence pro konkrétní jazyk řídící oprávnění a # omezení v rámci Licence. # původní kód „hear_snake“byl upraven pro implementaci pro MeArm dr. H. '' 'Pokyny Moje implementace používá Raspbery Pi 4 s akcelerátorem Google Coral a připojenou 16kanálovou servo kapotu Adafruit. Na porty 3, 7, 11 a 15 kapoty byla připevněna serva MeArm (průmyslová odvětví MIME). Podrobnosti naleznete v pokynu „Hearing MeArm“. Příkazy: "pozice x", x = 0 až 9, přesune zařízení do dané předdefinované polohy. „přesunout/jít nahoru“, „přesunout/jít dolů“, „jít/otočit dopředu“, „jít/otočit dozadu“, „otočit/jít doleva“a „otočit/jít doprava“vyvolává v daném kroku pomalý, krokový pohyb směru, „stop game“zastaví pohyby. „otevřít kartu“a „zavřít kartu“otevírá nebo zavírá chapadlo. „spustit video“evokuje zařízení, aby se vydalo podle přednastaveného pořadí pozic definovaných v seznamu „pozice“. „random game“má za následek náhodný vzorec pohybů, „stop game“to končí. „spustit hru“spustí další sérii tahů předdefinovaných v seznamu „transport1“, „další hra“reverzní operaci předdefinovanou pomocí „transport2“Použijte na vlastní riziko. '' 'z _future_ import absolutní_import z _future_ divize importu z _future_ import print_function import argparse import os z random import randint z vlákna závit import čas importu vlákna z edgetpu.basic.basic_engine import BasicEngine import modelu import pygame z pygame.locals import * import fronty z náhodný import randrange z adafruit_servokit import ServoKit import deska import busio import adafruit_pca9685 čas importu i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanály = 16) # nastavit počet kanálů # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # nastavení min, střed a max up_l = 145 # servo nahoru/dolů: nahoru md_l = 95 dn_l = 45 nahoru_r = 135 # servo vpřed/vzad md_r = 90 dn_r = 50 ri_t = 30 # otočné rameno vpravo nebo vlevo: pravá poloha md_t = 90 # otočné rameno vpravo nebo vlevo: střední poloha le_t = 150 op_g = 65 # chapadlo otevřené md_g = 90 # třmen na střed chapadla _g = 130 # chapadlo zavřeno vert = 15 # počet servoportů, servo nahoru/dolů vpřed = 11 # počet servoportů, otáčení servopohonu dopředu/dozadu = 7 # servo port pro otáčení servopohonu = 3 # servo port pro grip servo #seznam nastavení ramene pro devět poloh pozice = [(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 pozic, označených celými čísly 0-9 # přepravní postupy [vert/vpřed/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 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]. úhel = status [2] kit.servo [grip].angle = status [3] print (status) class Ovládací prvek (objekt): #Callback funkce def _init _ (self, q): self._q = q def callback (self, příkaz): self._q.put (příkaz) třída Aplikace: 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: "position x" key = int (keys) p = poloha [klíč] a = p [0] b = p [1] c = p [2] d = p [3] tisk ("Pozice:", klíč, "vert/dopředný/otočný/rukojeť:", a, "/", b, "/", c, "/", d, "stupně") status = [a, b, c, d] # dokumentů aktuální stav tisk (stav) # sys.stdout.write ("pozice: ", klíč," vlevo/vpravo: ", a,"/", b," stupeň ") kit.servo [vert].angle = a kit.servo [vpřed].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)) pro r v rozsahu (sp): #taneční pořadí pozic, 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 rychlost pohybů čas.spánek (0,5) # přestávka na konci procedury def TransMeArm1 (self): # ovládá transport MeArm 1, klíčové slovo: "spustit hru" tr1 = transport1 sp = (len (tr1)) #vypočítejte počet kroků pro r v rozsahu (sp): #přejděte na jakýkoli krok 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 rychlost pohybů time.sleep (0,5) def TransMeArm2 (self): # controls MeArm dance, keyword: "next game" tr2 = transport2 sp = (len (tr2)) for r in range (sp): #pořadí tanců poloh, 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 velocity of pohyby time.sleep (0.5) def RandomMoves (self): # přeskakuje náhodně mezi předdefinovanými pozicemi, klíčové slovo: „náhodná hra“dr = randrange (9) #randomly vybere pozici p = pozice [dr] # čte parametry pozice 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ánek (1) # nastavuje rychlost pohybů def MoveUp (vlastní): # zvedání chapadla v malých krocích u0 = stav [0] # čtení aktuálního stavu u1 = u0 + 5 # plus x stupňů, pokud (u1 > up_l): # testy, pokud nepřekračují minimální/maximální parametry u1 = up_l # jinak nastaveno na min/max hodnotu kit.servo [vert].angle = u1 # přesunout stav servo [0] = u1 # upravit stavovou hodnotu vytisknout (" nahoru ", stav) time.sleep (1) # nastavuje rychlost def MoveDown (self): d 0 = stav [0] d1 = d0 - 5 # minus x stupňů, pokud (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 stav [2] = l1 tisk ("vlevo", stav) čas.spánek (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 # nastavit grip do polohy „open“: „open_tab“time.sleep (0,5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # set grip to „closed“position: " close_tab "time.sleep (0,5) status [3] = cl_g def StopMove (self): # nedělá nic, ale zastaví pohyby tisk (" 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_hz), 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) kromě queue. Empty: new_item = None if new_item is not None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) or 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]) nebo item == "right": # odbočit vpravo self. MoveRight () if (args.debug_ke yboard a klíče [pygame. K_LEFT]) nebo item == "left": # odbočit doleva self. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) nebo 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": # 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]) or 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]) or item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) nebo 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 klíče [pygame. K_7]) nebo 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, na "next_game" if (args.debug_keyboard and keys [pygame. K_r]) nebo item == "r": self. RandomMoves () #random dance "random game" if (args.debug_keyboard and keys [pygame. K_j]) nebo item == "j": self. TransMeArm1 () # transportní objekt: "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) nebo item == "k": self. TransMeArm2 () # transport objektu opačným směrem: "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 = 'Použijte klávesnici k ovládání MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Doporučuje: