Съдържание:

Слухов MeArm, управляван от Google Coral TPU ускорител: 3 стъпки
Слухов MeArm, управляван от Google Coral TPU ускорител: 3 стъпки

Видео: Слухов MeArm, управляван от Google Coral TPU ускорител: 3 стъпки

Видео: Слухов MeArm, управляван от Google Coral TPU ускорител: 3 стъпки
Видео: Своим заявлением Туба Бююкюстюн разделила соцсети на две части. 2024, Юли
Anonim
Слухов MeArm, управляван от Google Coral TPU Accelerator
Слухов MeArm, управляван от Google Coral TPU Accelerator
Слухов MeArm, управляван от Google Coral TPU Accelerator
Слухов MeArm, управляван от Google Coral TPU Accelerator
Слухов MeArm, управляван от Google Coral TPU Accelerator
Слухов MeArm, управляван от Google Coral TPU Accelerator
Слухов MeArm, управляван от Google Coral TPU Accelerator
Слухов MeArm, управляван от Google Coral TPU Accelerator

По-долу бих искал да опиша гласово управлявана версия на 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
  • Малина Пи 4
  • Google Coral TPU Accelerator
  • 16 -канален серво капак на Adafruit
  • някои джъмперни кабели
  • по избор: кондензатор за серво капак, около 400 µF за 4 сервомотора (препоръчано от Adafruit)
  • 5-6 V източник на захранване за серво капак. Тук използвах старо зарядно устройство 6V, 4х AA батерия също работи
  • Микрофон. Използвах стара Microsoft HD3000 уеб камера като микрофон.

Стъпка 1: Настройка на системата

Настройване на системата
Настройване на системата
Настройване на системата
Настройване на системата

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

Инсталирайте примерния споттер за ключови думи от сайта на Google Coral GitHub, ако не е включен в изображението, и всички необходими програми. Прикрепете микрофона към Pi. Бих препоръчал да играете с примера „Чуваща змия“, за да се уверите, че всичко работи.

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

Изтеглете файловете, прикачени към тази инструкция, и ги копирайте в папката "Project Keyword Spotter". Файлът "commands_v1_MeArm.txt" трябва да бъде копиран в подпапката "config".

Свържете сервомоторите на вашия MeArm към капака на серво, както е посочено. Използвах порт 15 за нагоре/надолу, порт 11 за напред/назад, порт 7 за завой и порт 3 за сервоусилвателите на грайфера.

В рамките на скрипта може да се наложи да регулирате стойностите min/center/max за всяко серво към вашата конфигурация. Тези настройки помагат да се избегнат повреди на сервомоторите. Може също да се наложи да промените включените списъци „позиции“, „транспорт1“и „транспорт2“.

Стартирайте скрипта. Досега го управлявах от IDE.

В случай, че искате да промените ключовите фрази, които предизвикват определена функция според вашите нужди. Пълен списък на наличните ключови фрази се намира във файла „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 или друго устройство.

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

# Лицензиран под лиценза Apache, версия 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 # # Освен ако не се изисква от приложимото законодателство или е уговорено писмено, софтуерът #, разпространен под Лиценза, се разпространява на "КАКТО Е" НА ОСНОВА, # БЕЗ ГАРАНЦИИ ИЛИ УСЛОВИЯ НА ВСЕКИ ВИД, изричен или подразбиращ се. # Вижте Лиценза за конкретния език, уреждащ разрешенията и # ограниченията по Лиценза. # Оригиналният код "слух_ змия" беше променен за изпълнение за MeArm от д -р Х. '' 'Инструкции Моята реализация използва Raspbery Pi 4 с ускорител на Google Coral и прикрепен 16 -канален серво капак на Adafruit. Сервомоторите на MeArm (MIME индустрии) бяха прикрепени към портове 3, 7, 11 и 15 на капака. За подробности, моля, разгледайте инструкцията "Hearing MeArm". Команди: "позиция x", x = 0 до 9, премества устройството в предварително зададена позиция. „преместване/качване нагоре“, „преместване/слизане надолу“, „отиване/завъртане напред“, „отиване/завъртане назад“, „завиване/движение наляво“и „завиване/движение надясно“предизвикват бавно, стъпаловидно движение в дадената посока, „стоп играта“спира движенията. "отворен раздел" и "затварящ раздел" отваря или затваря грайфера. "стартиране на видео" извиква устройството да върви по предварително зададен ред на позициите, определен от списъка "позиции". "случайна игра" води до случаен модел на движения, "стоп игра" завършва. "стартираща игра" стартира друга серия от ходове, предварително определени от списъка "transport1", "следваща игра" обратната операция, предварително дефинирана от "transport2" Използвайте на свой собствен риск. '' 'от _future_ импортиране абсолютен_импорт от _future_ импортиране дивизия от _future_ импортиране print_function импортиране argparse импортиране os от произволно импортиране randint от резба импортиране Време за импортиране на нишка от edgetpu.basic.basic_engine импортиране BasicEngine модел за импортиране импортиране pygame от pygame.locals импортиране * опашка за импортиране от случаен диапазон за импортиране от 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 = 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 # захват затворен затворен = 15 # брой на серво порта, серво нагоре/надолу forw = 11 # номер на серво порт, напред/назад движещ се серво завой = 7 # серво порт за завъртане на серво захват = 3 # серво порт за захват серво #списък на настройките на рамото за девет позиции позиция = [(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, dnr, dn), (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 обект (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) # a "танц"

#преместване на MeArm към нулева позиция = = [md_l, md_r, md_t, md_g] kit.servo [vert].angle = status [0] kit.servo [forw].angle = status [1] kit.servo [turn]. ъгъл = статус [2] kit.servo [хващане]. ъгъл = статус [3] клас (статус) печат (контролер) (обект): #Функция за обратно повикване def _init _ (self, q): self._q = q def обратно извикване (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 MeArmPos (self, keys): # кара MeArm до предварително зададени позиции, ключови думи: "position x" key = int (keys) p = позиция [ключ] a = p [0] b = p [1] c = p [2] d = p [3] печат ("Позиции:", ключ, "vert/forw/turn/grip:", a, "/", b, "/", c, "/", d, "градуси") статус = [a, b, c, d] # документи текущо състояние отпечатване (състояние) # sys.stdout.write ("Позиция: ", ключ," ляво/дясно: ", a,"/", b," градус ") kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (0.5) def DancingMeArm (self): # контролира MeArm dance, ключова дума: "start_video" dnce = dance1 sp = (len (dnce)) за r в обхват (sp): #танцуващ ред на позиции, sp стъпки dc = dnce [r] p = позиция [dc] a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d time.sleep (1) # задава скорост на движение time.sleep (0.5) # прекъсване в края на процедурата def TransMeArm1 (self): # контролира MeArm transport 1, ключова дума: "стартираща игра" tr1 = transport1 sp = (len (tr1)) #изчислете броя на стъпките за r в обхват (sp): #отидете на всяка стъпка p = tr1 [r] a = p [0] b = p [1] c = p [2] d = p [3] комплект. servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # комплекта скорост на движение time.sleep (0.5) def TransMeArm2 (self): # контролира MeArm dance, ключова дума: "следваща игра" 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 [forw].angle = b kit.servo [turn].angle = c kit.servo [grip].angle = d print (p) time.sleep (1) # задава скорост на движение time.sleep (0.5) def RandomMoves (самостоятелно): # прескача на случаен принцип между предварително дефинирани позиции, ключова дума: "произволна игра" dr = randrange (9) # произволно избира позиция p = позиция [dr] # чете параметрите на позицията a = p [0] b = p [1] c = p [2] d = p [3] kit.servo [vert].angle = a kit.servo [forw].angle = b kit.servo [turn].angle = c kit.servo [захват].angle = d time.sleep (1) # задава скорост на движенията def MoveUp (self): # повдигащ захват на малки стъпки u0 = status [0] # четене на текущо състояние u1 = u0 + 5 # плюс x градуси, ако (u1 > up_l): # тестове, ако не надвишават параметрите min/max u1 = up_l # в противен случай е зададено на min/max value kit. нагоре ", състояние) time.sleep (1) # задава скорост def MoveDown (себе си): d 0 = статус [0] d1 = d0 - 5 # минус x градуси if (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # преместване на серво състояние [1] = f1 печат ("напред", статус) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x градуси if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # move servo status [2] = l1 print ("ляво", status) time.sleep (0.2) def MoveRight (self): r0 = status [2] r1 = r0 - 2 #minus x градуси if (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("надясно", статус) 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 int (args.mic) model.classify_audio (mic, engine, labels_file = "config/labels_gc2.raw.txt", commands_file = "config/commands_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_rate) 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 (True, 0.1) с изключение на опашката. 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 и клавиши [pygame. K_SPACE]) или item == "go": # self. MeArmPos (7) # if (args.debug_keyboard и клавиши [pygame. K_RIGHT]) или item == "надясно": # завийте надясно self. MoveRight () if (args.debug_ke yboard и клавиши [pygame. K_LEFT]) или item == "наляво": # завийте наляво self. MoveLeft () if (args.debug_keyboard и клавиши [pygame. K_UP]) или item == "up": self. MoveUp () if (args.debug_keyboard и клавиши [pygame. K_DOWN]) или item == "надолу": self. MoveDown () if (args.debug_keyboard и клавиши [pygame. K_B]) или item == "b": # назад self. MoveBack () if (args.debug_keyboard и клавиши [pygame. K_F]) или item == "f": # препраща self. MoveForw () if (args.debug_keyboard и клавиши [pygame. K_O]) или item == "o": # open grip: self. OpenGrip () if (args.debug_keyboard и клавиши [pygame. K_C]) или item == "c": # close grip: self. CloseGrip () if (args.debug_keyboard и keys [pygame. K_S]) или елемент == "s": # стоп движение: "start_game" self. StopMove () if (args.debug_keyboard и клавиши [pygame. K_0]) или item == "0": self. MeArmPos (0) if (args.debug_keyboard и клавиши [pygame. K_1]) или item == "1": self. MeArmPos (1) if (args.debug_keyboard и клавиши [pygame. K_2]) или item == "2": self. MeArmPos (2) if (args.debug_keyboard и клавиши [pygame. K_3]) или него em == "3": self. MeArmPos (3) if (args.debug_keyboard и клавиши [pygame. K_4]) или item == "4": self. MeArmPos (4) if (args.debug_keyboard и клавиши [pygame. K_5]) или елемент == "5": self. MeArmPos (5) if (args.debug_keyboard и клавиши [pygame. K_6]) или item == "6": self. MeArmPos (6) if (args.debug_keyboard и ключове [pygame. K_7]) или елемент == "7": self. MeArmPos (7) if (args.debug_keyboard и клавиши [pygame. K_8]) или item == "8": self. MeArmPos (8) ако (args.debug_keyboard и клавиши [pygame. K_9]) или item == "9": self. MeArmPos (9) if (args.debug_keyboard и клавиши [pygame. K_a]) или item == "d": self. DancingMeArm () #танцуващи MeArm, в "next_game" if (args.debug_keyboard и клавиши [pygame. K_r]) или item == "r": self. RandomMoves () #произволен танц "произволна игра" if (args.debug_keyboard и клавиши [pygame. K_j]) или item == "j": self. TransMeArm1 () # транспортен обект: "lunch_game" if (args.debug_keyboard и ключове [pygame. K_k]) или item == "k": self. TransMeArm2 () # транспортен обект обратна посока: "next_game" '' '' if (args.debug_keyboard и ключове [pygame. K_l]) или item == "l": self. JumpingJack2 (1) #LED мига "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 (args)

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