Мазмуну:

Уккан MeArm, Google Coral TPU акселератору: 3 кадам
Уккан MeArm, Google Coral TPU акселератору: 3 кадам

Video: Уккан MeArm, Google Coral TPU акселератору: 3 кадам

Video: Уккан MeArm, Google Coral TPU акселератору: 3 кадам
Video: МОЩНЫЙ ХИТ 🔥 УККАН САЙЫН УККУН КЕЛЕТ 2024, Июль
Anonim
Уккан MeArm, Google Coral TPU тездеткичи айдалды
Уккан MeArm, Google Coral TPU тездеткичи айдалды
Уккан MeArm, Google Coral TPU тездеткичи айдалды
Уккан MeArm, Google Coral TPU тездеткичи айдалды
Уккан MeArm, Google Coral TPU акселератору айдалды
Уккан MeArm, Google Coral TPU акселератору айдалды
Уккан MeArm, Google Coral TPU тездеткичи айдалды
Уккан MeArm, Google Coral TPU тездеткичи айдалды

Төмөндө мен MeArmдин үн менен башкарылуучу версиясын, туткасы бар кичинекей xyz робот колун сүрөттөп бергим келет. Мен MeArm Pi'ни MIME тармактарынан колдондум, бирок бул система MeArmдин каалаган версиясына же ушул сыяктуу сервопроводдуу түзмөктөргө карата колдонулушу керек.

Google Coral TPU Акселераторун колдонуу Raspberry Piде оффлайнда TensorFlow үн таануу сценарийлерин тез иштетүүгө жана ушуну менен физикалык түзмөктөрдү оозеки буйрутмалар менен бир секундадан төмөн башкарууга мүмкүндүк берет.

Бул жерде сүрөттөлгөн түзмөк мурунку эки көрсөтмөдө сүрөттөлгөн түшүнүктөрдүн айкалышы жана кеңейтүүсү. Бул Google Coral үн көзөмөлүнүн мурунку ишке ашырылышынын кеңейтүүсү, бул жерде сүрөттөлгөн секирүүчү Джек жана Google AIY үн башкарылган MeArmдин жакшырышы.

Google Voice AIY тутумун колдонгон үн менен башкарылуучу MeArm онлайн кирүүнү талап кылган, ишке ашыруу оңой болгон эмес, үн буйруктарын угууну активдештирүү үчүн баскычты басуу талап кылынган жана узак күтүү убактысы болгон. Азыр колдонулган Google Coral TPU Accelerator TensorFlowLite моделдерин Raspberry Pi же башка Linux түзмөктөрүндө жогорку ылдамдыкта оффлайнда иштетүүгө мүмкүндүк берет. Google Coral Github баракчасындагы мисалдардын арасында "таануу жыланы" деп аталган мисал бар, ал үн таануу тутуму үчүн 140 ачкыч фразаны түшүнө алат (2019 -жылдын сентябры), алар виртуалдык баскычтар менен салыштырылат. Бул "баскычтарды" Pythonдо программаланган кээ бир функцияларды аткаруу менен бириктирүү үн буйругу менен башкарылуучу түзүлүштү курууга мүмкүндүк берет. Мен жакында эле биринчи ишке ашырууну, үн менен башкарылуучу электромеханикалык секирүүнү сүрөттөдүм. Бул жерде ишке ашыруу бир аз татаалыраак жана MeArmдин бардык төрт сервосун башкарууга мүмкүндүк берет, же MeArmди тынымсыз жылдырууга же аны алдын ала аныкталган бир катарга жылдырууга кызмат орундары, же кээ бир татаал милдеттерди аткаруу үчүн.

Мисал катары бул жерде берилген скриптти колдонуп, башка үн менен башкарылуучу түзүлүштөрдү куруу салыштырмалуу жөнөкөй болушу керек, мис. робот машиналар же жардамчы технологиялык блоктор.

Жабдуулар

  • MeArm. Бул жерде колдонулат: MIME Industriesтен MeArm Pi
  • Raspberry Pi 4
  • Google Coral TPU тездеткичи
  • Adafruit 16 каналдуу серво капоту
  • кээ бир кабелдер
  • кошумча: servo капот үчүн конденсатор, 4 servo үчүн болжол менен 400 µF (Adafruit тарабынан сунушталган)
  • Серво капоту үчүн 5-6 В энергия булагы. Мен бул жерде эски 6В заряддагычты колдондум, 4х АА батарейкасы иштейт
  • Микрофон. Мен эски Microsoft HD3000 вебкамерасын микрофон катары колдондум.

1 -кадам: Системаны орнотуу

Системаны орнотуу
Системаны орнотуу
Системаны орнотуу
Системаны орнотуу

Google Coral Github баракчасынан Google Coral TPU Accelerator үчүн алдын ала конфигурацияланган Raspian сүрөтүн жүктөп алып, аны µSD картага орнотуңуз. Сүрөттө ошондой эле көптөгөн сценарийлер камтылган. Көрсөтүлгөндөй Pi орнотуңуз.

Сүрөткө киргизилбесе, Google Coral GitHub сайтынан Keyword spotter мисалын жана бардык керектүү программаларды орнотуңуз. Микрофонду Pi'ге туташтырыңыз. Баары иштеп жатканына ынануу үчүн "Уккан жылан" мисалы менен ойноону сунуштаар элем.

Бул жерде сүрөттөлгөндөй Adafruit 16 каналынын капот программасын жүктөп алып, орнотуңуз. Капотту орнотуп, Adafruit мисалдары менен ойноңуз, бардыгы туура иштеп жатканын камсыз кылуу.

Бул нускамага тиркелген файлдарды жүктөп алып, аларды "Долбоордун Ачкыч Ачкычтары" папкасына көчүрүңүз. "Commands_v1_MeArm.txt" файлы "config" субпапкасына көчүрүлүшү керек.

Көрсөтүлгөндөй MeArm сервосун серво капотуна туташтырыңыз. Мен 15 -портту өйдө/ылдый, 11 -портту алдыга/артка, 7 -портту бурулуш үчүн жана 3 -портту кармагычтар үчүн колдондум.

Сценарийдин ичинде сиз конфигурацияңызга ар бир серво үчүн мин/борбор/максималдуу баалуулуктарды тууралашыңыз керек болушу мүмкүн, Бул жөндөөлөр серволорго зыян келтирбөөгө жардам берет. Ошондой эле камтылган "позициялар", "транспорт1" жана "транспорт2" тизмелерин өзгөртүүгө туура келиши мүмкүн.

Скриптти иштетүү. Буга чейин мен аны IDEден иштетип келгем.

Каалооңузга жараша белгилүү бир функцияны туудурган ачкыч сөз айкаштарын өзгөрткүңүз келсе, жеткиликтүү KeyPhrasesтин толук тизмеси конфигурация папкасындагы "labels_gc2 raw.txt" файлынан табылган.

Системанын күтүү убактысы болжол менен 1 секундду түзөт, бирок кайсы аракеттер аткарылганына жараша. Кээ бир учурларда, негизги этап кайталанышы керек, таануунун тактыгы дайыма эле 100%боло бербейт.

2 -кадам: Түзмөктү колдонуу

Эгерде бардыгы орнотулуп, текшерилсе, анда сиз аппаратты иштете аласыз.

Учурдагы чектөө - бул берилген буйрук, ал токтотулбаса ("оюнду токтотуу" менен) же башка буйрук берилмейинче, кайталанма аткарылышы. Татаал көп баскычтуу милдеттер, мис. "transport1" ("ишке киргизүү оюну" фразасы менен шартталган) ар дайым акыркы баскычка чейин аткарылат.

Ошентип, "оңго буруу" менен, түзмөк кичине кадамдар менен оңго жылат же токтоп калган максималдуу мааниге жетет. "ишке киргизүү оюну", "кийинки оюн" же "start_video" берилген кадамда ар бир серво үчүн жөндөөнү камтыган тизмелер менен аныкталган бир катар кадамдарды баштайт. "Кокус оюн" түзмөктөрдүн тизмесинен туш келди тандалган бир кадамдан экинчи кадамга секирет.

Коштоочу видеодо көрүнүп тургандай, мен LEGOдон диаболо формасындагы объектти кургам, аны MeArm алып, бир жерден экинчи жерге алдын ала аныкталган кыймылдар тобу менен ташууга болот. Сиз "транспорт1" же "транспорт2" тизмелерин өзгөртүү аркылуу өз функцияларыңызды аныктай аласыз.

3 -кадам: Скрипт

Бул жерде саналып өткөн скрипт "Долбоордун ачкыч сөзү споттеринен" "Уккан жылан" мисалынын өзгөртүүсү. Мисал минимумга чейин жок кылынган, андан кийин Adafruit servo капоту үчүн берилген программалык камсыздоого жана мисалдарга негизделген servo айдоо үчүн бөлүк кошулган.

Сценарий азырынча оптималдаштырылган эмес. Өз тобокелчилигиңиз боюнча колдонуңуз, өзгөртүүгө жана оптималдаштырууга тартынбаңыз.

Питон скриптинен тышкары, командалар-файл жана колдонулган этикеткалар-файл бар. Аны конфигурация-папкасына коюңуз.

Жогоруда айтылгандай, атайын MeArm же башка түзмөктүн сценарийин ыңгайлаштыруу үчүн параметрлердин бир нече тууралоолору талап кылынышы мүмкүн.

# Автордук укук 2019 Google LLC#

# Apache License 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 # # Эгерде колдонуудагы мыйзам тарабынан талап кылынбаса же жазуу жүзүндө макул болбосо, Лицензиянын астында таркатылган программалык камсыздоо "КАПИШТЕРДЕ" НЕГИЗДЕ таркатылат, # КЕПИЛДИКТЕРИ ЖАНА ШАРТТАРЫ ЖОК АР КАНДАЙ, ачык же кыйыр түрдө. # Лицензиянын астындагы белгилүү бир тилди жөнгө салуучу уруксаттарды жана # чектөөлөрдү караңыз. # баштапкы "угуу_ жылан" коду MeArm үчүн Dr H. тарабынан өзгөртүлгөн. '' Нускамалар Менин ишке ашыруумда Google Coral ылдамдаткычы жана Adafruit 16 каналынын servo капоту тиркелген Raspbery Pi 4 колдонулат. MeArm серверлери (MIME индустриялары) капоттун 3, 7, 11 жана 15 портторуна бекитилген. Чоо -жайын билүү үчүн, "Hearing MeArm" инструкциясын карап көрүңүз. Буйруктар: "позициясы x", x = 0ден 9га чейин, түзмөктү алдын ала аныкталган абалга жылдырат. "жылуу/өйдөө", "жылуу/төмөн түшүү", "алдыга/артка бурулуу", "артка/артка бурулуу", "бурулуу/кетүү" жана "оңго/бурулуу" берилген кыймылда жай, баскычтуу кыймылды пайда кылат. багыт, "оюнду токтотуу" кыймылдарды токтотот. "ачык өтмөк" жана "жабуу өтмөгү" кармагычты ачат же жабат. "Видеону баштоо" түзмөктү "позициялар" тизмеси менен аныкталган позициялардын алдын ала коюлган тартибине баш ийүүгө чакырат. "Кокус оюн" кыймылдардын туш келди үлгүсүнө алып келет, "токтотуу оюну" аны аяктайт. "ишке киргизүү оюну" "транспорт1" тизмеси менен алдын ала аныкталган дагы бир катар серияларды баштайт, "кийинки оюн" "транспорт2" менен алдын ала аныкталган тескери операцияны өз тобокелиңизге колдонуңуз. '' '_future_ импорт абсолюттук_импорт _future_ импорт бөлүмү _future_ импорт print_function импорттоо туш келди импорт randint тартып argparse импорт os жыштыгынан импорт randint adafruit_servokit импортунан туш келди импорттоо rvo # каналдардын саны # 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 # кармалоочу жабык vert = 15 # servo порттун саны, servo өйдө/ылдый forw = 11 # servo портунун саны, алдыга/артка жылуучу servo turn = 7 # servo port to turn servo grip = 3 # servo port to grip 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_d, dn_r), (dn_l, dn_r, le_t, md_g)] # 0-9 бүтүн сандар менен көрсөтүлгөн 10 базалык позицияны аныктайт # транспорт процедуралары [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) # "бий"

#moving MeArm to 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]. бурч = макам [2] kit.servo [grip].angle = status [3] print (status) class Controler (object): #Callback функциясы def _init _ (self, q): self._q = q def callback (өзүн, 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 True def on_event (өзүнчө, окуя): if event.type == pygame. QUIT: self._running = False def MeArmPos (өзүн, ачкычтары): # MeArmны алдын ала коюлган позицияларга, ачкыч сөздөргө: "position x" key = int (key) p = позиция [ачкыч] a = p [0] b = p [1] c = p [2] d = p [3] басып чыгаруу ("Позициялар:", баскыч, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "grad": ", ачкыч," сол/оң: ", а,"/", б," даража ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn] len (dnce)) r үчүн диапазондо (sp): #позициялардын бийлөө тартиби, sp кадамдары dc = dnce [r] p = позиция [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) # кыймылдын ылдамдыгын белгилейт time.sleep (0.5) # процедуранын аягында тыныгуу defMeArm1 (өзүн): # MeArm транспортун башкарат 1, ачкыч сөз: "ишке киргизүү оюну" tr1 = transport1 sp = (len (tr1)) (sp) диапазонунда r үчүн кадамдардын санын эсептөө: #каалаган кадамга өтүү 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] кыймылдардын ылдамдыгы time.sleep (0.5) def TransMeArm2 (өзүн өзү): # 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]) def RandomMoves (өзүн өзү): # алдын ала аныкталган позициялардын арасына туш келди секирет, ачкыч сөз: "туш келди оюн" 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 [grip]. бурч = d time.sleep (1) # кыймылдын ылдамдыгын def MoveUp (өзүн өзү) белгилейт: # кичине кадам менен кармагычты көтөрүү u0 = status [0] # учурдагы абалын окуу u1 = u0 + 5 # plus x градус болсо (u1 > up_l): # тесттер мин/максималдуу параметрлерден ашпаса u1 = up_l # антпесе min/max маанисине коюлат.servo [vert].angle = u1 # servo status жылдыруу [0] = u1 # статустун маанисин тууралоону басып чыгаруу (" up ", status) time.sleep (1) # MoveDown (self) ылдамдыгын аныктайт: г 0 = абал [0] d1 = d0 - 5 # минус х градус, эгерде (d1 өйдө_р): f1 = өйдө_р kit.servo [forw].angle = f1 # серво статусун жылдыруу [1] = f1 басып чыгаруу ("алдыга", абал) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 # minus x градус, эгерде (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # servo жылдыруу status [2] = l1 print ("left", status) time.sleep (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x градус болсо (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # servo status жылдыруу [2] = r1 басып чыгаруу ("оңго", абал) time.sleep (0.2) def OpenGrip (өзүнчө): kit.servo [grip].angle = op_g # ачык тутумду "ачык" абалына коюңуз: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # кармоону "жабык" позицияга коюңуз: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (өз алдынча): # эч нерсе кылбайт, бирок кыймылдарды басып чыгарууну токтотот (" токтоо ", абал) time.sleep (0.25) def spotter (өзүнчө, аргалар): кыймылдаткыч = 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 = int (args_sram_) int (args.num_frames_hop)) def on_execute (өзүнчө, аргументтер): эгерде self.on_init () болбосо: self._running = False q = model.get_queue () self._controler = Контролер (q) болбосо, args.debug_keyboard: t = Thread (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) queue. Empty: new_item = new_item жок болсо эч нерсе: item = new_item if (args.debug_keyboard жана ачкычтар [pygame. K_ESCAPE]) же item == "stop": self._running = False # if (args.debug_keyboard and key [pygame. K_SPACE]) же item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) же пункт == "оңго": # оңго бурулуу. MoveRight () if (args.debug_ke yboard жана баскычтар [pygame. K_LEFT]) же пункт == "солго": # солго өзүн -өзү буруңуз. MoveLeft () if (args.debug_keyboard жана баскычтар [pygame. K_UP]) же пункт == "өйдө": self. MoveUp () эгер (args.debug_keyboard жана ачкычтар [pygame. K_DOWN]) же пункт == "ылдый": self. MoveDown () if (args.debug_keyboard жана ачкычтар [pygame. K_B]) же пункт == "b": # артка self. MoveBack () if (args.debug_keyboard жана key [pygame. K_F]) же item == "f": # forwards self. MoveForw () if (args.debug_keyboard and key [pygame. K_O]) or item == "o": # ачык кармоо: self. OpenGrip () if (args.debug_keyboard and key [pygame. K_C]) or item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) же item == "s": # stop motion: "start_game" self. StopMove () if (args.debug_keyboard and key [pygame. K_0]) or item == "0": self. MeArmPos (0) if (args.debug_keyboard жана key [pygame. K_1]) же item == "1": self. MeArmPos (1) if (args.debug_keyboard and key [pygame. K_2]) or item == "2": self. MeArmPos (2) if (args.debug_keyboard жана баскычтар [pygame. K_3]) же em == "3": self. MeArmPos (3) if (args.debug_keyboard and key [pygame. K_4]) or item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) же пункт == "5": self. MeArmPos (5) if (args.debug_keyboard and key [pygame. K_6]) же item == "6": self. MeArmPos (6) if (args.debug_keyboard and баскычтар [pygame. K_7]) же item == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) or item == "8": self. MeArmPos (8) if (args.debug_keyboard жана ачкычтар [pygame. K_9]) же item == "9": self. MeArmPos (9) if (args.debug_keyboard and key [pygame. K_a]) or item == "d": self. DancingMeArm () #dansing MeArm, on "next_game" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. RandomMoves () #random random "random game" if (args.debug_keyboard and keys [pygame. K_j]) же пункт == "j": өзүнчө) # транспорт объектисинин тескери багыты: "next_game" '' 'if (args.debug_keyboard жана ачкычтар [pygame. K_l]) же item == "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 = App () the_app.on_execute (args)

Сунушталууда: