Innehållsförteckning:

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

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

Video: A Hearing Jumping Jack, Google Coral TPU Accelerator Version: 4 Steg
Video: The BEST Self-Hosted CCTV Solution With AI Object Detection? 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 rör sig på benen, det lyssnar på dina order, det drivs av den senaste maskininlärningstekniken

"Hearing Jumping Jack" är en enkel elektromekanisk Jumping Jack, driven av två mikroservon och en mycket enkel växel, med lysdioder som "ögon". Den styrs av enkla röstkommandon som anger vilken av nio fördefinierade positioner den ska inta, eller om lysdioden ska slås på eller av, eller om den ska utföra en fördefinierad "dans" eller slumpmässig uppsättning drag.

Systemets kärnelement är Google Coral TPU -acceleratorn, som gör det möjligt att köra Tensorflow Lite -modeller offline med mycket hög hastighet, även på en "svag" dator som Raspberry Pi. Detta tillåter t.ex. snabb objektidentifiering och klassificering med RPi-kameran, men också för att köra maskininlärningsbaserade röstigenkänningsfunktioner lokalt.

Så vitt jag vet är detta det första publicerade exemplet för en Coral Accelerator-röstdetekteringsdriven fysisk DIY-enhet, och det bifogade kodexemplet kan också användas för andra mer komplexa projekt.

Röstkontrollen är baserad på exemplet "hörselormen" i "projektsökordsspotare" (https://github.com/google-coral/project-keyword-spotter) som nyligen (september 2019) placerades på GitHub. I min konfiguration består systemet av en Raspberry Pi 4 utrustad med en Adafruit 16 -kanals servohuva, en Google Coral TPU Accelerator och en webbkamera, som här används som mikrofon. Jumping Jack hade beskrivits tidigare i en tidigare instruktion, där den drevs av Google Voice -kit för att läsa röstkommandon, är ansluten till Servo Bonnet i version 2.0 som beskrivs i det följande.

Den tidigare versionen av Google Voice Kit hade tre centrala begränsningar: det berodde på Googles webbaserade röstigenkänningstjänster och installationen var relativt komplicerad, det krävdes att trycka på någon knapp innan du kunde ge ett kommando och det blev en allvarlig fördröjning mellan att säga kommandot och systemets svar. Att använda Google Coral -acceleratorn reducerar responstiden till sekunder, är oberoende av en internetuppkoppling och lyssnar hela tiden. Med vissa modifieringar kan du använda den för att styra enheter som är mycket mer komplexa som en Jumping Jack, som robotar eller bilar, eller vad du än kan bygga och styra med en Raspberry Pi.

I sin nuvarande version förstår Keyword Spotter en uppsättning med cirka 140 korta nyckelord/nyckelfraser, definierade i den medföljande modellfilen ("voice_commands_v0.7_egetpu.tflite") och beskrivs i en separat etikettfil ("labels_gc2.raw.txt"). Definierade av en fritt modifierbar fil (“command_v2_hampelmann.txt”), mappas sedan nyckelorden som används specifikt av vårt skript till tangenttryckningar på ett virtuellt tangentbord, t.ex. för bokstäver, siffror, upp/ner/vänster/höger, crtl+c, etc.

Då, t.ex. med hjälp av pygame.key, läses dessa”tangenttryckningar” och används för att styra vilka åtgärder en enhet, här hoppjacket, ska utföra. I vårt fall betyder det att köra de två servona till fördefinierade lägen, eller att slå på eller stänga av lysdioderna. Eftersom sökordet spotter körs i en separat slitbana kan den lyssna permanent på dina beställningar.

Version 21 september 2019

Tillbehör

Hallon 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…

Staplingsrubrik (om det behövs)

www.adafruit.com/product/2223

4x AA-batteripaket (eller annan 5-6V strömkälla) för Servo Bonnet

Gammal webbkamera, som mikrofon

Servodriven Jumping Jack, som beskrivits i en tidigare instruerbar. Layoutritningar bifogas nästa steg, men kan kräva justeringar.

Nödvändiga delar för Jumping Jack:

- 3 mm Forex -platta

- 2 mikroservos

- 2 och 3 mm skruvar och muttrar

- 2 vita lysdioder och ett motstånd

- lite kabel

Steg 1: Konfigurera enheten

Konfigurera enheten
Konfigurera enheten
Konfigurera enheten
Konfigurera enheten
Konfigurera enheten
Konfigurera enheten

För att bygga Jumping Jack, följ indikationerna i en tidigare instruktion. Jag använde Forex för min prototyp, men du kan använda laserskurna akryl- eller plywoodplattor. Du kan behöva justera layouten efter storleken på dina servon etc. Testa om benen och redskapen kan röra sig utan friktion.

Konfigurera din Raspberry Pi. På Coral Github -webbplatsen finns en Raspian -bild tillgänglig som innehåller allt som krävs för att köra Coral -acceleratorn på Pi och innehåller många projekt, med alla inställningar redan på plats.

Hämta projektordet spotter från Google Coral GitHub -sidan. Installera all nödvändig programvara enligt anvisningarna.

Installera de medföljande filerna. Placera hopp -jack -python -skriptet i projektordets sökordspotermapp och motsvarande kommandofil i konfigurationsmappen.

Fäst Adafruit Servo Bonnet på Pi. Eftersom jag använder ett RPI -hölje med en fläkt, behövde jag använda GPIO -staplare (t.ex. tillgängliga från Pimoroni) för att möjliggöra anslutning. Installera alla nödvändiga bibliotek, enligt anvisningarna i Adafruit -instruktionerna för servohuven.

Anslut en 5-6V strömkälla till servohuven. Fäst servon och lysdioder. I mitt fall använde jag port 0 för lysdioderna och portarna 11 och 15 för servon.

För att kontrollera allt, skulle jag rekommendera att prova projektordet sökord spotter "hörande orm" exempel och Adafruit servo motorhuven exempel först.

Steg 2: Kör Jumping Jack

Om alla delar är igång kan du försöka använda den. Du kan köra skriptet i IDE eller från kommandoraden.

Om du ropar "position 0" till "position 9", kommer Jumping Jack att ta en av de fördefinierade positionerna. Jag definierade "1" som båda armarna upp (uu), "3" som vänster upp, höger ner (ud), "9" som båda armarna ner (dd) och "5" som båda armarna centrerade (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" är identiskt med "5". "3" och "8" känns inte igen särskilt bra av sökordet spotter och kan behöva upprepas.

Du kan behöva justera minimi- och maxvärden för varje servo/sida så att servon inte blockeras och sedan drar för mycket ström.

"nästa spel" startar "dansen", det vill säga en definierad sekvens av positioner, medan "slumpmässigt spel" kommer att starta Jumping Jack för att utföra en slumpmässig sekvens av drag. I båda fallen kommer de att köra för alltid, så du kan behöva stoppa rörelser, t.ex. med ett "position zero" -kommando.

"stopp spel" kommer att framkalla en "ctrl + c" och stoppa processen.

"slå på" och "stäng av" kan användas för att slå på och stänga av lysdioderna.

Genom att ändra time.sleep -värden kan du justera rörelsens hastighet.

Steg 3: Koden och kommandofilen

Koden som presenteras här är en ändring av koden "hörande orm" som är en del av projektordet spotter -paketet för projektet. Jag tog precis bort allt som inte var nödvändigt för min ansökan, utan någon riktig förståelse för detaljerna. Eventuella förbättringar är välkomna.

Jag lade sedan till de delar som krävs för Adafruit Servo Bonnet, baserat på deras exempelfiler.

Jag vill tacka programmerarna i båda delarna.

Koden finns bifogad som fil. Använd det på dina egna risker, ändra det, förbättra det, spela med det.

# Copyright 2019 Google LLC

# # Licensierad under Apache -licensen, version 2.0 ("licensen"); # du får inte använda den här filen förutom i enlighet med licensen. # Du kan få en kopia av licensen på # # https://www.apache.org/licenses/LICENSE-2.0 # # Om inte det krävs enligt gällande lag eller skriftligt godkänts, distribueras programvara # som distribueras enligt licensen på en "SOM DET ÄR" GRUND, # UTAN GARANTIER ELLER VILLKOR FÖR NÅGON SÅ HÄR, antingen uttryckliga eller underförstådda. # Se licensen för det specifika språket för behörigheter och # begränsningar under licensen. från _future_ import absolut_import från _future_ import division från _future_ import print_function import argparse import os från slumpmässig import randint från threading import Trådimporttid från edgetpu.basic.basic_engine import BasicEngine importmodell pygame från pygame.locals import * importkö från slumpmässig import randrange från 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) # set antal av kanaler #kit.servo [0].actuation_range = 160 #kit.servo [0].set_pulse_width_range (1000, 2000) #upp, mitt och ned inställningar för vänster och höger armar upp_l = 35 md_l = 90 dn_l = 160 upp_r = 160 md_r = 90 dn_r = 35

lft = 15 # antal servoport, vänster servo (0-8)

rgt = 11 # antal servoport, höger servo (0-8) led_kanal_0 = hatt.kanaler [0] # LED inställd på port 0 led_kanal_0.plikt_cykel = 0 #tänd LED 100% # lista över arminställningar för nio positioner = [(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)] # definierar 9 JumpingJack-positioner, indikerade 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" -klass Controler (objekt): #Callback -funktion def _init _ (self, q): self._q = q def callback (self, kommando): self._q.put (kommando) klass 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): # kontroller Jumping Jack, sökord: "position x" key = int (nycklar) p = position [nyckel] a = p [0] b = p [1] utskrift ("Position:", nyckel, "vänster /höger: ", a,"/", b," grad ") # sys.stdout.write (" Position: ", nyckel," vänster/höger: ", 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ökord: "nästa spel" dnce = dance1 sp = (len (dnce)) för r i intervall (sp): # dansens ordningsföljd, sp -steg dc = dnce [r] if (dc inte inom intervallet (10)): # print ("input error at position", sp) dc = 4 p = position [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0,25) # ställer in hastighet av rörelser def JumpingJack2 (själv, tangenter): # kontroller Jumping Jack LEDs, nyckelord: "slå på/av" led = int (nycklar) om led == 1: led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.1) if led == 0: led_channel_0.duty_cycle = 0 # stäng av LED -tid. Sömn (0.1) om led == 2: # blinka led_channel_0.duty_cycle = 0xffff #turn on 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 on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.1) def JumpingJack3 (self): # kontroller Jumping Jack dance, sökord: "slumpmässigt spel" # för h inom intervall (10): dr = randrange (9) p = position [dr] a = p [0] b = p [1] kit.servo [lft].angle = ett kit.servo [rgt].angle = b time.sleep (0,25) # ställer in rörelsens hastighet def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic är Ingen annan int (args.mic) model.classify_audio (mic, engine, 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):

om inte self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) om inte args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 medan self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (Sant, 0,1) utom kö. Empty: new_item = None om new_item inte är None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) or item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) or item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) or item == "right": self. JumpingJack0 (6) if (args.debug_keyboard och nycklar [pygame. K_LEFT]) eller 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 and keys [pygame. K_1]) or 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 och nycklar [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 blinkar "target" if (args.debug_keyboard och tangenter [pygame. K_r]) eller item == "r": self. JumpingJack3 () #slumpmässig dans "random game" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Använd tangentbordet för att styra JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Det finns också kommandokonfigurationsfilen "commands_v2_hampelmann.txt". Ändra som du vill. Det är bara en lista över "kommando, tangent, (styrka,)" kombinationer, baserat på etikett-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, ner, flytta_ bakåt, vänster, flytta_ framåt, höger, gå_ bakåt, vänster, gå_föråt, höger, 0,8 mål, l, stäng av, 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,

Steg 4: Ytterligare idéer och andra exempel

Det är ganska uppenbart att denna inställning också kan användas för att styra robotar eller andra enheter. I princip allt som kan styras av en Raspberry Pi.

Jag arbetar med en förlängning av manuset för att köra en MeArm och hoppas kunna presentera detta i oktober 2019.

Jag funderar också på att använda Jumping Jack som en semafor, och att använda "project posenet" lemlägesigenkänningsprogrammet som ett verktyg för att läsa Jumping Jacks positioner och att översätta det till ett nummer. På så sätt kan den till och med kommunicera text, med 2x 8 positioner kan indikera 64 olika nummer, mer än tillräckligt för alfabet, siffror och tecken. Detta kan möjliggöra, även om det är något modifierat, en fysisk realisering för det föreslagna IETF "Transmission of IP Datagrams over the Semaphore Flag Signaling System (SFSS)" (https://tools.ietf.org/html/rfc4824).

Men detta kommer att bli en annan instruerbar. Och som de första experimenten indikerade att hoppjacket kommer att behöva betydande ändringar innan det kommer att erkännas som mänskligt av AI -systemet kan ta lite tid.

Jag vill uppmärksamma följande instruktioner: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, där en objekt för att hitta objekt som använder en kombination av en Raspberry Pi och Google Coral TPU beskrivs.

Rekommenderad: