Tabla de contenido:

A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral: 4 pasos
A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral: 4 pasos

Video: A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral: 4 pasos

Video: A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral: 4 pasos
Video: computer-vision-lecture-intro 2024, Mes de julio
Anonim
A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral
A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral
A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral
A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral
A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral
A Hearing Jumping Jack, versión del acelerador de TPU de Google Coral

Mueve sus extremidades, escucha sus órdenes, ¡es impulsado por la última tecnología de aprendizaje automático

El "Hearing Jumping Jack" es un simple Jumping Jack electromecánico, impulsado por dos micro servos y un engranaje muy simple, que tiene LED como "ojos". Se controla mediante simples comandos de voz que indican cuál de las nueve posiciones predefinidas debe tomar, si el LED debe encenderse o apagarse, o si debe realizar un "baile" predefinido o una serie de movimientos aleatorios.

El elemento central del sistema es el acelerador de TPU de Google Coral, que permite ejecutar modelos de Tensorflow Lite sin conexión a una velocidad muy alta, incluso en una computadora "débil" como la Raspberry Pi. Esto permite, por ejemplo, identificación y clasificación rápida de objetos utilizando la cámara RPi, pero también para ejecutar localmente funciones de reconocimiento de voz basadas en aprendizaje automático.

Que yo sepa, este es el primer ejemplo publicado para un dispositivo de bricolaje físico impulsado por detección de voz Coral Accelerator, y el ejemplo de código adjunto también podría usarse para otros proyectos más complejos.

El control por voz se basa en el ejemplo "la serpiente auditiva" en el "spotter de palabras clave del proyecto" (https://github.com/google-coral/project-keyword-spotter) que recientemente (septiembre de 2019) se colocó en GitHub. En mi configuración, el sistema está compuesto por una Raspberry Pi 4 equipada con un capó servo Adafruit de 16 canales, un Acelerador de TPU de Google Coral y una cámara web, aquí utilizada como micrófono. El Jumping Jack había sido descrito anteriormente en un instructable anterior, donde fue impulsado por el kit de Google Voice para leer comandos de voz, se adjunta al Servo Bonnet en la versión 2.0 que se describe a continuación.

La versión anterior de Google Voice Kit tenía tres limitaciones centrales: dependía de los servicios de reconocimiento de voz basados en la web de Google y la configuración era relativamente complicada, requería presionar algún tipo de botón antes de poder dar un comando, y hubo un retraso serio entre decir el comando y la respuesta del sistema. El uso del acelerador de Google Coral reduce el tiempo de respuesta a segundos, es independiente de una conexión a Internet y está escuchando todo el tiempo. Con algunas modificaciones puedes usarlo para controlar dispositivos mucho más complejos como un Jumping Jack, como robots o autos, o lo que sea que puedas construir y controlar con una Raspberry Pi.

En su versión actual, Keyword Spotter comprende un conjunto de aproximadamente 140 palabras clave / frases clave cortas, definidas en el archivo de modelo adjunto ("voice_commands_v0.7_egetpu.tflite") y descritas en un archivo de etiqueta separado ("labels_gc2.raw.txt"). Definidas por un archivo libremente modificable ("commands_v2_hampelmann.txt"), las palabras clave utilizadas específicamente por nuestro script se asignan a las pulsaciones de teclas en un teclado virtual, p. Ej. para letras, números, arriba / abajo / izquierda / derecha, crtl + c, etcétera.

Entonces, p. Ej. utilizando pygame.key, estas "pulsaciones de teclas" se leen y se utilizan para controlar qué acciones debe realizar un dispositivo, aquí el gato de salto. En nuestro caso, esto significa conducir los dos servos a posiciones predefinidas, o encender o apagar los LED. Como el observador de palabras clave se ejecuta en una banda de rodadura separada, puede escuchar permanentemente sus órdenes.

Versión 21 de septiembre de 2019

Suministros

Raspberry Pi 4, a través de Pimoroni

Acelerador de TPU de Google Coral, a través de Mouser Alemania, 72 €

Adafruit 16 Servo Bonnet, vía Pimoroni, unos 10 €

www.adafruit.com/product/3416

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

Cabecera del apilador (si es necesario)

www.adafruit.com/product/2223

Paquete de 4 pilas AA (u otra fuente de alimentación de 5-6 V) para Servo Bonnet

Cámara web antigua, como micrófono

Jumping Jack servoaccionado, como se describe en un instructable anterior. Los planos de distribución se adjuntan al siguiente paso, pero pueden requerir ajustes.

Piezas necesarias para el Jumping Jack:

- Placa Forex de 3 mm

- 2 micro servos

- Tornillos y tuercas de 2 y 3 mm

- 2 LED blancos y una resistencia

- un poco de cable

Paso 1: configuración del dispositivo

Configurar el dispositivo
Configurar el dispositivo
Configurar el dispositivo
Configurar el dispositivo
Configurar el dispositivo
Configurar el dispositivo

Para construir el Jumping Jack, siga las indicaciones dadas en un instructivo anterior. Usé Forex para mi prototipo, pero puede usar placas acrílicas o de madera contrachapada cortadas con láser. Puede que tenga que ajustar el diseño de acuerdo con el tamaño de sus servos, etc. Pruebe si las extremidades y el engranaje pueden moverse sin fricción.

Configura tu Raspberry Pi. En el sitio de Coral Github, hay una imagen de Raspian disponible que contiene todo lo necesario para ejecutar el acelerador de Coral en el Pi y contiene muchos proyectos, con todas las configuraciones ya implementadas.

Obtenga el buscador de palabras clave del proyecto de la página de Google Coral GitHub. Instale todo el software necesario como se indica.

Instale los archivos proporcionados. Coloque la secuencia de comandos de jump jack python en la carpeta de búsqueda de palabras clave del proyecto y el archivo de comandos correspondiente en la subcarpeta de configuración.

Conecte el Adafruit Servo Bonnet al Pi. Como estoy usando una carcasa RPI con un ventilador, necesitaba usar apiladores GPIO (por ejemplo, disponibles en Pimoroni) para habilitar la conexión. Instale todas las bibliotecas necesarias, como se indica en las instrucciones de Adafruit para el capó del servo.

Conecte una fuente de alimentación de 5-6 V al capó del servo. Conecte servos y LED. En mi caso, utilicé el puerto 0 para los LED y los puertos 11 y 15 para los servos.

Para comprobar todo, recomendaría probar primero el ejemplo del observador de palabras clave del proyecto "serpiente auditiva" y los ejemplos del capó del servo Adafruit.

Paso 2: Ejecutar el Jumping Jack

Si todas las partes están configuradas y funcionando, intente usarlo. Puede ejecutar el script en el IDE o desde la línea de comandos.

Gritar "posición 0" a "posición 9" hará que el Jumping Jack tome una de las posiciones predefinidas. Definí "1" como ambos brazos arriba (uu), "3" como izquierda arriba, derecha abajo (ud), "9" como ambos brazos abajo (dd) y "5" como ambos brazos centrados (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" es idéntico a "5". "3" y "8" no son reconocidos muy bien por el observador de palabras clave y pueden tener que repetirse.

Es posible que deba ajustar los valores mínimo y máximo para cada servo / lado para que los servos no se bloqueen y luego consuman demasiada energía.

"siguiente juego" iniciará el "baile", es decir, una secuencia definida de posiciones, mientras que "juego aleatorio" iniciará el Jumping Jack para realizar una secuencia aleatoria de movimientos. En ambos casos, funcionarán para siempre, por lo que es posible que deba detener los movimientos, p. Ej. con un comando de "posición cero".

"detener juego" evocará "ctrl + c" y detendrá el proceso.

Se pueden utilizar "encender" y "apagar" para encender y apagar los LED.

Modificando los valores de time.sleep puede ajustar la velocidad de los movimientos.

Paso 3: el código y el archivo de comandos

El código que se presenta aquí es una modificación del código de "serpiente auditiva" que forma parte del paquete de búsqueda de palabras clave del proyecto. Simplemente eliminé todo lo que no era necesario para mi aplicación, sin ningún conocimiento real de los detalles. Cualquier mejora es bienvenida.

Luego agregué las partes requeridas para Adafruit Servo Bonnet, según sus archivos de ejemplo.

Me gustaría agradecer a los programadores de ambas partes.

El código se puede encontrar adjunto como archivo. Úselo bajo su propio riesgo, modifíquelo, mejórelo, juegue con él.

# Copyright 2019 Google LLC

# # Con licencia de Apache License, Versión 2.0 (la "Licencia"); # no puede utilizar este archivo excepto de conformidad con la Licencia. # Puede obtener una copia de la Licencia en # # https://www.apache.org/licenses/LICENSE-2.0 # # A menos que lo exija la ley aplicable o se acuerde por escrito, el software # distribuido bajo la Licencia se distribuye en un BASE "TAL CUAL", # SIN GARANTÍAS O CONDICIONES DE NINGÚN TIPO, ya sea expresa o implícita. # Consulte la Licencia para conocer el idioma específico que rige los permisos y # limitaciones de la Licencia. 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 de canales # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # ajustes arriba, medio y abajo para brazos izquierdo y derecho up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft = 15 # número de puerto servo, servo izquierdo (0-8)

rgt = 11 # número de puerto servo, servo derecho (0-8) led_channel_0 = hat.channels [0] # LED establecido en el puerto 0 led_channel_0.duty_cycle = 0 # encender el LED 100% # lista de configuraciones del brazo para la posición de nueve posiciones = [(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)] # define 9 posiciones de JumpingJack, indicadas por enteros 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # una clase de "baile" Controlador (objeto): # Función de devolución de llamada def _init _ (self, q): self._q = q def callback (self, comando): self._q.put (comando) class Aplicación: 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): # controles Jumping Jack, palabras clave: "position x" key = int (keys) p = position [tecla] a = p [0] b = p [1] imprimir ("Posición:", tecla, "izquierda / derecha: ", a," / ", b," grado ") # sys.stdout.write (" Posición: ", tecla," izquierda / derecha: ", a," / ", b," grado ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # controla el baile de Jumping Jack, palabra clave: "siguiente juego" dnce = dance1 sp = (len (dnce)) para r en rango (sp): # orden de posiciones de baile, sp pasos dc = dnce [r] if (dc no en rango (10)): # print ("error de entrada en la posición", sp) dc = 4 p = posición [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # establece la velocidad de movimientos def JumpingJack2 (auto, teclas): # controles Jumping Jack LEDs, palabras clave: "encender / apagar" led = int (teclas) if 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 # apagar LED time.sleep (0.1) if led == 2: # blink led_channel_0.duty_cycle = 0xffff #turn on LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 # enciende el LED al 100% del tiempo de sueño (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): # controla el baile de Jumping Jack, palabra clave: "juego aleatorio" # para h en rango (10): dr = randrange (9) p = posición [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # establece la velocidad de los movimientos def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic es 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):

si no es self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) si no 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 (Verdadero, 0.1) excepto queue. Empty: new_item = None si new_item no es None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) o item == "stop": self._running = False # if (args.debug_keyboard y claves [pygame. K_SPACE]) o item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard y claves [pygame. K_RIGHT]) o item == "right": self. JumpingJack0 (6) if (args.debug_keyboard y claves [pygame. K_LEFT]) o elemento == "izquierda": self. JumpingJack0 (4) if (args.debug_keyboard y claves [pygame. K_UP]) o elemento == " arriba ": self. JumpingJack0 (1) if (args.debug_keyboard y claves [pygame. K_DOWN]) o item ==" abajo ": self. JumpingJack0 (9) if (args.debug_keyboard y claves [pygam e. K_0]) o elemento == "0": self. JumpingJack0 (0) if (args.debug_keyboard y claves [pygame. K_1]) o elemento == "1": self. JumpingJack0 (1) if (args. debug_keyboard y claves [pygame. K_2]) o elemento == "2": self. JumpingJack0 (2) if (args.debug_keyboard y claves [pygame. K_3]) o elemento == "3": self. JumpingJack0 (3) if (args.debug_keyboard y claves [pygame. K_4]) o elemento == "4": self. JumpingJack0 (4) if (args.debug_keyboard y claves [pygame. K_5]) o elemento == "5": self. JumpingJack0 (5) if (args.debug_keyboard y claves [pygame. K_6]) o elemento == "6": self. JumpingJack0 (6) if (args.debug_keyboard y claves [pygame. K_7]) o elemento == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard y claves [pygame. K_8]) o elemento ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard y claves [pygame. K_9]) o elemento == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) o item == "d": self. JumpingJack1 () #dancing Jack, en "next_game" if (args. debug_keyboard y claves [pygame. K_j]) o elemento == "j": self. JumpingJack2 (0) #LED on, ON " switch_on "if (args.debug_keyboard and keys [pygame. K_k]) o item ==" k ": self. JumpingJack2 (1) #LED apagado, encendido" swithch off "if (args.debug_keyboard and keys [pygame. K_l]) o item == "l": self. JumpingJack2 (1) #LED blink "target" if (args.debug_keyboard and keys [pygame. K_r]) o item == "r": self. JumpingJack3 () #baile aleatorio "juego aleatorio" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Usa el teclado para controlar el JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

También existe el archivo de configuración de comandos "commands_v2_hampelmann.txt". Modifica como quieras. Es solo una lista de combinaciones de "comando, tecla, (fuerza,)", basada en el archivo de etiqueta.

position_zero, 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, abajo, moverse_hacia atrás, izquierda, moverse_hacia adelante, derecha, ir_hacia atrás, izquierda, ir_hacia adelante, derecha, 0.8 objetivo, l, mudo, z, sí, y, no, n, encender_en, j, apagar_apagar, k, subir volumen, arriba, bajar volumen, abajo, next_game, d, random_game, r, start_game, s, stop_game, ctrl + c,

Paso 4: Más ideas y otros ejemplos

Es bastante obvio que esta configuración también se puede usar para controlar robots u otros dispositivos. Básicamente, todo lo que podría estar controlado por una Raspberry Pi.

Estoy trabajando en una extensión del script para manejar un MeArm y espero poder presentarlo en octubre de 2019.

También estoy considerando usar el Jumping Jack como semáforo, y usar el programa de reconocimiento de posición de extremidades "project posenet" como una herramienta para leer las posiciones del Jumping Jack y traducirlo de nuevo a un número. De esta forma puede incluso comunicar texto, dado que 2x 8 posiciones pueden indicar 64 números diferentes, más que suficiente para alfabeto, números y signos. Esto podría permitir, aunque ligeramente modificado, una realización física para el IETF propuesto "La transmisión de datagramas IP sobre el sistema de señalización de banderas semáforo (SFSS)" (https://tools.ietf.org/html/rfc4824).

Pero este será otro instructable. Y, como los primeros experimentos indicaron que el gato de salto necesitará modificaciones significativas antes de que el sistema de inteligencia artificial lo reconozca como humano, puede requerir algo de tiempo.

Me gustaría llamar su atención sobre el siguiente instructivo: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, donde se describe un robot de búsqueda de objetos que utiliza una combinación de Raspberry Pi y Google Coral TPU.

Recomendado: