INHOUDSOPGAWE:

A Hearing MeArm, Google Coral TPU -versneller: 3 stappe
A Hearing MeArm, Google Coral TPU -versneller: 3 stappe

Video: A Hearing MeArm, Google Coral TPU -versneller: 3 stappe

Video: A Hearing MeArm, Google Coral TPU -versneller: 3 stappe
Video: Building the MeArm Robotic Arm 2024, Julie
Anonim
A Hearing MeArm, Google Coral TPU -versneller aangedryf
A Hearing MeArm, Google Coral TPU -versneller aangedryf
A Hearing MeArm, Google Coral TPU -versneller aangedryf
A Hearing MeArm, Google Coral TPU -versneller aangedryf
A Hearing MeArm, Google Coral TPU -versneller aangedryf
A Hearing MeArm, Google Coral TPU -versneller aangedryf
A Hearing MeArm, Google Coral TPU -versneller aangedryf
A Hearing MeArm, Google Coral TPU -versneller aangedryf

In die volgende wil ek 'n stembeheerde weergawe van die MeArm beskryf, 'n klein xyz robotarm met 'n grijper. Ek het die MeArm Pi van MIME-nywerhede gebruik, maar die stelsel moet van toepassing wees op enige weergawe van die MeArm, of soortgelyke servo-aangedrewe toestelle.

Deur die Google Coral TPU Accelerator te gebruik, kan u vinnig vanlyn TensorFlow -stemherkenningsskrifte op die Raspberry Pi gebruik, en fisiese toestelle hiermee beheer deur gesproke bevele, met 'n vertraging van minder as een sekonde.

Die apparaat wat hier beskryf word, is 'n kombinasie en uitbreiding van konsepte wat in twee vorige instruksies beskryf is. Dit is 'n uitbreiding van 'n vroeëre implementering van die Google Coral -stembeheer, 'n Jumping Jack, wat hier beskryf word, en 'n groot verbetering van 'n Google AIY -stembeheerde MeArm wat hier beskryf word.

Die stembeheerde MeArm wat die Google Voice AIY-stelsel gebruik, het aanlyn toegang nodig, was nie maklik om te implementeer nie, moes 'n knoppie druk om die luister na stemopdragte te aktiveer en het 'n lang vertragingstyd gehad. Met die gebruikte Google Coral TPU -versneller kan TensorFlowLite -modelle vanlyn met 'n hoë snelheid op 'n Raspberry Pi of ander Linux -toestelle gebruik word. Onder die voorbeelde op die Google Coral Github -bladsy is daar 'n voorbeeld genaamd "gehoorslang" vir 'n stemherkenningstelsel wat 140 sleutelfrases (September 2019) kan verstaan, wat dan gekoppel kan word aan virtuele toetsaanslagen. Deur hierdie "toetsaanslagen" te koppel met die uitvoering van sommige funksies wat in Python geprogrammeer is, is dit moontlik om 'n spraakopdrag -beheerde toestel te bou. Ek het onlangs 'n eerste implementering beskryf, 'n spraakgestuurde elektromeganiese springaansluiting. Die implementering hiervan is 'n bietjie meer ingewikkeld en laat toe om al vier die servo's van die MeArm te beheer om die MeArm deurlopend te laat beweeg of na 'n aantal vooraf gedefinieerde posisies, of om meer ingewikkelde take uit te voer.

Deur die skrif hier as voorbeeld te gebruik, moet dit relatief eenvoudig wees om ander stembeheerde toestelle te bou, bv. robotmotors of hulpmiddeleenhede.

Voorrade

  • MeArm. Hier gebruik: MeArm Pi van MIME Industries
  • Framboos Pi 4
  • Google Coral TPU -versneller
  • Adafruit 16 -kanaals servo -enjinkap
  • 'n paar springkabels
  • opsioneel: kondensator vir servo -enjinkap, ongeveer 400 µF vir 4 servo's (aanbeveel deur Adafruit)
  • 5-6 V kragbron vir servo-enjinkap. Ek het hier 'n ou 6V -laaier gebruik, 'n 4x AA -battery werk ook
  • Mikrofoon. Ek het 'n ou Microsoft HD3000 -webkamera as mikrofoon gebruik.

Stap 1: Die opstel van die stelsel

Die opstel van die stelsel
Die opstel van die stelsel
Die opstel van die stelsel
Die opstel van die stelsel

Laai die vooraf gekonfigureerde Raspian -prent vir die Google Coral TPU Accelerator af vanaf die Google Coral Github -bladsy en installeer dit op 'n µSD -kaart. Die prent bevat ook 'n aantal voorbeeldskrifte. Stel die Pi op soos aangedui.

Installeer die voorbeeld Keyword spotter vanaf die Google Coral GitHub -webwerf, indien nie in die prent nie, en alle vereiste programme. Koppel die mikrofoon aan die Pi. Ek sal aanbeveel om met die voorbeeld "Hearing Snake" te speel om seker te maak dat alles werk.

Laai die Adafruit 16 -kanaal -enjinkapprogrammatuur af en installeer dit, soos hier beskryf. Installeer die enjinkap en speel met die voorbeelde van Adafruit om te verseker dat alles reg werk.

Laai die lêers wat by hierdie instruksies aangeheg is, af en kopieer dit na die gids "Project Keyword Spotter". Die lêer "commands_v1_MeArm.txt" moet na die "config" submap gekopieer word.

Koppel u MeArm se servo's aan op die servo -enjinkap soos aangedui. Ek gebruik poort 15 vir op/af, poort 11 vir vorentoe/agtertoe, poort 7 vir draai en poort 3 vir die gryperservo's.

Binne die script moet u die min/sentrum/maksimum waardes vir elke servo aanpas by u konfigurasie. Hierdie instellings help om skade aan die servo's te voorkom. Miskien moet u ook die ingesluit "posisies", "vervoer1" en "vervoer2" lyste wysig.

Begin die script. Tot dusver het ek dit vanaf die IDE bestuur.

In die geval dat u die sleutelfrases wat 'n sekere funksie oproep, wil verander volgens u behoefte. 'N Volledige lys van beskikbare sleutelprases word gevind in die "labels_gc2 raw.txt" -lêer in die config -submap.

Die stelsel het 'n latensie van ongeveer 1 sekonde, maar hang baie af van watter aksies uitgevoer word. In sommige gevalle moet die sleutelfase herhaal word, akkuraatheid van herkenning is nie altyd 100%nie.

Stap 2: Gebruik die toestel

As alles opgestel en nagegaan is, kan u die toestel gebruik.

'N Huidige beperking is dat 'n gegewe opdrag herhaaldelik uitgevoer word, solank dit nie gestop word nie (met behulp van' stopspel ') of 'n ander bevel gegee word. Komplekse multistap -take, bv. "transport1" (opgeroep deur die frase "launch game") word altyd tot die laaste stap uitgevoer.

Dus, deur 'regs te draai', beweeg die toestel in klein stappe na regs totdat dit stop, of die voorafbepaalde maksimum waarde bereik word. "launch game", "next game" of "start_video" sal 'n reeks bewegings begin wat gedefinieer word deur lyste wat die instelling vir elke servo by 'n gegewe stap bevat. 'ewekansige spel' sal die toestel van die een na die ander stap spring, lukraak uit 'n lys instellings gekies word.

Soos u in die meegaande video kan sien, het ek 'n diabolo -voorwerp van LEGO gebou wat deur die MeArm opgetel kan word en met 'n vooraf gedefinieerde stel bewegings van die een plek na die ander vervoer kan word. U kan u eie funksies definieer deur die 'transport1' of 'transport2' lyste te verander.

Stap 3: Die skrif

Die skrif wat hier gelys word, is 'n wysiging van die voorbeeld "Hearing Snake" van "Project Keyword Spotter". Die voorbeeld is tot 'n minimum beperk, en dan is die deel vir die bestuur van die servo's bygevoeg, gebaseer op die sagteware en voorbeelde van die Adafruit servo -enjinkap.

Die draaiboek is nou nog nie geoptimaliseer nie. Gebruik op eie risiko, verander en optimaliseer gerus.

Benewens die python-skrip is daar die command-file en die gebruikte labels-file. Plaas dit in die config-submap.

Soos voorheen genoem, kan dit nodig wees om verskeie parameters aan te pas om die script vir u spesiale MeArm of 'n ander toestel aan te pas.

# Kopiereg 2019 Google LLC#

# Gelisensieer onder die Apache -lisensie, weergawe 2.0 (die "lisensie"); # u mag hierdie lêer nie gebruik nie, behalwe in ooreenstemming met die lisensie. # U kan 'n afskrif van die lisensie verkry by # # 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 # # Tensy dit vereis word deur die toepaslike wetgewing of skriftelik ooreengekom is, word sagteware # wat onder die lisensie versprei word, versprei op 'n "AS IS" BASIS, # SONDER GARANTIES OF VOORWAARDES VAN ENIGE SOORT, hetsy uitdruklik of stilswyend. # Sien die lisensie vir die spesifieke taal vir toestemmings en # beperkings onder die lisensie. # die oorspronklike "hear_snake" -kode is gewysig vir 'n implementering vir die MeArm deur dr H. '' 'Instruksies My implementering gebruik 'n Raspbery Pi 4 met 'n Google Coral -versneller en 'n Adafruit 16 -kanaals servo -enjinkap aangeheg. Die servo's van 'n MeArm (MIME -nywerhede) is aan poort 3, 7, 11 en 15 van die enjinkap vasgemaak. Kyk na die "Hearing MeArm" instruksies vir meer inligting. Opdragte: "posisie x", x = 0 tot 9, skuif die toestel na 'n gegewe vooraf gedefinieerde posisie. "beweeg/gaan op", "beweeg/gaan af", "gaan/draai vorentoe", "gaan/draai agteruit", "draai/gaan links" en "draai/gaan regs" veroorsaak 'n stadige, stapsgewyse beweging in die gegewe rigting, "stop spel" stop die bewegings. "oop oortjie" en "oortjie sluit" maak die grijper oop of toe. "begin video" roep die toestel op om 'n voorafbepaalde volgorde van posisies te volg, gedefinieer deur die lys 'posisies'. 'ewekansige spel' lei tot 'n ewekansige bewegingspatroon, 'stopspel' eindig. 'launch game' begin 'n ander reeks bewegings wat vooraf gedefinieer is deur die lys 'transport1', 'volgende game', die omgekeerde bewerking wat vooraf gedefinieer is deur 'transport2' Gebruik op eie risiko. '' 'van _future_ invoer absolute_import van _future_ invoerafdeling van _future_ invoer afdrukfunksie invoer argparse invoer os van ewekansige invoer randint van draadinvoer Draad invoer tyd van edgetpu.basic.basic_engine invoer BasicEngine invoer model invoer pygame van pygame.locals invoer * invoer tou van ewekansige invoer randrange van adafruit_servokit invoer ServoKit invoerbord invoer busio invoer adafruit_pca9685 invoertyd i2c = busio. I2C (bord. SCL, bord. SDA) hoed = adafruit_pca9685. PCA9685 (i2c) hoed.frekwensie = 60 kit = ServoKit (kanale = 16) # stel aantal kanale # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, middel en maksimum instellings up_l = 145 # servo op/af: op md_l = 95 dn_l = 45 up_r = 135 # servo vorentoe/agtertoe md_r = 90 dn_r = 50 ri_t = 30 # draai arm regs of links: regter posisie md_t = 90 # draai arm regs of links: middelste posisie le_t = 150 op_g = 65 # gryper oop md_g = 90 # gripper gesentreerde kl _g = 130 # grijper gesluit vert = 15 # aantal servopoort, servo op/af voorwaarts = 11 # aantal servopoort, vorentoe/agteruit bewegende servodraai = 7 # servopoort om servogreep te draai = 3 # servopoort voor greep servo #lys van arminstellings vir nege posisies posisie = [(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, md,), (dn_l, dn_r, le_t, md_g)] # definieer 10 basisposisies, aangedui deur heelgetalle 0-9 # vervoerprosedures [vert/vorentoe/draai/greep] 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)]

dans1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # 'n "dans"

#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 [draai]. hoek = status [2] kit.servo [greep].hoek = status [3] druk (status) klas Beheerder (voorwerp): #Terugroepfunksie def _init _ (self, q): self._q = q def callback (self, 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 (self, gebeurtenis): as event.type == pygame. QUIT: self._running = Valse def MeArmPos (self, sleutels): # dryf MeArm na vooraf ingestelde posisies, sleutelwoorde: "posisie x" sleutel = int (sleutels) p = posisie [sleutel] a = p [0] b = p [1] c = p [2] d = p [3] druk ("Posisies:", sleutel, "vert/voor/draai/greep:", a, "/", b, "/", c, "/", d, "grade") status = [a, b, c, d] # dokumente huidige status druk (status) # sys.stdout.write ("Posisie: ", sleutel," links/regs: ", a,"/", b," graad ") kit.servo [vert].angle = 'n kit.servo [forw].angle = b kit.servo [draai].angle = c kit.servo [greep].angle = d tyd.slaap (0.5) def DancingMeArm (self): # beheer MeArm dance, navraag: "start_video" dnce = dance1 sp = (len (dnce)) vir r in reeks (sp): #dansorde van posisies, sp stappe dc = dnce [r] p = posisie [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = 'n kit.servo [forw].angle = b kit.servo [draai].angle = c kit.servo [greep].angle = d tyd. slaap (1) # stel die snelheid van bewegings in. Slaap (0.5) # breek aan die einde van die prosedure def TransMeArm1 (self): # beheer MeArm transport 1, sleutelwoord: "lanseer spel" tr1 = transport1 sp = (len (tr1)) #bereken die aantal stappe vir r in die reeks (sp): #gaan na enige stap p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = 'n kit.servo [forw].angle = b kit.servo [draai].angle = c kit.servo [greep].angle = d druk (p) time.sleep (1) # stelle bewegingssnelheid time.sleep (0.5) def TransMeArm2 (self): # beheer MeArm dance, navraag: "volgende wedstryd" tr2 = transport2 sp = (len (tr2)) vir r in range (sp): #dansorde van posisies, sp -stappe p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].hoek = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # stel bewegingsnelheid tyd in. slaap (0.5) def RandomMoves (self): # spring lukraak tussen vooraf gedefinieerde posisies, sleutelwoord: "random game" dr = randrange (9) # kies willekeurig 'n posisie p = posisie [dr] # lees posisie parameters 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 [greep].hoek = d tyd. slaap (1) # stel bewegingsnelheid def MoveUp (self): # gryp in klein stappe u0 = status [0] # lees huidige status u1 = u0 + 5 # plus x grade as (u1 > up_l): # toetse indien die min/maksimum parameters nie u1 = up_l # oorskry nie, anders gestel op min/maksimum waarde kit.servo [vert].hoek = u1 # skuif servostatus [0] = u1 # pas statuswaarde afdruk aan (" up ", status) time.sleep (1) # sets speed def MoveDown (self): d 0 = status [0] d1 = d0 - 5 #minus x grade as (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # move servo status [1] = f1 print ("vorentoe", status) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x grade as (b1 le_t): l1 = le_t kit.servo [draai].hoek = l1 # skuif servo status [2] = l1 druk ("links", status) time.sleep (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x grade as (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("regs", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # stel greep in "oop" posisie: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [greep].angle = cl_g # stel greep in "geslote" posisie: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # doen niks, maar stop bewegings druk (" stop ", status) time.sleep (0.25) def spotter (self, args): enjin = BasicEngine (args.model_file) mikrofoon = args.mic as args.mic niks anders is nie (args.mic) model.classify_audio (mikrofoon, enjin, 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_hz), int (args.num_frames_hop)) def on_execute (self, args): if not self.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 terwyl self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () anders: probeer: new_item = q.get (True, 0.1) behalwe queue. Empty: new_item = Geen as new_item nie None is: item = new_item if (args.debug_keyboard en sleutels [pygame. K_ESCAPE]) of item == "stop": self._running = Onwaar # as (args.debug_keyboard en sleutels [pygame. K_SPACE]) of item == "go": # self. MeArmPos (7) # if (args.debug_keyboard en sleutels [pygame. K_RIGHT]) of item == "regs": # draai regs self. MoveRight () as (args.debug_ke yboard en sleutels [pygame. K_LEFT]) of item == "links": # draai self self. MoveLeft () as (args.debug_keyboard en sleutels [pygame. K_UP]) of item == "up": self. MoveUp () if (args.debug_keyboard and keys [pygame. K_DOWN]) or item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) or item == "b": # agteruit self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) or item == "f": # forward self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) or item == "o": # oop greep: self. OpenGrip () as (args.debug_keyboard en sleutels [pygame. K_C]) of item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) of item == "s": # stop beweging: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) or item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys [pygame. K_1]) or item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) or item == "2": self. MeArmPos (2) if (args.debug_keyboard en sleutels [pygame. K_3]) of dit 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_4]) or item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) of item == "5": self. MeArmPos (5) if (args.debug_keyboard en sleutels [pygame. K_6]) of item == "6": self. MeArmPos (6) if (args.debug_keyboard en sleutels [pygame. K_7]) of item == "7": self. MeArmPos (7) if (args.debug_keyboard en sleutels [pygame. K_8]) of item == "8": self. MeArmPos (8) as (args.debug_keyboard and keys [pygame. K_9]) or item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. DancingMeArm () #dancing MeArm, op "next_game" if (args.debug_keyboard en sleutels [pygame. K_r]) of item == "r": self. RandomMoves () #random random "random game" if (args.debug_keyboard and keys [pygame. K_j]) of item == "j": self. TransMeArm1 () # vervoervoorwerp: "lunch_game" as (args.debug_keyboard en sleutels [pygame. K_k]) of item == "k": self. TransMeArm2 () # vervoervoorwerp omgekeerde rigting: "volgende_spel" '' '' as (args.debug_keyboard en sleutels [pygame. K_l]) of item == "l": self. JumpingJack2 (1) #LED knip "target" '' 'time.sleep (0.05) self.on_cleanup () as _name_ ==' _main_ ': ontleder = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Gebruik die sleutelbord om die MeArm te beheer.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Aanbeveel: