Orodha ya maudhui:

MeArm ya Kusikia, Google Coral TPU Accelerator inaendeshwa: 3 Hatua
MeArm ya Kusikia, Google Coral TPU Accelerator inaendeshwa: 3 Hatua

Video: MeArm ya Kusikia, Google Coral TPU Accelerator inaendeshwa: 3 Hatua

Video: MeArm ya Kusikia, Google Coral TPU Accelerator inaendeshwa: 3 Hatua
Video: Nyegezi SDA Choir, TZ - Utukuzwe 2024, Julai
Anonim
MeArm ya Kusikia, Google Coral TPU Accelerator Inaendeshwa
MeArm ya Kusikia, Google Coral TPU Accelerator Inaendeshwa
MeArm ya Kusikia, Google Coral TPU Accelerator Inaendeshwa
MeArm ya Kusikia, Google Coral TPU Accelerator Inaendeshwa
MeArm ya Kusikia, Google Coral TPU Accelerator Inaendeshwa
MeArm ya Kusikia, Google Coral TPU Accelerator Inaendeshwa
MeArm ya Kusikia, Google Coral TPU Accelerator Inaendeshwa
MeArm ya Kusikia, Google Coral TPU Accelerator Inaendeshwa

Katika yafuatayo ningependa kuelezea toleo linalodhibitiwa kwa sauti la MeArm, mkono mdogo wa roboti wa xyz na gripper. Nilitumia MeArm Pi kutoka kwa tasnia ya MIME, lakini mfumo unapaswa kutumika kwa toleo lolote la yeye MeArm, au vifaa kama hivyo vinavyotokana na servo.

Kutumia Google Coral TPU Accelerator inaruhusu kutumia hati za kutambulisha sauti za haraka nje ya mtandao TensorFlow kwenye Raspberry Pi, na kwa hivyo kudhibiti vifaa vya mwili kwa maagizo yaliyosemwa, na latency chini ya sekunde moja.

Kifaa kilichoelezewa hapa ni mchanganyiko, na ugani, wa dhana zilizoelezewa katika mafundisho mawili ya awali. Ni ugani wa utekelezaji wa mapema wa udhibiti wa sauti wa Google Coral, Jack ya Kuruka, iliyoelezewa hapa na uboreshaji mkubwa wa sauti ya Google AIY iliyodhibitiwa hapa.

MeArm inayodhibitiwa na sauti ikitumia mfumo wa Google Voice AIY ilihitaji ufikiaji mkondoni, haikuwa rahisi kutekeleza, inahitajika kubonyeza kitufe ili kuamsha usikilizaji wa maagizo ya sauti na ilikuwa na muda mrefu wa kuchelewa. Accelerator ya Coral TPU iliyotumiwa sasa inaruhusu kuendesha modeli za TensorFlowLite nje ya mkondo na kasi kubwa kwenye Raspberry Pi au vifaa vingine vya Linux. Miongoni mwa mifano kwenye ukurasa wa Google Coral Github kuna mfano unaoitwa "nyoka anayesikia" kwa mfumo wa utambuzi wa sauti ambao unaweza kuelewa vishazi muhimu 140 (Septemba 2019), ambazo zimepangwa kwa vitufe vya kawaida. Kuunganisha "vitufe" hivi na utekelezaji wa kazi zingine zilizowekwa kwenye Python inafanya uwezekano wa kuunda kifaa cha kudhibiti amri ya sauti. Hivi majuzi nilikuwa nimeelezea utekelezaji wa kwanza, sauti ya kuruka kwa umeme inayodhibitiwa na sauti. Utekelezaji hapa ni ngumu zaidi na inaruhusu kudhibiti servos zote nne za MeArm kusonga MeArm kwa kuendelea au iwe nayo kuhamia kwa idadi kadhaa ya yaliyotanguliwa nafasi, au kufanya kazi ngumu zaidi.

Kutumia hati iliyotolewa hapa kama mfano, inapaswa kuwa rahisi kuunda vifaa vingine vinavyodhibitiwa na sauti, n.k. magari ya roboti au vitengo vya teknolojia ya kusaidia.

Vifaa

  • Mikono. Imetumika hapa: MeArm Pi kutoka Viwanda vya MIME
  • Raspberry Pi 4
  • Accelerator ya Tumbawe ya Google
  • Adafruit 16 kituo cha servo bonnet
  • nyaya zingine za kuruka
  • hiari: capacitor kwa bonnet ya servo, karibu 400 µF kwa servos 4 (ilipendekezwa na Adafruit)
  • Chanzo cha nguvu cha 5-6 V cha bonnet ya servo. Mimi hapa nilitumia chaja ya zamani ya 6V, kifurushi cha betri cha 4x AA pia hufanya kazi
  • Kipaza sauti. Nilitumia kamera ya wavuti ya zamani ya Microsoft HD3000 kama kipaza sauti.

Hatua ya 1: Kuanzisha Mfumo

Kuanzisha Mfumo
Kuanzisha Mfumo
Kuanzisha Mfumo
Kuanzisha Mfumo

Pakua picha ya Raspian iliyowekwa tayari ya Google Coral TPU Accelerator kutoka kwa ukurasa wa Google Coral Github na uiweke kwenye kadi ya SD. Picha hiyo pia ina nakala kadhaa za mfano. Sanidi Pi kama ilivyoonyeshwa.

Sakinisha mfano wa matangazo ya neno kuu kutoka kwa wavuti ya Google Coral GitHub, ikiwa haijajumuishwa kwenye picha, na programu zote zinazohitajika. Ambatisha maikrofoni kwa Pi. Napenda kupendekeza kucheza na mfano wa "Nyoka anayesikia" ili kuhakikisha kila kitu kinafanya kazi.

Pakua na usakinishe programu ya bonnet ya Adafruit 16, kama ilivyoelezewa hapa. Sakinisha boneti na ucheze na mifano ya Adafruit ili kuhakikisha kila kitu kinafanya kazi vizuri.

Pakua faili zilizoambatanishwa na hii inayoweza kufundishwa na unakili kwenye folda ya "Mradi wa Neno la Msingi la Mradi". Faili ya "Command_v1_MeArm.txt" lazima inakiliwe kwenye folda ndogo ya "config".

Unganisha servos za MeArm yako kwenye bonnet ya servo kama inavyoonyeshwa. Nilitumia bandari ya 15 juu / chini, bandari ya 11 mbele / nyuma, bandari ya 7 kwa zamu na bandari ya 3 kwa servos ya gripper.

Ndani ya hati unaweza kuwa na kurekebisha min / kituo / max maadili kwa kila servo kwa usanidi wako, Mipangilio hii inasaidia kuzuia uharibifu wa servos. Labda pia lazima ubadilishe orodha zilizojumuishwa za "nafasi", "usafiri1" na "usafiri2".

Endesha hati. Kufikia sasa nilikuwa nikikimbia kutoka IDE.

Ikiwa ungependa kurekebisha vishazi muhimu vinavyoibua kazi fulani kulingana na hitaji lako. Orodha kamili ya Maneno muhimu yanapatikana katika faili ya "labels_gc2 raw.txt" kwenye folda ndogo ya usanidi.

Mfumo una muda wa kuchelewesha wa sekunde 1, lakini kulingana na hatua gani zinafanywa. Katika visa vingine awamu muhimu inapaswa kurudiwa, usahihi wa utambuzi sio kila wakati 100%.

Hatua ya 2: Kutumia Kifaa

Ikiwa kila kitu kimewekwa na kukaguliwa, unaweza kutumia kifaa.

Upeo wa sasa ni kwamba agizo lililopeanwa linatekelezwa mara kwa mara ilimradi halijasimamishwa (kwa kutumia "mchezo wa kuacha") au agizo lingine limetolewa. Kazi ngumu nyingi, k.m. "usafiri1" (iliyoibuliwa na maneno "mchezo wa uzinduzi") hutekelezwa kila wakati kwa hatua ya mwisho.

Kwa hivyo kwa "pinduka kulia" kifaa kitasonga kwa hatua ndogo kwenda kulia hadi kusimamishwa, au kiwango cha juu kilichowekwa tayari kinafikiwa. "mchezo wa uzinduzi", "mchezo unaofuata" au "start_video" itaanza mfululizo wa hatua ambazo hufafanuliwa na orodha zilizo na mpangilio wa kila servo kwa hatua fulani. "mchezo wa nasibu" kifaa kitaruka kutoka hatua moja hadi nyingine, iliyochukuliwa kwa nasibu kutoka kwenye orodha ya mipangilio.

Kama unavyoweza kuona kwenye video iliyofuatana, nilikuwa nimeunda kitu kilichoumbwa na diabolo kutoka LEGO ambacho kinaweza kuchukuliwa na MeArm na kusafirishwa kutoka eneo moja hadi lingine na seti ya harakati zilizofafanuliwa. Unaweza kufafanua kazi zako mwenyewe kwa kubadilisha orodha ya 'usafiri1' au 'usafiri2'.

Hatua ya 3: Hati

Hati iliyoorodheshwa hapa ni muundo wa mfano wa "Nyoka anayesikia" kutoka kwa "Mradi wa Neno la Mradi wa Mradi". Mfano umevuliwa kwa kiwango cha chini, kisha sehemu ya kuendesha servos iliongezwa, kulingana na programu na mifano iliyotolewa kwa boneti ya Adafruit servo.

Hati haijaboreshwa kwa sasa. Tumia kwa hatari yako mwenyewe, jisikie huru kurekebisha na kuboresha.

Mbali na hati ya chatu kuna amri-faili na lebo-faili iliyotumiwa. Weka kwenye folda ndogo ya usanidi.

Kama ilivyoelezwa hapo awali, marekebisho kadhaa ya vigezo yanaweza kuhitajika kurekebisha hati kwa MeArm yako maalum au kifaa kingine.

# Hakimiliki 2019 Google LLC #

# Leseni chini ya Leseni ya Apache, Toleo la 2.0 ("Leseni"); # huwezi kutumia faili hii isipokuwa kwa kufuata Leseni. # Unaweza kupata nakala ya Leseni kwa # # 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 # # Isipokuwa inavyotakiwa na sheria inayofaa au kukubaliwa kwa maandishi, programu # inayosambazwa chini ya Leseni inasambazwa kwa "AS IS", # BILA MAHAKIKI AU MASHARTI YA AINA YOYOTE, iwe inaelezea au inamaanisha. # Angalia Leseni ya lugha maalum inayosimamia ruhusa na mapungufu # chini ya Leseni. nambari ya asili ya "kusikia_snake" ilibadilishwa kwa utekelezaji wa MeArm na Dr H. Huduma za MeArm (Viwanda vya MIME) ziliunganishwa kwenye bandari 3, 7, 11 na 15 za bonnet. Kwa maelezo tafadhali angalia "Usikivu wa Usikivu" unaoweza kufundishwa. Amri: "nafasi x", x = 0 hadi 9, husogeza kifaa kwa nafasi iliyowekwa tayari. "songa / nenda juu", "songa / shuka", "nenda / pinduka mbele", "nenda / pinduka nyuma", "pinduka / nenda kushoto" na "pinduka / nenda kulia" toa mwendo wa polepole, wa hatua kwa hatua katika mwelekeo, "acha mchezo" huacha harakati. "fungua kichupo" na "funga kichupo" inafungua au inafunga gripper. "anza video" huibua kifaa kwenda kufuata mpangilio wa nafasi zilizowekwa awali, zilizoainishwa na orodha 'nafasi'. "mchezo wa nasibu" husababisha muundo wa nasibu wa harakati, "acha mchezo" unamaliza. "mchezo wa uzinduzi" huanza safu nyingine ya hatua zilizotanguliwa na orodha 'usafiri1', "mchezo unaofuata" operesheni ya nyuma inayofafanuliwa na 'usafiri2' Tumia kwa hatari yako mwenyewe. kutoka kwa _kufuata _ kuagiza kabisa_kuhamisha kutoka _kufuata_ mgawanyiko wa kuagiza kutoka _kufuata_ kuagiza kuchapisha_kufanya kazi kuagiza mgawanyiko wa kuingiza os kutoka kwa randint isiyo ya kawaida kutoka kwa uingizaji wa nyuzi Thread kuagiza muda kutoka edgetpu.basic.basic_engine kuagiza BasicEngine kuagiza mfano wa kuagiza pygame kutoka pygame. randrange ya kuagiza kutoka kwa adafruit_servokit kuagiza bodi ya kuagiza ServoKit kuagiza busio kuagiza adafruit_pca9685 wakati wa kuingiza i2c = busio. I2C (bodi. SCL, bodi. SDA) kofia = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (njia = 16) # seti idadi ya vituo # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, center and max settings up_l = 145 # servo up / down: up md_l = 95 dn_l = 45 up_r = 135 # servo mbele / nyuma md_r = 90 dn_r = 50 ri_t = 30 # kugeuza mkono kulia au kushoto: nafasi ya kulia md_t = 90 # kugeuza mkono kulia au kushoto: nafasi ya katikati le_t = 150 op_g = 65 # gripper wazi md_g = 90 # mtego uliozingatia cl _g = 130 # gripper imefungwa vert = 15 # idadi ya bandari ya servo, servo juu / chini forw = 11 # idadi ya bandari ya servo, mbele / nyuma kusonga servo turn = 7 # bandari ya servo kwa kugeuza mtego wa servo = 3 # bandari ya servo kwa mtego orodha ya mipangilio ya mikono kwa nafasi tisa nafasi = [(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, 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, md_t, md_g), (dn_l, dn_r, le_t, md_g)] # inafafanua nafasi 10 za msingi, zilizoonyeshwa na nambari 0-9 # taratibu za usafirishaji 110, 50, 65, op_g), (65, 50, 65, op_g), (65, 70, 65, cl_g), (120, 70, 65, cl_g), #pata kitu (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)]

usafiri2 = [(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)]

kucheza1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # "ngoma"

# Kusongesha MeArm kwa 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]. angle = status [2] kit.servo [mtego].angle = status [3] chapa (status) class Controler (object): #Callback function def _init _ (self, q): self._q = q def callback (ubinafsi, amri): self._q.put (amri) Programu ya darasa: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True Return True def on_event (kibinafsi, tukio): ikiwa event.type == pygame. QUIT: self._running = Fal def def MeArmPos (self, keys): # inaendesha MeArm kuweka nafasi zilizowekwa mapema, maneno muhimu: "position x" key = int (funguo) p = nafasi [ufunguo] a = p [0] b = p [1] c = p [2] d = p [3] chapisha ("Nafasi:", ufunguo, "vert / forw / turn / mtego:", a, "/", b, "/", c, "/", d, "degrees") hadhi = [a, b, c, d] # hati hati za hali ya sasa (hadhi) # sys.stdout.write ("Nafasi: ", ufunguo," kushoto / kulia: ", a," / ", b," degree ") kit.servo [vert].angle = kit.servo [forw].angle = b kit.servo [pinduka].angle = c kit.servo [mtego]. pembe = d time. kulala (0.5) def DancingMeArm (self): # udhibiti ngoma ya MeArm, neno kuu: "start_video" dnce = dance1 sp = (len (dnce)) kwa r katika masafa (sp): # mpangilio wa kucheza wa nafasi, sp hatua dc = dnce [r] p = nafasi [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = kit.servo [forw].angle = b kit.servo [zunguka]. pembeni = c kit. (1) # huweka kasi ya harakati wakati. Kulala (0.5) # mapumziko mwisho wa utaratibu def TransMeArm1 (self): # udhibiti Usafirishaji wa MeArm 1, neno kuu: "uzinduzi wa mchezo" tr1 = usafiri1 sp = (len (tr1)) # hesabu ya hatua kwa r katika masafa (sp): # nenda kwa hatua yoyote p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert]. pembe = kit.servo [forw]. pembetatu = b kit.servo [zamu].angle = c kit.servo [mtego]. pembe = d kuchapisha (p) wakati. kulala (1) # seti # kasi ya harakati time.sleep (0.5) def TransMeArm2 (self): # udhibiti ngoma ya MeArm, neno kuu: "mchezo ujao" tr2 = usafiri2 sp = (len (tr2)) kwa r katika masafa (sp mpangilio wa nafasi za kucheza #, sp hatua p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw]. pembetatu = b kit.servo [pinduka]. pembeni = c kit.servo [mtego].angle = d chapa (p) wakati. kulala (1) # huweka kasi ya wakati wa harakati. kulala (0.5 def def RandomMoves (binafsi): # anaruka bila mpangilio kati ya nafasi zilizotanguliwa, neno kuu: "mchezo wa nasibu" dr = randrange (9) # bila kuchagua huchagua nafasi p = msimamo [dr] # inasoma vigezo vya msimamo a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = kit.servo [forw].angle = b kit.servo [zunguka].angle = c kit.servo [mtego pete = d wakati. kulala (1) # huweka kasi ya harakati huhamisha MoveUp (ubinafsi): # kuinua gripper kwa hatua ndogo u0 = hadhi [0] # soma hali ya sasa u1 = u0 + 5 # pamoja na digrii x ikiwa (u1 > up_l): vipimo # ikiwa havizidi vigezo vya min / max u1 = up_l # vinginevyo vimewekwa kwa kit / min value kit.servo [vert].angle = u1 # songa hadhi ya servo [0] = u1 # rekebisha kuchapa kwa thamani ya hali (" juu ", hadhi) wakati. kulala (1) # huweka kasi ya DefDown (self): d 0 = hadhi [0] d1 = d0 - 5 # minus x digrii ikiwa (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # songa hali ya servo [1] = f1 chapa ("mbele", hadhi kulala) (1) def MoveBack (binafsi): b0 = hadhi [1] b1 = b0 - 5 #minus x digrii ikiwa (b1 le_t): l1 = le_t kit.servo [pinduka].angle = l1 # hoja servo hadhi [2] = l1 chapa ("kushoto", hadhi) wakati. kulala (0.2) def MoveRight (binafsi): r0 = hadhi [2] r1 = r0 - 2 #minus x digrii ikiwa (r1 <ri_t): r1 = kitanda cha ri_t.servo [pinduka].angle = r1 # songa hali ya servo [2] = r1 chapa ("kulia", hadhi) wakati. kulala (0.2) def OpenGrip (ubinafsi): kit.servo [mtego].angle = op_g # weka mtego kwa "kufungua" nafasi: "open_tab" time.sleep (0.5) hadhi [3] = op_g def CloseGrip (self): kit.servo [mtego].angle = cl_g # weka mtego kwa "funga" nafasi: " karibu_tab "time.sleep (0.5) hadhi [3] = cl_g def StopMove (self): # hafanyi chochote, lakini huacha harakati kuchapisha (" stop ", status) time.sleep (0.25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic ikiwa args.mic sio mwingine int (args.mic model.classify_audio (mic, engine, labels_file = "config / labels_gc2.raw.txt", amri_file = "usanidi / amri_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_hz), num_fr int (args.num_frames_hop)) def on_execute (self, args): ikiwa sio self. = Thread (target = self.spotter, args = (args,)) t.emon- True t.start () item = -1 wakati self._running: pygame.event.pump () ikiwa args.debug_keyboard: keys = pygame.key.get_pressed () mwingine: jaribu: new_item = q.get (Kweli, 0.1) isipokuwa foleni. Dalili: new_item = Hakuna ikiwa new_item sio Hakuna: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) au kitu == "stop": self._running = Uongo # ikiwa (args.debug_keyboard na funguo [pygame. K_SPACE]) au item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) au kipengee == "kulia": # pinduka kulia. MoveRight () ikiwa (args.debug_ke yboard na funguo [pygame. K_LEFT]) au kipengee == "kushoto": # pinduka kushoto mwenyewe. MoveLeft () ikiwa (args.debug_keyboard na funguo [pygame. K_UP]) au kipengee == "juu": self. MoveUp (ikiwa (args.debug_keyboard na funguo [pygame. K_DOWN]) au kitu == "chini": self. MoveDown () ikiwa (args.debug_keyboard na funguo [pygame. K_B]) au kipengee == "b": # nyuma self. MoveBack () ikiwa (args.debug_keyboard na funguo [pygame. K_F]) au kitu == "f": # mbele self. MoveForw () ikiwa (args.debug_keyboard na funguo [pygame. K_O]) au kitu == "o": # mtego wazi: self. OpenGrip () ikiwa (args.debug_keyboard na vitufe [pygame. K_C]) au kitu == "c": # mtego wa karibu: self. CloseGrip () ikiwa (args.debug_keyboard na vitufe. (0) ikiwa (args.debug_keyboard na funguo [pygame. K_1]) au kitu == "1": self. MeArmPos (1) ikiwa (args.debug_keyboard na funguo [pygame. K_2]) au kipengee == "2": self. MeArmPos (2) ikiwa (args.debug_keyboard na funguo [pygame. K_3]) au ni em == "3":. K_5]) au bidhaa == "5": self. MeArmPos (5) ikiwa (args.debug_keyboard na funguo [pygame. K_6]) au bidhaa == "6": self. MeArmPos (6) ikiwa (args.debug_keyboard na funguo [pygame. K_7]) au kitu == "7": self. MeArmPos (7) ikiwa (args.debug_keyboard na funguo [pygame. K_8]) au bidhaa == "8": self. MeArmPos (8) ikiwa (args. #Nacheza MeArm, kwenye "mchezo_ ujao" ikiwa (args.debug_keyboard na funguo [pygame. K_r]) au kitu == "r": self. RandomMoves () #densi ya nasibu "mchezo wa nasibu" ikiwa (args.debug_keyboard na vitufe [pygame. K_j]) au kitu == "j": self. TransMeArm1 () # kitu cha kusafirisha: "mchezo wa chakula cha mchana" ikiwa (args.debug_keyboard na funguo [pygame. K_k]) au bidhaa == "k": self. TransMeArm2 (kitu # cha kusafirisha mwelekeo mwelekeo: "next_game" '' 'if (args.debug_keyboard and funguo [pygame. K_l]) au kipengee == "l": self. JumpingJack2 (1) #LED blink "lengo" "" wakati. kulala (0.05) self.on_cleanup () ikiwa _name_ == '_main_': mchapishaji ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Tumia kibodi kudhibiti MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Ilipendekeza: