Obsah:

Hearing Jumping Jack, Google Coral TPU Accelerator Verze: 4 kroky
Hearing Jumping Jack, Google Coral TPU Accelerator Verze: 4 kroky

Video: Hearing Jumping Jack, Google Coral TPU Accelerator Verze: 4 kroky

Video: Hearing Jumping Jack, Google Coral TPU Accelerator Verze: 4 kroky
Video: Introducing Coral Dev Board Micro 2024, Červenec
Anonim
Hearing Jumping Jack, verze Google Coral TPU Accelerator
Hearing Jumping Jack, verze Google Coral TPU Accelerator
Hearing Jumping Jack, verze Google Coral TPU Accelerator
Hearing Jumping Jack, verze Google Coral TPU Accelerator
Hearing Jumping Jack, verze Google Coral TPU Accelerator
Hearing Jumping Jack, verze Google Coral TPU Accelerator

Pohybuje končetinami, poslouchá vaše rozkazy, pohání ji nejnovější technologie strojového učení

„Hearing Jumping Jack“je jednoduchý elektromechanický skákací zvedák poháněný dvěma mikro servy a velmi jednoduchým převodem s LED diodami jako „očima“. Ovládá se jednoduchými hlasovými povely, které indikují, kterou z devíti předdefinovaných pozic má zaujmout, nebo zda má být dioda LED zapnuta nebo vypnuta, nebo zda má provést předdefinovaný „tanec“nebo náhodnou sadu tahů.

Základním prvkem systému je akcelerátor Google Coral TPU, který umožňuje spouštět modely Tensorflow Lite offline velmi vysokou rychlostí, a to i na „slabém“počítači jako Raspberry Pi. To umožňuje např. rychlá identifikace a klasifikace objektů pomocí kamery RPi, ale také lokální spouštění funkcí rozpoznávání hlasu na základě strojového učení.

Pokud je mi známo, toto je první publikovaný příklad fyzického zařízení DIY poháněného detekcí hlasu Coral Accelerator a připojený příklad kódu může být také použit pro jiné, složitější projekty.

Ovládání hlasem je založeno na příkladu „slyšícího hada“v „spotteru klíčových slov projektu“(https://github.com/google-coral/project-keyword-spotter), který byl nedávno (září 2019) umístěn na GitHub. V mé konfiguraci se systém skládá z Raspberry Pi 4 vybaveného 16kanálovou servo kapotou Adafruit, akcelerátorem Google Coral TPU a webovou kamerou, zde používanou jako mikrofon. Skákací zvedák byl popsán dříve v předchozím instruktážním programu, kde byl poháněn sadou Google Voice pro čtení hlasových příkazů, je připojen k Servo Bonnet ve verzi 2.0, která je popsána v následujícím textu.

Předchozí verze sady Google Voice Kit měla tři hlavní omezení: záleželo na webových službách rozpoznávání hlasu Google a nastavení bylo poměrně komplikované, před povelem bylo potřeba stisknout nějaké tlačítko a došlo k vážnému zpoždění mezi vyslovením příkazu a reakcí systému. Použití akcelerátoru Google Coral zkracuje dobu odezvy na sekundy, je nezávislý na připojení k internetu a neustále poslouchá. S některými úpravami jej můžete použít k ovládání zařízení mnohem složitějších jako Jumping Jack, jako roboti nebo auta nebo cokoli, co můžete postavit a ovládat pomocí Raspberry Pi.

Ve své aktuální verzi nástroj pro vyhledávání klíčových slov rozumí sadě asi 140 krátkých klíčových slov/klíčových frází, definovaných v doprovodném souboru modelu („voice_commands_v0.7_egetpu.tflite“) a popsaných v samostatném souboru popisků („labels_gc2.raw.txt“). Definována volně upravitelným souborem („commands_v2_hampelmann.txt“), klíčová slova používaná konkrétně naším skriptem jsou poté mapována na stisk kláves na virtuální klávesnici, např. pro písmena, čísla, nahoru/dolů/doleva/doprava, crtl+c atd.

Pak např. pomocí pygame.key jsou tyto „stisky kláves“čteny a používány k ovládání, jaké akce má zařízení, zde skákací zvedák, provádět. V našem případě to znamená přenést dvě serva do předdefinovaných poloh nebo zapnout nebo vypnout LED diody. Když vyhledávač klíčových slov běží v samostatném běhounu, může trvale poslouchat vaše objednávky.

Verze 21. září 2019

Zásoby

Raspberry Pi 4, přes Pimoroni

Google Coral TPU Accelerator, přes Mouser Germany, 72 €

Servo kapota Adafruit 16, přes Pimoroni, asi 10 €

www.adafruit.com/product/3416

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

Záhlaví stohovače (je -li vyžadováno)

www.adafruit.com/product/2223

4x AA baterie (nebo jiný 5-6V napájecí zdroj) pro Servo Bonnet

Stará webová kamera jako mikrofon

Skákací zvedák poháněný servem, jak je popsáno v předchozím pokynu. Výkresy rozvržení jsou připojeny k dalšímu kroku, ale mohou vyžadovat úpravy.

Požadované díly pro Jumping Jack:

- Forexová deska 3 mm

- 2 mikro serva

- 2 a 3 mm šrouby a matice

- 2 bílé LED diody a rezistor

- trochu kabelu

Krok 1: Nastavení zařízení

Nastavení zařízení
Nastavení zařízení
Nastavení zařízení
Nastavení zařízení
Nastavení zařízení
Nastavení zařízení

Při stavbě skákacího zvedáku se řiďte pokyny uvedenými v předchozím pokynu. Pro svůj prototyp jsem použil Forex, ale můžete použít laserem řezané akrylové nebo překližkové desky. Možná budete muset upravit rozložení podle velikosti vašich serv atd. Vyzkoušejte, zda se končetiny a převodovka mohou pohybovat bez tření.

Nastavte si Raspberry Pi. Na webu Coral Github je k dispozici obrázek Raspian, který obsahuje vše potřebné ke spuštění akcelerátoru Coral na Pi a obsahuje mnoho projektů, přičemž všechna nastavení jsou již zavedena.

Získejte vyhledávač klíčových slov projektu ze stránky Google Coral GitHub. Nainstalujte veškerý požadovaný software podle pokynů.

Nainstalujte poskytnuté soubory. Umístěte skript skákacího jack pythonu do složky spotter klíčových slov projektu a soubor odpovídajících příkazů do podsložky config.

Připojte servo kapotu Adafruit k Pi. Jelikož používám kryt RPI s ventilátorem, potřeboval jsem k povolení připojení použít stohovače GPIO (např. Dostupné od Pimoroni). Nainstalujte všechny požadované knihovny, jak je uvedeno v pokynech k servo kapotě Adafruit.

Připojte k servo kapotě zdroj 5-6V. Připojte serva a LED diody. V mém případě jsem použil port 0 pro LED a porty 11 a 15 pro serva.

Chcete -li si vše ověřit, doporučil bych nejprve vyzkoušet příklad klíčového slova spotter „slyšet hada“a příklady servo kapoty Adafruit.

Krok 2: Spuštění skákacího zvedáku

Pokud jsou všechny části nastaveny a běží, zkuste je použít. Skript můžete spustit v IDE nebo z příkazového řádku.

Křičením „pozice 0“na „pozici 9“vyvoláte Jumping Jacka, aby zaujal jednu z předdefinovaných pozic. Definoval jsem „1“jako obě paže nahoru (uu), „3“jako levé nahoru, pravé dolů (ud), „9“jako obě paže dolů (dd) a „5“jako obě paže ve středu (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

„0“je totožné s „5“. „3“a „8“nejsou rozpoznáváním klíčových slov příliš dobře rozpoznány a může být nutné je opakovat.

Možná budete muset nastavit minimální a maximální hodnoty pro každé servo/stranu, aby serva nebyla zablokována a poté odebírala příliš mnoho energie.

„další hra“zahájí „tanec“, tj. definovanou posloupnost pozic, zatímco „náhodná hra“spustí skákajícího Jacka, aby provedl náhodnou sekvenci tahů. V obou případech poběží navždy, takže možná budete muset zastavit pohyby, např. příkazem „pozice nula“.

„stop game“vyvolá „ctrl + c“a zastaví proces.

Lze použít „zapnout“a „vypnout“zapnutí a vypnutí LED diod.

Úpravou hodnot time.sleep můžete upravit rychlost pohybů.

Krok 3: Kód a soubor příkazů

Zde uvedený kód je modifikací kódu „slyšícího hada“, který je součástí balíčku spotter klíčových slov projektu. Právě jsem odstranil vše, co pro mou aplikaci nebylo nutné, bez skutečného porozumění detailům. Jakákoli vylepšení jsou vítána.

Poté jsem přidal díly potřebné pro Adafruit Servo Bonnet na základě jejich ukázkových souborů.

Chtěl bych poděkovat programátorům obou částí.

Kód najdete v příloze jako soubor. Používejte ho na vlastní riziko, upravujte ho, vylepšujte, hrajte si s ním.

# 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 # # https://www.apache.org/licenses/LICENSE-2.0 # # Pokud to nevyžadují platné zákony 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ÉHOKOLI DRUHU, ať už výslovného nebo implikovaného. # Viz Licence pro konkrétní jazyk řídící oprávnění a # omezení v rámci Licence. from _future_ import absolute_import from _future_ import division from _future_ import print_function import argparse import os from 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 from random import randrange from 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 number kanálů #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #nastavení up, mid a down pro levé a pravé paže up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # počet servoportů, levé servo (0-8)

rgt = 11 # počet servoportů, pravé servo (0-8) led_channel_0 = hat.channels [0] # LED dioda na portu 0 led_channel_0.duty_cycle = 0 # zapnout LED 100% # seznam nastavení ramene pro devět pozic = [(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)] # definuje 9 pozic JumpingJack, označených celými čísly 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "taneční" třída Ovládač (objekt): #Callback funkce def _init _ (self, q): self._q = q def zpětné volání (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 JumpingJack0 (self, keys): # controls Jumping Jack, keywords: "position x" key = int (keys) p = position [klíč] a = p [0] b = p [1] tisk („Poloha:“, klíč, „vlevo /right: ", a,"/", b," degree ") # sys.stdout.write (" Position: ", key," left/right: ", a,"/", b," degree ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0,1) def JumpingJack1 (self): # kontroly Jumping Jack dance, klíčové slovo: "další hra" dnce = dance1 sp = (len (dnce)) pro r v rozsahu (sp): # pořadí tanců poloh, sp kroky dc = dnce [r] if (dc není v rozsahu (10)): # print ("chyba vstupu na pozici", sp) dc = 4 p = poloha [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # sets velocity pohybů def JumpingJack2 (vlastní, klávesy): # ovládání Jumping Jack LED, klíčová slova: „zapnout/vypnout“led = int (klíče), pokud led == 1: led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0,1) pokud led == 0: led_channel_0.duty_cycle = 0 # vypne 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 #zapněte LED 100% času. spánek (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 (self): # ovládání Jumping Jack dance, klíčové slovo: „náhodná hra“# pro h v dosahu (10): dr = randrange (9) p = pozice [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0,25) # nastavuje rychlost pohybů 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_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):

pokud ne self.on_init (): self._running = False q = model.get_queue () self._controler = ovladač (q) pokud ne 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 (Pravda, 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. 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 == " nahoru ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) nebo item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) nebo 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]) nebo 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]) nebo item == "l": self. JumpingJack2 (1) #LED bliká "target" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. JumpingJack3 () #random dance „random game“time.sleep (0,05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Pomocí klávesnice můžete ovládat JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Existuje také konfigurační soubor příkazu "commands_v2_hampelmann.txt". Upravte, jak chcete. Je to jen seznam kombinací „příkaz, klíč, (síla,)“na základě souboru štítků.

pozice_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, dolů, posunutí_zpět, doleva, posunutí_vpřed, doprava, návrat_zpět, doleva, posunutí_vpřed, doprava, 0,8 cíle, l, ztlumení, z, ano, y, ne, n, zapnutí_přepnutí, j, vypnutí_k vypnutí, k, zvýšení hlasitosti, nahoru, snížení hlasitosti, dolů, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

Krok 4: Další nápady a další příklady

Je zcela zřejmé, že toto nastavení lze použít také k ovládání robotů nebo jiných zařízení. V podstatě vše, co by mohlo být ovládáno Raspberry Pi.

Pracuji na rozšíření skriptu pro řízení MeArm a doufám, že to budu moci představit v říjnu 2019.

Uvažuji také o použití Jumping Jacku jako semaforu a programu rozpoznávání polohy končetin „project posenet“jako nástroje ke čtení poloh Jumping Jacka a jeho překladu zpět na číslo. Tímto způsobem může dokonce komunikovat text, vzhledem k tomu, že 2 x 8 pozic může indikovat 64 různých čísel, což je více než dostačující pro abecedu, čísla a znaky. To by mohlo umožnit, i když je mírně upraveno, fyzickou realizaci pro navrhovaný IETF „Přenos IP datagramů přes signalizační systém Semaphore Flag Signaling System (SFSS)“(https://tools.ietf.org/html/rfc4824).

Ale toto bude další instruktáž. A protože první experimenty naznačily, že skákací zvedák bude potřebovat značné úpravy, než bude systémem AI rozpoznán jako člověk, může to nějakou dobu trvat.

Chtěl bych vás upozornit na následující instruktáž: Hledání objektů-Osobní-Asistent-Robot-Ft-Raspberry, kde je popsán robot na hledání objektů využívající kombinaci Raspberry Pi a Google Coral TPU.

Doporučuje: