Tartalomjegyzék:

A Hearing MeArm, a Google Coral TPU gyorsítója: 3 lépés
A Hearing MeArm, a Google Coral TPU gyorsítója: 3 lépés

Videó: A Hearing MeArm, a Google Coral TPU gyorsítója: 3 lépés

Videó: A Hearing MeArm, a Google Coral TPU gyorsítója: 3 lépés
Videó: Gesture control Robot Arm MediaPipe MeArm 2024, November
Anonim
A Hearing MeArm, a Google Coral TPU gyorsítója
A Hearing MeArm, a Google Coral TPU gyorsítója
A Hearing MeArm, a Google Coral TPU gyorsítója
A Hearing MeArm, a Google Coral TPU gyorsítója
A Hearing MeArm, a Google Coral TPU gyorsítója
A Hearing MeArm, a Google Coral TPU gyorsítója
A Hearing MeArm, a Google Coral TPU gyorsítója
A Hearing MeArm, a Google Coral TPU gyorsítója

A következőkben a MeArm hangvezérelt változatát szeretném leírni, egy kicsi xyz robotkar fogóval. A MIME iparágak MeArm Pi-jét használtam, de a rendszernek alkalmazhatónak kell lennie a MeArm bármely verziójára, vagy hasonló szervo-meghajtású eszközökre.

A Google Coral TPU Accelerator használata lehetővé teszi a gyors offline TensorFlow hangfelismerő szkriptek futtatását a Raspberry Pi -n, és ezáltal a fizikai eszközök vezérlését szóbeli utasításokkal, egy másodperc alatti késéssel.

Az itt leírt eszköz két korábbi utasításban leírt fogalmak kombinációja és kiterjesztése. Ez a Google Coral hangvezérlés korábbi megvalósításának, az itt leírt Jumping Jack -nek a kiterjesztése, és az itt leírt Google AIY hangvezérelt MeArm hatalmas fejlesztése.

A hangvezérelt MeArm a Google Voice AIY rendszert használva megkövetelte az online hozzáférést, nem volt könnyű megvalósítani, egy gomb megnyomásával kellett aktiválni a hangutasítások hallgatását, és hosszú várakozási idővel rendelkezett. A most használt Google Coral TPU Accelerator lehetővé teszi a TensorFlowLite modellek offline futtatását nagy sebességgel Raspberry Pi vagy más Linux eszközökön. A Google Coral Github oldalon található példák között van egy "halló kígyó" nevű példa egy hangfelismerő rendszerre, amely 140 kulcskifejezést képes megérteni (2019. szept.), Majd virtuális billentyűleütésekre képezi le őket. Ha ezeket a "billentyűleütéseket" néhány Python programozott funkció végrehajtásával összekapcsolja, lehetővé teszi egy hangutasítással vezérelt eszköz felépítését. Nemrégiben leírtam egy első megvalósítást, egy hangvezérelt elektromechanikus ugrócsatlakozót. A megvalósítás itt egy kicsit bonyolultabb, és lehetővé teszi a MeArm mind a négy szervójának vezérlését, hogy vagy folyamatosan mozgassa a MeArm-et, vagy előre meghatározott számú pozíciókat, vagy néhány bonyolultabb feladat elvégzésére.

Az itt megadott szkriptet használva viszonylag egyszerűnek kell lennie más hangvezérelt eszközök, pl. robotkocsik vagy segédtechnikai egységek.

Kellékek

  • MeArm. Itt használt: MeArm Pi a MIME Industries -től
  • Raspberry Pi 4
  • Google Coral TPU gyorsító
  • Adafruit 16 csatornás szervo motorháztető
  • néhány áthidaló kábel
  • opcionális: kondenzátor a szervo motorháztetőhöz, körülbelül 400 µF 4 szervóhoz (az Adafruit ajánlása szerint)
  • 5-6 V-os tápegység szervo motorháztetőhöz. Itt egy régi 6V -os töltőt használtam, 4x AA elem is működik
  • Mikrofon. Mikrofonként egy régi Microsoft HD3000 webkamerát használtam.

1. lépés: A rendszer beállítása

A rendszer beállítása
A rendszer beállítása
A rendszer beállítása
A rendszer beállítása

Töltse le a Google Coral TPU Accelerator előre konfigurált Raspian képét a Google Coral Github oldalról, és telepítse µSD kártyára. A kép számos példaszkriptet is tartalmaz. Állítsa be a Pi -t a jelzések szerint.

Telepítse a példa Kulcsszó -figyelőt a Google Coral GitHub webhelyéről, ha nem szerepel a képen, és minden szükséges programot. Csatlakoztassa a mikrofont a Pi -hez. Javaslom, hogy játsszon a "Halló kígyó" példával, hogy megbizonyosodjon arról, hogy minden működik.

Töltse le és telepítse az Adafruit 16 csatornás motorháztető szoftvert az itt leírtak szerint. Szerelje be a motorháztetőt, és játsszon az Adafruit példákkal, hogy minden megfelelően működjön.

Töltse le az utasításhoz csatolt fájlokat, és másolja őket a "Project Keyword Spotter" mappába. A "commands_v1_MeArm.txt" fájlt át kell másolni a "config" almappába.

Csatlakoztassa a MeArm szervóit a szervo motorháztetőhöz a jelzések szerint. A 15 -ös portot használtam fel/le, 11 -es portot előre/hátra, 7 -es portot fordításhoz és 3 -as portot a fogó szervókhoz.

A szkripten belül előfordulhat, hogy az egyes szervók min/center/max értékeit a konfigurációjához kell igazítania. Ezek a beállítások segítenek elkerülni a szervók károsodását. Lehet, hogy módosítania kell a mellékelt "pozíciók", "szállítás1" és "szállítás2" listákat is.

Futtassa a szkriptet. Eddig az IDE -ből futtattam.

Abban az esetben, ha szükség szerint szeretné módosítani azokat a kulcsmondatokat, amelyek egy bizonyos funkciót idéznek elő. A rendelkezésre álló kulcsszavak teljes listája megtalálható a konfigurációs almappa "labels_gc2 raw.txt" fájljában.

A rendszer várakozási ideje körülbelül 1 másodperc, de nagyban függ attól, hogy milyen műveleteket hajtanak végre. Bizonyos esetekben a kulcsfázist meg kell ismételni, a felismerés pontossága nem mindig 100%.

2. lépés: Az eszköz használata

Ha minden be van állítva és ellenőrizve, akkor futtathatja az eszközt.

A jelenlegi korlátozás az, hogy egy adott parancsot ismétlődően hajtanak végre mindaddig, amíg azt nem állítják le (a "stop game" használatával), vagy más parancsot adnak meg. Összetett többlépcsős feladatok, pl. A "transport1" (amit az "indítójáték" kifejezés idéz) mindig az utolsó lépésre kerülnek végrehajtásra.

Tehát a "jobbra kanyarodással" a készülék kis lépésekben jobbra mozog, amíg le nem áll, vagy eléri az előre beállított maximális értéket. Az "indítójáték", a "következő játék" vagy a "start_video" olyan lépések sorozatát indítja el, amelyeket az adott szervo beállításait tartalmazó listák határoznak meg egy adott lépésnél. "véletlenszerű játék" lesz az eszköz, hogy ugorjon egyik lépésről a másikra, véletlenszerűen kiválasztva a beállítások listájáról.

Amint a mellékelt videóban is látható, a LEGO -tól diabolo alakú tárgyat építettem, amelyet a MeArm felvehet, és előre meghatározott mozdulatokkal egyik helyről a másikra szállíthatja. Saját funkcióit a „transport1” vagy „transport2” listák módosításával határozhatja meg.

3. lépés: A forgatókönyv

Az itt felsorolt szkript a "Hallgató kígyó" példa módosítása a "Project Keyword Spotter" -ből. A példát minimálisra csupaszították, majd hozzáadták a szervók meghajtásához szükséges részt, az Adafruit szervo motorháztetőhöz biztosított szoftver és példák alapján.

A szkriptet eddig nem optimalizálták. Használja saját kockázatára, bátran módosítsa és optimalizálja.

A python parancsfájl mellett megtalálhatók a parancsfájl és a használt címkefájl. Helyezze a config-almappába.

Amint azt korábban említettük, a paraméterek több módosítására lehet szükség ahhoz, hogy a szkriptet a speciális MeArm vagy más eszközhöz igazítsa.

# Copyright 2019 Google LLC#

# Az Apache License 2.0 verziója (a "Licenc") alapján licencelt; # ezt a fájlt csak a Licenc betartásával használhatja. # A Licenc másolatát a # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" címen szerezheti be https://www.apache.org/licenses/LICENSE-2.0 # # Hacsak a vonatkozó jogszabályok nem írják elő, vagy írásban nem állapodnak meg, a Licenc alapján terjesztett szoftvert # "AHOGYAN" ALAPJÁN terjesztik, # GARANCIÁK VAGY FELTÉTELEK NÉLKÜL MINDEN fajta, akár kifejezett, akár hallgatólagos. # A Licencben találja meg a Licencben szereplő engedélyekre és korlátozásokra vonatkozó konkrét nyelveket. # az eredeti "hallás_kígyó" kódot Dr. H. módosította a MeArm megvalósításához. '' 'Utasítások Az én megvalósításom egy Raspbery Pi 4 -et használ, Google Coral gyorsítóval és egy Adafruit 16 csatornás szervo motorháztetővel. A MeArm (MIME iparágak) szervói a motorháztető 3., 7., 11. és 15. portjához voltak csatlakoztatva. A részletekért kérjük, tekintse meg a "Hearing MeArm" utasításokat. Parancsok: "pozíció x", x = 0-9, mozgatja a készüléket egy előre meghatározott pozícióba. "mozogni/felmenni", "mozogni/lemenni", "menni/fordulni előre", "menni/fordulni hátra", "fordulni/balra menni" és "fordulni/menni jobbra" lassú, lépésenkénti mozgást idéz elő az adott irány, a "játék leállítása" leállítja a mozgásokat. "nyitott fül" és "fül bezárása" megnyitja vagy bezárja a fogót. A "start video" arra ösztönzi a készüléket, hogy kövesse a pozíciók előre meghatározott sorrendjét, amelyet a lista "pozíciói" határoznak meg. A "véletlenszerű játék" véletlenszerű mozgásmintát eredményez, a "játék leállítása" véget vet. Az "indítójáték" elindítja a "transport1" listával előre meghatározott mozdulatsorozatot, a "következő játék" pedig a "transport2" előre meghatározott fordított műveletet. Használja saját kockázatára. '' 'from _future_ import absolut_import from _future_ import Division 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 (csatornák = 16) # beállított csatornák száma # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # perc, közép és max beállítások up_l = 145 # szervo fel/le: fel md_l = 95 dn_l = 45 fel_r = 135 # szervo előre/hátra md_r = 90 dn_r = 50 ri_t = 30 # forduló kar jobbra vagy balra: jobb helyzet md_t = 90 # fordulókar jobbra vagy balra: középső helyzet le_t = 150 op_g = 65 # fogó nyitva md_g = 90 # fogóközpontú cl _g = 130 # fogó zárt vert = 15 # szervo port száma, szervo fel/le forw = 11 # szervo port száma, előre/hátra mozgó szervo fordulat = 7 # szervo port a szervo markolat elfordításához = 3 # szervo port a fogáshoz szervo #karok beállításainak listája kilenc pozícióhoz pozíció = [(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 mr), (dn_l, dn_r, le_t, md_g)] # 10 alaphelyzetet határoz meg, amelyeket egész számok jeleznek 0-9 # szállítási eljárások [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 objektum (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)]

tánc1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "tánc"

#a MeArm mozgatása nulla pozícióba status = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. szög = állapot [2] kit.servo [markolat].szög = állapot [3] nyomtatás (állapot) osztály Vezérlő (objektum): #Callback függvény def _init _ (önálló, q): self._q = q def callback (saját, 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 (én, esemény): if event.type == pygame. QUIT: self._running = False def MeArmPos (self, keys): # hajtja a MeArm -ot az előre beállított pozíciókra, kulcsszavak: "position x" key = int (kulcsok) p = pozíció [kulcs] a = p [0] b = p [1] c = p [2] d = p [3] print ("Pozíciók:", kulcs, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "fok") állapot = [a, b, c, d] # dokumentum aktuális állapota nyomtatás (állapot) # sys.stdout.write ("Pozíció: ", kulcs," bal/jobb: ", a,"/", b," fok ") 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): # irányítja a MeArm dance -t, kulcsszó: "start_video" dnce = dance1 sp = (len (dnce)) az (sp) tartományban: r] 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) # beállítja a mozgási sebességet. Alvás (0,5) #számolja ki az r lépéseinek számát az (sp) tartományban: #lépjen bármelyik lépésre p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3]. szervo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # sets mozgások sebessége time.sleep (0.5) def TransMeArm2 (self): # vezérli a MeArm dance táncot, kulcsszó: "next game" tr2 = transport2 sp = (len (tr2)) for r in range (sp): #pozíciók táncoló sorrendje, sp lépések 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) # beállítja a mozgási sebességet time.sleep (0,5)) def RandomMoves (ön): # véletlenszerűen ugrik az előre meghatározott pozíciók között, kulcsszó: "véletlenszerű játék" dr = randrange (9) # véletlenszerűen kiválaszt egy pozíciót p = pozíció [dr] # beolvassa a pozíció paramétereit 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].szög = d idő. elalvás (1) # beállítja a mozgások sebességét def MoveUp (ön): # emelőfogó kis lépésekben u0 = állapot [0] # aktuális állapot olvasása u1 = u0 + 5 # plusz x fok, ha (u1 > up_l): # teszt, ha nem haladja meg a min/max paramétereket fel ", állapot) time.sleep (1) # beállítja a sebességet def MoveDown (self): d 0 = állapot [0] d1 = d0 - 5 # mínusz x fok, ha (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # szervo állapot mozgatása [1] = f1 nyomtatás ("előre", állapot) time.sleep (1) def MoveBack (self): b0 = állapot [1] b1 = b0 - 5 # mínusz x fok, ha (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # servo állapot [2] = l1 nyomtatás ("bal", állapot) time.sleep (0,2) def MoveRight (ön): r0 = állapot [2] r1 = r0 - 2 #mínusz x fok, ha (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # servo status [2] = r1 print ("right", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # állítsa a markolatot "nyitott" pozícióba: "nyitott_lap" time.sleep (0.5) állapot [3] = op_g def CloseGrip (ön): kit.servo [markolat].szög = cl_g # állítsa a fogást "zárt" helyzetbe: " close_tab "time.sleep (0.5) állapot [3] = cl_g def StopMove (self): # nem tesz semmit, de leállítja a mozgásokat print (" stop ", állapot) time.sleep (0.25) def spotter (self, args): motor = BasicEngine (args.model_file) mic = args.mic, ha az args.mic az Nincs más int (args.mic) model.classify_audio (mikrofon, motor, címkék_fájl = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_amz_) int (args.num_frames_hop)) def on_execute (self, args): ha nem self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) ha nem args.debug_keyboard: t = Szál (cél = self.spotter, args = (args,)) t.daemon = True 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 (True, 0,1), kivéve a várólistát. vagy item == "stop": self._running = Hamis # if (args.debug_keyboard and keys [pygame. K_SPACE]) or item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) vagy item == "right": # forduljon jobbra magát. MoveRight () if (args.debug_ke yboard és billentyűk [pygame. K_LEFT]) vagy item == "left": # balra forduljon önállóan. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) or item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) vagy item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) vagy item == "b": # vissza self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # továbbítja a self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) vagy 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]) vagy item == "s": # stop motion: "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]) vagy 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]) vagy 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 kulcsok [pygame. K_7]) vagy 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]) vagy item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. DancingMeArm () #dancing MeArm, a "next_game" -en, ha (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #random dance "random game" if (args.debug_keyboard and keys [pygame. K_j]) vagy item == "j": self. TransMeArm1 () # szállítási objektum: "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) vagy item == "k": self. TransMeArm2 () # szállítási objektum fordított iránya: "next_game" '' 'if (args.debug_keyboard and kulcsok [pygame. K_l]) vagy item == "l": self. JumpingJack2 (1) #LED villog "target" '' '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 MeArm vezérléséhez.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args the_app = Alkalmazás the_app.on_execute (args)

Ajánlott: