Բովանդակություն:

A Hearing MeArm, Google Coral TPU արագացուցիչ ՝ 3 քայլ
A Hearing MeArm, Google Coral TPU արագացուցիչ ՝ 3 քայլ

Video: A Hearing MeArm, Google Coral TPU արագացուցիչ ՝ 3 քայլ

Video: A Hearing MeArm, Google Coral TPU արագացուցիչ ՝ 3 քայլ
Video: Gesture control Robot Arm MediaPipe MeArm 2024, Հուլիսի
Anonim
A Hearing MeArm, Google Coral TPU արագացուցիչ
A Hearing MeArm, Google Coral TPU արագացուցիչ
A Hearing MeArm, Google Coral TPU արագացուցիչ
A Hearing MeArm, Google Coral TPU արագացուցիչ
A Hearing MeArm, Google Coral TPU արագացուցիչ
A Hearing MeArm, Google Coral TPU արագացուցիչ
A Hearing MeArm, Google Coral TPU արագացուցիչ
A Hearing MeArm, Google Coral TPU արագացուցիչ

Հետևյալում ես կցանկանայի նկարագրել MeArm- ի ձայնով կառավարվող տարբերակը, մի փոքր xyz ռոբոտի բազուկ բռնակով: Ես օգտագործել եմ MeArm Pi- ն MIME ոլորտներից, բայց համակարգը պետք է կիրառելի լինի MeArm- ի ցանկացած տարբերակի կամ սերվով աշխատող նման սարքերի համար:

Google Coral TPU արագացուցիչի օգտագործումը թույլ է տալիս գործարկել արագ անցանց TensorFlow ձայնի ճանաչման սցենարներ Raspberry Pi- ի վրա և դրանով իսկ վերահսկել ֆիզիկական սարքերը խոսակցական պատվերով `մեկ վայրկյանից ցածր ուշացումով:

Այստեղ նկարագրված սարքը երկու նախորդ հրահանգներում նկարագրված հասկացությունների համադրություն և ընդլայնում է: Այն Google Coral ձայնային կառավարման ՝ Jumping Jack- ի ՝ ավելի վաղ ներդրված ծրագրի երկարացումն է և այստեղ նկարագրված Google AIY ձայնով կառավարվող MeArm- ի հսկայական բարելավումը:

Google Voice AIY համակարգի միջոցով ձայնով կառավարվող MeArm- ը պահանջում էր առցանց հասանելիություն, հեշտ իրագործելի չէր, պահանջվում էր սեղմել կոճակը ՝ ձայնային պատվերների ունկնդրումը ակտիվացնելու համար և երկար ուշացում ուներ: Google Coral TPU արագացուցիչը, որն այժմ օգտագործվում է, թույլ է տալիս գործարկել TensorFlowLite մոդելները անցանց ռեժիմում ՝ մեծ արագությամբ Raspberry Pi- ի կամ Linux- ի այլ սարքերի վրա: Google Coral Github էջի օրինակների մեջ կա մի օրինակ, որը կոչվում է «լսող օձ» ձայնի ճանաչման համակարգի համար, որը կարող է հասկանալ 140 հիմնական արտահայտություն (սեպտեմբեր 2019), որոնք այնուհետև քարտեզագրվում են վիրտուալ ստեղնաշարի վրա: Այս «ստեղնաշարի» համատեղումը Python- ում ծրագրավորված որոշ գործառույթների կատարմամբ հնարավորություն է տալիս կառուցել ձայնային հրամանով կառավարվող սարք: Ես վերջերս նկարագրել էի առաջին իրականացումը ՝ ձայնով կառավարվող էլեկտրամեխանիկական ցատկման վահանակը: Այստեղ իրականացումը մի փոքր ավելի բարդ է և թույլ է տալիս վերահսկել MeArm- ի բոլոր չորս ծառայությունները ՝ MeArm- ը շարունակաբար տեղափոխելու կամ այն տեղափոխելու համար մի շարք կանխորոշված դիրքեր կամ ավելի բարդ առաջադրանքներ կատարելու համար:

Օգտագործելով այստեղ ներկայացված սցենարը ՝ որպես օրինակ, պետք է համեմատաբար պարզ լինի ձայնով կառավարվող այլ սարքերի կառուցումը, օրինակ. ռոբոտային մեքենաներ կամ օժանդակ տեխնոլոգիական ստորաբաժանումներ:

Պարագաներ

  • MeArm. Օգտագործված է այստեղ ՝ MeArm Pi ՝ MIME Industries- ից
  • Ազնվամորի Պի 4
  • Google Coral TPU արագացուցիչ
  • Adafruit 16 ալիքով սերվո գլխարկ
  • որոշ jumper մալուխներ
  • կամընտիր. կոնդենսատոր servo գլխարկի համար, մոտ 400 μF 4 սերվոյի համար (առաջարկվում է Adafruit- ի կողմից)
  • 5-6 Վ էներգիայի աղբյուր servo գլխարկի համար: Ես այստեղ օգտագործել եմ հին 6 Վ լիցքավորիչ, 4 x AA մարտկոցի փաթեթը նույնպես աշխատում է
  • Խոսափող: Որպես խոսափող ես օգտագործել եմ հին Microsoft HD3000 վեբ -տեսախցիկը:

Քայլ 1: Համակարգի կարգավորում

Համակարգի կարգավորում
Համակարգի կարգավորում
Համակարգի կարգավորում
Համակարգի կարգավորում

Ներբեռնեք Raspian- ի նախապես կազմաձևված պատկերը Google Coral TPU արագացուցիչի համար Google Coral Github էջից և տեղադրեք μSD քարտի վրա: Պատկերը պարունակում է նաև մի շարք սցենարների օրինակ: Տեղադրեք Pi- ն, ինչպես նշված է:

Տեղադրեք Google Coral GitHub կայքի հիմնաբառերի դիտարկիչի օրինակը, եթե պատկերում ներառված չէ, և բոլոր անհրաժեշտ ծրագրերը: Միացրեք խոսափողը Pi- ին: Ես խորհուրդ կտայի խաղալ «Լսող օձի» օրինակով `համոզվելու համար, որ ամեն ինչ աշխատում է:

Ներբեռնեք և տեղադրեք Adafruit 16 ալիքի գլխարկի ծրագրակազմը, ինչպես նկարագրված է այստեղ: Տեղադրեք գլխարկը և խաղացեք Adafruit- ի օրինակներով ՝ ապահովելու համար, որ ամեն ինչ ճիշտ է աշխատում:

Ներբեռնեք այս հրահանգին կցված ֆայլերը և պատճենեք դրանք «Project Keyword Spotter» պանակում: «Commands_v1_MeArm.txt» ֆայլը պետք է պատճենվի «config» ենթապանակում:

Միացրեք ձեր MeArm- ի սպասարկիչները servo գլխարկին, ինչպես նշված է: Ես օգտագործել եմ 15 -րդ նավահանգիստը ՝ վեր/վար, 11 -ը ՝ առաջ/հետ, պորտը ՝ 7 -ը և պտույտը ՝ 3 -ը, բռնակ սպասարկողների համար:

Սցենարի շրջանակներում գուցե ստիպված լինեք յուրաքանչյուր սերվոյի համար նվազագույն/կենտրոն/առավելագույն արժեքները հարմարեցնել ձեր կազմաձևին: Այս պարամետրերն օգնում են խուսափել սերվերի վնասներից: Հնարավոր է նաև ստիպված լինեք փոփոխել ներառված «դիրքերի», «transport1» և «transport2» ցուցակները:

Գործարկեք սցենարը: Մինչ այժմ ես այն վարում էի IDE- ից:

Այն դեպքում, երբ ցանկանում եք փոփոխել այն հիմնական արտահայտությունները, որոնք առաջացնում են որոշակի գործառույթ ՝ ըստ ձեր կարիքի: Հասանելի KeyPhrases- ի ամբողջական ցանկը գտնվում է կազմաձևման ենթապանակի «labels_gc2 raw.txt» ֆայլում:

Համակարգը ունի մոտ 1 վայրկյան ձգձգման ժամանակ, բայց շատ բան կախված է նրանից, թե որ գործողություններն են կատարվում: Որոշ դեպքերում հիմնական փուլը պետք է կրկնվել, ճանաչման ճշգրտությունը միշտ չէ, որ 100%է:

Քայլ 2: Սարքի օգտագործումը

Եթե ամեն ինչ կարգավորված և ստուգված է, կարող եք գործարկել սարքը:

Ընթացիկ սահմանափակումն այն է, որ տրված պատվերը կրկնվում է այնքան ժամանակ, քանի դեռ այն չի դադարեցվել (օգտագործելով «դադարեցնել խաղը»), կամ տրվել է այլ հրաման: Բազմակողմանի բարդ առաջադրանքներ, օրինակ. «Տրանսպորտ 1» -ը (առաջացած «մեկնարկի խաղ» արտահայտությամբ) միշտ կատարվում է մինչև վերջին քայլը:

Այսպիսով, «աջ թեքվելով» սարքը փոքր քայլերով կշարժվի դեպի աջ մինչև կանգնեցնելը կամ կանխորոշված առավելագույն արժեքը հասնելը: «գործարկել խաղը», «հաջորդ խաղը» կամ «start_video» - ն կսկսեն մի շարք քայլեր, որոնք սահմանված են տվյալ քայլում յուրաքանչյուր սերվոյի պարամետրը պարունակող ցուցակներով: «պատահական խաղը» սարքը կթռնի մեկից մյուս քայլին ՝ պատահականորեն ընտրված պարամետրերի ցանկից:

Ինչպես կարող եք տեսնել կից տեսանյութում, ես LEGO- ից կառուցել էի դիաբոլո ձևով առարկա, որը կարող է վերցվել MeArm- ի կողմից և տեղափոխվել մի վայրից մյուսը ՝ նախապես սահմանված շարժումների միջոցով: Դուք կարող եք սահմանել ձեր սեփական գործառույթները ՝ փոփոխելով «transport1» կամ «transport2» ցուցակները:

Քայլ 3: Սցենարը

Այստեղ թվարկված սցենարը «Լսող օձի» օրինակի փոփոխություն է «Project Keyword Spotter» - ից: Օրինակն իջեցվել է նվազագույնի, այնուհետև ավելացվել է սերվոներ վարելու մասը ՝ հիմնվելով Adafruit servo գլխարկի ծրագրակազմի և օրինակների վրա:

Սցենարը մինչ այժմ օպտիմալացված չէ: Օգտագործեք ձեր ռիսկով, ազատ զգալ փոփոխել և օպտիմալացնել:

Բացի python սցենարից, կան հրամանների ֆայլ և օգտագործված պիտակների ֆայլ: Տեղադրեք այն config-subfolder- ում:

Ինչպես նշվեց նախկինում, ձեր հատուկ MeArm- ի կամ որևէ այլ սարքի համար սցենարը հարմարեցնելու համար կարող են պահանջվել պարամետրերի մի քանի ճշգրտում:

# Հեղինակային իրավունք 2019 Google ՍՊԸ#

# Արտոնագրված Apache լիցենզիայի ներքո, տարբերակ 2.0 («Լիցենզիա»); # Դուք չեք կարող օգտագործել այս ֆայլը, բացառությամբ Լիցենզիայի պահանջների: # Լիցենզիայի պատճենը կարող եք ձեռք բերել # # 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 # # Եթե գործող օրենսդրությամբ չի պահանջվում կամ գրավոր համաձայնություն չի տրվում, լիցենզիայի ներքո տարածված # ծրագրակազմը բաշխվում է «ԻՆՉՊԵՍ» ՀԻՄՆՈԹՅՈՆՆԵՐՈՎ, # ԱՌԱՆ ԵՐԱՇԽԻՔՆԵՐԻ ԵՎ ՊԱՅՄԱՆՆԵՐԻ YԱՆԿԱԱIN ԲԱՐԻ, կամ հստակ, կամ ենթադրյալ: # Տեսեք Լիցենզիան Լիցենզիայի ներքո գործող թույլտվությունների և # սահմանափակումների համար: # բնօրինակի «լսողության_օձ» ծածկագիրը փոխվել է MeArm- ի իրականացման համար ՝ դոկտոր Հ. MeArm- ի (MIME արդյունաբերություններ) սպասարկողները ամրացված էին գլխարկի 3, 7, 11 և 15 նավահանգիստներին: Մանրամասների համար խնդրում ենք ծանոթանալ «Hearing MeArm» հրահանգին: Հրամաններ. «Դիրքը x», x = 0 -ից 9 -ը, սարքը տեղափոխում է տվյալ կանխորոշված դիրքի: «շարժվել/բարձրանալ», «շարժվել/իջնել», «գնալ/թեքվել առաջ», «գնալ/շրջվել հետ», «թեքվել/գնալ ձախ» և «թեքվել/գնալ աջ» տվյալ դեպքում առաջացնում են դանդաղ, քայլ առ քայլ շարժում: ուղղություն, «դադարեցնել խաղը» դադարեցնում է շարժումները: «բաց ներդիր» և «փակել ներդիր» բացում կամ փակում է բռնիչը: «Սկսել տեսանյութը» սարքն է առաջացնում, որ սարքը հետևի ցուցակների «դիրքեր» -ով սահմանված դիրքերի նախնական կարգին: «պատահական խաղը» հանգեցնում է շարժումների պատահական ձևի, «դադարեցնել խաղը» ավարտում է այն: «գործարկման խաղը» սկսում է շարժումների հերթական շարանը, որը կանխորոշված է «transport1» ցուցակով, «հաջորդ խաղը» ՝ «transport2» - ով որոշված հակառակ գործողությունը: Օգտագործեք ձեր ռիսկով: '' '_future_- ից _future_ ներմուծման բաժին _future_ ներմուծում print_function ներմուծում argparse ներմուծում argparse ներմուծում os պատահական ներմուծումից randint from threading import թեմայի ներմուծման ժամանակ edgetpu.basic.basic.basic_engine import BasicEngine ներմուծման մոդել pygame- ից pygame- ից: ներմուծում * ներմուծման հերթ adafruit_servokit import պատահական ներմուծում ServoKit ներմուծման տախտակ ներմուծում busio ներմուծում adafruit_pca9685 ներմուծման ժամանակը i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (ալիքներ = 16) # շարք ալիքների # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # րոպե, կենտրոն և առավելագույն կարգավորումներ up_l = 145 # servo վերև/ներքև ՝ վերը md_l = 95 dn_l = 45 up_r = 135 # servo առաջ/ետ md_r = 90 dn_r = 50 ri_t = 30 # թևը աջ կամ ձախ. աջ դիրքը md_t = 90 # թևը թեքում է աջ կամ ձախ. կենտրոնական դիրքը le_t = 150 op_g = 65 # բռնիչը բաց է md_g = 90 # բռնիչ կենտրոնացված կլ _g = 130 # gripper փակ vert = 15 # սերվո պորտ, սերվո վեր/վար forw = 11 # սերվո պորտ, առաջ/հետ շարժվող սերվո պտույտ = 7 # սերվո պորտ `սերվո բռնակ շրջելու համար = 3 # սերվո պորտ բռնելու համար servo #բազկի կարգավորումների ցուցակ ինը դիրքի դիրքի համար = [(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)] # սահմանում է 10 բազային դիրքեր, որոնք նշված են 0-9 ամբողջ թվերով # տրանսպորտային ընթացակարգերով [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), #ստանալ օբյեկտ (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)]

տրանսպորտ 2 = [(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)]

պար 1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # ա «պար»

#տեղափոխում MeArm- ը զրոյի դիրքի կարգավիճակ = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]: անկյուն = կարգավիճակ [2] kit.servo [grip]. անկյուն = կարգավիճակ [3] տպել (կարգավիճակ) դաս Հսկիչ (օբյեկտ). #Հետադարձ գործառույթ def _init _ (self, q): self._q = q def callback (self, հրաման): self._q.put (հրաման) դաս դաս. հավելված ՝ def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (ինքնուրույն, իրադարձություն). դիրքը [ստեղն] a = p [0] b = p [1] c = p [2] d = p [3] տպագիր («Դիրքերը.», բանալին, «vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "աստիճաններ") կարգավիճակ = [a, b, c, d] # փաստաթղթեր ընթացիկ կարգավիճակ տպել (կարգավիճակ) # sys.stdout.write ("Պաշտոն ՝ ", բանալին," ձախ/աջ. ", a,"/", b," աստիճան ") kit.servo [vert].angle = a kit.servo [forw]: անկյուն = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # վերահսկում է MeArm պարը, հիմնաբառ ՝ «start_video» dnce = dance1 sp = (len (dnce)) for r in range (sp): #դիրքերի պարերի կարգ, sp քայլեր dc = dnce [r] p = դիրք] = d [p] (1) # սահմանում է շարժումների ժամանակի արագությունը: քուն (0.5) # ընդմիջում պրոցեդուրայի ավարտին def TransMeArm1 (ինքն). # Վերահսկում է MeArm transport 1, հիմնաբառ ՝ «մեկնարկի խաղ» tr1 = transport1 sp = (len (tr1)) #հաշվել r- ի համար քայլերի թիվը միջակայքում (sp). #գնալ ցանկացած քայլ p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] հավաքածու: servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip]. անկյուն = d տպել (p) ժամանակը: քնել (1) # հավաքածու շարժումների արագություն time.sleep (0.5) def TransMeArm2 (self). # վերահսկում է MeArm պարը, հիմնաբառ ՝ «հաջորդ խաղ» tr2 = transport2 sp = (len (tr2)) r տիրույթում (sp): դիրքերի #պարի կարգ, 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].angle = d print (p) time.sleep (1) # սահմանում է շարժումների ժամանակի արագությունը: քուն (0.5) def RandomMoves (self). # պատահականորեն ցատկում է կանխորոշված դիրքերի միջև, հիմնաբառ ՝ «պատահական խաղ» dr = randrange (9) # պատահականորեն ընտրում է դիրքը p = դիրքը [dr] # կարդում է դիրքի պարամետրերը 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 [բռնում].angle = d time.sleep (1) # սահմանում է շարժումների արագությունը def MoveUp (self). > up_l). # թեստ, եթե չի գերազանցում min/max պարամետրերը u1 = up_l # այլապես սահմանել min/max value kit.servo [vert].angle = u1 # տեղափոխել servo կարգավիճակը [0] = u1 # կարգավորել կարգավիճակի արժեքը տպել (" վեր », կարգավիճակ) time.sleep (1) # սահմանում է արագություն def MoveDown (ինք). դ 0 = կարգավիճակ [0] d1 = d0 - 5 # նվազագույն x աստիճան, եթե (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # տեղափոխել servo կարգավիճակը [1] = f1 տպել («առաջ», կարգավիճակ) time.sleep (1) def MoveBack (ինքն): b0 = կարգավիճակ [1] b1 = b0 - 5 # նվազագույն x աստիճան, եթե (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo կարգավիճակ [2] = l1 տպում («ձախ», կարգավիճակ) time.sleep (0.2) def MoveRight (self): r0 = կարգավիճակ [2] r1 = r0 - 2 #նվազագույն x աստիճան, եթե (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print («right», status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # սահմանել բռնումը դեպի «բաց» դիրքը. «open_tab» time.sleep (0.5) կարգավիճակը [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # բռնակը դնել «փակ» դիրքի. " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # ոչինչ չի անում, բայց դադարեցնում է շարժումների տպումը (" stop ", status) time.sleep (0.25) def spotter (self, args): շարժիչ = BasicEngine (args.model_file) խոսափող = args.mic եթե args.mic այլ ոչ մի այլ բան int (args.mic) model.classify_audio (խոսափող, շարժիչ, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz_mont, int (args.num_frames_hop)) def on_execute (self, args). եթե ոչ self.on_init (): self._running = False q = model.get_queue () self._controler = Controller (q) եթե ոչ args.debug_keyboard: t = Թեման (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 (True, 0.1) բացառությամբ հերթի: Դատարկ: new_item = Ոչ մեկը, եթե new_item- ը չկա Ոչ մեկը: item = new_item if (args.debug_keyboard և բանալիներ [pygame. K_ESCAPE]) կամ տարր == «կանգառ». [pygame. K_RIGHT]) կամ տարր == "աջ". # աջ թեքվել self. MoveRight () if (args.debug_ke yboard և ստեղներ [pygame. K_LEFT]) կամ տարր == «ձախ». # թեքեք ինքներդ ձախ. MoveVeft () եթե (args.debug_keyboard և ստեղներ [pygame. K_UP]) կամ տարր == "վեր". self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) or item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) or item == "b": # backwards self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # forward self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) or item == «o»: # բաց բռնում ՝ self. OpenGrip () if (args.debug_keyboard և բանալիներ [pygame. K_C]) կամ տարր == "c": # close grip: self. CloseGrip () if (args.debug_keyboard և բանալիներ [pygame. K_S]) կամ տարր == "s": # դադարեցնել շարժումը. "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]) or item == "2": self. MeArmPos (2) եթե (args.debug_keyboard և բանալիներ [pygame. K_3]) կամ այն em == "3": self. MeArmPos (3) եթե (args.debug_keyboard և ստեղներ [pygame. K_4]) կամ տարր == "4": self. MeArmPos (4) եթե (args.debug_keyboard և բանալիներ [pygame. K_5]) կամ տարր == "5". Self. MeArmPos (5) եթե (args.debug_keyboard և բանալիներ [pygame. K_6]) կամ տարր == "6": self. MeArmPos (6) եթե (args.debug_keyboard և ստեղներ [pygame. K_7]) կամ տարր == "7". self. MeArmPos (7) եթե (args.debug_keyboard և բանալիներ [pygame. K_8]) կամ տարր == "8". self. MeArmPos (8) եթե (args.debug_keyboard և ստեղներ [pygame. K_9]) կամ տարր == "9". self. MeArmPos (9) եթե (args.debug_keyboard և բանալիներ [pygame. K_a]) կամ տարր == "d": self. DancingMeArm () #dancing MeArm, «հաջորդ_խաղի» դեպքում, եթե (args.debug_keyboard և ստեղներ [pygame. K_r]) կամ տարր == "r": self. RandomMoves () #պատահական պար «պատահական խաղ», եթե (args.debug_keyboard և բանալիներ [pygame. K_j]) կամ տարր == "j": self. TransMeArm1 () # տրանսպորտային օբյեկտ. "lunch_game" if (args.debug_keyboard and keys [pygame. K_k]) or item == "k": self. TransMeArm2 () # տրանսպորտային օբյեկտի հակադարձ ուղղություն. "next_game" '' 'եթե (args.debug_keyboard և ստեղներ [pygame. K_l]) կամ տարր == "l". self. JumpingJack2 (1) #LED blink «target» '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Օգտագործել ստեղնաշարը MeArm- ը կառավարելու համար', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = Հավելված () the_app.on_execute (args)

Խորհուրդ ենք տալիս: