Indholdsfortegnelse:

A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 trin
A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 trin

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 trin

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 trin
Video: I Can Save You Money! – Raspberry Pi Alternatives 2024, Juli
Anonim
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version
A Hearing Jumping Jack, Google Coral TPU Accelerator Version

Det bevæger sine lemmer, det lytter til dine ordrer, det er drevet af den nyeste machine learning -teknologi

"Hearing Jumping Jack" er en simpel elektromekanisk Jumping Jack, drevet af to mikroservoer og et meget enkelt gear, der har lysdioder som "øjne". Den styres af simple stemmekommandoer, der angiver, hvilken af ni foruddefinerede positioner den skal indtage, eller om LED'en skal tændes eller slukkes, eller om den skal udføre en foruddefineret "dans" eller et tilfældigt sæt træk.

Systemets kerneelement er Google Coral TPU -acceleratoren, som gør det muligt at køre Tensorflow Lite -modeller offline med meget høj hastighed, selv på en "svag" computer som Raspberry Pi. Dette giver f.eks. hurtig objektidentifikation og klassificering ved hjælp af RPi-kameraet, men også til at køre maskinlæringsbaserede stemmegenkendelsesfunktioner lokalt.

Mig bekendt er dette det første publicerede eksempel på en Coral Accelerator-stemmedetekteringsdrevet fysisk DIY-enhed, og det vedhæftede kodeeksempel kan også bruges til andre, mere komplekse projekter.

Stemmestyringen er baseret på eksemplet "hørselsslangen" i "projektsøgeordsspoteren" (https://github.com/google-coral/project-keyword-spotter), som for nylig (september 2019) blev placeret på GitHub. I min konfiguration består systemet af en Raspberry Pi 4 udstyret med en Adafruit 16 kanals servo motorhjelm, en Google Coral TPU Accelerator og et webcam, her brugt som mikrofon. Jumping Jack var blevet beskrevet før i en tidligere instruerbar, hvor den blev drevet af Google Voice -kittet til at læse stemmekommandoer, er knyttet til Servo Bonnet i version 2.0 beskrevet i det følgende.

Den tidligere version af Google Voice Kit havde tre centrale begrænsninger: det var afhængigt af Googles webbaserede stemmegenkendelsestjenester, og opsætningen var relativt kompliceret, det krævede at trykke på en slags knap, før du kunne give en kommando, og der var en alvorlig forsinkelse mellem at sige kommandoen og systemets svar. Brug af Google Coral -acceleratoren reducerer svartiden til sekunder, er uafhængig af en internetforbindelse og lytter hele tiden. Med nogle ændringer kan du bruge den til at styre enheder, der er meget mere komplekse som en Jumping Jack, som robotter eller biler, eller hvad du nu kan bygge og styre med en Raspberry Pi.

I sin nuværende version forstår Keyword Spotter et sæt på cirka 140 korte søgeord/nøglesætninger, defineret i den medfølgende modelfil (“voice_commands_v0.7_egetpu.tflite”) og beskrevet i en separat etiketfil (“labels_gc2.raw.txt”). Defineret af en frit ændret fil (“command_v2_hampelmann.txt”) kortlægges nøgleordene, der specifikt bruges af vores script, derefter til tastetryk på et virtuelt tastatur, f.eks. for bogstaver, tal, op/ned/venstre/højre, crtl+c osv.

Derefter kan f.eks. ved hjælp af pygame.key læses disse "tastetryk" og bruges til at styre, hvilke handlinger en enhed, her springstikket, skal udføre. I vores tilfælde betyder det at køre de to servoer til foruddefinerede positioner eller at tænde eller slukke lysdioderne. Da søgeordet spotter kører i en separat slidbane, kan det lytte permanent til dine ordrer.

Version 21. september 2019

Forbrugsvarer

Hindbær Pi 4, via Pimoroni

Google Coral TPU Accelerator, via Mouser Tyskland, 72 €

Adafruit 16 Servo Bonnet, via Pimoroni, cirka 10 €

www.adafruit.com/product/3416

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

Stablerhoved (hvis påkrævet)

www.adafruit.com/product/2223

4x AA batteripakke (eller anden 5-6V strømkilde) til Servo Bonnet

Gammelt webcam, som mikrofon

Servodrevet Jumping Jack, som beskrevet i en tidligere instruerbar. Layouttegninger er vedhæftet det næste trin, men kan kræve justeringer.

Nødvendige dele til Jumping Jack:

- 3 mm Forex plade

- 2 mikroservoer

- 2 og 3 mm skruer og møtrikker

- 2 hvide lysdioder og en modstand

- lidt kabel

Trin 1: Opsætning af enheden

Opsætning af enheden
Opsætning af enheden
Opsætning af enheden
Opsætning af enheden
Opsætning af enheden
Opsætning af enheden

For at bygge Jumping Jack skal du følge anvisningerne i en tidligere instruktion. Jeg brugte Forex til min prototype, men du kan bruge laserskårne akryl- eller krydsfinerplader. Du skal muligvis justere layoutet i henhold til størrelsen på dine servoer osv. Test om lemmer og gear kan bevæge sig uden friktion.

Opsæt din Raspberry Pi. På Coral Github -webstedet er der et Raspian -billede til rådighed, der indeholder alt, hvad der kræves for at køre Coral -acceleratoren på Pi, og indeholder en masse projekter, hvor alle indstillinger allerede er på plads.

Få projektets søgeordspotter fra Google Coral GitHub -siden. Installer al nødvendig software som angivet.

Installer de medfølgende filer. Placer jumping jack python -scriptet i projekt -søgeords spotter -mappen og den tilsvarende kommandofil i konfigurationsundermappen.

Fastgør Adafruit Servo Bonnet til Pi. Da jeg bruger et RPI -hus med en ventilator, var jeg nødt til at bruge GPIO -stablere (f.eks. Tilgængelige fra Pimoroni) for at muliggøre forbindelse. Installer alle nødvendige biblioteker, som angivet i Adafruit -instruktionerne til servo -motorhjelmen.

Slut en 5-6V strømkilde til servo motorhjelmen. Fastgør servoer og lysdioder. I mit tilfælde brugte jeg port 0 til lysdioderne og porte 11 og 15 til servoerne.

For at kontrollere alt, vil jeg anbefale at prøve projektet søgeord spotter "hør slange" eksempel og Adafruit servo motorhjelm eksempler først.

Trin 2: Kør Jumping Jack

Hvis alle dele er sat op og kører, så prøv at bruge det. Du kan køre scriptet i IDE eller fra kommandolinjen.

Hvis man råber "position 0" til "position 9", vil Jumping Jack fremkalde en af de foruddefinerede positioner. Jeg definerede "1" som begge arme op (uu), "3" som venstre op, højre ned (ud), "9" som begge arme ned (dd) og "5" som begge arme centreret (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" er identisk med "5". "3" og "8" genkendes ikke særlig godt af søgeordet spotter og skal muligvis gentages.

Du skal muligvis justere minimums- og maksimumværdier for hver servo/side, så servoerne ikke blokeres og derefter trække for meget strøm.

"næste spil" starter "dansen", dvs. en defineret sekvens af positioner, mens "tilfældigt spil" vil starte Jumping Jack for at udføre en tilfældig sekvens af træk. I begge tilfælde vil de køre for evigt, så du skal muligvis stoppe bevægelser, f.eks. med en "position zero" kommando.

"stop game" vil fremkalde en "ctrl + c" og stoppe processen.

"tænd" og "sluk" kan bruges til at tænde og slukke LED'erne.

Ved ændring af time.sleep -værdier kan du justere bevægelseshastigheden.

Trin 3: Koden og kommandofilen

Koden, der præsenteres her, er en ændring af koden "hørende slange", der er en del af projekt -søgeordspotterpakken. Jeg har lige fjernet alt, hvad der ikke var nødvendigt for min ansøgning, uden nogen reel forståelse af detaljerne. Eventuelle forbedringer er velkomne.

Jeg tilføjede derefter de nødvendige dele til Adafruit Servo Bonnet, baseret på deres eksempelfiler.

Jeg vil gerne takke programmørerne i begge dele.

Koden kan findes vedhæftet som fil. Brug det på dine egne risici, rediger det, forbedre det, leg med det.

# Copyright 2019 Google LLC

# # Licenseret under Apache -licensen, version 2.0 ("licensen"); # du må ikke bruge denne fil, undtagen i overensstemmelse med licensen. # Du kan få en kopi af licensen på # # https://www.apache.org/licenses/LICENSE-2.0 # # Medmindre det kræves i henhold til gældende lov eller skriftligt accepteret, distribueres software #, der distribueres under licensen på en "SOM DET ER" GRUNDLÆGGENDE, # UDEN GARANTIER ELLER BETINGELSER FOR NOGEN Slag, enten udtrykkelige eller underforståede. # Se licensen for det specifikke sprog for tilladelser og # begrænsninger under licensen. fra _future_ import absolut_import fra _future_ import division fra _future_ import print_function import argparse import os fra random import randint fra threading import Thread import tid fra edgetpu.basic.basic_ engine import BasicEngine import model pygame fra pygame.locals import * import kø fra random import randrange fra adafruit_servokit import ServoKit importkort import busio import adafruit_pca9685 importtid i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frekvens = 60 kit = ServoKit (kanaler = 16) # sætnummer af kanaler #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #op, midt og ned indstillinger for venstre og højre arme up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # antal servoport, venstre servo (0-8)

rgt = 11 # antal servo port, højre servo (0-8) led_channel_0 = hat.kanaler [0] # LED indstillet på port 0 led_channel_0.duty_cycle = 0 #tænd LED 100% # liste over arm indstillinger for ni positioner position = [(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)] # definerer 9 JumpingJack-positioner, angivet med heltal 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # a "dance" -klasse Controler (objekt): #Callback -funktion def _init _ (self, q): self._q = q def callback (self, kommando): self._q.put (kommando) klasse 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 JumpingJack0 (self, keys): # controls Jumping Jack, keywords: "position x" key = int (keys) p = position [nøgle] a = p [0] b = p [1] print ("Position:", nøgle, "venstre /højre: ", a,"/", b," grad ") # sys.stdout.write (" Position: ", nøgle," venstre/højre: ", a,"/", b," grad ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # kontroller Jumping Jack dance, søgeord: "næste spil" dnce = dance1 sp = (len (dnce)) for r i området (sp): #dans position af positioner, sp trin dc = dnce [r] hvis (dc ikke inden for område (10)): # print ("input error at position", sp) dc = 4 p = position [dc] a = p [0] b = p [1] kit.servo [lft].angle = et kit.servo [rgt].angle = b time.sleep (0,25) # sætter hastighed af bevægelser def JumpingJack2 (selv, taster): # kontroller Jumping Jack LED'er, søgeord: "tænd/sluk" led = int (nøgler) hvis led == 1: led_channel_0.duty_cycle = 0xffff #tænd LED 100% time.sleep (0.1) hvis led == 0: led_channel_0.duty_cycle = 0 # sluk LED time.sleep (0.1) if led == 2: # blink led_channel_0.duty_cycle = 0xffff #turn LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #tænd LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #tænd LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #tænd LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn LED 100% time.sleep (0.1) def JumpingJack3 (self): # kontroller Jumping Jack dance, søgeord: "tilfældigt spil" # for h inden for rækkevidde (10): dr = randrange (9) p = position [dr] a = p [0] b = p [1] kit.servo [lft].angle = et kit.servo [rgt].angle = b time.sleep (0,25) # indstiller bevægelseshastighed def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic er Intet andet int (args.mic) model.classify_audio (mikrofon, motor, labels_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 (self, args):

hvis ikke self.on_init (): self._running = Falsk q = model.get_queue () self._controler = Controler (q) hvis ikke args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 mens self._running: pygame.event.pump () hvis args.debug_keyboard: keys = pygame.key.get_pressed () else: prøv: new_item = q.get (Sandt, 0,1) undtagen kø. Empty: new_item = Ingen hvis new_item ikke er None: item = new_item if (args.debug_keyboard og nøgler [pygame. K_ESCAPE]) eller item == "stop": self._running = False # if (args.debug_keyboard og nøgler [pygame. K_SPACE]) eller item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard og nøgler [pygame. K_RIGHT]) eller item == "right": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_LEFT]) or item == "left": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_UP]) or item == " up ": self. JumpingJack0 (1) if (args.debug_keyboard and keys [pygame. K_DOWN]) or item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) eller item == "0": self. JumpingJack0 (0) if (args.debug_keyboard og nøgler [pygame. K_1]) eller item == "1": self. JumpingJack0 (1) if (args. debug_keyboard and keys [pygame. K_2]) or item == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) or item == "3": self. JumpingJack0 (3) if (args.debug_keyboard and keys [pygame. K_4]) or item == "4": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_5]) or item == "5": self. JumpingJack0 (5) if (args.debug_keyboard and keys [pygame. K_6]) or item == "6": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_7]) or item == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard and keys [pygame. K_8]) or item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and keys [pygame. K_8]) or item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and keys [pygame. K_9]) or item == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) or item == "d": self. JumpingJack1 () #dancing Jack, on "next_game" if (args. debug_keyboard og nøgler [pygame. K_j]) eller item == "j": self. JumpingJack2 (0) #LED on, ON " switch_on "if (args.debug_keyboard and keys [pygame. K_k]) or item ==" k ": self. JumpingJack2 (1) #LED off, on" swithch off "if (args.debug_keyboard and keys [pygame. K_l]) eller item == "l": self. JumpingJack2 (1) #LED blink "target" if (args.debug_keyboard and keys [pygame. K_r]) or item == "r": self. JumpingJack3 () #randomom dance "random game" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Brug tastaturet til at styre JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Der er også kommandoen config file "commands_v2_hampelmann.txt". Rediger som du vil. Det er bare en liste over "kommando, tast, (styrke,)" kombinationer, baseret på etiket-filen.

position_zero, 0, position_one, 1, position_two, 2, position_tree, 3, position_four, 4, position_five, 5, position_six, 6, position_seven, 7, position_eight, 8, position_nine, 9, move_up, up, go_up, up, move_down, down, go_down, ned, bevæg _ tilbage, venstre, bevæg_ fremad, højre, gå_ tilbage, venstre, gå_ fremad, højre, 0,8 mål, l, mute, z, ja, y, nej, n, switch_on, j, switch_off, k, volume_up, up, volume_down, down, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

Trin 4: Yderligere ideer og andre eksempler

Det er ganske indlysende, at denne indstilling også kan bruges til at styre robotter eller andre enheder. Grundlæggende alt, hvad der kan styres af en Raspberry Pi.

Jeg arbejder på en udvidelse af scriptet til at køre en MeArm, og håber at kunne præsentere dette i oktober 2019.

Jeg overvejer også at bruge Jumping Jack som en semafor og at bruge programmet "project posenet" lempositiongenkendelse som et værktøj til at læse Jumping Jack's positioner og oversætte det tilbage til et tal. På denne måde kan det endda kommunikere tekst, givet 2x 8 positioner kan angive 64 forskellige tal, mere end tilstrækkeligt til alfabet, tal og tegn. Dette kan muligvis muliggøre en fysisk realisering af det foreslåede IETF "Transmission of IP Datagrams over the Semaphore Flag Signaling System (SFSS)" (https://tools.ietf.org/html/rfc4824), mens det er lidt ændret.

Men dette vil være en anden instruerbar. Og som de første eksperimenter indikerede, at springstikket har brug for betydelige ændringer, før det vil blive anerkendt som menneske af AI -systemet, kan det tage noget tid.

Jeg vil gerne henlede din opmærksomhed på følgende instruerbare: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, hvor en objekt til at finde robot ved hjælp af en kombination af en Raspberry Pi og Google Coral TPU er beskrevet.

Anbefalede: