Оглавление:

Джек со слухом, версия ускорителя Google Coral TPU: 4 шага
Джек со слухом, версия ускорителя Google Coral TPU: 4 шага

Видео: Джек со слухом, версия ускорителя Google Coral TPU: 4 шага

Видео: Джек со слухом, версия ускорителя Google Coral TPU: 4 шага
Видео: ПАША ФЛЕЙЗИН СПАЛИЛ ЛИЦО #Пашафлейзин 2024, Июль
Anonim
Слуховой прыгающий джек, версия ускорителя Google Coral TPU
Слуховой прыгающий джек, версия ускорителя Google Coral TPU
Слуховой прыгающий джек, версия ускорителя Google Coral TPU
Слуховой прыгающий джек, версия ускорителя Google Coral TPU
Слуховой прыгающий джек, версия ускорителя Google Coral TPU
Слуховой прыгающий джек, версия ускорителя Google Coral TPU

Он двигает своими конечностями, он слушает ваши приказы, он управляется новейшими технологиями машинного обучения

«Домкрат для прыжков со слухом» - это простой электромеханический домкрат для прыжков, приводимый в движение двумя сервоприводами и очень простым механизмом, имеющим светодиоды в качестве «глаз». Он управляется простыми голосовыми командами, указывающими, какое из девяти предопределенных положений он должен занять, или должен ли светодиод быть включен или выключен, или должен ли он выполнять предопределенный «танец» или случайный набор движений.

Основным элементом системы является ускоритель Google Coral TPU, который позволяет запускать модели Tensorflow Lite в автономном режиме с очень высокой скоростью даже на «слабом» компьютере, таком как Raspberry Pi. Это позволяет, например, быстрая идентификация и классификация объектов с помощью камеры RPi, а также для локального запуска функций распознавания голоса на основе машинного обучения.

Насколько мне известно, это первый опубликованный пример физического DIY-устройства с распознаванием голоса Coral Accelerator, и прилагаемый пример кода также может использоваться для других, более сложных проектов.

Голосовое управление основано на примере «слышащая змея» в «поисковике ключевых слов проекта» (https://github.com/google-coral/project-keyword-spotter), который недавно (сентябрь 2019 г.) был размещен на GitHub. В моей конфигурации система состоит из Raspberry Pi 4, оснащенного 16-канальным сервоприводом Adafruit, ускорителя Google Coral TPU и веб-камеры, которая здесь используется в качестве микрофона. Прыгающий Джек был описан ранее в предыдущем руководстве, где он управлялся комплектом Google Voice для чтения голосовых команд, прикреплен к сервоприводу в версии 2.0, описанной ниже.

Предыдущая версия Google Voice Kit имела три основных ограничения: она зависела от веб-служб распознавания голоса Google, и настройка была относительно сложной, требовалось нажать какую-то кнопку, прежде чем вы могли дать команду, и была серьезная задержка. между произнесением команды и ответом системы. Использование ускорителя Google Coral сокращает время отклика до секунд, не зависит от подключения к Интернету и постоянно прослушивает. С некоторыми изменениями вы можете использовать его для управления более сложными устройствами, такими как Jumping Jack, роботами или автомобилями, или чем угодно, что вы можете построить и контролировать с помощью Raspberry Pi.

В своей текущей версии Keyword Spotter понимает набор из около 140 коротких ключевых слов / ключевых фраз, определенных в прилагаемом файле модели («voice_commands_v0.7_egetpu.tflite») и описанных в отдельном файле меток («labels_gc2.raw.txt»). Определенные свободно изменяемым файлом («commands_v2_hampelmann.txt»), ключевые слова, специально используемые нашим скриптом, затем сопоставляются с нажатиями клавиш на виртуальной клавиатуре, например для букв, цифр, вверх / вниз / влево / вправо, crtl + c и т. д.

Тогда, например, с помощью pygame.key эти «нажатия клавиш» считываются и используются для управления тем, какие действия должно выполнять устройство, в данном случае прыгун. В нашем случае это означает приведение двух сервоприводов в заранее заданные положения или включение или выключение светодиодов. Поскольку корректировщик ключевых слов работает в отдельной ступени, он может постоянно прислушиваться к вашим приказам.

Версия 21 сентября 2019 г.

Запасы

Raspberry Pi 4, через Пиморони

Google Coral TPU Accelerator, через Mouser Germany, 72 €

Adafruit 16 Servo Bonnet, через Пиморони, около 10 €

www.adafruit.com/product/3416

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

Заголовок укладчика (при необходимости)

www.adafruit.com/product/2223

4 батарейных блока AA (или другой источник питания 5-6 В) для сервопривода крышки

Старая веб-камера, как микрофон

Прыгающий домкрат с сервоприводом, как описано в предыдущем руководстве. Чертежи-макеты прилагаются к следующему шагу, но могут потребовать корректировок.

Необходимые детали для прыжкового домкрата:

- пластина Forex 3 мм

- 2 микро сервопривода

- винты и гайки 2 и 3 мм

- 2 белых светодиода и резистор

- немного кабеля

Шаг 1. Настройка устройства

Настройка устройства
Настройка устройства
Настройка устройства
Настройка устройства
Настройка устройства
Настройка устройства

Чтобы построить Jumping Jack, следуйте указаниям, приведенным в предыдущем руководстве. Я использовал Forex для своего прототипа, но вы можете использовать лазерную резку из акрила или фанеры. Возможно, вам придется отрегулировать компоновку в соответствии с размером ваших сервоприводов и т. Д. Проверьте, могут ли конечности и шестерня двигаться без трения.

Настройте свой Raspberry Pi. На сайте Coral Github доступен образ Raspian, который содержит все необходимое для запуска ускорителя Coral на Pi и содержит множество проектов со всеми уже установленными настройками.

Получите средство поиска ключевых слов для проекта со страницы Google Coral GitHub. Установите все необходимое программное обеспечение, как указано.

Установите предоставленные файлы. Поместите скрипт python прыгающего джек в папку обнаружения ключевых слов проекта, а файл соответствующих команд - в подпапку config.

Присоедините сервопривод Adafruit к Pi. Поскольку я использую корпус RPI с вентилятором, мне нужно было использовать укладчики GPIO (например, доступные от Pimoroni) для подключения. Установите все необходимые библиотеки, как указано в инструкциях Adafruit для сервопривода капота.

Подключите источник питания 5-6 В к сервоприводу. Присоедините сервоприводы и светодиоды. В моем случае я использовал порт 0 для светодиодов и порты 11 и 15 для сервоприводов.

Чтобы все проверить, я бы порекомендовал сначала попробовать пример ключевого слова проекта «слышащую змею» и примеры сервокопов Adafruit.

Шаг 2: Запуск прыгающего домкрата

Если все части настроены и работают, попробуйте использовать его. Вы можете запустить сценарий в среде IDE или из командной строки.

Крик «позиция 0» - «позиция 9» заставит Прыгающего Джека занять одну из предопределенных позиций. Я определил «1» как обе руки вверх (uu), «3» как левую вверх, правую вниз (ud), «9» как обе руки вниз (dd) и «5» как обе руки по центру (cc).

uu uc ud = 1 2 3

куб куб cd = 4 5 6

du dc dd = 7 8 9

«0» идентично «5». "3" и "8" не очень хорошо распознаются поисковиком ключевых слов, и, возможно, их придется повторять.

Возможно, вам придется настроить минимальные и максимальные значения для каждого сервопривода / стороны, чтобы сервоприводы не были заблокированы и потребляли слишком много энергии.

«следующая игра» запустит «танец», то есть определенную последовательность позиций, в то время как «случайная игра» запустит прыгающий валет для выполнения случайной последовательности ходов. В обоих случаях они будут работать вечно, поэтому вам, возможно, придется прекратить движения, например командой "нулевое положение".

«остановить игру» вызовет «ctrl + c» и остановит процесс.

«включить» и «выключить» можно использовать для включения и выключения светодиодов.

Изменяя значения time.sleep, вы можете регулировать скорость движений.

Шаг 3. Код и файл команд

Представленный здесь код является модификацией кода «слышащая змея», который является частью пакета подсказок ключевых слов проекта. Я просто удалил все, что не было необходимо для моего приложения, без какого-либо реального понимания деталей. Любые улучшения приветствуются.

Затем я добавил детали, необходимые для сервопривода Adafruit, на основе их файлов с примерами.

Хочу поблагодарить программистов обеих частей.

Код можно найти в прикрепленном файле. Используйте его на свой страх и риск, модифицируйте, улучшайте, играйте с ним.

# Copyright 2019 Google LLC

# # Под лицензией Apache License, версия 2.0 («Лицензия»); # вы не можете использовать этот файл, кроме как в соответствии с Лицензией. # Вы можете получить копию Лицензии по адресу # # https://www.apache.org/licenses/LICENSE-2.0 # # Если это не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение, # распространяемое по Лицензии, распространяется на ОСНОВАНИЕ «КАК ЕСТЬ», # БЕЗ ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых. # См. Лицензию, чтобы узнать о разрешениях и # ограничениях на конкретном языке в соответствии с Лицензией. 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 Время импорта потока из 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 время импорта i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (channels = 16) # set number каналов # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # настройки верхнего, среднего и нижнего положения для левого и правого рычага up_l = 35 md_l = 90 dn_l = 160 up_r = 160 мд_р = 90 дн_р = 35

lft = 15 # номер сервопорта, левый сервопривод (0-8)

rgt = 11 # номер сервопорта, правый сервопривод (0-8) led_channel_0 = hat.channels [0] # Светодиод установлен на порту 0 led_channel_0.duty_cycle = 0 # включить светодиод 100% # список настроек рычага для положения в девяти положениях = [(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)] # определяет 9 позиций JumpingJack, обозначенных целыми числами 0-9 dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # "танцевальный" класс Controler (объект): # 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 JumpingJack0 (self, keys): # управляет JumpingJack, ключевые слова: "position x" key = int (keys) p = position [key] a = p [0] b = p [1] print ("Position:", key, "left / right: ", a," / ", b," степень ") # sys.stdout.write (" Position: ", key," left / right: ", a," / ", b," степень ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (self): # управляет JumpingJack dance, ключевое слово: "следующая игра" dnce = dance1 sp = (len (dnce)) for r in range (sp): # танцевальный порядок позиций, sp шаги dc = dnce [r] if (dc not in range (10)): # print ("ошибка ввода в позиции", 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) # устанавливает скорость движений def JumpingJack2 (self, keys): # управляет светодиодами Jumping Jack, ключевые слова: "включить / выключить" led = int (keys) if led == 1: led_channel_0.duty_cycle = 0xffff # включить светодиод 100% time.sleep (0.1) если led == 0: led_channel_0.duty_cycle = 0 # выключить светодиод time.sleep (0.1) if led == 2: # мигать led_channel_0.duty_cycle = 0xffff # включить светодиод 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 # включить светодиод 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff # включить светодиод 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 # включить светодиод 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff # включить светодиод 100% time.sleep (0.1) def JumpingJack3 (self): # управляет Jumping Jack dance, ключевое слово: "random game" # для h в диапазоне (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) # устанавливает скорость движений def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic не является другим 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.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) если не args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 в то время как self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (True, 0.1) кроме queue. Empty: new_item = None, если new_item не None: item = new_item if (args.debug_keyboard and keys [pygame. K_ESCAPE]) или item == "stop": self._running = False # if (args.debug_keyboard и ключи [pygame. K_SPACE]) или item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard и keys [pygame. K_RIGHT]) или item == "right": self. JumpingJack0 (6) if (args.debug_keyboard и ключи [pygame. K_LEFT]) или item == "left": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_UP]) или item == " вверх ": self. JumpingJack0 (1) if (args.debug_keyboard и keys [pygame. K_DOWN]) или item ==" down ": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygam e. K_0]) или item == "0": self. JumpingJack0 (0) if (args.debug_keyboard and keys [pygame. K_1]) или item == "1": self. JumpingJack0 (1) if (args. debug_keyboard и ключи [pygame. K_2]) или item == "2": self. JumpingJack0 (2) if (args.debug_keyboard and keys [pygame. K_3]) или item == "3": self. JumpingJack0 (3) if (args.debug_keyboard и ключи [pygame. K_4]) или item == "4": self. JumpingJack0 (4) if (args.debug_keyboard and keys [pygame. K_5]) или item == "5": self. JumpingJack0 (5) if (args.debug_keyboard and keys [pygame. K_6]) или item == "6": self. JumpingJack0 (6) if (args.debug_keyboard and keys [pygame. K_7]) или item == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard и keys [pygame. K_8]) или item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard and keys [pygame. K_9]) или item == "9": self. JumpingJack0 (9) if (args.debug_keyboard and keys [pygame. K_a]) или item == "d": self. JumpingJack1 () # танцующий Джек, в "next_game" if (args. debug_keyboard и keys [pygame. K_j]) или item == "j": self. JumpingJack2 (0) # Светодиод включен, включен » switch_on "if (args.debug_keyboard and keys [pygame. K_k]) или item ==" k ": self. JumpingJack2 (1) #LED off, on" swithch off "if (args.debug_keyboard and keys [pygame. K_l]) или item == "l": self. JumpingJack2 (1) #LED мигает "target" if (args.debug_keyboard and keys [pygame. K_r]) или item == "r": self. JumpingJack3 () #random dance "случайная игра" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Используйте клавиатуру для управления JumpingJack. ', action =' store_true ', по умолчанию = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Также есть файл конфигурации команд "commands_v2_hampelmann.txt". Модифицируйте как хотите. Это просто список комбинаций «команда, ключ, (сила)», основанный на файле метки.

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, вниз, move_backwards, left, move_forwards, right, go_backwards, left, go_forwards, right, 0.8 target, l, mute, z, yes, y, no, n, switch_on, j, switch_off, k, volume_up, up, volume_down, вниз, следующая_игра, d, случайная_игра, r, начальная_игра, s, стоп-игра, ctrl + c,

Шаг 4: Дополнительные идеи и другие примеры

Совершенно очевидно, что эту настройку также можно использовать для управления роботами или другими устройствами. Практически все, что может управляться Raspberry Pi.

Я работаю над расширением скрипта для управления MeArm и надеюсь, что смогу представить его в октябре 2019 года.

Я также подумываю использовать Jumping Jack в качестве семафора и использовать программу распознавания положения конечностей "project posenet" в качестве инструмента для чтения положений Jumping Jack и преобразования их обратно в число. Таким образом, он может даже передавать текст, учитывая, что 2 x 8 позиций могут указывать 64 различных числа, более чем достаточно для алфавита, чисел и знаков. Это могло бы позволить, хотя и с небольшими изменениями, физическую реализацию предлагаемой IETF «Передачи IP-дейтаграмм через систему сигнализации семафорных флагов (SFSS)» (https://tools.ietf.org/html/rfc4824).

Но это будет другое поучительное дело. И, как показали первые эксперименты, прыгуну потребуются значительные изменения, прежде чем он будет признан системой ИИ как человек, может потребоваться некоторое время.

Я хотел бы обратить ваше внимание на следующую инструкцию: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, где описывается робот для поиска объектов, использующий комбинацию Raspberry Pi и Google Coral TPU.

Рекомендуемые: