Mündəricat:

Eşitmə Qolu, Google Coral TPU Sürətləndiricisi: 3 addım
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi: 3 addım

Video: Eşitmə Qolu, Google Coral TPU Sürətləndiricisi: 3 addım

Video: Eşitmə Qolu, Google Coral TPU Sürətləndiricisi: 3 addım
Video: Sharp QT-90 отличная магнитола из 1983 года. Подробный тест. 2024, Iyul
Anonim
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi İdarə Edilir
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi İdarə Edilir
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi İdarə Edilir
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi İdarə Edilir
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi İdarə Edilir
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi İdarə Edilir
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi İdarə Edilir
Eşitmə Qolu, Google Coral TPU Sürətləndiricisi İdarə Edilir

Aşağıda kiçik bir xyz robot qolu olan MeArm-in səslə idarə olunan versiyasını təsvir etmək istərdim. MeArm Pi-ni MIME sənayesindən istifadə etdim, ancaq sistem MeArm-in hər hansı bir versiyasına və ya oxşar servo idarə olunan cihazlara tətbiq olunmalıdır.

Google Coral TPU Sürətləndiricisini istifadə edərək, Raspberry Pi üzərində sürətli oflayn TensorFlow səs tanıma skriptlərini işə salmağa və bununla da fiziki cihazları bir saniyədən aşağı gecikmə ilə danışıq əmrləri ilə idarə etməyə imkan verir.

Burada təsvir olunan cihaz, əvvəlki iki təlimatda təsvir olunan anlayışların birləşməsi və uzadılmasıdır. Burada təsvir olunan Google Coral səs idarəetməsinin, Jumping Jack -in əvvəlki tətbiqinin və burada təsvir edilən Google AIY səsli MeArm -in genişləndirilməsidir.

Google Voice AIY sistemindən istifadə edərək səslə idarə olunan MeArm, onlayn giriş tələb edir, tətbiq etmək asan deyildi, səsli sifarişlərin dinlənilməsini aktivləşdirmək üçün bir düyməyə basmaq lazım idi və uzun bir gecikmə müddəti var idi. İndi istifadə olunan Google Coral TPU Sürətləndiricisi, Raspberry Pi və ya digər Linux cihazlarında yüksək sürətlə TensorFlowLite modellərini oflayn rejimdə işləməyə imkan verir. Google Coral Github səhifəsindəki nümunələr arasında, 140 düyməli ifadəni (Sentyabr 2019) başa düşə bilən bir səs tanıma sistemi üçün "eşitmə ilanı" adlı bir nümunə var, sonra da virtual düymələr vurulur. Python -da proqramlaşdırılmış bəzi funksiyaların yerinə yetirilməsi ilə bu "düymələri" birləşdirmək, səsli komanda ilə idarə olunan bir cihaz qurmağa imkan verir. Bu yaxınlarda ilk tətbiq, səslə idarə olunan elektromekanik atlama jakını təsvir etdim. Buradakı tətbiq bir az daha mürəkkəbdir və ya MeArm-in bütün dörd servosunu ya MeArm'ı davamlı olaraq hərəkət etdirmək və ya bir sıra əvvəlcədən təyin edilmiş bir sıra hərəkət etmək üçün idarə etməyə imkan verir. vəzifələr və ya daha mürəkkəb vəzifələri yerinə yetirmək üçün.

Nümunə olaraq burada verilən skriptdən istifadə edərək, digər səslə idarə olunan qurğuların qurulması nisbətən sadə olmalıdır, məsələn. robot maşınlar və ya köməkçi texnoloji bölmələr.

Təchizat

  • MeArm. Burada istifadə olunur: MIME Industries -dən MeArm Pi
  • Moruq Pi 4
  • Google Coral TPU Sürətləndiricisi
  • Adafruit 16 kanallı servo kapot
  • bəzi keçid kabelləri
  • isteğe bağlı: servo kapot üçün kondansatör, 4 servo üçün təxminən 400 µF (Adafruit tərəfindən tövsiyə olunur)
  • Servo kapot üçün 5-6 V güc mənbəyi. Burada köhnə 6V şarj cihazından istifadə etdim, 4x AA batareya paketi də işləyir
  • Mikrofon. Mikrofon olaraq köhnə bir Microsoft HD3000 veb kamerasından istifadə etdim.

Addım 1: Sistemin qurulması

Sistemin Qurulması
Sistemin Qurulması
Sistemin Qurulması
Sistemin Qurulması

Google Coral Github səhifəsindən Google Coral TPU Accelerator üçün əvvəlcədən qurulmuş Raspian görüntüsünü yükləyin və bir µSD karta quraşdırın. Şəkildə bir çox nümunə skript də var. Göstərildiyi kimi Pi qurun.

Məsələn, Google Coral GitHub saytından açar söz aşkarlayıcı nümunəsini və lazım olan bütün proqramları quraşdırın. Mikrofonu Pi -yə bağlayın. Hər şeyin işlədiyinə əmin olmaq üçün "Eşitmə İlanı" nümunəsi ilə oynamağı məsləhət görürəm.

Burada təsvir edildiyi kimi Adafruit 16 kanal kapot proqramını yükləyin və quraşdırın. Kapotu quraşdırın və hər şeyin düzgün işlədiyini təmin etmək üçün Adafruit nümunələri ilə oynayın.

Bu təlimata əlavə edilmiş faylları yükləyin və "Layihə Açar söz Spotter" qovluğuna kopyalayın. "Commands_v1_MeArm.txt" faylı "config" alt qovluğuna kopyalanmalıdır.

MeArm servolarınızı göstərilən şəkildə servo kapotuna qoşun. Yuxarı/aşağı 15 -ci portu, irəli/geri 11 -ci, dönmə üçün 7 -ci və tutucu servoları üçün 3 -cü portdan istifadə etdim.

Ssenari daxilində hər bir servo üçün min/mərkəz/maksimum dəyərlərini konfiqurasiyanıza uyğunlaşdıra bilərsiniz, Bu parametrlər servoların zədələnməməsinə kömək edir. Daxil olan "mövqelər", "nəqliyyat1" və "nəqliyyat2" siyahılarını da dəyişdirə bilərsiniz.

Ssenarini işə salın. İndiyə qədər IDE -dən idarə edirdim.

Ehtiyacınıza görə müəyyən bir funksiyanı oyadan açar sözləri dəyişdirmək istəsəniz, mövcud KeyPhrases -in tam siyahısı konfiqurasiya alt qovluğundakı "labels_gc2 raw.txt" faylında tapıla bilər.

Sistemin gecikmə müddəti təxminən 1 saniyədir, lakin hansı hərəkətlərin ediləcəyindən çox asılıdır. Bəzi hallarda əsas mərhələ təkrar edilməlidir, tanınma dəqiqliyi həmişə 100%olmur.

Addım 2: Cihazdan istifadə

Hər şey qurulub yoxlanılıbsa, cihazı işə sala bilərsiniz.

Mövcud bir məhdudiyyət, müəyyən bir əmrin dayandırılmadığı müddətdə ("oyunu dayandır" oyunundan istifadə edərək) və ya başqa bir əmrin verildiyi müddətdə təkrar icra edilməsidir. Kompleks çox mərhələli vəzifələr, məsələn. "transport1" ("başlatma oyunu" ifadəsi ilə uyarılır) həmişə son mərhələyə qədər icra olunur.

Beləliklə, "sağa dönün" cihaz dayanana qədər kiçik addımlarla sağa hərəkət edəcək və ya əvvəlcədən təyin edilmiş maksimum dəyərə çatacaq. "başlatma oyunu", "növbəti oyun" və ya "start_video", müəyyən bir addımda hər bir servo üçün ayarı ehtiva edən siyahılar tərəfindən təyin olunan bir sıra hərəkətlərə başlayacaq. "təsadüfi oyun", cihazın bir siyahıdan təsadüfi olaraq seçilmiş bir addımdan digərinə keçməsini təmin edəcək.

Əlavə olunan videoda görə biləcəyiniz kimi, MeArm tərəfindən götürülə bilən və əvvəlcədən təyin edilmiş bir hərəkət dəsti ilə bir yerdən digərinə nəql edilə bilən LEGO -dan bir diabolo formalı bir obyekt qurmuşdum. 'Transport1' və ya 'transport2' siyahılarını dəyişdirərək öz funksiyalarınızı təyin edə bilərsiniz.

Addım 3: Ssenari

Burada sadalanan skript, "Layihə Açar söz Spotteri" ndən "Eşitmə İlanı" nümunəsinin bir dəyişiklikidir. Nümunə minimuma endirildi, sonra proqram təminatı və Adafruit servo kapot üçün verilən nümunələrə əsaslanaraq servoların idarə edilməsi üçün hissə əlavə edildi.

Ssenari indiyədək optimallaşdırılmamışdır. Öz riski ilə istifadə edin, dəyişdirmək və optimallaşdırmaqdan çekinmeyin.

Python skriptinə əlavə olaraq əmr faylı və istifadə olunan etiketlər faylı var. Konfiqurasiya alt qovluğuna yerləşdirin.

Daha əvvəl də qeyd edildiyi kimi, xüsusi MeArm və ya başqa bir cihazın skriptini uyğunlaşdırmaq üçün bir neçə parametr tənzimlənməsi tələb oluna bilər.

# Müəlliflik hüququ 2019 Google LLC#

# Apache Lisenziyası, Versiya 2.0 ("Lisenziya") altında lisenziyalı; # bu faylı Lisenziyaya uyğun olaraq istifadə edə bilməzsiniz. # Lisenziyanın bir nüsxəsini # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" ünvanından əldə edə bilərsiniz. https://www.apache.org/licenses/LICENSE-2.0 # # Tətbiq olunan qanunla tələb olunmadığı və ya yazılı şəkildə razılaşdırılmadığı təqdirdə, Lisenziya altında paylanan proqram təminatı "OLDUĞU kimi" BAZA, # ZƏMANƏT VƏ ŞƏRTLƏRİ olmadan paylanır İstənilən növ, istər açıq, istərsə də örtülü. # Lisenziyadakı xüsusi dil tənzimləmə icazələri və # məhdudiyyətlər üçün Lisenziyaya baxın. # orijinal "eşitmə_ ilanı" kodu Dr H. tərəfindən MeArm üçün tətbiq üçün dəyişdirildi. '' Təlimatlar Mənim tətbiqimdə Google Coral sürətləndiricisi və Adafruit 16 kanallı servo kapotu olan Raspbery Pi 4 istifadə olunur. Bir MeArm (MIME sənayesi) servoları kapotun 3, 7, 11 və 15 limanlarına bərkidilmişdi. Ətraflı məlumat üçün "Eşitmə Qulluğu" Təlimatına baxın. Əmrlər: "mövqe x", x = 0 -dan 9 -a qədər, cihazı əvvəlcədən təyin edilmiş bir mövqeyə keçirir. "yuxarı/yuxarı", "aşağı/aşağı", "irəli/irəli", "geri/geri dön", "sola/sola" və "sağa dönmək" veriləndə yavaş, addım -addım hərəkətə səbəb olur. istiqamət, "oyunu dayandır" hərəkətləri dayandırır. "açıq sekme" və "yaxın nişan" tutucunu açır və ya bağlayır. "videoya başla", cihazı "mövqelər" siyahısı ilə müəyyən edilmiş əvvəlcədən təyin edilmiş bir mövqe sırasına riayət etməyə məcbur edir. "təsadüfi oyun" təsadüfi bir hərəkət nümunəsi ilə nəticələnir, "oyunu dayandır" bitir. "başlatma oyunu", 'transport1' siyahısı ilə əvvəlcədən təyin edilmiş başqa bir hərəkət seriyasına başlayır, 'nəqliyyat2' ilə əvvəlcədən təyin edilmiş tərs əməliyyat, öz riskiniz üzərindədir. '' '_future_ idxalından _future_ idxalından _future_ idxalından _future_ idxalı print_funksiyasından təsadüfi idxal randintindən argparse idxal etmək idgetpu.basic.basic_engine idxalından mövzu idxal zamanı BasicEngine idxal modeli pygame.locals -dan idxal pygame idxal * idxal sırası adafruit_servokit idxalından təsadüfi idxal ServoKit idxal taxtası idxal busio idxal adafruit_pca9685 idxal vaxtı i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanallar = 16) # kanal sayını təyin edin # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # dəq, mərkəz və maksimum parametrlər yuxarı_l = 145 # servo yuxarı/aşağı: yuxarı md_l = 95 dn_l = 45 yuxarı_r = 135 # servo irəli/geri md_r = 90 dn_r = 50 ri_t = 30 # sağa və ya sola dönmə: sağ mövqe md_t = 90 # dönmə qolu sağa və ya sola: orta mövqe le_t = 150 op_g = 65 # tutucu açıq md_g = 90 # tutucu mərkəzli cl _g = 130 # tutucu qapalı vert = 15 # servo port sayı, servo yuxarı/aşağı forw = 11 # servo port sayı, irəli/geriyə hərəkət edən servo dönüş = 7 # servo tutuşu çevirmək üçün servo port = 3 # tutma üçün servo port servo #doqquz mövqe mövqeyi üçün qol parametrlərinin siyahısı = [(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_d, dn_r, dn_r), (dn_l, dn_r, le_t, md_g)] # # 0-9 tam ədədləri ilə göstərilən 10 əsas mövqeyi təyin edir # nəqliyyat prosedurları [vert/irəli/dönüş/tutma] nəqliyyat1 = [(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), #obyekti (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)]

nəqliyyat2 = [(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)]

rəqs1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "rəqs"

#hərəkət edən MeArm -dan Sıfır mövqe statusu = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [növbəsi]. angle = status [2] kit.servo [grip].angle = status [3] print (status) class Controler (object): #Callback funksiyası def _init _ (self, q): self._q = q def callback (öz, command): self._q.put (command) class App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return on_event (özünü, hadisə): əgər event.type == pygame. QUIT: self._running = Yanlış def MeArmPos (öz, düymələr): # MeArm -ı əvvəlcədən təyin edilmiş mövqelərə, açar sözlərə aparır: "mövqe x" key = int (düymələr) p = mövqe [açar] a = p [0] b = p [1] c = p [2] d = p [3] çap ("Vəzifələr:", düymə, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "dərəcələr") status = [a, b, c, d] # sənəd cari vəziyyəti çap (status) # sys.stdout.write ("Vəzifə: ", açar," sol/sağ: ", a,"/", b," dərəcə ")) kit.servo [vert].angle = bir kit.servo [forw].angle = b kit.servo [çevir].angle = c kit.servo [tutma].angle = d vaxt.yuxu (0.5) def DancingMeArm (özünü): # MeArm rəqsini idarə edir, açar söz: "start_video" dnce = dance1 sp = (l (dnce)) r aralığında (sp): #mövqelərin rəqs sırası, sp addımları dc = dnce [r] p = mövqe [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = bir kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # hərəkətlərin sürətini təyin edir. Yuxu (0.5) # prosedurun sonunda fasilə def TransMeArm1 (özünü): # MeArm nəqlini idarə edir 1, açar söz: "oyunu başlat" tr1 = nəqliyyat1 sp = (len (tr1)) (sp) aralığında r üçün addımların sayını hesablayın: #hər hansı bir addıma keç p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = bir kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.yuxu (1) # set hərəkətlərin sürəti time.sleep (0.5) def TransMeArm2 (özünü): # MeArm rəqsini idarə edir, açar söz: "növbəti oyun" tr2 = nəqliyyat2 sp = (len (tr2)) r aralığında (sp): mövqelərin #rəqs sırası, sp addımları p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [əvvəl]) def RandomMoves (özünü): # əvvəlcədən təyin edilmiş mövqelər arasında təsadüfi olaraq atlayır, açar söz: "təsadüfi oyun" dr = randrange (9) # təsadüfi bir mövqe seçir p = mövqe [dr] # mövqe parametrlərini oxuyur 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 time.sleep (1) # hərəkətlərin sürətini təyin edir Def MoveUp (özünü): # tutucunu kiçik addımlarla qaldırmaq u0 = status [0] # cari vəziyyəti oxu u1 = u0 + 5 # plus x dərəcə əgər (u1 > up_l): # test, min/maksimum parametrləri keçmirsə u1 = yuxarı_l # əks halda min/maksimum dəyər kitinə təyin olunur.servo [vert].angle = u1 # servo vəziyyətini köçür [0] = u1 # status dəyərini tənzimlə (") up ", status) time.sleep (1) # # set speed def def MoveDown (self): d 0 = status [0] d1 = d0 - 5 # minus x dərəcə, əgər (d1 yuxarı_r): f1 = yuxarı_r kit.servo [forw].angle = f1 # servo vəziyyəti hərəkət etdir [1] = f1 çap ("irəli", status) time.sleep (1) def MoveBack (öz): b0 = status [1] b1 = b0 - 5 # minus x dərəcə olarsa (b1 le_t): l1 = le_t kit.servo [çevir].angle = l1 # servo hərəkət et status [2] = l1 çap ("sol", status) vaxt.yuxu (0.2) def MoveRight (özünü): r0 = status [2] r1 = r0 - 2 #mənfi x dərəcədirsə (r1 <ri_t): r1 = ri_t kit.servo [dönüş].angle = r1 # servo vəziyyətini dəyişdir [2] = r1 çap ("sağ", status) vaxt.yuxu (0.2) def OpenGrip (özünü): kit.servo [tutma].angle = op_g # tutuşu "açıq" mövqeyinə təyin edin: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # tutuşu "qapalı" mövqeyinə təyin edin: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (öz): # heç nə etmir, ancaq hərəkəti dayandırır (" stop ", status) time.sleep (0.25) def spotter (self, args): motor = BasicEngine (args.model_file) mikrofon = args.mic, əgər args.mic başqa deyilsə int (args.mic) model.classify_audio (mikrofon, motor, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hzz = num (args_sram_) int (args.num_frames_hop)) def on_execute (self, args): if not.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) if not args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: cəhd edin: new_item = q.get (True, 0.1) queue. Empty: new_item = new_item olmadıqda heç biri yoxdur: item = new_item if (args.debug_keyboard və düymələr [pygame. K_ESCAPE]) və ya maddə == "stop": self._running = False # if (args.debug_keyboard və düymələr [pygame. K_SPACE]) və ya maddə == "go": # self. MeArmPos (7) # if (args.debug_keyboard və düymələr) [pygame. K_RIGHT]) və ya maddə == "sağ": # özünü sağa çevir. MoveRight () əgər (args.debug_ke yboard və düymələr [pygame. K_LEFT]) və ya maddə == "sola": # özünü sola çevir. MoveLeft () əgər (args.debug_keyboard və düymələr [pygame. K_UP]) və ya maddə == "yuxarı": self. MoveUp () əgər (args.debug_keyboard və düymələr [pygame. K_DOWN]) və ya maddə == "aşağı": self. MoveDown () əgər (args.debug_keyboard və düymələr [pygame. K_B]) və ya maddə == "b": # geriyə self. MoveBack () if (args.debug_keyboard və düymələr [pygame. K_F]) və ya maddə == "f": # forwards self. MoveForw () if (args.debug_keyboard və düymələr [pygame. K_O]) və ya maddə == "o": # açıq tutuş: self. OpenGrip () if (args.debug_keyboard və düymələr [pygame. K_C]) və ya maddə == "c": # yaxın tutuş: self. CloseGrip () if (args.debug_keyboard və düymələr) [pygame. K_S]) və ya maddə == "s": # hərəkəti dayandır: "start_game" self. StopMove () if (args.debug_keyboard və düymələr [pygame. K_0]) və ya maddə == "0": self. MeArmPos (0) əgər (args.debug_keyboard və düymələr [pygame. K_1]) və ya maddə == "1": self. MeArmPos (1) if (args.debug_keyboard və düymələr [pygame. K_2]) və ya maddə == "2": self. MeArmPos (2) əgər (args.debug_keyboard və düymələr [pygame. K_3]) və ya 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]) və ya maddə == "5": self. MeArmPos (5) əgər (args.debug_keyboard və düymələr [pygame. K_6]) və ya maddə == "6": self. MeArmPos (6) if (args.debug_keyboard və düymələr [pygame. K_7]) və ya maddə == "7": self. MeArmPos (7) if (args.debug_keyboard və düymələr [pygame. K_8]) və ya maddə == "8": self. MeArmPos (8) if (args.debug_keyboard və düymələr [pygame. K_9]) və ya maddə == "9": self. MeArmPos (9) əgər (args.debug_keyboard və düymələr [pygame. K_a]) və ya maddə == "d": self. DancingMeArm () #Dansing MeArm, on "next_game" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #təsadüfi rəqs "təsadüfi oyun" əgər (args.debug_keyboard və düymələr [pygame. K_j]) və ya maddə == "j": self. TransMeArm1 () # nəqliyyat obyekti: "nahar oyunu" əgər (args.debug_keyboard və düymələr [pygame. K_k]) və ya maddə == "k": self. TransMeArm2 () # nəqliyyat obyektinin tərs istiqaməti: "next_game" '' 'if (args.debug_keyboard və düymələr [pygame. K_l]) və ya maddə == "l": self. JumpingJack2 (1) #LED yanıb sönür "hədəf" '' 'vaxt.yuxu (0.05) self.on_cleanup () əgər _name_ ==' _main_ ': ayrıştırıcı = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'MeArm idarə etmək üçün klaviaturadan istifadə edin.', action = 'store_true', default = False) model.add_model_flags (ayrıştırıcı) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Tövsiyə: