Оглавление:

A Hearing MeArm, управляемый ускорителем Google Coral TPU: 3 шага
A Hearing MeArm, управляемый ускорителем Google Coral TPU: 3 шага

Видео: A Hearing MeArm, управляемый ускорителем Google Coral TPU: 3 шага

Видео: A Hearing MeArm, управляемый ускорителем Google Coral TPU: 3 шага
Видео: Карманный робот манипулятор meArm 2024, Июль
Anonim
A Hearing MeArm, ускоритель Google Coral TPU с управлением
A Hearing MeArm, ускоритель Google Coral TPU с управлением
A Hearing MeArm, ускоритель Google Coral TPU с управлением
A Hearing MeArm, ускоритель Google Coral TPU с управлением
A Hearing MeArm, ускоритель Google Coral TPU с управлением
A Hearing MeArm, ускоритель Google Coral TPU с управлением
A Hearing MeArm, ускоритель Google Coral TPU с управлением
A Hearing MeArm, ускоритель Google Coral TPU с управлением

Далее я хотел бы описать управляемую голосом версию MeArm, маленькую роботизированную руку xyz с захватом. Я использовал MeArm Pi из индустрии MIME, но система должна быть применима к любой версии MeArm или аналогичным устройствам с сервоприводом.

Использование Google Coral TPU Accelerator позволяет запускать быстрые автономные сценарии распознавания голоса TensorFlow на Raspberry Pi и, таким образом, управлять физическими устройствами с помощью голосовых команд с задержкой менее одной секунды.

Описанное здесь устройство представляет собой комбинацию и расширение концепций, описанных в двух предыдущих инструкциях. Это расширение более ранней реализации голосового управления Google Coral, Jumping Jack, описанное здесь, и значительное улучшение MeArm с голосовым управлением Google AIY, описанное здесь.

MeArm с голосовым управлением с использованием системы Google Voice AIY требовал онлайн-доступа, его было нелегко реализовать, требовалось нажимать кнопку для активации прослушивания голосовых команд, и у него было длительное время задержки. Используемый сейчас ускоритель Google Coral TPU Accelerator позволяет запускать модели TensorFlowLite в автономном режиме с высокой скоростью на Raspberry Pi или других устройствах Linux. Среди примеров на странице Google Coral Github есть пример под названием «слышащая змея» для системы распознавания голоса, которая может понимать 140 ключевых фраз (сентябрь 2019 г.), которые затем сопоставляются с виртуальными нажатиями клавиш. Объединение этих "нажатий клавиш" с выполнением некоторых функций, запрограммированных на Python, позволяет создать устройство, управляемое голосовыми командами. Недавно я описал первую реализацию, электромеханическое прыгающее гнездо с голосовым управлением. Реализация здесь немного сложнее и позволяет управлять всеми четырьмя сервоприводами MeArm, чтобы либо перемещать MeArm непрерывно, либо заставлять его перемещаться в ряд заранее определенных позиции, либо для выполнения более сложных задач.

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

Запасы

  • MeArm. Здесь используется: MeArm Pi от MIME Industries
  • Raspberry Pi 4
  • Ускоритель Google Coral TPU
  • Капот Adafruit с 16-канальным сервоприводом
  • некоторые соединительные кабели
  • опционально: конденсатор для сервопривода, около 400 мкФ для 4 сервоприводов (рекомендуется Adafruit)
  • Источник питания 5-6 В для сервопривода капота. Я здесь использовал старое зарядное устройство на 6 В, также работает батарейный блок 4x AA
  • Микрофон. Я использовал старую веб-камеру Microsoft HD3000 в качестве микрофона.

Шаг 1: Настройка системы

Настройка системы
Настройка системы
Настройка системы
Настройка системы

Загрузите предварительно настроенный образ Raspian для ускорителя Google Coral TPU Accelerator со страницы Google Coral Github и установите его на карту µSD. Изображение также содержит несколько примеров скриптов. Настройте Pi, как показано.

Установите пример поиска ключевых слов с сайта Google Coral GitHub, если он не включен в образ, и все необходимые программы. Присоедините микрофон к Pi. Я бы порекомендовал поиграть с примером "Hearing Snake", чтобы убедиться, что все работает.

Загрузите и установите программное обеспечение Adafruit для 16-канального капота, как описано здесь. Установите капот и поиграйте с примерами Adafruit, чтобы убедиться, что все работает правильно.

Загрузите файлы, прикрепленные к этому руководству, и скопируйте их в папку «Project Keyword Spotter». Файл "commands_v1_MeArm.txt" необходимо скопировать в подпапку "config".

Подключите сервоприводы MeArm к сервокапоту, как показано. Я использовал порт 15 для движения вверх / вниз, порт 11 для движения вперед / назад, порт 7 для поворота и порт 3 для сервоприводов захвата.

В сценарии вам, возможно, придется настроить минимальные / центральные / максимальные значения для каждого сервопривода в соответствии с вашей конфигурацией. Эти настройки помогают избежать повреждения сервоприводов. Возможно, вам также придется изменить включенные списки "позиции", "транспорт1" и "транспорт2".

Запускаем скрипт. До сих пор я запускал его из IDE.

Если вы хотите изменить ключевые фразы, которые вызывают определенную функцию, в соответствии с вашими потребностями. Полный список доступных KeyPhrases находится в файле "labels_gc2 raw.txt" в подпапке config.

Система имеет время задержки около 1 секунды, но во многом зависит от того, какие действия выполняются. В некоторых случаях необходимо повторить ключевой этап, точность распознавания не всегда 100%.

Шаг 2: Использование устройства

Если все настроено и проверено, можно запускать устройство.

Текущее ограничение заключается в том, что данный приказ выполняется повторно до тех пор, пока он не будет остановлен (с использованием «стоп игры») или дан другой приказ. Сложные многоступенчатые задачи, например «transport1» (вызывается фразой «запустить игру») всегда выполняются до последнего шага.

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

Как вы можете видеть в сопроводительном видео, я построил объект в форме диаболо из LEGO, который может быть подхвачен MeArm и перемещен из одного места в другое с помощью предопределенного набора движений. Вы можете определить свои собственные функции, изменив списки «transport1» или «transport2».

Шаг 3: сценарий

Перечисленный здесь скрипт является модификацией примера "Hearing Snake" из "Project Keyword Spotter". Пример был сокращен до минимума, затем была добавлена часть для привода сервоприводов на основе программного обеспечения и примеров, предоставленных для сервокапота Adafruit.

На данный момент скрипт не оптимизирован. Используйте на свой страх и риск, не стесняйтесь изменять и оптимизировать.

В дополнение к скрипту python есть файл команд и файл используемых меток. Поместите его в подпапку config.

Как упоминалось ранее, может потребоваться несколько настроек параметров, чтобы адаптировать сценарий к вашему особому MeArm или другому устройству.

# Copyright 2019 Google LLC #

# Под лицензией Apache License, версия 2.0 («Лицензия»); # вы не можете использовать этот файл, кроме как в соответствии с Лицензией. # Вы можете получить копию лицензии по адресу # # href = "https://www.apache.org/licenses/LICENSE-2.0" href = "https://www.apache.org/licenses/LICENSE-2.0" https://www.apache.org/licenses/LICENSE-2.0 # # Если это не требуется применимым законодательством или не согласовано в письменной форме, # программное обеспечение, распространяемое по Лицензии, распространяется на УСЛОВИЯХ "КАК ЕСТЬ", # БЕЗ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО ВИДА, явного или подразумеваемого. # См. Лицензию, чтобы узнать о разрешениях и # ограничениях на конкретном языке в соответствии с Лицензией. # исходный код "hear_snake" был изменен для реализации MeArm доктором Х. '' 'Инструкции В моей реализации используется Raspbery Pi 4 с ускорителем Google Coral и прикрепленным к нему 16-канальным сервоприводом Adafruit. Сервоприводы MeArm (индустрия MIME) были прикреплены к портам 3, 7, 11 и 15 крышки. Для получения дополнительных сведений ознакомьтесь с инструкцией "Hearing MeArm". Команды: «позиция x», x = от 0 до 9, перемещает устройство в заданное заранее заданное положение. «двигаться / идти вверх», «двигаться / идти вниз», «идти / повернуть вперед», «идти / повернуть назад», «повернуть / пойти влево» и «повернуть / пойти вправо» вызывают медленное, пошаговое движение в данном направление, «стоп игра» останавливает движения. «открыть вкладку» и «закрыть вкладку» открывает или закрывает захват. "start video" заставляет устройство следовать заранее заданному порядку позиций, определенному списком "позиции". «случайная игра» приводит к случайному шаблону движений, «стоп игра» завершает ее. «запустить игру» запускает другую серию ходов, предопределенных списком «transport1», «следующая игра» - обратная операция, предопределенная параметром «transport2». Используйте на свой страх и риск. '' 'from _future_ import absolute_import из _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 случайный импорт randomrange из 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 (каналы = 16) # установить количество каналов # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # минимальные, центральные и максимальные настройки up_l = 145 # сервопривод вверх / вниз: вверх md_l = 95 dn_l = 45 up_r = 135 # сервопривод вперед / назад md_r = 90 dn_r = 50 ri_t = 30 # поворотный рычаг вправо или влево: правое положение md_t = 90 # поворотный рычаг вправо или влево: центральное положение le_t = 150 op_g = 65 # захват открыт md_g = 90 # захват по центру cl _g = 130 # захват закрыт vert = 15 # номер порта сервопривода, сервопривод вверх / вниз forw = 11 # номер порта сервопривода, поворот сервопривода вперед / назад = 7 # порт сервопривода для поворота захвата серво = 3 # порт сервопривода для захвата servo # список настроек руки для девяти позиций position = [(md_l, md_r, md_t, op_g), (up_l, md_r, ri_t, op_g), (up_l, md_r, md_t, cl_g), (up_l, md_r, le_t, cl_g), (md_l, md_r, md_t, op_g), (md_l, md_r, md_t, md_g), (md_l, md_r, md_t, cl_g), (dn_l, dn_r, ri_t, op_g), (dn_l_d_dgt_r,), (dn_l, dn_r, le_t, md_g)] # определяет 10 базовых позиций, обозначенных целыми числами 0-9 # транспортные процедуры [vert / forward / turn / grip] transport1 = [(140, 70, 65, op_g), (110, 50, 65, op_g), (65, 50, 65, op_g), (65, 70, 65, cl_g), (120, 70, 65, cl_g), #get object (100, 70, 135, cl_g), (100, 80, 135, cl_g), (100, 80, 135, md_g), (100, 80, 135, op_g), (140, 70, 135, op_g), (140, 70, 90, op_g), (140, 70, 65, op_g)]

транспорт2 = [(140, 70, 65, op_g), (140, 70, 135, op_g), (95, 70, 135, op_g), (95, 80, 135, op_g), (95, 80, 135, cl_g), (110, 70, 135, cl_g), (110, 70, 65, cl_g), (70, 70, 65, cl_g), (70, 70, 65, op_g), (80, 50, 65, op_g)]

dance1 = (0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # "танец"

# перемещение MeArm в нулевое положение status = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [поворот]. angle = status [2] kit.servo [grip].angle = status [3] print (status) class Controler (object): #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 MeArmPos (self, keys): # переводит MeArm в предустановленные позиции, ключевые слова: "position x" key = int (keys) p = позиция [ключ] a = p [0] b = p [1] c = p [2] d = p [3] print ("Положения:", ключ, "верт. / вперед / поворот / захват:", a, "/", b, "/", c, "/", d, "градусы") status = [a, b, c, d] # документ текущего статуса print (status) # sys.stdout.write ("Position: ", ключ," влево / вправо: ", a," / ", b," градус ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [поворот].angle = c kit.servo [захват].angle = d time.sleep (0.5) def DancingMeArm (self): # управляет танцем MeArm, ключевое слово: "start_video" dnce = dance1 sp = (len (dnce)) для r в диапазоне (sp): # танцевальный порядок позиций, sp шагов dc = dnce [r] p = position [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [вперед].angle = b kit.servo [поворот].angle = c kit.servo [захват].angle = d time.sleep (1) # устанавливает скорость движений time.sleep (0.5) # break в конце процедуры def TransMeArm1 (self): # управляет транспортом MeArm 1, ключевое слово: "запустить игру" tr1 = transport1 sp = (len (tr1)) # вычислить количество шагов для r в диапазоне (sp): # перейти к любому шагу p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit. servo [vert].angle = a kit.servo [вперед].angle = b kit.servo [поворот].angle = c kit.servo [захват].angle = d print (p) time.sleep (1) # наборы скорость движений time.sleep (0.5) def TransMeArm2 (self): # управляет танцем MeArm, ключевое слово: "следующая игра" tr2 = transport2 sp = (len (tr2)) для r в диапазоне (sp): # танцевальный порядок позиций, sp шагов p = tr2 [r] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [вперед].angle = b kit.servo [поворот].angle = c kit.servo [захват].angle = d print (p) time.sleep (1) # задает скорость движений time.sleep (0,5) def RandomMoves (self): # случайный переход между предопределенными позициями, ключевое слово: "random game" dr = randrange (9) # случайный выбор позиции p = position [dr] # чтение параметров позиции a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [вперед].angle = b kit.servo [поворот].angle = c kit.servo [захват].angle = d time.sleep (1) # задает скорость движений def MoveUp (self): # поднимает захват маленькими шагами u0 = status [0] # считывает текущий статус u1 = u0 + 5 # плюс x градусов if (u1 > up_l): # проверяет, не превышаются ли параметры min / max u1 = up_l # в противном случае устанавливается минимальное / максимальное значение kit.servo [vert].angle = u1 # перемещать статус сервопривода [0] = u1 # настраивать значение статуса print (" up ", status) time.sleep (1) # устанавливает защиту от скорости MoveDown (self): d 0 = статус [0] d1 = d0 - 5 # минус x градусов if (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # статус сервопривода перемещения [1] = f1 print ("вперед", статус) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 # минус x градусов if (b1 le_t): l1 = le_t kit.servo [поворот].angle = l1 # перемещение сервопривода status [2] = l1 print ("left", status) time.sleep (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 # минус x градусов if (r1 <ri_t): r1 = ri_t kit.servo [поворот].angle = r1 # переместить состояние сервопривода [2] = r1 print ("right", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # установить захват в "открытое" положение: "open_tab" time.sleep (0.5) status [3] = op_g def CloseGrip (self): kit.servo [grip].angle = cl_g # установить захват в "закрытое" положение: " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # ничего не делает, но останавливает движения print (" stop ", status) time.sleep (0.25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic, если args.mic имеет значение None else int (args.mic) model.classify_audio (микрофон, движок, labels_file = "config / labels_gc2.raw.txt", commands_file = "config / commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hmes = int (args.sample_um_hz), n int (args.num_frames_hop)) def on_execute (self, args): if not self.on_init (): self._running = False q = model.get_queue () self._controler = Controler (q) if not args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 при self._running: pygame.event.pump () если args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (True, 0.1) except queue. Empty: new_item = None, если new_item не None: item = new_item if (args.debug_keyboard и keys [pygame. K_ESCAPE]) или item == "stop": self._running = False # if (args.debug_keyboard and keys [pygame. K_SPACE]) или item == "go": # self. MeArmPos (7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) или item == "right": # поверните направо self. MoveRight () if (args.debug_ke yboard and keys [pygame. K_LEFT]) или item == "left": # поверните налево self. MoveLeft () if (args.debug_keyboard and keys [pygame. K_UP]) или item == "up": self. MoveUp () if (args.debug_keyboard и keys [pygame. K_DOWN]) или item == "down": self. MoveDown () if (args.debug_keyboard and keys [pygame. K_B]) или item == "b": # назад self. MoveBack () if (args.debug_keyboard and keys [pygame. K_F]) или item == "f": # пересылает self. MoveForw () if (args.debug_keyboard and keys [pygame. K_O]) или item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard and keys [pygame. K_C]) или item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard and keys [pygame. K_S]) или item == "s": # остановить движение: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) или item == "0": self. MeArmPos (0) if (args.debug_keyboard and keys [pygame. K_1]) или item == "1": self. MeArmPos (1) if (args.debug_keyboard and keys [pygame. K_2]) или item == "2": self. MeArmPos (2) if (args.debug_keyboard и ключи [pygame. K_3]) или это em == "3": self. MeArmPos (3) if (args.debug_keyboard and keys [pygame. K_4]) или item == "4": self. MeArmPos (4) if (args.debug_keyboard and keys [pygame. K_5]) или item == "5": self. MeArmPos (5) if (args.debug_keyboard and keys [pygame. K_6]) или item == "6": self. MeArmPos (6) if (args.debug_keyboard и keys [pygame. K_7]) или item == "7": self. MeArmPos (7) if (args.debug_keyboard and keys [pygame. K_8]) или item == "8": self. MeArmPos (8) if (args.debug_keyboard и keys [pygame. K_9]) или item == "9": self. MeArmPos (9) if (args.debug_keyboard and keys [pygame. K_a]) или item == "d": self. DancingMeArm () #dancing MeArm, на "next_game" if (args.debug_keyboard and keys [pygame. K_r]) или item == "r": self. RandomMoves () #random dance "random game" if (args.debug_keyboard and keys [pygame. K_j]) или item == "j": self. TransMeArm1 () # транспортный объект: "обед_игра" if (args.debug_keyboard and keys [pygame. K_k]) или item == "k": self. TransMeArm2 () # обратное направление транспортного объекта: "next_game" '' 'if (args.debug_keyboard и keys [pygame. K_l]) или item == "l": self. JumpingJack2 (1) #LED blink "target" '' 'time.sleep (0.05) self.on_cleanup () if _name_ ==' _main_ ': parser = argparse. ArgumentParser () parser.add_argument ('- debug_keyboard', help = 'Используйте клавиатуру для управления MeArm.', action = 'store_true', по умолчанию = False) model.add_model_flags (parser) args = parser.parse_args () the_app = App () the_app.on_execute (аргументы)

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