Mundarija:

Eshitish vositasi, Google Coral TPU tezlatgichi: 3 qadam
Eshitish vositasi, Google Coral TPU tezlatgichi: 3 qadam

Video: Eshitish vositasi, Google Coral TPU tezlatgichi: 3 qadam

Video: Eshitish vositasi, Google Coral TPU tezlatgichi: 3 qadam
Video: Boshqa telefonga ulanish va kim bilan gaplashayotganini bilish. слежка за телефоном бесплатно 2024, Iyul
Anonim
Eshitish vositasi, Google Coral TPU tezlatgichi
Eshitish vositasi, Google Coral TPU tezlatgichi
Eshitish vositasi, Google Coral TPU tezlatgichi
Eshitish vositasi, Google Coral TPU tezlatgichi
Eshitish vositasi, Google Coral TPU tezlatgichi
Eshitish vositasi, Google Coral TPU tezlatgichi
Eshitish vositasi, Google Coral TPU tezlatgichi
Eshitish vositasi, Google Coral TPU tezlatgichi

Quyida MeArm-ning ovoz bilan boshqariladigan versiyasini, tutqichli kichik xyz robot qo'lini tasvirlab bermoqchiman. Men MeArm Pi-ni MIME sanoatidan ishlatardim, lekin tizim MeArm-ning har qanday versiyasiga yoki shunga o'xshash servo-boshqariladigan qurilmalarga qo'llanilishi kerak.

Google Coral TPU Accelerator -dan foydalanish Raspberry Pi -da tez tanib bo'lmaydigan TensorFlow ovozni aniqlash skriptlarini ishga tushirish va shu tariqa jismoniy qurilmalarni og'zaki buyurtmalar bilan bir soniyadan past kechiktirish bilan boshqarish imkonini beradi.

Bu erda tasvirlangan qurilma oldingi ikkita ko'rsatmada tasvirlangan tushunchalarning kombinatsiyasi va kengayishi. Bu Google Coral ovozli boshqaruvining ilgari qo'llanilishining kengaytmasi, bu erda tasvirlangan sakrash jakı va bu erda tasvirlangan Google AIY ovozli boshqariladigan MeArm -ning yaxshilanishi.

Google Voice AIY tizimidan foydalangan holda ovozli boshqariladigan MeArm onlayn kirishni talab qildi, uni amalga oshirish oson emas edi, ovozli buyruqlarni tinglashni faollashtirish uchun tugmani bosish kerak edi va uzoq kutish vaqti bor edi. Hozirda ishlatiladigan Google Coral TPU tezlatgichi TensorFlowLite modellarini Raspberry Pi yoki boshqa Linux qurilmalarida yuqori tezlikda oflayn rejimda ishga tushirishga imkon beradi. Google Coral Github sahifasidagi misollar orasida ovozni aniqlash tizimi uchun "eshitish iloni" deb nomlangan misol mavjud bo'lib, u 140 ta kalit iborani (2019 yil sentyabr) tushunishi mumkin, ular keyinchalik virtual tugmalar bilan taqqoslanadi. Python -da dasturlashtirilgan ba'zi funktsiyalarni bajarish bilan "tugmachalarni bosish" ni birlashtirish, ovozli buyruq bilan boshqariladigan qurilmani yaratishga imkon beradi. Men yaqinda birinchi dasturni tasvirlab bergandim, ovoz bilan boshqariladigan elektromekanik o'tish joyi, bu erda amalga oshirish biroz murakkabroq va MeArm-ning to'rtta servosini boshqarishga imkon beradi, ular MeArm-ni doimiy ravishda siljitadi yoki oldindan belgilangan qatorga o'tkaziladi. lavozimlar yoki ba'zi murakkab vazifalarni bajarish.

Bu erda misol sifatida berilgan skriptdan foydalanib, boshqa ovozli qurilmalarni qurish nisbatan sodda bo'lishi kerak, masalan. robotli mashinalar yoki yordamchi texnika birliklari.

Ta'minotlar

  • MeArm. Bu erda ishlatiladi: MIME Industries kompaniyasidan MeArm Pi
  • Raspberry Pi 4
  • Google Coral TPU tezlatgichi
  • Adafruit 16 kanalli servo kaput
  • ba'zi o'tish kabellari
  • ixtiyoriy: servo kapot uchun kondansatör, 4 servo uchun taxminan 400 mF (Adafruit tomonidan tavsiya etilgan)
  • Servo kapot uchun 5-6 V quvvat manbai. Men bu erda eski 6V zaryadlovchidan foydalandim, 4x AA batareya to'plami ham ishlaydi
  • Mikrofon. Men eski Microsoft HD3000 veb -kamerasini mikrofon sifatida ishlatardim.

1 -qadam: tizimni sozlash

Tizimni sozlash
Tizimni sozlash
Tizimni sozlash
Tizimni sozlash

Google Coral Github sahifasidan Google Coral TPU Accelerator uchun oldindan tuzilgan Raspian tasvirini yuklab oling va uni microSD kartasiga o'rnating. Rasmda bir qator skript namunalari ham bor. Ko'rsatilganidek, Pi -ni o'rnating.

Misol uchun, Google Coral GitHub saytidan kalit so'zni aniqlash vositasini o'rnating, agar rasmga kiritilmagan bo'lsa va barcha kerakli dasturlar. Mikrofonni Pi -ga ulang. Hamma ishlayotganiga ishonch hosil qilish uchun "Eshituvchi ilon" misolida o'ynashni tavsiya qilaman.

Bu erda tasvirlangan Adafruit 16 kanalli kapot dasturini yuklab oling va o'rnating. Kapotni o'rnating va hamma narsa to'g'ri ishlashini ta'minlash uchun Adafruit misollari bilan o'ynang.

Ushbu ko'rsatmaga biriktirilgan fayllarni yuklab oling va ularni "Project Keyword Spotter" jildiga ko'chiring. "Commands_v1_MeArm.txt" fayli "config" pastki jildiga ko'chirilishi kerak.

MeArm servosini servo kapotiga ko'rsatilgan tarzda ulang. Men 15 -portni yuqoriga/pastga, 11 -portni oldinga/orqaga, burilish uchun 7 -portni va tutqich servolari uchun 3 -portni ishlatardim.

Skriptda siz har bir servo uchun min/center/max qiymatlarini konfiguratsiyangizga moslashtirishingiz kerak bo'lishi mumkin, bu sozlamalar servolarga zarar bermaslikka yordam beradi. Siz ham o'z ichiga olgan "pozitsiyalar", "transport1" va "transport2" ro'yxatlarini o'zgartirishingiz kerak bo'lishi mumkin.

Skriptni ishga tushiring. Hozirgacha men uni IDE -dan ishlatardim.

Agar siz kerakli funktsiyani talab qiladigan kalit so'zlarni o'zgartirishni xohlasangiz, mavjud kalit so'zlarning to'liq ro'yxati konfiguratsiya pastki papkasidagi "labels_gc2 raw.txt" faylida joylashgan.

Tizim taxminan 1 soniya kechikish vaqtiga ega, lekin ko'p jihatdan qaysi harakatlar bajarilishiga bog'liq. Ba'zi hollarda, asosiy bosqichni takrorlash kerak, tanib olish aniqligi har doim ham 100%emas.

2 -qadam: Qurilmadan foydalanish

Agar hamma narsa sozlangan va tekshirilgan bo'lsa, siz qurilmani ishga tushirishingiz mumkin.

Hozirgi cheklov - bu berilgan buyruq to'xtatilmaguncha ("o'yinni to'xtatish" yordamida) yoki boshqa buyruq berilguncha takror -takror bajarilishi. Murakkab ko'p bosqichli vazifalar, masalan. "transport1" ("ishga tushirish o'yini" iborasi bilan chaqiriladi) har doim oxirgi bosqichga qadar bajariladi.

Shunday qilib, "o'ngga burilish" orqali, qurilma to'xtab qolguncha yoki oldindan belgilangan maksimal qiymatga yetguncha o'ngga kichik qadam bilan harakatlanadi. "ishga tushirish o'yini", "keyingi o'yin" yoki "start_video" ma'lum bir bosqichda har bir servo uchun sozlamalarni o'z ichiga olgan ro'yxatlar bilan belgilanadigan harakatlar ketma -ketligini boshlaydi. "Tasodifiy o'yin" - bu sozlamalar ro'yxatidan tasodifiy tanlangan qurilma bir pog'onadan ikkinchisiga o'tadi.

Siz hamrohlik qilayotgan videoda ko'rib turganingizdek, men LEGO -dan diabolo shaklidagi ob'ektni qurgan edim, uni MeArm tomonidan olish mumkin va oldindan belgilangan harakatlar majmui bilan bir joydan ikkinchi joyga ko'chirish mumkin edi. Siz "transport1" yoki "transport2" ro'yxatlarini o'zgartirish orqali o'z funktsiyalaringizni belgilashingiz mumkin.

3 -qadam: skript

Bu erda keltirilgan skript "Project Keyword Spotter" dan "Eshituvchi ilon" misolining o'zgartirilishi. Namuna minimal darajaga tushirildi, keyin dasturiy ta'minot va Adafruit servo kapotiga berilgan misollar asosida servolarni haydash qismi qo'shildi.

Hozircha skript optimallashtirilmagan. O'zingizning xavf -xataringizdan foydalaning, o'zgartirish va optimallashtirishdan qo'rqing.

Python skriptiga qo'shimcha ravishda buyruqlar fayli va ishlatilgan teglar fayli mavjud. Uni konfiguratsiya pastki papkasiga joylashtiring.

Yuqorida aytib o'tilganidek, maxsus MeArm yoki boshqa qurilmangiz uchun skriptni moslashtirish uchun parametrlarni bir nechta sozlash talab qilinishi mumkin.

# Mualliflik huquqi 2019 Google LLC#

# Apache litsenziyasi ostida litsenziyalangan, versiya 2.0 ("litsenziya"); # siz ushbu faylni litsenziyaga muvofiq ishlata olmaysiz. # Siz litsenziyaning nusxasini # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" manzilidan olishingiz mumkin. https://www.apache.org/licenses/LICENSE-2.0 # # Agar amaldagi qonunchilik talab qilmasa yoki yozma ravishda rozi bo'lmasa, Litsenziya ostida tarqatilgan # dasturiy ta'minot "KAFOLATSIZ VA SHARTLARSIZ" HAR QANDAY, aniq yoki nazarda tutilgan. # Litsenziyadagi maxsus tilni boshqaruvchi ruxsatnomalar va # cheklovlar uchun Litsenziyani ko'ring. # "eshitish_ ilon" ning asl kodi doktor H. tomonidan MeArm uchun qo'llanma uchun o'zgartirilgan. "Ko'rsatmalar Mening ilovamda Google Coral tezlatgichi va Adafruit 16 kanalli servo kapotli Raspbery Pi 4 ishlatiladi. MeArm (MIME sanoati) servolari kapotning 3, 7, 11 va 15 -portlariga biriktirilgan. Tafsilotlar uchun "Eshitish vositasi" ko'rsatmasiga qarang. Buyruqlar: "pozitsiya x", x = 0 dan 9gacha, qurilmani oldindan belgilangan holatga o'tkazadi. "yuqoriga/yuqoriga", "pastga/pastga", "oldinga/orqaga", "orqaga/orqaga", "chapga/chapga" va "o'ngga burilish/burilish") sekin, bosqichma -bosqich harakatni keltirib chiqaradi. yo'nalish, "o'yinni to'xtatish" harakatlarni to'xtatadi. "ochiq yorliq" va "yorliqni yopish" tutqichni ochadi yoki yopadi. "Videoni ishga tushirish" qurilmani "pozitsiyalar" ro'yxati bilan belgilangan pozitsiyalarning oldindan belgilangan tartibini bajarishga majbur qiladi. "tasodifiy o'yin" tasodifiy harakatlar modeliga olib keladi, "o'yinni to'xtatish" tugaydi. "ishga tushirish o'yini" "transport1" ro'yxati bilan oldindan belgilab qo'yilgan boshqa harakatlar ketma -ketligini boshlaydi, "keyingi o'yin" "transport2" bilan oldindan belgilanadigan teskari operatsiyani o'z xavfingiz bilan ishlating. _future_ dan _future_ import bo'linishidan _future_ import bo'linishidan import bosma funktsiyasi argparse import os Adafruit_servokit importidan tasodifiy import ServoKit import kartasi import busio import adafruit_pca9685 import vaqti i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (kanallar = 16) # kanallar sonini belgilang # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, markaz va maksimal sozlamalar up_l = 145 # servo yuqoriga/pastga: yuqoriga md_l = 95 dn_l = 45 up_r = 135 # servo oldinga/orqaga md_r = 90 dn_r = 50 ri_t = 30 # o'ngga yoki chapga burilish: o'ng holat md_t = 90 # qo'lni o'ngga yoki chapga burish: markaziy pozitsiya le_t = 150 op_g = 65 # tutqich ochiq md_g = 90 # gripper markazlashtirilgan cl _g = 130 # ushlagich yopiq vert = 15 # servo portlar soni, servo yuqoriga/pastga forw = 11 # servo portlar soni, oldinga/orqaga harakatlanuvchi servo burilish = 7 # servo tutqichni burish uchun servo port = 3 # ushlagich uchun servo port servo #to'qqiz pozitsiya uchun qo'l sozlamalari ro'yxati = [(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_r), (dn_l, dn_r, le_t, md_g)] # 0-9 tamsayılar bilan ko'rsatilgan 10 ta asosiy pozitsiyani belgilaydi # transport protseduralari [vert/oldinga/burilish/ushlash] 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), #ob'ektni (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)]

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

#harakatlanuvchi MeArmni nol holatiga = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [burilish]. burchak = status [2] kit.servo [grip].angle = status [3] print (status) class Controler (object): #Callback funksiyasi def _init _ (self, q): self._q = q def callback (o'zini, buyruq): self._q.put (buyruq) sinf App: def _init _ (o'zini): self._running = Haqiqiy def on_init (o'zini): pygame.init () self.game_started = Haqiqiy o'zini._running = Haqiqiy qaytish on_event (self, hodisa): if event.type == pygame. QUIT: self._running = False def MeArmPos (o'z -o'zidan, kalitlar): # MeArm -ni oldindan o'rnatilgan pozitsiyalarga, kalit so'zlarga: "pozitsiya x" key = int (tugmalar) p = pozitsiya [kalit] a = p [0] b = p [1] c = p [2] d = p [3] chop etish ("Lavozimlar:", kalit, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "daraja") holati = [a, b, c, d] # ta hujjat joriy holatini chop etish (holat) # sys.stdout.write ("Lavozim: ", kalit," chap/o'ng: ", a,"/", b," daraja ")) kit.servo [vert].angle = kit.servo [forw].angle = b kit.servo [navbat].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # MeArm raqsini boshqaradi, kalit so'z: "start_video" dnce = dance1 sp = (l (dnce)) r uchun diapazonda (sp): #pozitsiyalarning raqs tartibi, sp qadamlari dc = dnce [r] p = pozitsiya [dc] 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) # harakat tezligini belgilaydi. Uyqu (0,5) # protsedura oxirida tanaffus def TransMeArm1 (o'zini): # MeArm transportini boshqaradi 1, kalit so'z: "o'yinni ishga tushirish" tr1 = transport1 sp = (len (tr1)) (sp) diapazonidagi r uchun qadamlar sonini hisoblang: #istalgan qadamga o'tish p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = kit.servo [forw].angle = b kit.servo [turn] harakat tezligi time.sleep (0.5) def TransMeArm2 (self): # MeArm raqsini boshqaradi, kalit so'z: "keyingi o'yin" tr2 = transport2 sp = (len (tr2)) r oralig'ida (sp)): pozitsiyalarning raqs tartibi, sp qadamlari 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) # harakat tezligini belgilaydi vaqt. uxlash (0,5)) def RandomMoves (o'zini): # oldindan belgilangan pozitsiyalar orasidan tasodifiy o'tadi, kalit so'z: "tasodifiy o'yin" dr = randrange (9) # tasodifiy pozitsiyani tanlaydi p = pozitsiya [dr] # pozitsiya parametrlarini o'qiydi 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) # harakat tezligini belgilaydi def MoveUp (o'z -o'zidan): # tutqichni kichik qadamda ko'tarish u0 = status [0] # hozirgi holatni o'qish u1 = u0 + 5 # plus x daraja bo'lsa (u1 > up_l): # testlar min/maksimal parametrlardan oshmasa u1 = up_l # aks holda min/max qiymati kit.servo [vert].angle = u1 # servo holatini siljitish [0] = u1 # holat qiymatini sozlash chop etish (" yuqoriga ", holat) time.sleep (1) # tezlikni belgilaydi MoveDown (o'zini): d 0 = holat [0] d1 = d0 - 5 # minus x daraja, agar (d1 yuqoriga_r): f1 = yuqoriga_r kit.servo [forw].angle = f1 # servo holatini siljitish [1] = f1 bosib chiqarish ("oldinga", holat) time.sleep (1) def MoveBack (o'zini): b0 = status [1] b1 = b0 - 5 # minus x daraja, agar (b1 le_t): l1 = le_t kit.servo [burilish].angle = l1 # servo harakat status [2] = l1 chop etish ("chap", holat) vaqti.sleep (0.2) def MoveRight (o'zini): r0 = status [2] r1 = r0 - 2 #minus x daraja, agar (r1 <ri_t): r1 = ri_t kit.servo [burilish].angle = r1 # servo holatini siljitish [2] = r1 bosib chiqarish ("o'ng", holat) vaqti. uxlash (0,2) def OpenGrip (o'zini): kit.servo [tutish].angle = op_g # ochishni "ochiq" holatiga o'rnating: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (o'zini): kit.servo [grip].angle = cl_g # tutqichni "yopiq" holatiga o'rnating: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (o'z -o'zidan): # hech narsa qilmaydi, lekin harakatlarni to'xtatadi (" to'xtatish ", holat) time.sleep (0.25) def spotter (self, args): motor = BasicEngine (args.model_file) mikrofon = args.mic agar args.mic boshqa bo'lmasa int (args.mic)) model.classify_audio (mikrofon, dvigatel, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args_sram_) int (args.num_frames_hop)) def on_execute (self, args): bo'lmasa self.on_init (): self._running = False q = model.get_queue () self._controler = Tekshiruvchi (q) bo'lmasa 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: try: new_item = q.get (True, 0.1), queue. Empty: new_item = new_item bo'lmasa None: item = new_item if (args.debug_keyboard va kalitlari [pygame. K_ESCAPE]) yoki item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) yoki item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) yoki element == "o'ng": # o'z -o'zidan o'ngga buriling. MoveRight () if (args.debug_ke yboard va tugmalar [pygame. K_LEFT]) yoki element == "chapga": # chapga burilish self. MoveLeft () agar (args.debug_keyboard va tugmalar [pygame. K_UP]) yoki element == "yuqoriga": self. MoveUp () agar (args.debug_keyboard va tugmalar [pygame. K_DOWN]) yoki element == "pastga": self. MoveDown () if (args.debug_keyboard va tugmalar [pygame. K_B]) yoki element == "b": # orqaga self. MoveBack () if (args.debug_keyboard va tugmalar [pygame. K_F]) yoki item == "f": # forwards self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) yoki item == "o": # ochiq tutish: self. OpenGrip () if (args.debug_keyboard va tugmalar [pygame. K_C]) yoki element == "c": # yaqin tutish: self. CloseGrip () if (args.debug_keyboard va tugmalar) [pygame. K_S]) yoki item == "s": # stop motion: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) yoki item == "0": self. MeArmPos (0) agar (args.debug_keyboard va tugmalar [pygame. K_1]) yoki element == "1": self. MeArmPos (1) if (args.debug_keyboard va tugmalar [pygame. K_2]) yoki element == "2": self. MeArmPos (2) agar (args.debug_keyboard va tugmalar [pygame. K_3]) yoki em == "3": self. MeArmPos (3) if (args.debug_keyboard and keys [pygame. K_4]) yoki item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) yoki element == "5": self. MeArmPos (5) if (args.debug_keyboard va tugmalar [pygame. K_6]) yoki element == "6": self. MeArmPos (6) if (args.debug_keyboard and kalitlar [pygame. K_7]) yoki element == "7": self. MeArmPos (7) if (args.debug_keyboard va kalitlar [pygame. K_8]) yoki element == "8": self. MeArmPos (8) if (args.debug_keyboard va tugmalar [pygame. K_9]) yoki element == "9": self. MeArmPos (9) agar (args.debug_keyboard va tugmalar [pygame. K_a]) yoki element == "d": self. DancingMeArm () #Dansing MeArm, "next_game" da if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #tasodifiy raqs "tasodifiy o'yin" agar (args.debug_keyboard va tugmalar [pygame. K_j]) yoki element == "j": self. TransMeArm1 () # transport ob'ekti: "tushlik_oyini" agar (args.debug_keyboard va tugmalar [pygame. K_k]) yoki element == "k": self. TransMeArm2 () # transport ob'ektining teskari yo'nalishi: "next_game" '' 'if (args.debug_keyboard va kalitlari [pygame. K_l]) yoki element == "l": self. JumpingJack2 (1) #LED milt -milt "nishon" '' 'vaqt. uxlash (0.05) self.on_cleanup () agar _name_ ==' _main_ ': tahlilchi = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'MeArmni boshqarish uchun klaviaturadan foydalaning.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Tavsiya: