Inhoudsopgave:

A Hearing MeArm, Google Coral TPU Accelerator Driven - Ajarnpa
A Hearing MeArm, Google Coral TPU Accelerator Driven - Ajarnpa

Video: A Hearing MeArm, Google Coral TPU Accelerator Driven - Ajarnpa

Video: A Hearing MeArm, Google Coral TPU Accelerator Driven - Ajarnpa
Video: MeArm Kickstarter - late night, sick and tired, and out of focus... 2024, Juli-
Anonim
Een horende MeArm, Google Coral TPU Accelerator Driven
Een horende MeArm, Google Coral TPU Accelerator Driven
Een horende MeArm, Google Coral TPU Accelerator Driven
Een horende MeArm, Google Coral TPU Accelerator Driven
Een horende MeArm, Google Coral TPU Accelerator Driven
Een horende MeArm, Google Coral TPU Accelerator Driven
Een horende MeArm, Google Coral TPU Accelerator Driven
Een horende MeArm, Google Coral TPU Accelerator Driven

Hieronder wil ik een spraakgestuurde versie van de MeArm beschrijven, een kleine xyz robotarm met een grijper. Ik heb de MeArm Pi van MIME-industrieën gebruikt, maar het systeem zou van toepassing moeten zijn op elke versie van de MeArm of soortgelijke servo-aangedreven apparaten.

Het gebruik van de Google Coral TPU Accelerator maakt het mogelijk om snelle offline TensorFlow-spraakherkenningsscripts op de Raspberry Pi uit te voeren en hierbij fysieke apparaten te bedienen door gesproken opdrachten, met een latentie van minder dan een seconde.

Het hierin beschreven apparaat is een combinatie en uitbreiding van concepten die zijn beschreven in twee eerdere instructables. Het is een uitbreiding van een eerdere implementatie van de Google Coral spraakbesturing, een Jumping Jack, die hier wordt beschreven en een enorme verbetering van een Google AIY spraakgestuurde MeArm die hier wordt beschreven.

De spraakgestuurde MeArm met het Google Voice AIY-systeem vereiste online toegang, was niet eenvoudig te implementeren, moest op een knop drukken om het luisteren naar spraakopdrachten te activeren en had een lange latentietijd. De Google Coral TPU Accelerator die wordt gebruikt, maakt het nu mogelijk om TensorFlowLite-modellen met hoge snelheid offline uit te voeren op een Raspberry Pi of andere Linux-apparaten. Onder de voorbeelden op de Google Coral Github-pagina is er een voorbeeld genaamd "hearing snake" voor een spraakherkenningssysteem dat 140 sleutelzinnen kan begrijpen (september 2019), die vervolgens worden toegewezen aan virtuele toetsaanslagen. Door deze "toetsaanslagen" te koppelen aan het uitvoeren van enkele functies die in Python zijn geprogrammeerd, is het mogelijk om een apparaat met spraakbediening te bouwen. Ik had onlangs een eerste implementatie beschreven, een spraakgestuurde elektromechanische springaansluiting. De implementatie hierin is wat complexer en maakt het mogelijk om alle vier de servo's van de MeArm te besturen om de MeArm continu te verplaatsen of naar een aantal vooraf gedefinieerde functies of om complexere taken uit te voeren.

Met het hier gegeven script als voorbeeld, zou het relatief eenvoudig moeten zijn om andere spraakgestuurde apparaten te bouwen, b.v. robotauto's of ondersteunende technologie-eenheden.

Benodigdheden

  • MeArm. Hier gebruikt: MeArm Pi van MIME Industries
  • Raspberry Pi 4
  • Google Coral TPU-versneller
  • Adafruit 16 kanaals servo motorkap
  • sommige startkabels
  • optioneel: condensator voor servomotorkap, ongeveer 400 µF voor 4 servo's (aanbevolen door Adafruit)
  • 5-6 V stroombron voor servomotorkap. Ik gebruikte hier een oude 6V-oplader, een 4x AA-batterijpakket werkt ook
  • Microfoon. Ik gebruikte een oude Microsoft HD3000 webcam als microfoon.

Stap 1: Het systeem instellen

Het systeem instellen
Het systeem instellen
Het systeem instellen
Het systeem instellen

Download de vooraf geconfigureerde Raspian-afbeelding voor de Google Coral TPU Accelerator van de Google Coral Github-pagina en installeer deze op een µSD-kaart. De afbeelding bevat ook een aantal voorbeeldscripts. Stel de Pi in zoals aangegeven.

Installeer het voorbeeld Keyword spotter van de Google Coral GitHub-site, indien niet opgenomen in de afbeelding, en alle vereiste programma's. Bevestig de microfoon aan de Pi. Ik zou aanraden om met het voorbeeld "Hearing Snake" te spelen om er zeker van te zijn dat alles werkt.

Download en installeer de Adafruit 16-kanaals motorkapsoftware, zoals hier beschreven. Installeer de motorkap en speel met de Adafruit-voorbeelden om ervoor te zorgen dat alles goed werkt.

Download de bestanden die bij deze instructable zijn gevoegd en kopieer ze naar de map "Project Keyword Spotter". Het bestand "commands_v1_MeArm.txt" moet worden gekopieerd naar de submap "config".

Sluit de servo's van uw MeArm aan op de servokap zoals aangegeven. Ik gebruikte poort 15 voor omhoog/omlaag, poort 11 voor vooruit/achteruit, poort 7 voor draaien en poort 3 voor de grijperservo's.

Binnen het script moet u mogelijk de min/center/max-waarden voor elke servo aanpassen aan uw configuratie. Deze instellingen helpen schade aan de servo's te voorkomen. Mogelijk moet u ook de meegeleverde "posities", "transport1" en "transport2" lijsten wijzigen.

Voer het script uit. Tot nu toe had ik het uitgevoerd vanuit de IDE.

Als u de sleutelzinnen die een bepaalde functie oproepen, wilt wijzigen volgens uw behoefte. Een volledige lijst met beschikbare sleutelzinnen vindt u in het bestand "labels_gc2 raw.txt" in de submap config.

Het systeem heeft een latentietijd van ongeveer 1 seconde, maar hangt sterk af van welke acties worden uitgevoerd. In sommige gevallen moet de sleutelfase worden herhaald, nauwkeurigheid van herkenning is niet altijd 100%.

Stap 2: Het apparaat gebruiken

Als alles is ingesteld en gecontroleerd, kunt u het apparaat gebruiken.

Een huidige beperking is dat een bepaald bevel herhaaldelijk wordt uitgevoerd zolang het niet wordt gestopt (met behulp van "stop spel") of een ander bevel wordt gegeven. Complexe meerstapstaken, b.v. "transport1" (opgeroepen door de uitdrukking "startspel") worden altijd uitgevoerd tot de laatste stap.

Dus door "rechts draaien" zal het apparaat in kleine stappen naar rechts bewegen totdat het stopt, of de vooraf ingestelde maximale waarde is bereikt. "launch game", "next game" of "start_video" zal een reeks zetten starten die worden gedefinieerd door lijsten met de instelling voor elke servo bij een bepaalde stap. "willekeurig spel" zal het apparaat van de ene naar de andere stap springen, willekeurig gekozen uit een lijst met instellingen.

Zoals je in de begeleidende video kunt zien, had ik een diabolovormig object van LEGO gebouwd dat door de MeArm kan worden opgepakt en met een vooraf gedefinieerde reeks bewegingen van de ene naar de andere locatie kan worden vervoerd. U kunt uw eigen functies definiëren door de lijsten 'transport1' of 'transport2' te wijzigen.

Stap 3: Het script

Het hier vermelde script is een wijziging van het voorbeeld "Hearing Snake" van "Project Keyword Spotter". Het voorbeeld is uitgekleed tot een minimum, daarna is het onderdeel voor het aandrijven van de servo's toegevoegd, op basis van de software en voorbeelden die voor de Adafruit-servomotorkap zijn geleverd.

Het script is nog niet geoptimaliseerd. Gebruik op eigen risico, voel je vrij om te wijzigen en te optimaliseren.

Naast het python-script is er het commands-bestand en het gebruikte labels-bestand. Plaats het in de config-submap.

Zoals eerder vermeld, kunnen verschillende aanpassingen van parameters nodig zijn om het script aan te passen aan uw speciale MeArm of een ander apparaat.

# Copyright 2019 Google LLC#

# Gelicentieerd onder de Apache-licentie, versie 2.0 (de "licentie"); # u mag dit bestand alleen gebruiken in overeenstemming met de licentie. # U kunt een kopie van de Licentie verkrijgen op # # 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 # # Tenzij vereist door de toepasselijke wetgeving of schriftelijk overeengekomen, wordt software # gedistribueerd onder de Licentie gedistribueerd op een "AS IS" BASIS, # ZONDER GARANTIES OF VOORWAARDEN VAN ELKE SOORT, expliciet of impliciet. # Zie de Licentie voor de specifieke taal die machtigingen en # beperkingen onder de Licentie regelt. # de originele "hearing_snake"-code is aangepast voor een implementatie voor de MeArm door Dr. H. ''' Instructies Mijn implementatie gebruikt een Raspbery Pi 4 met een Google Coral-versneller en een Adafruit 16-kanaals servomotorkap. De servo's van een MeArm (MIME-industrieën) waren bevestigd aan poorten 3, 7, 11 en 15 van de motorkap. Voor meer informatie neem een kijkje op de "Hearing MeArm" Instructable. Commando's: "positie x", x= 0 tot 9, verplaatst het apparaat naar een vooraf bepaalde positie. "verplaats/ga omhoog", "beweeg/ga omlaag", "ga/draai vooruit", "ga/draai achteruit", "draai/ga naar links" en "draai/ga naar rechts" roepen een langzame, stapsgewijze beweging op in de gegeven richting, "stop game" stopt de bewegingen. "open tab" en "close tab" opent of sluit de grijper. "start video" roept het apparaat op om een vooraf ingestelde volgorde van posities te volgen, gedefinieerd door de lijst 'posities'. "random game" resulteert in een willekeurig bewegingspatroon, "stop game" maakt er een einde aan. "start spel" start een andere reeks zetten vooraf gedefinieerd door de lijst 'transport1', "volgende spel" de omgekeerde bewerking vooraf gedefinieerd door 'transport2'. Gebruik op eigen risico. ''' uit _future_ import absolute_import uit _future_ import divisie uit _future_ import print_function import argparse import os uit willekeurige import randint uit threading import Thread import tijd uit edgetpu.basic.basic_engine import BasicEngine import model import pygame uit pygame.locals import * import wachtrij uit willekeurige importrandrange van 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(channels=16) # aantal kanalen instellen #kit.servo[0].actuation_range = 160 #kit.servo[0].set_pulse_width_range(1000, 2000) # min, center en max instellingen up_l = 145 # servo up/down: up md_l = 95 dn_l = 45 up_r = 135 # servo vooruit/achteruit md_r = 90 dn_r = 50 ri_t = 30 # draaiarm rechts of links: rechterpositie md_t = 90 # draaiarm rechts of links: middenpositie le_t = 150 op_g = 65 # grijper open md_g = 90 # grijper gecentreerd cl _g = 130 # grijper gesloten vert = 15 # aantal servopoorten, servo omhoog/omlaag forw = 11 # aantal servopoorten, vooruit/achteruit bewegende servodraai = 7 # servopoort voor draaien servogreep = 3 # servopoort voor handgreep servo #lijst met arminstellingen voor negen posities positie = [(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, md_t, md_r,), (dn_l, dn_r, le_t, md_g)] # definieert 10 basisposities, aangegeven door gehele getallen 0-9 # transportprocedures [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)]

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

#moving MeArm naar nulpositie status =[md_l, md_r, md_t, md_g] kit.servo[vert].angle = status[0] kit.servo[forw].angle = status[1] kit.servo[turn]. angle = status[2] kit.servo[grip].angle = status[3] print (status) class Controler(object): #Callback function 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, event): if event.type == pygame. QUIT: self._running = False def MeArmPos(self, keys): # drijft MeArm naar vooraf ingestelde posities, trefwoorden: "position x" key = int(keys) p = position[key] a = p[0] b = p[1] c = p[2] d = p[3] print ("Posities: ", key, " vert/forw/turn/grip: ", a, "/", b, "/", c, "/", d, "graden") status = [a, b, c, d] # documenten huidige status print (status) # sys.stdout.write("Positie: ", 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.sleep(0.5) def DancingMeArm(self): # controls MeArm dance, trefwoord: "start_video" dnce = dance1 sp=(len(dnce)) voor r binnen bereik (sp): #dansvolgorde van posities, sp stappen dc = dnce[r] p = positie[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) # stelt snelheid van bewegingen in time.sleep(0.5) # pauze aan het einde van procedure def TransMeArm1(self): # bestuurt MeArm transport 1, trefwoord: "start game" tr1 = transport1 sp=(len(tr1)) #bereken het aantal stappen voor r binnen bereik (sp): #ga naar een willekeurige stap 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.sleep(1) # sets snelheid van bewegingen time.sleep(0.5) def TransMeArm2(self): # controls MeArm dance, keyword: "next game" tr2 = transport2 sp=(len(tr2)) for r in range (sp): #dansvolgorde van posities, sp stappen 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) # stelt snelheid van bewegingen in time.sleep(0.5) def RandomMoves(self): # springt willekeurig tussen vooraf gedefinieerde posities, trefwoord: "willekeurig spel" dr= randrange (9) #selecteert willekeurig een positie p = positie[dr] # leest positieparameters 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) # stelt snelheid van bewegingen in def MoveUp(self): # hijsgrijper in kleine stappen u0 = status[0] # lees huidige status u1 = u0 + 5 # plus x graden als (u1 > up_l): # test als de min/max parameters niet worden overschreden u1 = up_l # anders ingesteld op min/max waarde kit.servo[vert].angle = u1 # move servo status[0] = u1 # wijzig statuswaarde print (" up ", status) time.sleep (1) # sets velocity def MoveDown(self): d 0 = status[0] d1 = d0 - 5 #min x graden if (d1 up_r): f1 = up_r kit.servo[forw].angle = f1 # move servo status[1] = f1 print ("forward", status) time.sleep (1) def MoveBack(self): b0 = status[1] b1 = b0 - 5 #min x graden if (b1 le_t): l1 = le_t kit.servo[turn].angle = l1 # move servo status[2] = l1 print ("links", status) time.sleep (0.2) def MoveRight(self): r0 = status[2] r1 = r0 - 2 #min x graden if (r1 < ri_t): r1 = ri_t kit.servo[turn].angle = r1 # move servo status[2] = r1 print ("right", status) time.sleep (0.2) def OpenGrip(self): kit.servo[grip].angle = op_g # zet grip op "open" positie: "open_tab" time.sleep(0.5) status[3] = op_g def CloseGrip(self): kit.servo[grip].angle = cl_g # zet grip op "closed" positie: " close_tab" time.sleep(0.5) status[3] = cl_g def StopMove(self): # doet niets, maar stopt bewegingen print ("stop", status) time.sleep(0.25) def spotter(self, args): engine = BasicEngine(args.model_file) mic = args.mic als args.mic Geen anders is int(args.mic) model.classify_audio(mic, engine, labels_file="config/labels_gc2.raw.txt", commands_file="config/commands_v1_MeArm.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(self, args): if not self.on_init(): self._running = False q = model.get_queue() self._controler = Controler(q) indien niet 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) behalve wachtrij. Empty: new_item = None als new_item niet None is: item = new_item if (args.debug_keyboard and keys[pygame. K_ESCAPE]) of item == "stop": self._running = False # if (args.debug_keyboard and keys[pygame. K_SPACE]) of item == "go": # self. MeArmPos(7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) of item == "rechts": # draai zelf naar rechts. MoveRight() if (args.debug_ke yboard en toetsen [pygame. K_LEFT]) of item == "links": # sla linksaf self. MoveLeft() if (args.debug_keyboard and keys[pygame. K_UP]) of item == "up": self. MoveUp() if (args.debug_keyboard and keys[pygame. K_DOWN]) of item == "down": self. MoveDown() if (args.debug_keyboard and keys[pygame. K_B]) or item == "b": # achteruit self. MoveBack() if (args.debug_keyboard and keys[pygame. K_F]) of item == "f": # forward self. MoveForw() if (args.debug_keyboard and keys[pygame. K_O]) of item == "o": # open grip: self. OpenGrip() if (args.debug_keyboard and keys[pygame. K_C]) of item == "c": # close grip: self. CloseGrip() if (args.debug_keyboard en toetsen [pygame. K_S]) of item == "s": # stop beweging: "start_game" self. StopMove() if (args.debug_keyboard and keys[pygame. K_0]) of item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys[pygame. K_1]) of item == "1": self. MeArmPos(1) if (args.debug_keyboard and keys[pygame. K_2]) of item == "2": self. MeArmPos(2) if (args.debug_keyboard and keys[pygame. K_3]) of it em == "3": self. MeArmPos(3) if (args.debug_keyboard and keys[pygame. K_4]) of item == "4": self. MeArmPos(4) if (args.debug_keyboard and keys[pygame. K_5]) of item == "5": self. MeArmPos(5) if (args.debug_keyboard and keys[pygame. K_6]) of item == "6": self. MeArmPos(6) if (args.debug_keyboard en keys[pygame. K_7]) of item == "7": self. MeArmPos(7) if (args.debug_keyboard and keys[pygame. K_8]) of item == "8": self. MeArmPos(8) if (args.debug_keyboard and keys[pygame. K_9]) of item == "9": self. MeArmPos(9) if (args.debug_keyboard and keys[pygame. K_a]) of item == "d": self. DancingMeArm() #dancing MeArm, op "next_game" if (args.debug_keyboard and keys[pygame. K_r]) of item == "r": self. RandomMoves() #random dance "willekeurig spel" if (args.debug_keyboard and keys[pygame. K_j]) of item == "j": self. TransMeArm1() # transportobject: "lunch_game" if (args.debug_keyboard and keys[pygame. K_k]) of item == "k": self. TransMeArm2() # transportobject omgekeerde richting: "next_game" ''' if (args.debug_keyboard en keys[pygame. K_l]) of item == "l": self. JumpingJack2(1) #LED knippert "target" ''' time.sleep(0.05) self.on_cleanup() if _name_ == '_main_': parser = argparse. ArgumentParser() parser.add_argument('--debug_keyboard', help='Gebruik het toetsenbord om de MeArm te besturen.', action='store_true', default=False) model.add_model_flags(parser) args = parser.parse_args () the_app = App() the_app.on_execute(args)

Aanbevolen: