Përmbajtje:

Një Jack Hearing Jumping, Google Coral TPU Accelerator Version: 4 Hapa
Një Jack Hearing Jumping, Google Coral TPU Accelerator Version: 4 Hapa

Video: Një Jack Hearing Jumping, Google Coral TPU Accelerator Version: 4 Hapa

Video: Një Jack Hearing Jumping, Google Coral TPU Accelerator Version: 4 Hapa
Video: Has the Philippines gone quiet?😴 🇵🇭 (ISLAND HOPPING) 2024, Korrik
Anonim
Një Jack Hearing Jumping, Versioni i Përshpejtuesit Google Coral TPU
Një Jack Hearing Jumping, Versioni i Përshpejtuesit Google Coral TPU
Një Jack Hearing Jumping, Versioni i Përshpejtuesit Google Coral TPU
Një Jack Hearing Jumping, Versioni i Përshpejtuesit Google Coral TPU
Një Jack Hearing Jumping, Versioni i Përshpejtuesit Google Coral TPU
Një Jack Hearing Jumping, Versioni i Përshpejtuesit Google Coral TPU

Ai lëviz gjymtyrët, dëgjon porositë tuaja, drejtohet nga teknologjia më e fundit e mësimit të makinerisë

"Jack Hearing Jumping" është një Jack i thjeshtë elektromekanik i Kërcimit, i drejtuar nga dy mikro servo dhe një ingranazh shumë i thjeshtë, që ka LED si "sy". Ai kontrollohet nga komanda të thjeshta zanore që tregojnë se cilën nga nëntë pozicionet e paracaktuara do të marrë, ose nëse LED duhet të ndizet ose fiket, ose nëse do të kryejë një "valle" të paracaktuar ose një grup lëvizjesh të rastësishme.

Elementi thelbësor i sistemit është përshpejtuesi Google Coral TPU, i cili ju lejon të ekzekutoni modelet Tensorflow Lite jashtë linje me shpejtësi shumë të madhe, madje edhe në një kompjuter "të dobët" si Raspberry Pi. Kjo lejon p.sh. identifikimi dhe klasifikimi i shpejtë i objekteve duke përdorur kamerën RPi, por edhe për të drejtuar funksionet e njohjes së zërit të bazuar në mësimin e makinerisë në vend.

Në dijeninë time ky është shembulli i parë i botuar për një pajisje DIY fizike të nxitur nga zbulimi i zërit Coral, dhe shembulli i kodit të bashkangjitur mund të përdoret gjithashtu për projekte të tjera, më komplekse.

Kontrolli i zërit bazohet në shembullin "gjarpri i dëgjimit" në "vëzhguesin e fjalëve kyçe të projektit" (https://github.com/google-coral/project-keyword-spotter) i cili kohët e fundit (shtator 2019) u vendos në GitHub. Në konfigurimin tim, sistemi përbëhet nga një Raspberry Pi 4 e pajisur me një kapak servo Adafruit 16 kanal, një përshpejtues Google Coral TPU dhe një kamer në internet, e përdorur këtu si mikrofon. Jack Jumping ishte përshkruar më parë në një udhëzues të mëparshëm, ku u nxit nga kompleti i Google Voice për të lexuar komandat zanore, i është bashkangjitur Servo Bonnet në versionin 2.0 të përshkruar në vijim.

Versioni i mëparshëm i Google Voice Kit kishte tre kufizime qendrore: varej nga shërbimet e njohjes së zërit të bazuara në ueb të Google dhe konfigurimi ishte relativisht i komplikuar, kërkohej të shtypte një lloj butoni para se të jepnit një komandë dhe pati një vonesë serioze midis thënies së komandës dhe përgjigjes së sistemit. Përdorimi i përshpejtuesit Google Coral zvogëlon kohën e përgjigjes në sekonda, është i pavarur nga një lidhje interneti dhe po dëgjon gjatë gjithë kohës. Me disa modifikime ju mund ta përdorni atë për të kontrolluar pajisjet shumë më komplekse si një Jumping Jack, si robotë ose makina, ose gjithçka që mund të ndërtoni dhe kontrolloni me një Raspberry Pi.

Në versionin e tij aktual, Fjalë kyçe Spotter kupton një grup prej rreth 140 fjalësh kyçe/fraza kyçe, të përcaktuara në skedarin model shoqërues ("voice_commands_v0.7_egetpu.tflite") dhe të përshkruara në një skedar të veçantë etiketash ("labels_gc2.raw.txt") Me Të përcaktuara nga një skedar i modifikueshëm lirshëm ("commands_v2_hampelmann.txt"), fjalët kyçe të përdorura në mënyrë specifike nga skenari ynë, më pas hartohen në goditjet e tastit në një tastierë virtuale, p.sh. për shkronja, numra, lart/poshtë/majtas/djathtas, crtl+c, etj.

Pastaj, p.sh. duke përdorur çelësin pygame, këto "goditje çelësash" lexohen dhe përdoren për të kontrolluar se cilat veprime do të kryejë një pajisje, këtu kapaku i kërcimit. Në rastin tonë, kjo do të thotë të çosh dy servos në pozicione të paracaktuara, ose të ndezësh ose fikësh LED -të. Ndërsa vërejtësi i fjalëve kyçe funksionon në një hap të veçantë, ai mund të dëgjojë përgjithmonë porositë tuaja.

Versioni 21 shtator 2019

Furnizimet

Raspberry Pi 4, nëpërmjet Pimoroni

Google Coral TPU Accelerator, nëpërmjet Mouser Germany, 72 €

Adafruit 16 Servo Bonnet, nëpërmjet Pimoroni, rreth 10 €

www.adafruit.com/product/3416

learn.adafruit.com/adafruit-16-channel-pwm…

Koka e grumbullimit (nëse kërkohet)

www.adafruit.com/product/2223

Paketë baterie 4x AA (ose burim tjetër energjie 5-6V) për Servo Bonnet

Webcam e vjetër, si mikrofon

Servo drejtoi Jumping Jack, siç përshkruhet në një udhëzues të mëparshëm. Vizatimet e paraqitjes i bashkëngjiten hapit tjetër, por mund të kërkojnë rregullime.

Pjesët e kërkuara për Jack Jumping:

- Pllakë Forex 3 mm

- 2 mikro servo

- vida dhe arra 2 dhe 3 mm

- 2 LED të bardhë dhe një rezistencë

- pak kabllo

Hapi 1: Vendosja e pajisjes

Vendosja e Pajisjes
Vendosja e Pajisjes
Vendosja e Pajisjes
Vendosja e Pajisjes
Vendosja e Pajisjes
Vendosja e Pajisjes

Për të ndërtuar Jack Jumping, ju lutemi ndiqni indikacionet e dhëna në një udhëzues të mëparshëm. Kam përdorur Forex për prototipin tim, por ju mund të përdorni pllaka akrilike ose kompensatë të prera me lazer. Mund t'ju duhet të rregulloni paraqitjen sipas madhësisë së servos tuaj etj. Testoni nëse gjymtyrët dhe ingranazhet mund të lëvizin pa fërkime.

Vendosni Raspberry Pi tuaj. Në faqen Coral Github, ekziston një imazh Raspian që përmban gjithçka që kërkohet për të drejtuar përshpejtuesin Coral në Pi dhe përmban shumë projekte, me të gjitha cilësimet tashmë në vend.

Merrni vëzhguesin e fjalëve kyçe të projektit nga faqja Google Coral GitHub. Instaloni të gjithë programet e kërkuar siç tregohet.

Instaloni skedarët e dhënë. Vendoseni skriptin python të kërcimit në dosjen e projektit me fjalë kyçe të projektit dhe skedarin e komandave përkatëse në nën -dosjen e konfigurimit.

Bashkangjitni Adafruit Servo Bonnet në Pi. Ndërsa jam duke përdorur një strehë RPI me një ventilator, më duhej të përdor stickers GPIO (p.sh. të disponueshme nga Pimoroni) për të mundësuar lidhjen. Instaloni të gjitha bibliotekat e kërkuara, siç tregohet në udhëzimet e Adafruit për kapakun servo.

Bashkangjitni një burim energjie 5-6V në kapakun servo. Bashkangjit servos dhe LED. Në rastin tim, kam përdorur portin 0 për LED dhe portet 11 dhe 15 për servos.

Për të kontrolluar gjithçka, unë do të rekomandoja që së pari të provoni shembullin e fjalës kyçe të projektit "dëgjimi i gjarprit" dhe shembujt e kapakut të servisit Adafruit.

Hapi 2: Drejtimi i Xhaketës së Kërcimit

Nëse të gjitha pjesët janë ngritur dhe funksionojnë, përpiquni ta përdorni. Mund ta ekzekutoni skriptin në IDE ose nga rreshti i komandës.

Thirrja "pozicioni 0" në "pozicionin 9" do të evokojë Xhekun e Kërcimit për të marrë një nga pozicionet e paracaktuara. Përcaktova "1" si të dy krahët lart (uu), "3" si majtas lart, djathtas poshtë (ud), "9" si të dy krahët poshtë (dd) dhe "5" si të dy krahët në qendër (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" është identik me "5". "3" dhe "8" nuk njihen shumë mirë nga vëzhguesi i fjalëve kyçe dhe mund të duhet të përsëriten.

Ju mund të keni nevojë të rregulloni vlerat minimale dhe maksimale për secilën servo/anë në mënyrë që servos të mos bllokohen dhe më pas të tërheqin shumë energji.

"loja tjetër" do të fillojë "vallëzimin", domethënë një sekuencë të përcaktuar pozicionesh, ndërsa "loja e rastësishme" do të fillojë Jumping Jack për të kryer një sekuencë të rastësishme lëvizjesh. Në të dy rastet ato do të funksionojnë përgjithmonë, kështu që mund t'ju duhet të ndaloni lëvizjet, p.sh. me një komandë "pozicioni zero".

"Ndalo lojën" do të evokojë një "ctrl + c" dhe do të ndalojë procesin.

"ndizni" dhe "fikni" mund të përdoren ndizni dhe fikni LED -të.

Me modifikimin e kohës.vlerat e gjumit ju mund të rregulloni shpejtësinë e lëvizjeve.

Hapi 3: Kodi dhe Skedari i Komandave

Kodi i paraqitur këtu është një modifikim i kodit të "gjarprit të dëgjuar" që është pjesë e paketës së projektit me fjalë kyçe të projektit. Unë thjesht hoqa gjithçka që nuk ishte e nevojshme për aplikimin tim, pa ndonjë kuptim të vërtetë të detajeve. Çdo përmirësim është i mirëpritur.

Unë pastaj shtova pjesët e kërkuara për Adafruit Servo Bonnet, bazuar në skedarët e tyre të shembullit.

Dua të falënderoj programuesit e të dyja pjesëve.

Kodi mund të gjendet i bashkangjitur si skedar. Përdoreni atë për rreziqet tuaja, modifikojeni, përmirësojeni, luani me të.

# E drejta e autorit 2019 Google LLC

# # Licencuar sipas Licencës Apache, Versioni 2.0 ("Licenca"); # ju nuk mund ta përdorni këtë skedar përveç në përputhje me Licencën. # Ju mund të merrni një kopje të Licencës në # # https://www.apache.org/licenses/LICENSE-2.0 # # Nëse nuk kërkohet nga ligji në fuqi ose nuk është rënë dakord me shkrim, softueri # i shpërndarë sipas Licencës shpërndahet në një BAZA "SI ISSHT", # PA GARANCI APO KUSHTET E ÇDO LLOJI, qofshin ato të shprehura ose të nënkuptuara. # Shihni Licencën për gjuhën specifike që qeveris lejet dhe # kufizimet sipas Licencës. nga _future_ import absolut_import nga _future_ import ndarje nga _future_ import print_function import import argparse import os from random import randint from threading import Koha e importimit të fijes nga edgetpu.basic.basic.engine import BasicEngine model import import pygame nga pygame.locals import * import queue from import import random randrange nga adafruit_servokit import ServoKit bordi i importit import busio import adafruit_pca9685 koha e importit i2c = busio. I2C (bordi. SCL, bordi. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frekuenca = 60 kit = ServoKit (kanalet = 16) # numrin e caktuar i kanaleve #kit.servo [0].aktivizimi_rang = 160 #kit.servo [0].zakoni_pulse_width_range (1000, 2000) #cilësimet lart, mes dhe poshtë për krahët e majtë dhe të djathtë lart_l = 35 md_l = 90 dn_l = 160 lart_r = 160 md_r = 90 dn_r = 35

lft = 15 # numri i portit servo, servo e majtë (0-8)

rgt = 11 # numri i portit servo, servo e djathtë (0-8) led_channel_0 = hat.channels [0] # LED i vendosur në port 0 led_channel_0.duty_cycle = 0 # ndez LED 100% # listë të cilësimeve të krahut për pozicionin e nëntë pozicioneve = [(md_l, md_r), (up_l, up_r), (up_l, md_r), (up_l, dn_r), (md_l, up_r), (md_l, md_r), (md_l, dn_r), (dn_l, up_r), (dn_l, md_r), (dn_l, dn_r)] # përcakton 9 pozicione të JumpingJack, të treguara me numra të plotë 0-9 valle1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # një klasë "vallëzimi" Kontrolluesi (objekti): # Funksioni i kthimit def _init _ (vetja, q): vetja., komandë): self._q.put (komandë) klasa Aplikacioni: def _init _ (vetja): self._running = E vërtetë def on_init (vetja): pygame.init () self.game_started = Vërtetë veta._running = Kthimi i vërtetë Def i vërtetë on_event (vetvetja, ngjarja): nëse event.type == pygame. QUIT: self._running = Def defse JumpingJack0 (vetja, çelësat): # kontrollet Jumping Jack, fjalë kyçe: "position x" key = int (çelësat) p = pozicion [çelësi] a = p [0] b = p [1] print ("Pozicioni:", çelësi, "majtas /djathtas: ", a,"/", b," gradë ") # sys.stdout.write (" Pozicioni: ", çelësi," majtas/djathtas: ", a,"/", b," shkallë ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (vetja): # kontrollet duke kërcyer Jack valle, fjala kyçe: "loja tjetër" dnce = valle1 sp = (len (dnce)) për r në rang (sp): # rendi i vallëzimit të pozicioneve, hapat sp dc = dnce [r] nëse (dc jo në rang (10)): # print ("gabimi i hyrjes në pozicion", sp) dc = 4 p = pozicioni [dc] a = p [0] b = p [1] kit.servo [lft].ango = a kit.servo [rgt].ango = b kohë.fjetje (0.25) # vendos shpejtësi e lëvizjeve def JumpingJack2 (vetë, çelësa): # kontrolle Jumping Jack LED, fjalë kyçe: "ndez/fik" led = int (çelësat) nëse udhëheq == 1: led_channel_0.duty_cycle = 0xffff # ndez LED 100% kohë.fjetur (0.1) nëse udhëheq == 0: led_channel_0.duty_cycle = 0 # fik kohën LED. Gjumë (0.1) nëse udhëheq = 2: # blink led_channel_0.duty_cycle = 0xffff # ndez LED 100% kohë. Gjumë (0.5) led_channel_0.duty_cycle = 0 #ndez LED 100% kohë. gjumë (0.5) led_channel_0.duty_cycle = 0xffff #ndez LED 100% kohë. gjumë (0.5) led_channel_0.duty_cycle = 0 #ndez LED 100% kohë. gjumë (0.5) led_channel_0.duty_cycle = 0xffff #ndez LED 100% kohë. gjumë (0.1) def JumpingJack3 (vetë): # kontrollet Jumping Jack dance, fjala kyçe: "lojë e rastësishme" # për h në rang (10): dr = randrange (9) p = pozicioni [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # përcakton shpejtësinë e lëvizjeve def spotter (vetë, args): motor = BasicEngine (args.model_file) mic = args.mic nëse args.mic nuk është askush tjetër int (args.mic) model.classify_audio (mikrofoni, motori, etiketat_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v2_hampelmann.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_hz), num_frames_hop = int (args.num_frames_hop))

def on_execute (vetë, args):

nëse jo self.on_init (): self._running = False q = model.get_queue () self._controler = Kontrolluesi (q) nëse jo args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = E vërtetë t.filloni () artikullin = -1 ndërsa vetë._running: pygame.event.pump () nëse args.debug_keyboard: keys = pygame.key.get_pressed () tjetër: provoni: new_item = q.get (E vërtetë, 0.1) përveç radhës. E zbrazët: new_item = Asnjë nëse new_item nuk është Asnjë: item = new_item if (args.debug_keyboard dhe çelësat [pygame. K_ESCAPE]) ose artikulli == "stop": self._running = False # nëse (args.debug_keyboard dhe çelësat [pygame. K_SPACE]) ose artikulli == "shko": # self. JumpingJack0 (7) # if (args.debug_keyboard dhe çelësat [pygame. K_RIGHT]) ose artikulli == "djathtas": vetja. JumpingJack0 (6) nëse (args.debug_keyboard dhe çelësat [pygame. K_LEFT]) ose artikulli == "majtas": vetë. JumpingJack0 (4) nëse (args.debug_keyboard dhe çelësat [pygame. K_UP]) ose artikulli == " lart ": self. JumpingJack0 (1) nëse (args.debug_keyboard dhe çelësat [pygame. K_DOWN]) ose artikulli ==" poshtë ": self. JumpingJack0 (9) nëse (args.debug_keyboard dhe çelësat [pygam e. K_0]) ose artikulli == "0": self. JumpingJack0 (0) nëse (args.debug_keyboard dhe çelësat [pygame. K_1]) ose artikulli == "1": self. JumpingJack0 (1) nëse (args. debug_keyboard dhe çelësat [pygame. K_2]) ose artikulli == "2": vetë. JumpingJack0 (2) nëse (args.debug_keyboard dhe çelësat [pygame. K_3]) ose artikulli == "3": vetë. JumpingJack0 (3) nëse (args.debug_keyboard dhe çelësat [pygame. K_4]) ose artikulli == "4": self. JumpingJack0 (4) nëse (args.debug_keyboard dhe çelësat [pygame. K_5]) ose artikulli == "5": vetja. JumpingJack0 (5) nëse (args.debug_keyboard dhe çelësat [pygame. K_6]) ose artikulli == "6": vetë. JumpingJack0 (6) nëse (args.debug_keyboard dhe çelësat [pygame. K_7]) ose artikulli == "7 ": self. JumpingJack0 (7) nëse (args.debug_keyboard dhe çelësat [pygame. K_8]) ose artikulli ==" 8 ": self. JumpingJack0 (8) nëse (args.debug_keyboard dhe çelësat [pygame. K_9]) ose artikulli == "9": self. JumpingJack0 (9) nëse (args.debug_keyboard dhe çelësat [pygame. K_a]) ose artikulli == "d": self. JumpingJack1 () #dancing Jack, në "next_game" nëse (args. debug_keyboard dhe çelësat [pygame. K_j]) ose artikulli == "j": vetë. JumpingJack2 (0) #LED on, ON " switch_on "if (args.debug_keyboard dhe çelësat [pygame. K_k]) ose artikulli ==" k ": self. JumpingJack2 (1) #LED off, on" swithch off "nëse (args.debug_keyboard dhe çelësat [pygame. K_l]) ose artikulli == "l": vetë. JumpingJack2 (1) #LED blink "target" nëse (args.debug_keyboard dhe çelësat [pygame. K_r]) ose artikulli == "r": self. JumpingJack3 () #valle e rastësishme "lojë e rastësishme" time.sleep (0.05) self.on_cleanup () nëse _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Përdorni tastierën për të kontrolluar JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Ekziston edhe skedari i konfigurimit të komandës "commands_v2_hampelmann.txt". Ndryshoni si të doni. Shtë vetëm një listë e kombinimeve "komandë, çelës, (forcë,)", bazuar në skedarin e etiketës.

pozicioni_zero, 0, pozicioni_një, 1, pozicioni_dytë, 2, pozicioni_tretë, 3, pozicioni_katër, 4, pozicioni_pesë, 5, pozicioni_gjashtë, 6, pozicioni_shtatë, pozita_tetë, 8, pozicioni_nëntë, 9, lëvizje -lart, lart, go_up, lart, lëvizje_poshtë, poshtë, zbritje, poshtë, lëviz_prapa, majtas, lëviz_para, djathtas, shko_prapsht, majtas, shko_përpara, djathtas, 0,8 shënjestër, l, hesht, z, po, y, jo, n, switch_on, j, switch_off, k, volum_up, lart, volum_down, poshtë, next_game, d, game_ random, r, start_game, s, stop_game, ctrl+c,

Hapi 4: Ide të Mëtejshme dhe Shembuj të tjerë

Quiteshtë shumë e qartë se ky cilësim mund të përdoret gjithashtu për të kontrolluar robotët ose pajisjet e tjera. Në thelb gjithçka që mund të kontrollohet nga një Raspberry Pi.

Unë jam duke punuar në një zgjerim të skenarit për të drejtuar një MeArm, dhe shpresoj të jem në gjendje ta paraqes këtë në Tetor 2019.

Po mendoj gjithashtu të përdor Jumping Jack si një semafor, dhe të përdor programin "project posenet" për njohjen e pozicionit të gjymtyrëve si një mjet për të lexuar pozicionet e Jumping Jack dhe për ta përkthyer atë përsëri në një numër. Në këtë mënyrë mund të komunikojë edhe tekstin, duke pasur parasysh pozicionet 2x 8 mund të tregojnë 64 numra të ndryshëm, më shumë se të mjaftueshëm për alfabetin, numrat dhe shenjat. Kjo mund të mundësojë, ndërsa është modifikuar pak, një realizim fizik për IETF të propozuar "Transmetimi i të Dhënave të IP mbi Sistemin e Sinjalizimit të Flamurit Semafor (SFSS)" (https://tools.ietf.org/html/rfc4824).

Por kjo do të jetë një tjetër udhëzuese. Dhe, pasi eksperimentet e para treguan se foleja e kërcimit do të ketë nevojë për modifikime të rëndësishme para se të njihet si njeri nga sistemi AI mund të kërkojë ca kohë.

Unë do të doja të tërhiqja vëmendjen tuaj në udhëzimet e mëposhtme: Objekt-Gjetja-Personal-Ndihmës-Robot-Ft-Mjedër, ku përshkruhet një robot që gjen objekt duke përdorur një kombinim të një Raspberry Pi dhe Google Coral TPU.

Recommended: