Inhaltsverzeichnis:

Ein Hör-Jumping Jack, Google Coral TPU Accelerator-Version - Gunook
Ein Hör-Jumping Jack, Google Coral TPU Accelerator-Version - Gunook

Video: Ein Hör-Jumping Jack, Google Coral TPU Accelerator-Version - Gunook

Video: Ein Hör-Jumping Jack, Google Coral TPU Accelerator-Version - Gunook
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Juli
Anonim
Ein Hampelmann für das Hören, Google Coral TPU Accelerator-Version
Ein Hampelmann für das Hören, Google Coral TPU Accelerator-Version
Ein Hampelmann für das Hören, Google Coral TPU Accelerator-Version
Ein Hampelmann für das Hören, Google Coral TPU Accelerator-Version
Ein Hampelmann für das Hören, Google Coral TPU Accelerator-Version
Ein Hampelmann für das Hören, Google Coral TPU Accelerator-Version

Es bewegt seine Gliedmaßen, es hört auf Ihre Befehle, es wird von der neuesten maschinellen Lerntechnologie angetrieben

Der „Hearing Jumping Jack“ist ein einfacher elektromechanischer Jumping Jack, angetrieben von zwei Mikroservos und einem sehr einfachen Getriebe, mit LEDs als „Augen“. Es wird durch einfache Sprachbefehle gesteuert, die anzeigen, welche der neun vordefinierten Positionen es einnehmen soll, ob die LED ein- oder ausgeschaltet werden soll oder ob es einen vordefinierten "Tanz" oder zufällige Bewegungen ausführen soll.

Kernelement des Systems ist der Google Coral TPU-Beschleuniger, der es ermöglicht, Tensorflow Lite-Modelle auch auf einem „schwachen“Rechner wie dem Raspberry Pi mit sehr hoher Geschwindigkeit offline zu betreiben. Dies ermöglicht z. B. schnelle Objektidentifikation und -klassifizierung mit der RPi-Kamera, aber auch um maschinell lernende Spracherkennungsfunktionen lokal auszuführen.

Meines Wissens ist dies das erste veröffentlichte Beispiel für ein spracherkennungsgesteuertes physisches Heimwerkergerät von Coral Accelerator, und das angehängte Codebeispiel könnte auch für andere, komplexere Projekte verwendet werden.

Die Sprachsteuerung basiert auf dem Beispiel „die hörende Schlange“im „project keyword spotter“(https://github.com/google-coral/project-keyword-spotter), das kürzlich (September 2019) auf GitHub platziert wurde. In meiner Konfiguration besteht das System aus einem Raspberry Pi 4 ausgestattet mit einer Adafruit 16-Kanal-Servohaube, einem Google Coral TPU Accelerator und einer Webcam, hier als Mikrofon verwendet. Der Jumping Jack wurde zuvor in einer früheren Anleitung beschrieben, in der er vom Google Voice-Kit zum Lesen von Sprachbefehlen angetrieben wurde, und ist in der im Folgenden beschriebenen Version 2.0 an der Servo Bonnet befestigt.

Die vorherige Version von Google Voice Kit hatte drei zentrale Einschränkungen: Sie war abhängig von den webbasierten Spracherkennungsdiensten von Google und die Einrichtung war relativ kompliziert, es musste eine Art Knopf gedrückt werden, bevor Sie einen Befehl geben konnten, und es gab eine ernsthafte Verzögerung zwischen dem Aussprechen des Befehls und der Antwort des Systems. Die Verwendung des Google Coral Accelerator reduziert die Reaktionszeit auf Sekunden, ist unabhängig von einer Internetverbindung und hört die ganze Zeit zu. Mit einigen Modifikationen können Sie es verwenden, um viel komplexere Geräte wie Jumping Jack, Roboter oder Autos oder was auch immer Sie mit einem Raspberry Pi bauen und steuern können, zu steuern.

In seiner aktuellen Version versteht der Keyword Spotter einen Satz von ca. 140 kurzen Keywords/Keyphrasen, die in der zugehörigen Modelldatei („voice_commands_v0.7_egetpu.tflite“) definiert und in einer separaten Label-Datei („labels_gc2.raw.txt“) beschrieben sind.. Definiert durch eine frei änderbare Datei („commands_v2_hampelmann.txt“) werden die von unserem Skript gezielt verwendeten Schlüsselwörter dann auf Tastenanschläge auf einer virtuellen Tastatur abgebildet, z. B. für Buchstaben, Zahlen, oben/unten/links/rechts, Strg+c usw..

Dann z. B. Mit pygame.key werden diese „Tastendrücke“gelesen und gesteuert, welche Aktionen ein Gerät, hier der Hampelmann, ausführen soll. In unserem Fall bedeutet dies, die beiden Servos in vordefinierte Positionen zu fahren oder die LEDs ein- oder auszuschalten. Da der Keyword-Spotter in einem eigenen Profil läuft, kann er permanent auf Ihre Bestellungen hören.

Version 21.09.2019

Lieferungen

Raspberry Pi 4, über Pimoroni

Google Coral TPU Accelerator, über Mouser Deutschland, 72€

Adafruit 16 Servo Bonnet, über Pimoroni, ca. 10 €

www.adafruit.com/product/3416

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

Stapelkopf (falls erforderlich)

www.adafruit.com/product/2223

4x AA Batteriepack (oder andere 5-6V Stromquelle) für Servo Bonnet

Alte Webcam, als Mikrofon

Servogetriebener Jumping Jack, wie in einem vorherigen instructable beschrieben. Layout-Zeichnungen sind dem nächsten Schritt beigefügt, können jedoch Anpassungen erfordern.

Benötigte Teile für den Jumping Jack:

- 3 mm Forex-Platte

- 2 Mikroservos

- 2 und 3 mm Schrauben und Muttern

- 2 weiße LEDs und ein Widerstand

- ein bisschen Kabel

Schritt 1: Einrichten des Geräts

Einrichten des Geräts
Einrichten des Geräts
Einrichten des Geräts
Einrichten des Geräts
Einrichten des Geräts
Einrichten des Geräts

Um den Jumping Jack zu bauen, folgen Sie bitte den Anweisungen in einer vorherigen Anleitung. Ich habe Forex für meinen Prototyp verwendet, aber Sie können lasergeschnittene Acryl- oder Sperrholzplatten verwenden. Eventuell müssen Sie das Layout entsprechend der Größe Ihrer Servos usw. anpassen. Testen Sie, ob sich die Wurfarme und das Getriebe ohne Reibung bewegen können.

Richten Sie Ihren Raspberry Pi ein. Auf der Coral Github-Site ist ein Raspian-Image verfügbar, das alles enthält, was zum Ausführen des Coral-Beschleunigers auf dem Pi erforderlich ist und viele Projekte enthält, wobei alle Einstellungen bereits vorhanden sind.

Holen Sie sich den Projekt-Keyword-Spotter von der Google Coral GitHub-Seite. Installieren Sie alle erforderliche Software wie angegeben.

Installieren Sie die bereitgestellten Dateien. Platzieren Sie das Jumping-Jack-Python-Skript im Projekt-Schlüsselwort-Spotter-Ordner und die entsprechende Befehlsdatei im config-Unterordner.

Befestigen Sie die Adafruit Servo Bonnet am Pi. Da ich ein RPI-Gehäuse mit Lüfter verwende, musste ich GPIO-Stacker (z. B. erhältlich von Pimoroni) verwenden, um die Verbindung zu ermöglichen. Installieren Sie alle erforderlichen Bibliotheken, wie in der Adafruit-Anleitung für die Servohaube angegeben.

Schließen Sie eine 5-6V Stromquelle an die Servohaube an. Bringen Sie Servos und LEDs an. In meinem Fall habe ich Port 0 für die LEDs und Port 11 und 15 für die Servos verwendet.

Um alles zu überprüfen, würde ich empfehlen, zuerst das Projekt-Keyword-Spotter "Hearing Snake"-Beispiel und die Adafruit-Servo-Motorhauben-Beispiele auszuprobieren.

Schritt 2: Den Jumping Jack ausführen

Wenn alle Teile eingerichtet sind und ausgeführt werden, versuchen Sie es zu verwenden. Sie können das Skript in der IDE oder über die Befehlszeile ausführen.

Das Rufen von "Position 0" bis "Position 9" wird den Jumping Jack dazu bringen, eine der vordefinierten Positionen einzunehmen. Ich habe "1" als beide Arme oben (uu), "3" als links oben, rechts unten (ud), "9" als beide Arme unten (dd) und "5" als beide Arme zentriert (cc) definiert.

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" ist identisch mit "5". "3" und "8" werden vom Keyword-Spotter nicht sehr gut erkannt und müssen ggf. wiederholt werden.

Eventuell müssen Sie die Minimal- und Maximalwerte für jedes Servo/Seite anpassen, damit die Servos nicht blockiert werden und dann zu viel Leistung ziehen.

„nächstes Spiel“startet den „Tanz“, d. h. eine definierte Abfolge von Stellungen, während „zufälliges Spiel“den Jumping Jack startet, um eine zufällige Zugfolge auszuführen. In beiden Fällen laufen sie ewig, so dass Sie möglicherweise Bewegungen stoppen müssen, z. B. mit einem "Position Null"-Befehl.

"Spiel stoppen" ruft ein "Strg + C" hervor und stoppt den Vorgang.

Mit "switch on" und "switch off" können die LEDs ein- und ausgeschaltet werden.

Durch die Änderung der time.sleep-Werte können Sie die Geschwindigkeit der Bewegungen anpassen.

Schritt 3: Der Code und die Befehlsdatei

Der hier vorgestellte Code ist eine Modifikation des "Hearing Snake"-Codes, der Teil des Projekt-Keyword-Spotter-Pakets ist. Ich habe einfach alles entfernt, was für meine Bewerbung nicht notwendig war, ohne die Details wirklich zu verstehen. Jede Verbesserung ist willkommen.

Ich habe dann die für die Adafruit Servo Bonnet erforderlichen Teile basierend auf ihren Beispieldateien hinzugefügt.

Ich möchte den Programmierern beider Teile danken.

Den Code finden Sie im Anhang als Datei. Verwenden Sie es auf eigene Gefahr, ändern Sie es, verbessern Sie es, spielen Sie damit.

# Copyright 2019 Google LLC

# # Lizenziert unter der Apache-Lizenz, Version 2.0 (die "Lizenz"); # Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden. # Eine Kopie der Lizenz erhalten Sie unter # # https://www.apache.org/licenses/LICENSE-2.0 # # Sofern nicht gesetzlich vorgeschrieben oder schriftlich vereinbart, wird die unter der Lizenz vertriebene Software auf einem BASIS "WIE BESEHEN", # OHNE GEWÄHRLEISTUNGEN ODER BEDINGUNGEN JEGLICHER ART, weder ausdrücklich noch stillschweigend. # Siehe die Lizenz für die spezifische Sprache, die Berechtigungen und # Einschränkungen unter der Lizenz regelt. from _future_ import absolute_import from _future_ import division from _future_ import print_function import argparse import os from random import randint from threading import Thread import time from edgetpu.basic.basic_engine import BasicEngine import model import pygame from pygame.locals import * import queue from random import randrange from 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) # set number der Kanäle #kit.servo[0].actuation_range = 160 #kit.servo[0].set_pulse_width_range(1000, 2000) # Up-, Mid- und Down-Einstellungen für linken und rechten Arm up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft= 15 # Nummer des Servoanschlusses, linkes Servo (0-8)

rgt= 11 # Nummer des Servo-Ports, rechtes Servo (0-8) led_channel_0 = hat.channels[0] # LED auf Port 0 gesetzt led_channel_0.duty_cycle = 0 #LED einschalten 100% #Liste der Armeinstellungen für neun Positionen = [(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)] # definiert 9 JumpingJack-Positionen, angegeben durch ganze Zahlen 0-9 dance1 =(0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # eine "Tanz"-Klasse Controler(object): #Callback-Funktion 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 JumpingJack0(self, keys): # steuert Jumping Jack, Schlüsselwörter: "position x" key = int(keys) p = position [Taste] a = p[0] b = p[1] print ("Position: ", Taste, " links /right: ", a, "/", b, "degree") # sys.stdout.write("Position: ", key, " left/right: ", a, "/", b, "degree") kit.servo[lft].angle = a kit.servo[rgt].angle = b time.sleep(0.1) def JumpingJack1(self): # steuert den Jumping-Jack-Tanz, Stichwort: "nächstes Spiel" dnce = dance1 sp=(len(dnce)) für r im Bereich (sp): #tanzende Reihenfolge der Positionen, sp Schritte dc = dnce[r] if (dc nicht im Bereich(10)): # print ("Eingabefehler an 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) # setzt die Geschwindigkeit der Bewegungen def JumpingJack2(self, keys): # steuert Jumping Jack LEDs, Stichworte: "ein-/ausschalten" led = int(keys) if led == 1: led_channel_0.duty_cycle = 0xffff #LED einschalten 100% time.sleep (0.1) if led == 0: led_channel_0.duty_cycle = 0 # LED ausschalten time.sleep (0.1) if led == 2: # blinken led_channel_0.duty_cycle = 0xffff #LED einschalten 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #LED einschalten 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #LED einschalten 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #LED einschalten 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #LED einschalten 100% time.sleep (0.1) def JumpingJack3(self): # steuert Jumping-Jack-Tanz, Stichwort: "Random Game" # für h im Bereich (10): dr= randrange (9) p = position[dr] a = p[0] b = p[1] kit.servo [lft].angle = a kit.servo[rgt].angle = b time.sleep(0.25) # setzt die Bewegungsgeschwindigkeit def spotter(self, args): engine = BasicEngine(args.model_file) mic = args.mic if args.mic ist None else 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):

falls nicht self.on_init(): self._running = False q = model.get_queue() self._controler = Controler(q) falls nicht args.debug_keyboard: t = Thread(target=self.spotter, args=(args,)) t.daemon = True t.start() item = -1 während self._running: pygame.event.pump() if args.debug_keyboard: keys = pygame.key.get_pressed() else: try: new_item = q.get (True, 0.1) außer queue. Empty: new_item = None wenn new_item nicht 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 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]) oder item == "0": self. JumpingJack0(0) if (args.debug_keyboard and keys[pygame. K_1]) oder item == "1": self. JumpingJack0(1) if (args. debug_keyboard and keys[pygame. K_2]) oder item == "2": self. JumpingJack0(2) if (args.debug_keyboard and keys[pygame. K_3]) oder 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_9]) or item == "9": self. JumpingJack0(9) if (args.debug_keyboard and keys[pygame. K_a]) oder item == "d": self. JumpingJack1() #dancing Jack, on "next_game" if (args. debug_keyboard and keys[pygame. K_j]) oder 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]) oder item == "l": self. JumpingJack2(1) #LED blinkt "target" if (args.debug_keyboard and keys[pygame. K_r]) oder item == "r": self. JumpingJack3() #random dance "random game" time.sleep(0.05) self.on_cleanup() if _name_ == '_main_': parser = argparse. ArgumentParser() parser.add_argument('--debug_keyboard', help='Benutze die Tastatur um den JumpingJack zu steuern.', action='store_true', default=False) model.add_model_flags(parser) args = parser.parse_args() the_app = App() the_app.on_execute(args)

Es gibt auch die Befehlskonfigurationsdatei "commands_v2_hampelmann.txt". Ändern Sie nach Belieben. Es ist nur eine Liste von "Befehl, Taste, (Stärke,)"-Kombinationen, basierend auf der Label-Datei.

position_null, 0, position_one, 1, position_two, 2, position_three, 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, runter, move_backwards, left, move_forwards, right, go_backwards, left, go_forwards, right, 0.8 Ziel, l, stumm, z, ja, y, nein, 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,

Schritt 4: Weitere Ideen und andere Beispiele

Es liegt auf der Hand, dass diese Einstellung auch zur Steuerung von Robotern oder anderen Geräten verwendet werden kann. Grundsätzlich alles, was von einem Raspberry Pi gesteuert werden könnte.

Ich arbeite an einer Erweiterung des Skripts zum Antrieb eines MeArms und hoffe, dieses im Oktober 2019 präsentieren zu können.

Ich überlege auch, den Jumping Jack als Semaphor zu verwenden und das Programm zur Erkennung der Gliedmaßenposition "project posenet" als Werkzeug zu verwenden, um die Positionen des Jumping Jack zu lesen und in eine Zahl zurück zu übersetzen. Auf diese Weise kann es sogar Text kommunizieren, da 2x 8 Positionen 64 verschiedene Zahlen anzeigen können, mehr als ausreichend für Alphabet, Zahlen und Zeichen. Dies könnte, wenn auch leicht modifiziert, eine physikalische Realisierung für die vorgeschlagene IETF "The Transmission of IP Datagrams over the Semaphore Flag Signaling System (SFSS)" (https://tools.ietf.org/html/rfc4824) ermöglichen.

Aber dies wird ein anderes instructable sein. Und wie erste Experimente zeigten, dass der Hampelmann erhebliche Modifikationen benötigt, bevor er von der KI als Mensch erkannt wird, kann es einige Zeit dauern.

Ich möchte Ihre Aufmerksamkeit auf das folgende instructable lenken: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, wo ein Objektfindungsroboter mit einer Kombination aus einem Raspberry Pi und Google Coral TPU beschrieben wird.

Empfohlen: