Съдържание:

A Hearing Jumping Jack, Google Coral TPU Accelerator Версия: 4 стъпки
A Hearing Jumping Jack, Google Coral TPU Accelerator Версия: 4 стъпки

Видео: A Hearing Jumping Jack, Google Coral TPU Accelerator Версия: 4 стъпки

Видео: A Hearing Jumping Jack, Google Coral TPU Accelerator Версия: 4 стъпки
Видео: The BEST Self-Hosted CCTV Solution With AI Object Detection? 2024, Ноември
Anonim
A Hearing Jumping Jack, версия на Google Coral TPU Accelerator
A Hearing Jumping Jack, версия на Google Coral TPU Accelerator
A Hearing Jumping Jack, версия на Google Coral TPU Accelerator
A Hearing Jumping Jack, версия на Google Coral TPU Accelerator
A Hearing Jumping Jack, версия на Google Coral TPU Accelerator
A Hearing Jumping Jack, версия на Google Coral TPU Accelerator

Той движи крайниците си, слуша вашите поръчки, задвижван е от най -новата технология за машинно обучение

„Слуховият скачащ жак“е прост електромеханичен скачащ жак, задвижван от две микро сервоустройства и много проста предавка, със светодиоди като „очи“. Той се управлява чрез прости гласови команди, показващи коя от деветте предварително определени позиции да заеме, или дали светодиодът трябва да се включва или изключва, или ако изпълнява предварително определен „танц“или произволен набор от движения.

Основният елемент на системата е ускорителят на 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, TPU ускорител на Google Coral и уеб камера, използвана тук като микрофон. Джакът за скачане беше описан по -рано в предишна инструкция, където той беше задвижван от комплекта Google Voice за четене на гласови команди, е прикрепен към Servo Bonnet във версия 2.0, описана по -долу.

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

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

Тогава, напр. използвайки pygame.key, тези „натискания на клавиши“се четат и използват за контролиране на действията, които дадено устройство, тук скачащият жак, ще извърши. В нашия случай това означава да задвижите двата сервомотора до предварително определени позиции или да включите или изключите светодиодите. Тъй като споттерът за ключови думи работи в отделен протектор, той може постоянно да слуша вашите поръчки.

Версия 21 септември 2019 г.

Консумативи

Raspberry Pi 4, чрез Pimoroni

Google Coral TPU Accelerator, чрез Mouser Германия, 72 €

Adafruit 16 Servo Bonnet, чрез Pimoroni, около 10 €

www.adafruit.com/product/3416

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

Заглавка за подреждане (ако е необходимо)

www.adafruit.com/product/2223

4x AA батерия (или друг източник на захранване 5-6V) за Servo Bonnet

Стара уеб камера, като микрофон

Jumping Jack със серво задвижване, както е описано в предишна инструкция. Чертежите на оформлението са приложени към следващата стъпка, но може да изискват корекции.

Необходими части за скачащия жак:

- 3 мм форекс плоча

- 2 микро серво

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

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

- малко кабел

Стъпка 1: Настройка на устройството

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

За да изградите Jumping Jack, моля, следвайте указанията, дадени в предишна инструкция. Използвах Forex за моя прототип, но можете да използвате лазерно изрязани акрилни плочи или плочи от шперплат. Може да се наложи да коригирате оформлението според размера на вашите сервомотори и др. Проверете дали крайниците и предавката могат да се движат без триене.

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

Вземете споттер за ключови думи за проекта от страницата на Google Coral GitHub. Инсталирайте целия необходим софтуер, както е посочено.

Инсталирайте предоставените файлове. Поставете скрипта за прескачане на жак python в папката за откриване на ключови думи на проекта и съответния файл с команди в подпапката config.

Прикрепете Servo капака на Adafruit към Pi. Тъй като използвам RPI корпус с вентилатор, трябваше да използвам GPIO стекери (напр. Налични от Pimoroni), за да активирам връзката. Инсталирайте всички необходими библиотеки, както е посочено в инструкциите на Adafruit за серво капака.

Прикрепете източник на захранване 5-6V към серво капака. Прикрепете серво и LED. В моя случай използвах порт 0 за светодиодите и портове 11 и 15 за сервомоторите.

За да проверите всичко, бих препоръчал първо да изпробвате примера за ключови думи за проекта „чуваща змия“и примерите със серво капак на Adafruit.

Стъпка 2: Тичане на скачащия жак

Ако всички части са настроени и работят, опитайте се да ги използвате. Можете да стартирате скрипта в IDE или от командния ред.

Извикването на „позиция 0“на „позиция 9“ще извика Jumping Jack да заеме една от предварително определените позиции. Определих "1" като двете ръце нагоре (uu), "3" като ляво нагоре, надясно надолу (ud), "9" като двете ръце надолу (dd) и "5" като двете ръце центрирани (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" е идентично с "5". "3" и "8" не се разпознават много добре от ключовите думи spotter и може да се наложи да бъдат повторени.

Може да се наложи да регулирате минималните и максималните стойности за всяко серво/страна, така че сервомоторите да не бъдат блокирани и след това да черпят твърде много енергия.

"следваща игра" ще започне "танца", т.е. определена последователност от позиции, докато "произволна игра" ще започне Jumping Jack, за да изпълни произволна последователност от ходове. И в двата случая те ще работят завинаги, така че може да се наложи да спрете движенията, напр. с команда "позиция нула".

„стоп играта“ще предизвика „ctrl + c“и ще спре процеса.

"включване" и "изключване" могат да се използват за включване и изключване на светодиодите.

Чрез промяна на стойностите на time.sleep можете да регулирате скоростта на движенията.

Стъпка 3: Кодът и файлът с команди

Кодът, представен тук, е модификация на кода „чуваща змия“, който е част от пакета за търсене на ключови думи за проекта. Просто премахнах всичко, което не беше необходимо за моето приложение, без никакво реално разбиране на детайлите. Всякакви подобрения са добре дошли.

След това добавих частите, необходими за Adafruit Servo Bonnet, въз основа на техните примерни файлове.

Искам да благодаря на програмистите от двете части.

Кодът може да се намери прикачен като файл. Използвайте го на свой собствен риск, променяйте го, подобрявайте го, играйте с него.

# Авторско право 2019 Google LLC

# # Лицензиран под лиценза Apache, Версия 2.0 („Лицензът“); # не можете да използвате този файл, освен в съответствие с Лиценза. # Можете да получите копие от Лиценза на # # https://www.apache.org/licenses/LICENSE-2.0 # # Освен ако не се изисква от приложимото законодателство или е уговорено писмено, софтуерът #, разпространен по Лиценза, се разпространява на ОСНОВА "КАКТО Е", # БЕЗ ГАРАНЦИИ ИЛИ УСЛОВИЯ НА ВСИЧКИ ВИДОВЕ, изрични или подразбиращи се. # Вижте Лиценза за конкретния език, уреждащ разрешенията и # ограниченията по Лиценза. от _future_ импортиране абсолютен_импорт от _future_ импорт разделение от _future_ импорт print_function импортиране argparse внос os от произволен импорт randint от резба импортиране Време за импортиране на нишка от edgetpu.basic.basic_engine импортиране BasicEngine модел за импортиране импортиране pygame от pygame.locals импортиране * опашка за импортиране от произволен импорт randrange от adafruit_servokit внос ServoKit борд за внос внос busio внос 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 = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

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

rgt = 11 # номер на серво порт, дясно серво (0-8) led_channel_0 = hat.channels [0] # светодиод на порт 0 led_channel_0.duty_cycle = 0 # включване на LED 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) # a "dance" клас Контролер (обект): # Функция за обратно повикване def _init _ (self, q): self._q = q def callback (self, команда): self._q.put (команда) клас App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = True self._running = True връщане True def on_event (self, event): if event.type == pygame. QUIT: self._running = False def JumpingJack0 (self, keys): # контролира Jumping Jack, ключови думи: "position x" key = int (keys) p = position [ключ] a = p [0] b = p [1] печат ("Позиция:", ключ, "вляво /надясно: ", a,"/", b," степен ") # sys.stdout.write (" Позиция: ", ключ," ляво/дясно: ", a,"/", b," степен ") kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.1) def JumpingJack1 (себе си): # контролира Jumping Jack dance, ключова дума: "следваща игра" dnce = dance1 sp = (len (dnce)) за r в обхват (sp): # танцуващ ред на позиции, sp стъпки dc = dnce [r] if (dc не е в диапазон (10)): # печат ("грешка при въвеждане на позиция", sp) dc = 4 p = позиция [dc] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # задава скорост на движения def JumpingJack2 (себе си, клавиши): # контроли Jumping Jack LED, ключови думи: "включване/изключване" led = int (клавиши), ако led == 1: led_channel_0.duty_cycle = 0xffff # включване на LED 100% time.sleep (0.1) ако led == 0: led_channel_0.duty_cycle = 0 # изключете LED time.sleep (0.1) if led == 2: # мига led_channel_0.duty_cycle = 0xffff # включете LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #включете LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #включете LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #включете LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #включете LED 100% time.sleep (0.1) def JumpingJack3 (self): # контроли Jumping Jack dance, ключова дума: "произволна игра" # за h в обхват (10): dr = randrange (9) p = позиция [dr] a = p [0] b = p [1] kit.servo [lft].angle = a kit.servo [rgt].angle = b time.sleep (0.25) # задава скорост на движения def defter (self, args): engine = BasicEngine (args.model_file) mic = args.mic if args.mic е None 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):

ако не 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 while self._running: pygame.event.pump () if args.debug_keyboard: keys = pygame.key.get_pressed () else: try: new_item = q.get (Вярно, 0.1) с изключение на опашката. Празна: new_item = Няма, ако new_item не е None: item = new_item if (args.debug_keyboard и клавиши [pygame. K_ESCAPE]) или item == "stop": self._running = False # if (args.debug_keyboard и клавиши [pygame. K_SPACE]) или item == "go": # self. JumpingJack0 (7) # if (args.debug_keyboard и клавиши [pygame. K_RIGHT]) или item == "надясно": self. JumpingJack0 (6) if (args.debug_keyboard и клавиши [pygame. K_LEFT]) или item == "наляво": self. JumpingJack0 (4) if (args.debug_keyboard и клавиши [pygame. K_UP]) или item == " нагоре ": self. JumpingJack0 (1) if (args.debug_keyboard и клавиши [pygame. K_DOWN]) или item ==" надолу ": self. JumpingJack0 (9) if (args.debug_keyboard и клавиши [pygam e. K_0]) или item == "0": self. JumpingJack0 (0) if (args.debug_keyboard и клавиши [pygame. K_1]) или item == "1": self. JumpingJack0 (1) if (args. debug_keyboard и клавиши [pygame. K_2]) или item == "2": self. JumpingJack0 (2) if (args.debug_keyboard и клавиши [pygame. K_3]) или item == "3": self. JumpingJack0 (3) if (args.debug_keyboard и клавиши [pygame. K_4]) или item == "4": self. JumpingJack0 (4) if (args.debug_keyboard и клавиши [pygame. K_5]) или item == "5": self. JumpingJack0 (5) if (args.debug_keyboard и клавиши [pygame. K_6]) или item == "6": self. JumpingJack0 (6) if (args.debug_keyboard и клавиши [pygame. K_7]) или item == "7 ": self. JumpingJack0 (7) if (args.debug_keyboard и клавиши [pygame. K_8]) или item ==" 8 ": self. JumpingJack0 (8) if (args.debug_keyboard и клавиши [pygame. K_9]) или item == "9": self. JumpingJack0 (9) if (args.debug_keyboard и клавиши [pygame. K_a]) или item == "d": self. JumpingJack1 () #танцуващ Джак, на "next_game" if (args. debug_keyboard и клавиши [pygame. K_j]) или елемент == "j": self. JumpingJack2 (0) #LED включен, ON " switch_on "if (args.debug_keyboard и клавиши [pygame. K_k]) или item ==" k ": self. JumpingJack2 (1) #LED изключено, включено" изключване "if (args.debug_keyboard и клавиши [pygame. K_l]) или item == "l": self. JumpingJack2 (1) #LED мига "target" if (args.debug_keyboard и клавиши [pygame. K_r]) или item == "r": self. JumpingJack3 () #произволен танц "random game" time.sleep (0.05) self.on_cleanup () if _name_ == '_main_': parser = argparse. ArgumentParser () parser.add_argument ('-debug_keyboard', help = 'Използвайте клавиатурата за управление на JumpingJack. ', action =' store_true ', default = False) model.add_model_flags (парсер) args = parser.parse_args () the_app = App () the_app.on_execute (args)

Има и командния конфигурационен файл „commands_v2_hampelmann.txt“. Променете както искате. Това е просто списък с комбинации "команда, ключ, (сила,)", въз основа на файла с етикет.

позиция_ нула, 0, position_one, 1, position_two, 2, position_three, 3, position_tour, 4, position_five, 5, position_six, 6, position_seven, 7, position_eight, 8, position_nine, 9, move_up, нагоре, go_up, нагоре, move_down, надолу, go_down, надолу, преместване_назад, наляво, преместване_напред, надясно, връщане назад, наляво, напред, next_game, d, random_game, r, start_game, s, stop_game, 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).

Но това ще бъде друга инструкция. И тъй като първите експерименти показват, че скачащият крик ще се нуждае от значителни модификации, преди да бъде разпознат като човек от системата на AI, може да отнеме известно време.

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

Препоръчано: