Talaan ng mga Nilalaman:

Isang Pagdinig sa MeArm, Google Coral TPU Accelerator na Hinimok: 3 Mga Hakbang
Isang Pagdinig sa MeArm, Google Coral TPU Accelerator na Hinimok: 3 Mga Hakbang

Video: Isang Pagdinig sa MeArm, Google Coral TPU Accelerator na Hinimok: 3 Mga Hakbang

Video: Isang Pagdinig sa MeArm, Google Coral TPU Accelerator na Hinimok: 3 Mga Hakbang
Video: Sen. Hontiveros, walang kredibilidad; Ginawang pagdinig sa Senado, trial by publicity lang -Topacio 2024, Hulyo
Anonim
Isang Pagdinig sa MeArm, Hinimok ng Google Coral TPU Accelerator
Isang Pagdinig sa MeArm, Hinimok ng Google Coral TPU Accelerator
Isang Pagdinig sa MeArm, Hinimok ng Google Coral TPU Accelerator
Isang Pagdinig sa MeArm, Hinimok ng Google Coral TPU Accelerator
Isang Pagdinig sa MeArm, Hinimok ng Google Coral TPU Accelerator
Isang Pagdinig sa MeArm, Hinimok ng Google Coral TPU Accelerator
Isang Pagdinig sa MeArm, Hinimok ng Google Coral TPU Accelerator
Isang Pagdinig sa MeArm, Hinimok ng Google Coral TPU Accelerator

Sa sumusunod na nais kong ilarawan ang isang bersyon na kinokontrol ng boses ng MeArm, isang maliit na braso ng xyz robot na may gripper. Ginamit ko ang MeArm Pi mula sa mga industriya ng MIME, ngunit ang system ay dapat na mailapat sa anumang bersyon ng MeArm, o mga katulad na aparato na hinihimok ng servo.

Ang paggamit ng Google Coral TPU Accelerator ay nagbibigay-daan upang magpatakbo ng mabilis na mga script ng pagkilala sa boses ng TensorFlow sa Raspberry Pi, at dito makokontrol ang mga pisikal na aparato sa pamamagitan ng mga binibigkas na order, na may latency na mas mababa sa isang segundo.

Ang aparato na inilalarawan dito ay isang kumbinasyon, at pagpapalawak, ng mga konsepto na inilarawan sa dalawang nakaraang mga itinuturo. Ito ay isang extension ng isang naunang pagpapatupad ng kontrol ng boses ng Google Coral, isang Jumping Jack, na inilarawan dito at isang malawak na pagpapabuti ng isang pagkontrol ng boses ng Google AIY na MeArm na inilarawan dito.

Ang MeArm na kinokontrol ng boses gamit ang system ng Google Voice AIY na kinakailangan ng online access, hindi madaling ipatupad, kinakailangan upang pindutin ang isang pindutan upang maisaaktibo ang pakikinig para sa mga order ng boses at may mahabang oras ng latency. Ang Google Coral TPU Accelerator na ginamit ngayon ay nagbibigay-daan upang patakbuhin ang mga modelo ng TensorFlowLite offline na may mataas na tulin sa isang Raspberry Pi o iba pang mga aparatong Linux. Kabilang sa mga halimbawa sa pahina ng Google Coral Github mayroong isang halimbawang tinatawag na "pandinig na ahas" para sa isang sistema ng pagkilala sa boses na maaaring maunawaan ang 140 pangunahing mga parirala (Setyembre 2019), na pagkatapos ay nai-map sa mga virtual na keystroke. Ang pagsasama sa mga "keystroke" na ito sa pagpapatupad ng ilang mga pagpapaandar na naka-program sa Python ay ginagawang posible na bumuo ng isang aparato na kinokontrol ng boses na utos. Kamakailan ko ay inilarawan ang isang unang pagpapatupad, isang electromekanical jumping jack na kinokontrol ng boses. Ang pagpapatupad dito ay medyo mas kumplikado at pinapayagan na makontrol ang lahat ng apat na servos ng MeArm upang alinman na ilipat ang MeArm o magpatuloy na lumipat sa isang bilang ng mga paunang natukoy mga posisyon, o upang maisagawa ang ilang mas kumplikadong mga gawain.

Gamit ang script na ibinigay dito bilang halimbawa, dapat na medyo simple upang makabuo ng iba pang mga aparato na kinokontrol ng boses, hal. mga robotic car o assistive tech unit.

Mga gamit

  • MeArm. Ginamit dito: MeArm Pi mula sa MIME Industries
  • Raspberry Pi 4
  • Google Coral TPU Accelerator
  • Adafruit 16 channel servo bonnet
  • ilang mga jumper cables
  • opsyonal: capacitor para sa servo bonnet, halos 400 µF para sa 4 servos (inirekomenda ng Adafruit)
  • 5-6 V na mapagkukunan ng kuryente para sa servo bonnet. Gumamit ako dito ng isang lumang 6V charger, gumagana rin ang isang 4x AA na baterya pack
  • Mikropono Gumamit ako ng isang lumang Microsoft HD3000 webcam bilang mikropono.

Hakbang 1: Pag-set up ng System

Pag-set up ng System
Pag-set up ng System
Pag-set up ng System
Pag-set up ng System

I-download ang na-configure na imahe na Raspian para sa Google Coral TPU Accelerator mula sa pahina ng Google Coral Github at i-install ito sa isang cardSD card. Naglalaman din ang imahe ng isang bilang ng mga halimbawang script. I-set up ang Pi tulad ng ipinahiwatig.

I-install ang halimbawa ng Spotter ng keyword mula sa site ng Google Coral GitHub, kung hindi kasama sa imahe, at lahat ng kinakailangang programa. Ikabit ang mikropono sa Pi. Inirerekumenda kong laruin ang halimbawa ng "Pagdinig ng Ahas" upang matiyak na gumagana ang lahat.

I-download at i-install ang Adafruit 16 channel bonnet software, tulad ng inilarawan dito. I-install ang bonnet at maglaro kasama ang mga halimbawa ng Adafruit upang matiyak na gumagana ang lahat ng maayos.

I-download ang mga file na nakakabit sa itinuturo na ito at kopyahin ang mga ito sa folder na "Project Keyword Spotter". Ang file na "Command_v1_MeArm.txt" ay dapat kopyahin sa "config" na subfolder.

Ikonekta ang mga servo ng iyong MeArm sa servo bonnet tulad ng ipinahiwatig. Gumamit ako ng port 15 para sa pataas / pababa, port 11 para sa pasulong / paatras, port 7 para sa pagliko at port 3 para sa mga gripper servos.

Sa loob ng script maaari mong ayusin ang mga halagang min / center / max para sa bawat servo sa iyong pagsasaayos, makakatulong ang mga setting na ito upang maiwasan ang pinsala sa mga servo. Maaari mo ring baguhin ang mga kasamang listahan ng "posisyon", "transport1" at "transport2".

Patakbuhin ang iskrip. Sa ngayon ay pinatakbo ko ito mula sa IDE.

Kung sakaling nais mong baguhin ang mga pangunahing parirala na nagpapukaw sa isang tiyak na pag-andar ayon sa iyong pangangailangan. Ang isang kumpletong listahan ng mga magagamit na KeyPhrases ay matatagpuan sa file na "labels_gc2 raw.txt" sa config subfolder.

Ang system ay may oras ng latency na halos 1 segundo, ngunit depende sa kung aling mga pagkilos ang ginaganap. Sa ilang mga kaso ang pangunahing yugto ay dapat na paulit-ulit, ang kawastuhan ng pagkilala ay hindi palaging 100%.

Hakbang 2: Paggamit ng Device

Kung ang lahat ay na-set up at nasuri, maaari mong patakbuhin ang aparato.

Ang isang kasalukuyang limitasyon ay ang isang naibigay na order ay naisakatuparan ng paulit-ulit hangga't hindi ito tumitigil (gamit ang "stop game") o ibang order ang ibinigay. Mga kumplikadong gawain ng multistep, hal. Ang "transport1" (pinupukaw ng pariralang "paglulunsad ng laro") ay laging isinasagawa sa huling hakbang.

Kaya sa pamamagitan ng "pagliko sa kanan" ang aparato ay lilipat sa maliliit na hakbang patungo sa kanan hanggang sa tumigil, o naabot ang na-preset na maximum na halaga. Ang "paglulunsad ng laro", "susunod na laro" o "start_video" ay magsisimula ng isang serye ng mga paglipat na tinukoy ng mga listahan na naglalaman ng setting para sa bawat servo sa isang naibigay na hakbang. Ang "random na laro" ay ang aparato upang tumalon mula sa isa patungo sa isa pang hakbang, sapalarang pinili mula sa isang listahan ng mga setting.

Tulad ng nakikita mo sa kasamang video, nagtayo ako ng isang diabolo na hugis na bagay mula sa LEGO na maaaring kunin ng MeArm at maihatid mula sa isang lokasyon patungo sa isa pa sa pamamagitan ng isang paunang natukoy na hanay ng mga paggalaw. Maaari mong tukuyin ang iyong sariling mga pagpapaandar sa pamamagitan ng pagbabago ng mga listahan ng 'transport1' o 'transport2'.

Hakbang 3: Ang Script

Ang iskrip na nakalista dito ay isang pagbabago ng halimbawang "Pagdinig sa Ahas" mula sa "Project Keyword Spotter". Ang halimbawa ay natanggal sa isang minimum, pagkatapos ang bahagi para sa pagmamaneho ng servos ay idinagdag, batay sa software at mga halimbawang ibinigay para sa Adafruit servo bonnet.

Ang script ay hindi na-optimize sa ngayon. Gamitin sa iyong sariling peligro, huwag mag-atubiling baguhin at i-optimize.

Bilang karagdagan sa script ng sawa mayroong mga command-file at ang ginamit na mga label-file. Ilagay ito sa config-subfolder.

Tulad ng nabanggit dati, maraming mga pagsasaayos ng mga parameter ang maaaring kailanganin upang maiakma ang script para sa iyong espesyal na MeArm o ilang iba pang aparato.

# Copyright 2019 Google LLC #

# Lisensyado sa ilalim ng Lisensya ng Apache, Bersyon 2.0 (ang "Lisensya"); # hindi mo maaaring gamitin ang file na ito maliban sa pagsunod sa Lisensya. # Maaari kang makakuha ng isang kopya ng Lisensya sa # # 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 # # Maliban kung hinihiling ng naaangkop na batas o sumang-ayon sa pagsulat, ang software # na ipinamamahagi sa ilalim ng Lisensya ay ipinamamahagi sa isang "AS IS" BATAYAN, # WALANG WARRANTIES O KUNDISYON NG ANUMANG URI, alinman sa pagpapahayag o ipinahiwatig. # Tingnan ang Lisensya para sa tukoy na mga pahintulot sa pamamahala ng wika at # mga limitasyon sa ilalim ng Lisensya. # ang orihinal na "hearing_snake" code ay binago para sa isang pagpapatupad para sa MeArm ni Dr H. '' 'Mga Tagubilin Ang aking pagpapatupad ay gumagamit ng isang Raspbery Pi 4 na may isang Google Coral accelerator at isang Adafruit 16 na servo bonnet na nakakabit. Ang mga servo ng isang MeArm (mga industriya ng MIME) ay nakakabit sa mga port 3, 7, 11 at 15 ng bonnet. Para sa mga detalye mangyaring tingnan ang "Nakakarinig ng MeArm" na Maituturo. Mga utos: "posisyon x", x = 0 hanggang 9, ilipat ang aparato sa isang naibigay na natukoy na posisyon. "ilipat / umakyat", "ilipat / bumaba", "go / turn forward", "go / turn back", "turn / go left" at "turn / go right" pukawin ang isang mabagal, hakbang-hakbang na paggalaw sa ibinigay direksyon, "ihinto ang laro" hihinto ang paggalaw. Ang "open tab" at ang "close tab" ay bubukas o isara ang gripper. Ang "simulang video" ay pinupukaw ang aparato upang sundin ang isang preset na pagkakasunud-sunod ng mga posisyon, na tinukoy ng listahan ng 'mga posisyon'. Ang "random game" ay nagreresulta sa isang random na pattern ng mga paggalaw, natatapos ito ng "stop game". Ang "paglunsad ng laro" ay nagsisimula ng isa pang serye ng mga paglipat na tinukoy ng listahan na 'transport1', "susunod na laro" ang pabalik na operasyon na tinukoy ng 'transport2' Gumamit sa iyong sariling peligro. '' 'mula sa _future_ import absolute_import mula sa _future_ import na dibisyon mula sa _future_ import print_unction import argparse import os mula sa random na pag-import ng randint mula sa pag-thread ng pag-import ng Thread import time mula sa edgetpu.basic.basic_engine import BasicEngine import model import pygame mula sa pygame.locals import * import pila mula sa random import randrange mula sa adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 import time i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (channel = 16) # itakda ang bilang ng mga channel # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, center at max setting up_l = 145 # servo pataas / pababa: pataas md_l = 95 dn_l = 45 pataas_r = 135 # servo pasulong / paatras md_r = 90 dn_r = 50 ri_t = 30 # pag-ikot ng braso pakanan o kaliwa: kanang posisyon md_t = 90 # pag-ikot ng braso pakanan o kaliwa: posisyon sa gitna le_t = 150 op_g = 65 # gripper bukas md_g = 90 # gripper centered cl _g = 130 # gripper closed vert = 15 # bilang ng servo port, servo pataas / pababa forw = 11 # bilang ng servo port, pasulong / pabalik na paglipat ng servo turn = 7 # servo port para sa pag-on ng servo grip = 3 # servo port para sa grip servo #list ng mga setting ng braso para sa siyam na posisyon ng posisyon = [(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, m_,)), (dn_l, dn_r, le_t, md_g)] # tumutukoy sa 10 mga posisyon sa batayan, na ipinahiwatig ng mga integer 0-9 # na mga pamamaraan sa transportasyon [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), #get object (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)]

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

#moving MeArm to Zero posisyon ng katayuan = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. anggulo = katayuan [2] kit.servo [grip].angle = status [3] print (status) class Controler (object): #Callback function def _init _ (self, q): self._q = q def callback (self, utos): self._q.put (utos) klase App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True return True def on_event (sarili, kaganapan): kung event.type == pygame. QUIT: self._running = Maling def MeArmPos (sarili, key): # drive MeArm to preset posisyon, keyword: "posisyon x" key = int (key) p = posisyon [key] a = p [0] b = p [1] c = p [2] d = p [3] print ("Positions:", key, "vert / forw / turn / grip:", a, "/", b, "/", c, "/", d, "degree") status = [a, b, c, d] # mga dokumento kasalukuyang naka-print sa katayuan (status) # sys.stdout.write ("Posisyon: ", key," left / right: ", a," / ", b," degree ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.s Sleep (0.5) def DancingMeArm (self): # kinokontrol ang MeArm dance, keyword: "start_video" dnce = dance1 sp = (len (dnce)) para sa r sa saklaw (sp): #sayawan ng pagkakasunud-sunod ng mga posisyon, sp mga hakbang dc = dnce [r] p = posisyon [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.sulog (1) # nagtatakda ng tulin ng paggalaw ng oras. Tulog (0.5) # break sa dulo ng pamamaraan def TransMeArm1 (sarili): # kinokontrol ang MeArm transport 1, keyword: "launch game" tr1 = transport1 sp = (len (tr1)) #kalkula ang bilang ng mga hakbang para sa r sa saklaw (sp): #punta sa anumang hakbang 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].angle = c kit.servo [grip].angle = d print (p) time.sulog (1) # set tulin ng paggalaw ng oras. tulog (0.5) def TransMeArm2 (sarili): # kinokontrol ang MeArm sayaw, keyword: "susunod na laro" tr2 = transport2 sp = (len (tr2)) para sa r sa saklaw (sp): #sayawan ng pagkakasunud-sunod ng mga posisyon, sp mga hakbang 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.sulog (1) # nagtatakda ng tulin ng paggalaw ng oras.sulog (0.5) def RandomMove (sarili): # na tumatalon nang sapalaran sa pagitan ng mga paunang natukoy na posisyon, keyword: "random game" dr = randrange (9) # random na pipili ng isang posisyon p = posisyon [dr] # nagbabasa ng mga parameter ng posisyon 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.sulog (1) # nagtatakda ng tulin ng mga paggalaw def MoveUp (sarili): # nakakataas na gripper sa maliliit na hakbang u0 = katayuan [0] # basahin ang kasalukuyang katayuan u1 = u0 + 5 # plus x degrees kung (u1 > up_l): # mga pagsubok kung hindi lalampas sa min / max na mga parameter u1 = up_l # kung hindi man ay itinakda sa min / max na halaga ng kit.servo [vert].angle = u1 # ilipat ang katayuan ng servo [0] = u1 # ayusin ang pag-print ng halaga ng katayuan (" pataas ", katayuan) oras. tulog (1) # nagtatakda ng tulin def MovDown (sarili): d 0 = status [0] d1 = d0 - 5 #minus x degrees if (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # ilipat ang katayuan ng servo [1] = f1 print ("forward", status) time.s Sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x degrees if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # ilipat ang servo katayuan [2] = l1 print ("kaliwa", katayuan) oras. pagtulog (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x degrees if (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # ilipat ang katayuan ng servo [2] = r1 print ("kanan", status) time.s Sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # itakda ang mahigpit na pagkakahawak sa posisyon na "bukas": "open_tab" time.s Sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # set grip to "closed" posisyon: " close_tab "time.s Sleep (0.5) status [3] = cl_g def StopMove (self): # walang ginagawa, ngunit pinipigilan ang pag-print ng paggalaw (" stop ", status) time. sleep (0.25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic kung ang args.mic ay Wala ng iba pang int (args.mic) model.classify_audio (mic, engine, labels_file = "config / labels_gc2.raw.txt", Command_file = "config / Command_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_fes), num int (args.num_frames_hop)) def on_execut (self, args): kung hindi self.on_init (): self._running = Mali q = model.get_queue () self._controler = Controler (q) kung hindi args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 habang self._running: pygame.event.pump () kung args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (True, 0.1) maliban sa pila. sintomas: new_item = Wala kung ang new_item ay wala: item = new_item kung (args.debug_keyboard at mga key [pygame. K_ESCAPE]) o item == "stop": self._running = Maling # kung (args.debug_keyboard at mga key [pygame. K_SPACE]) o item == "go": # self. MeArmPos (7) # kung (args.debug_keyboard at mga key [pygame. K_RIGHT]) o item == "kanan": # turn right self. MoveRight () kung (args.debug_ke yboard at mga key [pygame. K_LEFT]) o item == "left": # turn left self. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) or item == "up": self. MoveUp () kung (args.debug_keyboard at mga key [pygame. K_DOWN]) o item == "down": self. MoveDown () kung (args.debug_keyboard at mga key [pygame. K_B]) o item == "b": # paatras self. MoveBack () kung (args.debug_keyboard at mga key [pygame. K_F]) o item == "f": # pasulong sa sarili. MoveForw () kung (args.debug_keyboard at mga key [pygame. K_O]) o item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard and keys [pygame. K_C]) or item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) o item == "s": # stop movement: "start_game" self. StopMove () kung (args.debug_keyboard at mga key [pygame. K_0]) o item == "0": self. MeArmPos (0) kung (args.debug_keyboard at mga key [pygame. K_1]) o item == "1": self. MeArmPos (1) kung (args.debug_keyboard at mga key [pygame. K_2]) o item == "2": self. MeArmPos (2) kung (args.debug_keyboard at mga key [pygame. K_3]) o ito em == "3": self. MeArmPos (3) kung (args.debug_keyboard at mga key [pygame. K_4]) o item == "4": self. MeArmPos (4) kung (args.debug_keyboard at mga key [pygame. K_5]) o item == "5": self. MeArmPos (5) kung (args.debug_keyboard at mga key [pygame. K_6]) o item == "6": self. MeArmPos (6) kung (args.debug_keyboard at mga key [pygame. K_7]) o item == "7": self. MeArmPos (7) kung (args.debug_keyboard at mga key [pygame. K_8]) o item == "8": self. MeArmPos (8) kung (args.debug_keyboard at mga key [pygame. K_9]) o item == "9": self. MeArmPos (9) kung (args.debug_keyboard at mga key [pygame. K_a]) o item == "d": self. DancingMeArm () #dancing MeArm, sa "next_game" kung (args.debug_keyboard at mga key [pygame. K_r]) o item == "r": self. RandomMove () #random dance "random game" kung (args.debug_keyboard at mga key [pygame. K_j]) o item == "j": self. TransMeArm1 () # transport object: "lunch_game" kung (args.debug_keyboard at mga key [pygame. K_k]) o item == "k": self. TransMeArm2 () # transport object reverse direction: "next_game" '' 'kung (args.debug_keyboard at mga key [pygame. K_l]) o item == "l": self. JumpingJack2 (1) #LED blink "target" '' 'time.s Sleep (0.05) self.on_cleanup () kung _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Gamitin ang keyboard upang makontrol ang MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execut (args)

Inirerekumendang: