Përmbajtje:

Një Dëgjim MeArm, nxitues Google Coral TPU Drejtuar: 3 hapa
Një Dëgjim MeArm, nxitues Google Coral TPU Drejtuar: 3 hapa

Video: Një Dëgjim MeArm, nxitues Google Coral TPU Drejtuar: 3 hapa

Video: Një Dëgjim MeArm, nxitues Google Coral TPU Drejtuar: 3 hapa
Video: 300 fjalë + Lexim dhe dëgjim: - Anglisht + Shqip - (folës amtar) 2024, Korrik
Anonim
A Hearing MeArm, nxitësi i Google Coral TPU nxitues
A Hearing MeArm, nxitësi i Google Coral TPU nxitues
A Hearing MeArm, nxitësi i Google Coral TPU nxitues
A Hearing MeArm, nxitësi i Google Coral TPU nxitues
A Hearing MeArm, nxitësi i Google Coral TPU nxitues
A Hearing MeArm, nxitësi i Google Coral TPU nxitues
A Hearing MeArm, nxitësi i Google Coral TPU nxitues
A Hearing MeArm, nxitësi i Google Coral TPU nxitues

Në vijim do të doja të përshkruaja një version të kontrolluar nga zëri të MeArm, një krah i vogël roboti xyz me një kapëse. Kam përdorur MeArm Pi nga industritë MIME, por sistemi duhet të jetë i zbatueshëm për çdo version të MeArm, ose pajisje të ngjashme të drejtuara nga servo.

Përdorimi i Google Coral TPU Accelerator ju lejon të ekzekutoni skriptet e shpejta offline të njohjes së zërit TensorFlow në Raspberry Pi, dhe kështu të kontrolloni pajisjet fizike me urdhra të folur, me një vonesë nën një sekondë.

Pajisja e përshkruar këtu është një kombinim dhe zgjerim i koncepteve të përshkruara në dy udhëzime të mëparshme. Shtë një zgjerim i një zbatimi të mëparshëm të kontrollit të zërit të Google Coral, një Jumping Jack, i përshkruar këtu dhe një përmirësim i madh i një MeArm të kontrolluar me zë të Google AIY të përshkruar këtu.

MeArm i kontrolluar nga zëri duke përdorur sistemin Google Voice AIY kërkonte qasje në internet, nuk ishte i lehtë për t'u zbatuar, kërkohej të shtypte një buton për të aktivizuar dëgjimin për porositë zanore dhe kishte një kohë të gjatë vonese. Përshpejtuesi Google Coral TPU i përdorur tani ju lejon të ekzekutoni modelet TensorFlowLite jashtë linje me një shpejtësi të lartë në një Raspberry Pi ose pajisje të tjera Linux. Ndër shembujt në faqen e Google Coral Github ekziston një shembull i quajtur "gjarpër i dëgjuar" për një sistem të njohjes së zërit që mund të kuptojë 140 fraza kryesore (shtator 2019), të cilat më pas hartohen në goditjet virtuale të tastit. Bashkimi i këtyre "goditjeve të tastit" me ekzekutimin e disa funksioneve të programuara në Python bën të mundur ndërtimin e një pajisjeje të kontrolluar nga një komandë zanore. Kohët e fundit kam përshkruar një zbatim të parë, një prizë kërcimi elektromekanike të kontrolluar nga zëri. Zbatimi këtu është pak më kompleks dhe ju lejon të kontrolloni të katër servot e MeArm për të lëvizur MeArm vazhdimisht ose për ta kaluar atë në një numër të paracaktuar pozicione, ose për të kryer disa detyra më komplekse.

Duke përdorur shkrimin e dhënë këtu si shembull, duhet të jetë relativisht e thjeshtë të ndërtoni pajisje të tjera të kontrolluara nga zëri, p.sh. makina robotike ose njësi teknologjike ndihmëse.

Furnizimet

  • MeArm Përdoret këtu: MeArm Pi nga Industritë MIME
  • Mjedër Pi 4
  • Përshpejtuesi Google Coral TPU
  • Servo kapak Adafruit 16 kanalësh
  • disa kabllo kërcyes
  • opsionale: kondensator për kapakun servo, rreth 400 µF për 4 servos (rekomanduar nga Adafruit)
  • Burim energjie 5-6 V për kapakun servo. Unë këtu kam përdorur një karikues të vjetër 6V, një paketë baterie 4x AA funksionon gjithashtu
  • Mikrofon. Kam përdorur një kamerë të vjetër Microsoft HD3000 si mikrofon.

Hapi 1: Vendosja e sistemit

Vendosja e Sistemit
Vendosja e Sistemit
Vendosja e Sistemit
Vendosja e Sistemit

Shkarkoni imazhin e parakonfiguruar Raspian për Përshpejtuesin Google Coral TPU nga faqja Google Coral Github dhe instalojeni në një kartë µSD. Imazhi përmban gjithashtu një numër skriptesh shembull. Vendosni Pi siç tregohet.

Instaloni shembullin e vërejtjes së fjalëve kyçe nga faqja Google Coral GitHub, nëse nuk përfshihet në imazh, dhe të gjitha programet e kërkuara. Bashkangjitni mikrofonin në Pi. Unë do të rekomandoja të luani me shembullin "Gjarpri që dëgjon" për t'u siguruar që gjithçka po funksionon.

Shkarkoni dhe instaloni programin e kapakut të kanalit Adafruit 16, siç përshkruhet këtu. Instaloni kapuçin dhe luani me shembujt Adafruit për të siguruar që gjithçka po funksionon siç duhet.

Shkarkoni skedarët e bashkangjitur në këtë udhëzues dhe kopjoni ato në dosjen "Projekti i Fjalës Kyçe". Skedari "commands_v1_MeArm.txt" duhet të kopjohet në nën -dosjen "config".

Lidhni servot e MeArm tuaj me kapakun servo siç tregohet. Kam përdorur portin 15 për lart/poshtë, portin 11 për përpara/prapa, portin 7 për kthesën dhe portin 3 për servoset e kapëseve.

Brenda skenarit mund t'ju duhet të rregulloni vlerat min/qendër/maksimale për secilin servo në konfigurimin tuaj, Këto cilësime ndihmojnë për të shmangur dëmtimin e servos. Ju gjithashtu mund të keni nevojë të modifikoni listat e përfshira "pozicionet", "transport1" dhe "transport2".

Drejtoni skenarin. Deri tani e kisha drejtuar atë nga IDE.

Në rast se dëshironi të modifikoni frazat kryesore që evokojnë një funksion të caktuar sipas nevojës tuaj. Një listë e plotë e Fjalëve Kyçe të disponueshme gjenden në skedarin "labels_gc2 raw.txt" në nën -dosjen e konfigurimit.

Sistemi ka një kohë vonesë prej rreth 1 sekonde, por në varësi të madhe nga veprimet që kryhen. Në disa raste faza kryesore duhet të përsëritet, saktësia e njohjes nuk është gjithmonë 100%.

Hapi 2: Përdorimi i pajisjes

Nëse gjithçka është konfiguruar dhe kontrolluar, mund ta përdorni pajisjen.

Një kufizim aktual është që një urdhër i caktuar të ekzekutohet në mënyrë të përsëritur për aq kohë sa nuk ndalet (duke përdorur "lojën e ndalimit") ose jepet një urdhër tjetër. Detyra komplekse me shumë hapa, p.sh. "Transport1" (të nxitur nga fraza "loja e fillimit") ekzekutohen gjithmonë në hapin përfundimtar.

Pra, duke "kthyer djathtas" pajisja do të lëvizë me hapa të vegjël në të djathtë derisa të ndalet, ose të arrihet vlera maksimale e paracaktuar. "loja e nisjes", "loja tjetër" ose "start_video" do të fillojnë një seri lëvizjesh që përcaktohen nga listat që përmbajnë cilësimin për secilën servo në një hap të caktuar. "lojë e rastësishme" do të bëjë që pajisja të hidhet nga një hap në tjetrin, e zgjedhur rastësisht nga një listë cilësimesh.

Siç mund ta shihni në videon shoqëruese, unë kisha ndërtuar një objekt në formë diabolo nga LEGO që mund të merret nga MeArm dhe të transportohet nga një vend në tjetrin nga një grup lëvizjesh të paracaktuara. Ju mund të përcaktoni funksionet tuaja duke modifikuar listat 'transport1' ose 'transport2'.

Hapi 3: Shkrimi

Skenari i listuar këtu është një modifikim i shembullit të "Gjarprit që dëgjon" nga "Spotter Keyword Project". Shembulli është hequr në minimum, më pas është shtuar pjesa për drejtimin e servove, bazuar në softuerin dhe shembujt e dhënë për kapakun servo Adafruit.

Skenari nuk është optimizuar deri tani. Përdorni në rrezikun tuaj, mos ngurroni të modifikoni dhe optimizoni.

Përveç shkrimit python, ekziston skedari i komandave dhe skedari i etiketave të përdorura. Vendoseni atë në nën-dosjen e konfigurimit.

Siç u përmend më parë, disa rregullime të parametrave mund të kërkohen për të përshtatur skriptin për MeArm tuaj të veçantë ose ndonjë pajisje tjetër.

# E drejta e autorit 2019 Google LLC#

# Licensuar sipas Licencës Apache, Versioni 2.0 ("Licenca"); # ju nuk mund ta përdorni këtë skedar përveç në përputhje me Licencën. # Ju mund të merrni një kopje të Licencës në # # 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 # # Nëse nuk kërkohet nga ligji në fuqi ose nuk është rënë dakord me shkrim, softueri # i shpërndarë nën Licencë shpërndahet në një BAZ "" SI ISSHT "", # PA GARANCI DHE KUSHTET E ÇDO LLOJ, qoftë e shprehur apo e nënkuptuar. # Shihni Licencën për gjuhën specifike që qeveris lejet dhe # kufizimet sipas Licencës. # kodi origjinal "gjarpëri i dëgjimit" u modifikua për një zbatim për MeArm nga Dr H. '' '' Udhëzime Zbatimi im përdor një Raspbery Pi 4 me një përshpejtues Google Coral dhe një kapak servo Adafruit 16 kanalësh të bashkangjitur. Serviset e një MeArm (industritë MIME) ishin bashkangjitur në portet 3, 7, 11 dhe 15 të kapakut. Për detaje, ju lutemi hidhini një sy udhëzuesit "Hearing MeArm". Komandat: "pozicioni x", x = 0 në 9, lëviz pajisjen në një pozicion të caktuar të paracaktuar. "lëviz/shko lart", "lëviz/zbrit", "shko/kthehu përpara", "shko/kthehu mbrapsht", "kthehu/shko majtas" dhe "kthehu/shko djathtas" evokojnë një lëvizje të ngadaltë, hap pas hapi në të dhënën drejtim, "ndalo lojën" ndalon lëvizjet. "skedë e hapur" dhe "mbyll tab" hap ose mbyll mbërthyesin. "fillimi i videos" evokon që pajisja të shkojë duke ndjekur një rend të paracaktuar pozicionesh, të përcaktuara nga lista "pozicionet". "loja e rastësishme" rezulton në një model të rastësishëm të lëvizjeve, "ndalo lojën" përfundon atë. "loja e nisjes" fillon një seri lëvizjesh të paracaktuara nga lista "transport1", "loja tjetër" operacioni i kundërt i paracaktuar nga "transport2" Përdorni në rrezikun tuaj. '' 'nga _future_ import absolut_import nga _future_ import ndarje nga _future_ import print_function import argparse import os from import import randomint from importing threading from import thread Thread time from edgetpu.basic.basic_engine import BasicEngine model import import pygame nga pygame.locals import * import queue from import i rastësishëm randrange nga adafruit_servokit import ServoKit import bord import import busio import adafruit_pca9685 import import i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanale = 16) # vendosur numrin e kanaleve # kit.servo [0].aktivizimi_rang = 160 # kit.servo [0].vendosja_pulse_width_range (1000, 2000) # min, qendra dhe cilësimet maksimale up_l = 145 # servo lart/poshtë: lart md_l = 95 dn_l = 45 up_r = 135 # servo përpara/prapa md_r = 90 dn_r = 50 ri_t = 30 # krahu i djathtë ose i majtë: pozicioni i djathtë md_t = 90 # kthimi i krahut djathtas ose majtas: pozicioni qendror le_t = 150 op_g = 65 # kapësja e hapur md_g = 90 # gripper në qendër cl _g = 130 # gripper mbyllur vert = 15 # numri i portit servo, servo lart/poshtë forw = 11 # numri i servo portit, kthesë servo që lëviz përpara/prapa = 7 # port servo për kthimin e servo grip = 3 # port servo për kapje servo #lista e cilësimeve të krahut për pozicionet e nëntë pozicioneve = [(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_r,), (dn_l, dn_r, le_t, md_g)] # përcakton 10 pozicione bazë, të treguara me numra të plotë 0-9 # procedurat e transportit [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), #merrni 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)]

valle1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "valle"

#moving MeArm to Zero status position = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. kënd = status [2] kit.servo [shtrëngim].kënd = status [3] klasë print (status) Kontrollues (objekt): #Funksioni i kthimit def _init _ (vetvetja, q): vetja._q = q def kthimi i thirrjes (vetja, komandë): self._q.put (komandë) klasa Aplikacioni: def _init _ (vetja): self._running = Def e vërtetë në_init (vetja): pygame.init () self.game_started = Vërtetë veta._running = Kthimi i vërtetë Def def_event (vetja, ngjarja): nëse event.type == pygame. QUIT: self._running = False def MeArmPos (vetja, çelësat): # e çon MeArm në pozicionet e paracaktuara, fjalë kyçe: "position x" key = int (çelësat) p = pozicioni [çelësi] a = p [0] b = p [1] c = p [2] d = p [3] print ("Pozicionet:", çelësi, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "gradë") statusi = [a, b, c, d] # dokumente printoni statusin aktual (statusin) # sys.stdout.write ("Pozicioni: ", çelësi," majtas/djathtas: ", a,"/", b," shkallë ") kit.servo [vert].ango = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (vetja): # kontrollon vallen MeArm, fjala kyçe: "video_fillimi" dnce = valle1 sp = (len (dnce)) për r në rangun (sp): #rendi i vallëzimit të pozicioneve, hapat sp dc = dnce [r] p = pozicioni [dc] a = p [0] b = p [1] c = p [2] = d [p] (1) # përcakton shpejtësinë e kohës së lëvizjeve.gjumë (0.5) # pushim në fund të procedurës def TransMeArm1 (vetë): # kontrollon transportin MeArm 1, fjala kyçe: "loja e nisjes" tr1 = transport1 sp = (len (tr1)) #llogarisni numrin e hapave për r në rang (sp): #shkoni në çdo hap 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].ango = c kit.servo [shtrëngim].ango = d printim (p) kohë. gjumë (1) # grupe shpejtësia e lëvizjeve kohë.fjetja (0.5) def TransMeArm2 (vetja): # kontrollon vallëzimin MeArm, fjala kyçe: "loja tjetër" tr2 = transport2 sp = (len (tr2)) për r në rang (sp): #rendi i vallëzimit të pozicioneve, hapat sp 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].ango = d print (p) koha.gjumë (1) # vendos shpejtësinë e lëvizjeve kohë.fjetje (0.5) def RandomMoves (vetja): # kërcen rastësisht midis pozicioneve të paracaktuara, fjala kyçe: "lojë e rastësishme" dr = randrange (9) # rastësisht zgjedh një pozicion p = pozicion [dr] # lexon parametrat e pozicionit 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].ango = c kit.servo [shtrëngim].ango = d koha.gjumë (1) # vendos shpejtësinë e lëvizjeve def MoveUp (vetja): # ngritje e kapëses në hapa të vegjël u0 = status [0] # lexo statusin aktual u1 = u0 + 5 # plus x gradë nëse (u1 > up_l): # teste nëse nuk i kalojnë parametrat min/max u1 = up_l # përndryshe vendosen në min/max vlerë kit.servo [vert].angle = u1 # zhvendos statusin e servo [0] = u1 # rregullo vlerën e statusit print (" lart ", statusi) time.sleep (1) # vendos shpejtësinë def MoveDown (vetja): d 0 = statusi [0] d1 = d0 - 5 #minus x gradë nëse (d1 lart_r): f1 = up_r kit.servo [forw].angle = f1 # move status servo [1] = f1 print ("përpara", statusi) time.sleep (1) def MoveBack (vetja): b0 = statusi [1] b1 = b0 - 5 #minus x gradë nëse (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo statusi [2] = l1 print ("majtas", statusi) koha.gjumë (0.2) def MoveRight (vetja): r0 = statusi [2] r1 = r0 - 2 #minus x gradë nëse (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move status servo [2] = r1 print ("right", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].ango = op_g # vendosur rrokje në pozicionin "e hapur": "open_tab" time.sleep (0.5) statusi [3] = op_g def CloseGrip (vetja): kit.servo [grip].ango = cl_g # vendos rrokje në pozicionin "e mbyllur": " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (vetja): # nuk bën asgjë, por ndalon shtypjen e lëvizjeve (" stop ", status) time.sleep (0.25) def spotter (self, args): motor = BasicEngine (args.model_file) mic = args.mic nëse args.mic është Asnjë tjetër int (args.mic) model.classify_audio (mikrofoni, motori, etiketat_file = "konfiguro/etiketat_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz_, int = int (args.num_frames_hop)) def on_execute (self, args): nëse jo self.on_init (): self._running = False q = model.get_queue () self._controler = Kontrolluesi (q) nëse jo 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 () tjetër: provo: new_item = q.get (E vërtetë, 0.1) përveç radhës. Bosh: new_item = Asnjë nëse new_item nuk është Asnjë: item = new_item if (args.debug_keyboard dhe çelësat [pygame. K_ESCAPE]) ose artikulli == "stop": self._running = False # if (args.debug_keyboard dhe çelësat [pygame. K_SPACE]) ose artikulli == "shko": # self. MeArmPos (7) # if (args.debug_keyboard dhe çelësat [pygame. K_RIGHT]) ose artikulli == "djathtas": # kthehu djathtas vetë. MoveRight () nëse (args.debug_ke yboard dhe çelësat [pygame. K_LEFT]) ose artikulli == "majtas": # kthehu majtas vetë. MoveLeft () nëse (args.debug_keyboard dhe çelësat [pygame. K_UP]) ose artikulli == "lart": vetë. MoveUp () nëse (args.debug_keyboard dhe çelësat [pygame. K_DOWN]) ose artikulli == "poshtë": self. MoveDown () nëse (args.debug_keyboard dhe çelësat [pygame. K_B]) ose artikulli == "b": # prapa self. MoveBack () if (args.debug_keyboard dhe çelësat [pygame. K_F]) ose artikulli == "f": # përpara vetes. MoveForw () nëse (args.debug_keyboard dhe çelësat [pygame. K_O]) ose artikulli == "o": # rrokje e hapur: self. OpenGrip () nëse (args.debug_keyboard dhe çelësat [pygame. K_C]) ose artikulli == "c": # mbyllje e ngushtë: self. CloseGrip () nëse (args.debug_keyboard dhe çelësa [pygame. K_S]) ose artikulli == "s": # ndalo lëvizjen: "start_game" self. StopMove () nëse (args.debug_keyboard dhe çelësat [pygame. K_0]) ose artikulli == "0": vetë. MeArmPos (0) nëse (args.debug_keyboard dhe çelësat [pygame. K_1]) ose artikulli == "1": self. MeArmPos (1) nëse (args.debug_keyboard dhe çelësat [pygame. K_2]) ose artikulli == "2": self. MeArmPos (2) nëse (args.debug_keyboard dhe çelësat [pygame. K_3]) ose atë em == "3": self. MeArmPos (3) nëse (args.debug_keyboard dhe çelësat [pygame. K_4]) ose artikulli == "4": self. MeArmPos (4) nëse (args.debug_keyboard dhe çelësat [pygame. K_5]) ose artikulli == "5": self. MeArmPos (5) nëse (args.debug_keyboard dhe çelësat [pygame. K_6]) ose artikulli == "6": vetë. MeArmPos (6) nëse (args.debug_keyboard dhe çelësat [pygame. K_7]) ose artikulli == "7": self. MeArmPos (7) nëse (args.debug_keyboard dhe çelësat [pygame. K_8]) ose artikulli == "8": vetë. MeArmPos (8) nëse (args.debug_keyboard dhe çelësat [pygame. K_9]) ose artikulli == "9": self. MeArmPos (9) nëse (args.debug_keyboard dhe çelësat [pygame. K_a]) ose artikulli == "d": vetë. DancingMeArm () #dancing MeArm, në "lojën e ardhshme" nëse (args.debug_keyboard dhe çelësat [pygame. K_r]) ose artikulli == "r": self. RandomMoves () #valle "e rastësishme" lojë (args.debug_keyboard dhe çelësat [pygame. K_j]) ose artikulli == "j": self. TransMeArm1 () # objekt transporti: "loja_d drekë" nëse (args.debug_keyboard dhe çelësat [pygame. K_k]) ose artikulli == "k": vetë. TransMeArm2 () # drejtim i kundërt i objektit të transportit: "next_game" '' 'nëse (args.debug_keyboard dhe çelësat [pygame. K_l]) ose artikulli == "l": vetë. JumpingJack2 (1) #LED blink "target" '' 'time.fjetur (0.05) self.on_cleanup () nëse _name_ ==' _main_ ': analizues = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Përdorni tastierën për të kontrolluar MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = Aplikacioni () the_app.on_execute (args)

Recommended: