Tartalomjegyzék:

Halló ugró Jack, Google Coral TPU Accelerator verzió: 4 lépés
Halló ugró Jack, Google Coral TPU Accelerator verzió: 4 lépés

Videó: Halló ugró Jack, Google Coral TPU Accelerator verzió: 4 lépés

Videó: Halló ugró Jack, Google Coral TPU Accelerator verzió: 4 lépés
Videó: Part 01 - Moby Dick Audiobook by Herman Melville (Chs 001-009) 2024, November
Anonim
Halló ugró Jack, Google Coral TPU Accelerator verzió
Halló ugró Jack, Google Coral TPU Accelerator verzió
Halló ugró Jack, Google Coral TPU Accelerator verzió
Halló ugró Jack, Google Coral TPU Accelerator verzió
Halló ugró Jack, Google Coral TPU Accelerator verzió
Halló ugró Jack, Google Coral TPU Accelerator verzió

Mozgatja a végtagjait, hallgat a megrendeléseire, a legújabb gépi tanulási technológia hajtja

A „Hearing Jumping Jack” egy egyszerű elektromechanikus ugró Jack, amelyet két mikroszervó és egy nagyon egyszerű fogaskerék hajt, és a LED -ek „szemek”. Egyszerű hangutasítások vezérlik, amelyek jelzik, hogy a kilenc előre meghatározott pozíció közül melyiket kell elfoglalnia, vagy be kell -e kapcsolni vagy ki kell kapcsolni a LED -et, vagy el kell végeznie egy előre meghatározott "tánc" vagy véletlenszerű mozdulatsort.

A rendszer alapeleme a Google Coral TPU gyorsító, amely lehetővé teszi a Tensorflow Lite modellek offline futtatását nagyon nagy sebességgel, még egy "gyenge" számítógépen, mint a Raspberry Pi. Ez lehetővé teszi pl. az objektumok gyors azonosítása és osztályozása az RPi kamera használatával, de a gépi tanuláson alapuló hangfelismerő funkciók helyi futtatása is.

Tudomásom szerint ez az első közzétett példa a Coral Accelerator hangfelismerés által vezérelt fizikai barkácseszközre, és a mellékelt kódpélda más, összetettebb projektekhez is használható.

A hangvezérlés a „halló kígyó” példán alapul a „projekt kulcsszavak észlelőjében” (https://github.com/google-coral/project-keyword-spotter), amelyet nemrég (2019. szeptember) helyeztek el a GitHubon. Az én konfigurációmban a rendszer egy Raspberry Pi 4 -ből áll, amely Adafruit 16 csatornás szervo motorháztetővel, Google Coral TPU Acceleratorral és webkamerával van felszerelve, itt mikrofonként használják. A Jumping Jack -et korábban leírták egy korábbi utasításban, ahol a Google Voice készlet hajtotta a hangutasítások olvasására, a szervo motorháztetőhöz van csatolva az alábbiakban leírt 2.0 verzióban.

A Google Voice Kit korábbi verziójának három központi korlátozása volt: a Google webalapú hangfelismerési szolgáltatásaitól függött, és a beállítás viszonylag bonyolult volt, valamilyen parancsot kellett megnyomnia, mielőtt parancsot adhatott, és komoly késés történt a parancs kimondása és a rendszer válasza között. A Google Coral gyorsító használata másodpercekre csökkenti a válaszidőt, független az internetkapcsolattól, és folyamatosan hallgat. Bizonyos módosításokkal sokkal bonyolultabb eszközök vezérlésére használható, mint Jumping Jack, robotok vagy autók, vagy bármi, amit a Raspberry Pi -vel építhet és vezérelhet.

Jelenlegi verziójában a Kulcsszófigyelő körülbelül 140 rövid kulcsszót/kulcskifejezést tartalmaz, amelyeket a kísérő modellfájlban definiáltak („voice_commands_v0.7_egetpu.tflite”), és külön címkefájlban („labels_gc2.raw.txt”) írják le.. A szabadon módosítható fájl („commands_v2_hampelmann.txt”) határozza meg, majd a szkriptünk által kifejezetten használt kulcsszavakat virtuális billentyűzeten, pl. betűk, számok esetén fel/le/balra/jobbra, crtl+c, stb.

Akkor pl. A pygame.key használatával ezeket a „billentyűleütéseket” olvassák be, és annak vezérlésére használják, hogy egy eszköz, itt az ugró jack, mely műveleteket hajtsa végre. Esetünkben ez azt jelenti, hogy a két szervót előre meghatározott helyzetbe kell hajtani, vagy a LED -ek be- vagy kikapcsolása. Mivel a kulcsszó -figyelő külön futófelületen fut, folyamatosan hallgathatja megrendeléseit.

Verzió: 2019. szeptember 21

Kellékek

Raspberry Pi 4, Pimoroni útján

Google Coral TPU gyorsító, Mouser Németországon keresztül, 72 €

Adafruit 16 Servo Bonnet, Pimoroni útján, körülbelül 10 €

www.adafruit.com/product/3416

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

Stacker fejléc (ha szükséges)

www.adafruit.com/product/2223

4x AA elem (vagy más 5-6V-os tápegység) a szervo motorháztetőhöz

Régi webkamera, mint mikrofon

Szervóhajtású ugró Jack, ahogy azt egy előző utasításban leírtuk. Az elrendezési rajzok a következő lépéshez vannak csatolva, de módosítást igényelhetnek.

A Jumping Jackhez szükséges alkatrészek:

- 3 mm -es Forex lemez

- 2 mikro szervó

- 2 és 3 mm -es csavarok és anyák

- 2 fehér LED és egy ellenállás

- egy kis kábel

1. lépés: Az eszköz beállítása

A készülék beállítása
A készülék beállítása
A készülék beállítása
A készülék beállítása
A készülék beállítása
A készülék beállítása

A Jumping Jack építéséhez kövesse az előző utasításban megadott utasításokat. A prototípusomhoz Forex -et használtam, de használhat lézervágott akril- vagy rétegelt lemezeket. Előfordulhat, hogy az elrendezést a szervók méretének megfelelően kell beállítani. Ellenőrizze, hogy a végtagok és a fogaskerekek súrlódás nélkül mozoghatnak -e.

Állítsa be a Raspberry Pi -t. A Coral Github oldalon elérhető egy raspiai kép, amely mindent tartalmaz, ami szükséges a Coral gyorsító futtatásához a Pi -n, és sok projektet tartalmaz, az összes beállítás már megvan.

Szerezze be a projekt kulcsszófigyelőt a Google Coral GitHub oldaláról. Telepítse az összes szükséges szoftvert a jelzések szerint.

Telepítse a mellékelt fájlokat. Helyezze az ugró jack python parancsfájlt a projekt kulcsszó -figyelő mappájába, és a megfelelő parancsfájlt a konfigurációs almappába.

Csatlakoztassa az Adafruit szervo motorháztetőt a Pi -hez. Mivel RPI házat használok ventilátorral, a csatlakozás engedélyezéséhez GPIO kötegelőket (pl. A Pimoroni cégtől) kellett használnom. Telepítse az összes szükséges könyvtárat, amint azt a szervo motorháztetőre vonatkozó Adafruit utasítások jelzik.

Csatlakoztasson egy 5-6V-os áramforrást a szervo motorháztetőhöz. Szereljen fel szervókat és LED -eket. Az én esetemben a 0 -as portot használtam a LED -ekhez, és a 11 -es és 15 -ös portokat a szervókhoz.

Ahhoz, hogy mindent ellenőrizhessek, azt javaslom, hogy először próbálja ki a projekt kulcsszófigyelő "hallókígyó" példáját és az Adafruit szervo motorháztető példáit.

2. lépés: Az ugró Jack futtatása

Ha minden alkatrész be van állítva és működik, próbálja meg használni. A parancsfájlt futtathatja az IDE -ben vagy a parancssorból.

A „0 pozíció” 9 pozícióba kiáltása a Jumping Jack -et arra készteti, hogy elfoglalja az előre meghatározott pozíciók egyikét. Az "1" -et mindkét karnak felfelé (uu), a "3" -ot balra felfelé, jobbra lefelé (ud), a "9" -et mindkét karnak lefelé (dd) és az "5" -et mindkét karnak középre állítottam (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

A "0" azonos az "5" -vel. A "3" és a "8" nem ismeri fel nagyon jól a spotter kulcsszót, és előfordulhat, hogy meg kell ismételni.

Előfordulhat, hogy minden szervóhoz/oldalhoz be kell állítania a minimális és maximális értékeket, hogy a szervók ne legyenek blokkolva, és ezután túl sok energiát merítsenek.

A "következő játék" elindítja a "táncot", azaz egy meghatározott pozíciósorozatot, míg a "véletlenszerű játék" elindítja a Jumping Jack -et, hogy véletlenszerű mozdulatsorozatot hajtson végre. Mindkét esetben örökké futnak, így előfordulhat, hogy meg kell állítania a mozgásokat, pl. "pozíció nulla" paranccsal.

A "játék leállítása" "ctrl + c" -et idéz elő, és leállítja a folyamatot.

A "bekapcsolás" és "kikapcsolás" funkciók használhatók a LED -ek be- és kikapcsolásához.

A time.sleep értékek módosításával beállíthatja a mozgások sebességét.

3. lépés: A kód és a parancsfájl

Az itt bemutatott kód a "halló kígyó" kód módosítása, amely a projekt kulcsszófigyelő csomag része. Most eltávolítottam mindent, ami nem volt szükséges az alkalmazásomhoz, a részletek valódi megértése nélkül. Bármilyen fejlesztést szívesen fogadunk.

Ezután hozzáadtam az Adafruit szervo motorháztetőhöz szükséges alkatrészeket, a példájuk alapján.

Szeretném megköszönni mindkét rész programozóinak.

A kód fájlként csatolva található. Használja saját kockázatára, módosítsa, javítsa, játsszon vele.

# Copyright 2019 Google LLC

# # Az Apache licenc 2.0 verziója ("Licenc") alapján licencelt; # ezt a fájlt csak a Licenc betartásával használhatja. # A Licenc egy példányát a # # https://www.apache.org/licenses/LICENSE-2.0 # címen szerezheti be, kivéve, ha a vonatkozó jogszabályok előírják vagy írásban beleegyeznek, a Licenc alapján terjesztett szoftver # A "MEGVAN" ALAP, # GARANCIÁK VAGY FELTÉTELEK NÉLKÜL, sem kifejezett, sem hallgatólagos. # A Licencben találja meg a Licencben szereplő engedélyekre és korlátozásokra vonatkozó konkrét nyelveket. from _future_ import absolut_import from _future_ import Division 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 csatornák száma #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #fel, közép és le a bal és jobb kar beállításai up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # szervo port száma, bal szervo (0-8)

rgt = 11 # szervo port száma, jobb szervó (0-8) led_channel_0 = hat.channels [0] # LED be van állítva a 0-as porton led_channel_0.duty_cycle = 0 # LED bekapcsolása 100% # kar beállításainak listája kilenc pozícióban = [(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)] # 9 JumpingJack pozíciót határoz meg, 0-9 táncos egész számokkal jelezve 1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "dance" osztály Kontroll (objektum): # Visszahívási funkció def _init _ (self, q): self._q = q def callback (self, parancs): self._q.put (parancs) osztály 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 JumpingJack0 (self, keys): # vezérli a Jumping Jack -t, kulcsszavak: "position x" key = int (kulcsok) p = pozíció [kulcs] a = p [0] b = p [1] print ("Pozíció:", kulcs, "bal" /jobb: ", a,"/", b," fok ") # sys.stdout.write (" Pozíció: ", kulcs," bal/jobb: ", a,"/", b," fok ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # control Jumping Jack dance, kulcsszó: "next game" dnce = dance1 sp = (len (dnce)) r esetén (sp): # pozíciók táncoló sorrendje, sp lépések dc = dnce [r], ha (dc nem a (10) tartományban): # print ("bemeneti hiba a pozícióban", sp) dc = 4 p = pozíció [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0,25) # beállítja a sebességet of mozgások def JumpingJack2 (önálló, billentyűk): # vezérlő Jumping Jack LED -ek, kulcsszavak: "be/ki" led = int (billentyűk), ha led == 1: led_channel_0.duty_cycle = 0xffff #turn LED 100% time.sleep (0.1) ha led == 0: led_channel_0.duty_cycle = 0 # kapcsolja ki a LED time.sleep (0.1) ha led == 2: # villog led_channel_0.duty_cycle = 0xffff #kapcsolja be a LED -et 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #kapcsold be a LED -et 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #LED bekapcsolása 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #LED bekapcsolása 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn LED 100% time.sleep (0.1) def JumpingJack3 (self): # vezérlő Jumping Jack dance, kulcsszó: "random game" # for h in range (10): dr = randrange (9) p = position [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # beállítja a mozgások sebességét def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if Az args.mic nem más int (args.mic) model.classify_audio (mikrofon, motor, 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):

ha nem self.on_init (): self._running = Hamis q = model.get_queue () self._controler = Kontroll (q) ha nem args.debug_keyboard: t = Szál (cél = self.spotter, args = (args,)) t.daemon = Igaz t.start () item = -1 míg self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (Igaz, 0,1), kivéve a várólistát. (args.debug_keyboard and keys [pygame. K_SPACE]) vagy item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) vagy 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]) vagy item == " up ": 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]) vagy item == "0": self. JumpingJack0 (0) if (args.debug_keyboard and keys [pygame. K_1]) vagy item == "1": self. JumpingJack0 (1) if (args. debug_keyboard és keys [pygame. K_2]) vagy item == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) vagy 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]) vagy 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]) vagy 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]) vagy 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_billentyűzet és billentyűk [pygame. K_j]) vagy 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]) vagy item == "l": self. JumpingJack2 (1) #LED villog "target" if (args.debug_keyboard and keys [pygame. K_r]) vagy 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 = 'Használja a billentyűzetet a JumpingJack vezérléséhez. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Van még a "commands_v2_hampelmann.txt" konfigurációs parancsfájl. Módosítsd kedved szerint. Ez csak a "parancs, kulcs, (erősség,)" kombinációk listája, a címkefájl alapján.

pozíció_zero, 0, pozíció_egy, 1, két pozíció, 2, három pozíció, 3, négy pozíció, 4, öt pozíció, 5, hatodik pozíció, 6, hetes pozíció, 7, nyolc pozíció, 8, kilenc pozíció, 9, felfelé, fel, fel, fel, fel, lefelé, lefelé, lefelé, le, vissza_mozgatás hátra, balra, mozgatás_ előre, jobbra, visszafelé, balra, előremenés, jobbra, 0,8 cél, l, némítás, z, igen, y, nem, n, kapcsoló_on, j, kikapcsolás, k, hangerő fel, fel, hangerő le, le, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

4. lépés: További ötletek és más példák

Teljesen nyilvánvaló, hogy ez a beállítás robotok vagy más eszközök vezérlésére is használható. Alapvetően mindent, amit egy Raspberry Pi irányíthat.

A szkript kiterjesztésén dolgozom a MeArm vezérléséhez, és remélem, hogy 2019 októberében bemutathatom ezt.

Azt is fontolóra veszem, hogy a Jumping Jack -et szemaforként használom, és a "project posenet" végtagpozíció -felismerő programot használom eszközként az Ugró Jack pozícióinak leolvasásához és szám lefordításához. Így akár szöveget is közölhet, mivel 2x8 pozíció 64 különböző számot jelezhet, ami több mint elegendő az ábécé, a számok és a jelek számára. Ez lehetővé teheti, bár kissé módosítva, a javasolt IETF fizikai megvalósítását "Az IP -adatgramok átvitele a szemafor -zászlós jelzőrendszeren (SFSS)" (https://tools.ietf.org/html/rfc4824).

De ez egy másik tanulságos lesz. És amint az első kísérletek azt mutatták, hogy az ugrócsuklónak jelentős módosításokra lesz szüksége, mielőtt az AI rendszer emberként felismeri, némi időbe telhet.

Szeretném felhívni a figyelmét a következő oktatható feladatra: Objektumkereső-személyi asszisztens-robot-Ft-Málna, ahol egy Raspberry Pi és a Google Coral TPU kombinációját használó tárgykereső robotot írnak le.

Ajánlott: