Daftar Isi:

Alat Pendengaran, Akselerator TPU Google Coral Didorong: 3 Langkah
Alat Pendengaran, Akselerator TPU Google Coral Didorong: 3 Langkah

Video: Alat Pendengaran, Akselerator TPU Google Coral Didorong: 3 Langkah

Video: Alat Pendengaran, Akselerator TPU Google Coral Didorong: 3 Langkah
Video: WeID#16 I SCIENCE & TECHNO PARK: LOKOMOTOF INOVASI DAYA SAING DAERAH I 21 NOV 2020 2024, Juli
Anonim
Alat Pendengaran, Didorong oleh Akselerator TPU Google Coral
Alat Pendengaran, Didorong oleh Akselerator TPU Google Coral
Alat Pendengaran, Didorong oleh Akselerator TPU Google Coral
Alat Pendengaran, Didorong oleh Akselerator TPU Google Coral
Alat Pendengaran, Didorong oleh Akselerator TPU Google Coral
Alat Pendengaran, Didorong oleh Akselerator TPU Google Coral
Alat Pendengaran, Didorong oleh Akselerator TPU Google Coral
Alat Pendengaran, Didorong oleh Akselerator TPU Google Coral

Berikut ini saya ingin menjelaskan versi MeArm yang dikendalikan suara, lengan robot xyz kecil dengan gripper. Saya menggunakan MeArm Pi dari industri MIME, tetapi sistem harus dapat diterapkan ke semua versi MeArm, atau perangkat yang digerakkan oleh servo serupa.

Menggunakan Google Coral TPU Accelerator memungkinkan menjalankan skrip pengenalan suara TensorFlow offline cepat di Raspberry Pi, dan dengan ini mengontrol perangkat fisik dengan perintah lisan, dengan latensi di bawah satu detik.

Perangkat yang dijelaskan di sini adalah kombinasi, dan perluasan, dari konsep yang dijelaskan dalam dua instruksi sebelumnya. Ini adalah perpanjangan dari implementasi sebelumnya dari kontrol suara Google Coral, sebuah Jumping Jack, yang dijelaskan di sini dan peningkatan besar dari MeArm yang dikontrol suara Google AIY yang dijelaskan di sini.

MeArm yang dikontrol suara menggunakan sistem Google Voice AIY membutuhkan akses online, tidak mudah diterapkan, perlu menekan tombol untuk mengaktifkan mendengarkan perintah suara dan memiliki waktu latensi yang lama. Akselerator TPU Google Coral yang digunakan sekarang memungkinkan untuk menjalankan model TensorFlowLite secara offline dengan kecepatan tinggi pada Raspberry Pi atau perangkat Linux lainnya. Di antara contoh di halaman Google Coral Github ada contoh yang disebut "mendengar ular" untuk sistem pengenalan suara yang dapat memahami 140 frasa kunci (September 2019), yang kemudian dipetakan ke penekanan tombol virtual. Menggabungkan "tekanan tombol" ini dengan eksekusi beberapa fungsi yang diprogram dengan Python memungkinkan untuk membangun perangkat yang dikendalikan perintah suara. Saya baru-baru ini telah menjelaskan implementasi pertama, jack lompat elektromekanis yang dikendalikan suara. Implementasi di sini sedikit lebih kompleks dan memungkinkan untuk mengontrol keempat servo MeArm untuk memindahkan MeArm secara terus menerus atau memindahkannya ke sejumlah yang telah ditentukan posisi, atau untuk melakukan beberapa tugas yang lebih kompleks.

Menggunakan skrip yang disediakan di sini sebagai contoh, seharusnya relatif sederhana untuk membuat perangkat lain yang dikendalikan suara, mis. mobil robot atau unit teknologi bantu.

Perlengkapan

  • SayaArm. Digunakan di sini: MeArm Pi dari MIME Industries
  • Raspberry Pi 4
  • Akselerator TPU Google Coral
  • Adafruit 16 saluran servo bonnet
  • beberapa kabel jumper
  • opsional: kapasitor untuk kap servo, sekitar 400 F untuk 4 servo (direkomendasikan oleh Adafruit)
  • Sumber daya 5-6 V untuk kap servo. Saya di sini menggunakan pengisi daya 6V lama, baterai AA 4x juga berfungsi
  • Mikropon. Saya menggunakan webcam Microsoft HD3000 lama sebagai mikrofon.

Langkah 1: Menyiapkan Sistem

Menyiapkan Sistem
Menyiapkan Sistem
Menyiapkan Sistem
Menyiapkan Sistem

Unduh gambar Raspian yang telah dikonfigurasikan sebelumnya untuk Google Coral TPU Accelerator dari halaman Google Coral Github dan instal pada kartu SD. Gambar juga berisi sejumlah contoh skrip. Atur Pi seperti yang ditunjukkan.

Instal contoh Keyword spotter dari situs Google Coral GitHub, jika tidak disertakan dalam gambar, dan semua program yang diperlukan. Pasang mikrofon ke Pi. Saya akan merekomendasikan untuk bermain dengan contoh "Hearing Snake" untuk memastikan semuanya berfungsi.

Unduh dan instal perangkat lunak kap mesin Adafruit 16 saluran, seperti yang dijelaskan di sini. Pasang kap mesin dan mainkan dengan contoh Adafruit untuk memastikan semuanya berfungsi dengan baik.

Unduh file yang dilampirkan pada instruksi ini dan salin ke folder "Project Keyword Spotter". File "commands_v1_MeArm.txt" harus disalin ke subfolder "config".

Hubungkan servos MeArm Anda ke kap servo seperti yang ditunjukkan. Saya menggunakan port 15 untuk naik/turun, port 11 untuk maju/mundur, port 7 untuk belokan dan port 3 untuk servos gripper.

Di dalam skrip Anda mungkin harus menyesuaikan nilai min/center/max untuk setiap servo ke konfigurasi Anda, Pengaturan ini membantu menghindari kerusakan pada servos. Anda mungkin juga harus mengubah daftar "posisi", "transport1" dan "transport2" yang disertakan.

Jalankan skrip. Sejauh ini saya telah menjalankannya dari IDE.

Jika Anda ingin memodifikasi frase kunci yang membangkitkan fungsi tertentu sesuai dengan kebutuhan Anda. Daftar lengkap Frase Kunci yang tersedia dapat ditemukan di file "labels_gc2 raw.txt" di subfolder konfigurasi.

Sistem memiliki waktu latensi sekitar 1 detik, tetapi sangat bergantung pada tindakan yang dilakukan. Dalam beberapa kasus fase kunci harus diulang, akurasi pengenalan tidak selalu 100%.

Langkah 2: Menggunakan Perangkat

Jika semuanya sudah diatur dan diperiksa, Anda dapat menjalankan perangkat.

Batasan saat ini adalah bahwa perintah yang diberikan dieksekusi berulang-ulang selama tidak dihentikan (menggunakan "stop game") atau perintah lain diberikan. Tugas multilangkah yang kompleks, mis. "transport1" (dibangkitkan oleh frasa "permainan peluncuran") selalu dieksekusi hingga langkah terakhir.

Jadi dengan "belok kanan" perangkat akan bergerak dalam langkah-langkah kecil ke kanan sampai berhenti, atau nilai maksimum yang telah ditetapkan tercapai. "launch game", "next game" atau "start_video" akan memulai serangkaian gerakan yang ditentukan oleh daftar yang berisi pengaturan untuk setiap servo pada langkah tertentu. "permainan acak" akan perangkat untuk melompat dari satu langkah ke langkah lain, dipilih secara acak dari daftar pengaturan.

Seperti yang Anda lihat di video terlampir, saya telah membuat objek berbentuk diabolo dari LEGO yang dapat diambil oleh MeArm dan diangkut dari satu lokasi ke lokasi lain dengan serangkaian gerakan yang telah ditentukan. Anda dapat menentukan fungsi Anda sendiri dengan memodifikasi daftar 'transport1' atau 'transport2'.

Langkah 3: Script

Script yang tercantum di sini adalah modifikasi dari contoh "Hearing Snake" dari "Project Keyword Spotter". Contoh telah dilucuti seminimal mungkin, kemudian bagian untuk menggerakkan servo ditambahkan, berdasarkan perangkat lunak dan contoh yang disediakan untuk kap servo Adafruit.

Script belum dioptimalkan sekarang. Gunakan dengan risiko Anda sendiri, jangan ragu untuk memodifikasi dan mengoptimalkan.

Selain skrip python ada file perintah dan file label yang digunakan. Tempatkan di config-subfolder.

Seperti disebutkan sebelumnya, beberapa penyesuaian parameter mungkin diperlukan untuk mengadaptasi skrip untuk MeArm khusus Anda atau perangkat lain.

# Hak Cipta 2019 Google LLC#

# Berlisensi di bawah Lisensi Apache, Versi 2.0 ("Lisensi"); # Anda tidak boleh menggunakan file ini kecuali sesuai dengan Lisensi. # Anda dapat memperoleh salinan Lisensi di # # 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 # # Kecuali diwajibkan oleh hukum yang berlaku atau disetujui secara tertulis, perangkat lunak # didistribusikan di bawah Lisensi didistribusikan "SEBAGAIMANA ADANYA", # TANPA JAMINAN ATAU KETENTUAN JENIS APAPUN, baik tersurat maupun tersirat. # Lihat Lisensi untuk bahasa tertentu yang mengatur izin dan # batasan di bawah Lisensi. # kode "hearing_snake" asli telah dimodifikasi untuk implementasi MeArm oleh Dr H. ''' Petunjuk Implementasi saya menggunakan Raspbery Pi 4 dengan akselerator Google Coral dan kap servo Adafruit 16 saluran terpasang. Servo dari MeArm (industri MIME) dipasang ke port 3, 7, 11 dan 15 kap mesin. Untuk detailnya, silakan lihat Instruksi "Hearing MeArm". Perintah: "posisi x", x= 0 hingga 9, memindahkan perangkat ke posisi yang telah ditentukan sebelumnya. "maju/naik", "pindah/turun", "maju/belok ke depan", "maju/belok mundur", "belok/ke kiri" dan "belok/ke kanan" membangkitkan gerakan lambat dan bertahap dalam arah, "stop game" menghentikan gerakan. "tab terbuka" dan "tutup tab" membuka atau menutup gripper. "mulai video" membangkitkan perangkat untuk mengikuti urutan posisi yang telah ditetapkan, yang ditentukan oleh daftar 'posisi'. "permainan acak" menghasilkan pola gerakan acak, "permainan berhenti" mengakhirinya. "launch game" memulai serangkaian gerakan lain yang telah ditentukan oleh daftar 'transport1', "game berikutnya" operasi terbalik yang telah ditentukan oleh 'transport2' Gunakan dengan risiko Anda sendiri. ''' 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 Waktu import thread dari edgetpu.basic.basic_engine import BasicEngine import model pygame from pygame.locals import * import queue from random import randrange from adafruit_servokit import ServoKit import board import busio import adafruit_pca9685 waktu impor i2c = busio. I2C(board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685(i2c) hat.frequency = 60 kit = ServoKit(channels=16) # set jumlah saluran #kit.servo[0].actuation_range = 160 #kit.servo[0].set_pulse_width_range(1000, 2000) # pengaturan min, tengah dan maks up_l = 145 # servo naik/turun: naik md_l = 95 dn_l = 45 up_r = 135 # servo maju/mundur md_r = 90 dn_r = 50 ri_t = 30 # memutar lengan kanan atau kiri: posisi kanan md_t = 90 # memutar lengan kanan atau kiri: posisi tengah le_t = 150 op_g = 65 # gripper terbuka md_g = 90 # gripper berpusat cl _g = 130 # gripper vert tertutup = 15 # jumlah port servo, servo atas/bawah maju = 11 # jumlah port servo, putaran servo bergerak maju/mundur = 7 # port servo untuk memutar pegangan servo = 3 # port servo untuk pegangan servo #daftar pengaturan lengan untuk sembilan posisi posisi = [(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_g, cl_t), (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, dn_r, ri_t, op_g), (dn_l, dn_r, le_t, md_g)] # mendefinisikan 10 posisi dasar, ditunjukkan oleh bilangan bulat 0-9 # prosedur transport [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 objek (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)]

transport2 = [(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 "menari"

#memindahkan MeArm ke posisi Nol status =[md_l, md_r, md_t, md_g] kit.servo[vert].angle = status[0] kit.servo[forw].angle = status[1] kit.servo[turn]. 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 Aplikasi: 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): # mengarahkan MeArm ke posisi preset, kata kunci: "position x" key = int(keys) p = posisi[kunci] a = p[0] b = p[1] c = p[2] d = p[3] print ("Posisi: ", kunci, " vert/forw/turn/grip: ", a, "/", b, "/", c, "/", d, "derajat") status = [a, b, c, d] # dokumen status saat ini cetak (status) # sys.stdout.write("Posisi: ", kunci, " kiri/kanan: ", a, "/", b, "derajat") 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): # mengontrol dance MeArm, kata kunci: "start_video" dnce = dance1 sp=(len(dnce)) untuk r dalam rentang (sp): #urutan posisi menari, langkah sp dc = dnce[r] p = posisi[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 waktu.tidur (1) # mengatur kecepatan gerakan time.sleep(0.5) # istirahat di akhir prosedur def TransMeArm1(self): # mengontrol MeArm transport 1, kata kunci: "launch game" tr1 = transport1 sp=(len(tr1)) #hitung jumlah langkah untuk r dalam rentang (sp): #pergi ke langkah apa pun p = tr1[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) # set kecepatan gerakan time.sleep(0.5) def TransMeArm2(self): # mengontrol tarian MeArm, kata kunci: "permainan selanjutnya" tr2 = transport2 sp=(len(tr2)) untuk r dalam jangkauan (sp): #urutan posisi menari, sp langkah 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) # mengatur kecepatan gerakan time.sleep(0.5) def RandomMoves(self): # melompat secara acak antara posisi yang telah ditentukan, kata kunci: "permainan acak" dr= randrange (9) #secara acak memilih posisi p = position[dr] # membaca parameter posisi 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) # mengatur kecepatan gerakan def MoveUp(self): # mengangkat gripper dalam langkah kecil u0 = status[0] # membaca status saat ini u1 = u0 + 5 # ditambah x derajat if (u1 > up_l): # tes jika tidak melebihi parameter min/max u1 = up_l # jika tidak set ke min/max value kit.servo[vert].angle = u1 # pindah status servo[0] = u1 # sesuaikan nilai status cetak (" up ", status) time.sleep (1) # set kecepatan def MoveDown(self): d 0 = status[0] d1 = d0 - 5 #minus x derajat if (d1 up_r): f1 = up_r kit.servo[forw].angle = f1 # pindah status servo[1] = f1 print ("maju", status) time.sleep (1) def MoveBack(self): b0 = status[1] b1 = b0 - 5 #minus x derajat if (b1 le_t): l1 = le_t kit.servo[turn].angle = l1 # move servo status[2] = l1 print ("kiri ", status) time.sleep (0.2) def MoveRight(self): r0 = status[2] r1 = r0 - 2 #minus x derajat jika (r1 < ri_t): r1 = ri_t kit.servo[turn].angle = r1 # pindah status servo [2] = r1 print ("kanan ", status) time.sleep (0.2) def OpenGrip(self): kit.servo[grip].angle = op_g # setel grip ke posisi "open": "open_tab" time.sleep(0.5) status[3] = op_g def CloseGrip(self): kit.servo[grip].angle = cl_g # setel grip ke posisi "tertutup": " close_tab" time.sleep(0.5) status[3] = cl_g def StopMove(self): # tidak melakukan apa-apa, tetapi menghentikan gerakan print ("stop ", status) time.sleep(0.25) def spotter(self, args): engine = BasicEngine(args.model_file) mic = args.mic jika args.mic tidak ada lagi 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_hz), num_frames_hop= int(args.num_frames_hop)) def on_execute(self, args): jika bukan self.on_init(): self._running = Salah q = model.get_queue() self._controler = Controler(q) jika bukan 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) kecuali queue. Empty: new_item = Tidak ada jika new_item bukan None: item = new_item if (args.debug_keyboard and keys[pygame. K_ESCAPE]) atau item == "stop": self._running = False # if (args.debug_keyboard and keys[pygame. K_SPACE]) atau item == "go": # self. MeArmPos(7) # if (args.debug_keyboard and keys [pygame. K_RIGHT]) atau item == "kanan": # belok kanan self. MoveRight() if (args.debug_ke yboard dan keys[pygame. K_LEFT]) atau item == "kiri": # belok kiri self. MoveLeft() if (args.debug_keyboard and keys[pygame. K_UP]) atau item == "up": self. MoveUp() if (args.debug_keyboard dan keys[pygame. K_DOWN]) atau item == "down": self. MoveDown() if (args.debug_keyboard and keys[pygame. K_B]) atau item == "b": # mundur self. MoveBack() if (args.debug_keyboard dan keys[pygame. K_F]) atau item == "f": # meneruskan self. MoveForw() if (args.debug_keyboard dan keys[pygame. K_O]) atau item == "o": # pegangan terbuka: self. OpenGrip() if (args.debug_keyboard dan keys[pygame. K_C]) atau item == "c": # close grip: self. CloseGrip() if (args.debug_keyboard dan kunci [pygame. K_S]) atau item == "s": # hentikan gerakan: "start_game" self. StopMove() if (args.debug_keyboard dan keys[pygame. K_0]) atau item == "0": self. MeArmPos (0) if (args.debug_keyboard dan keys[pygame. K_1]) atau item == "1": self. MeArmPos(1) if (args.debug_keyboard and keys[pygame. K_2]) atau item == "2": self. MeArmPos(2) if (args.debug_keyboard dan keys[pygame. K_3]) atau itu em == "3": self. MeArmPos(3) if (args.debug_keyboard dan keys[pygame. K_4]) atau item == "4": self. MeArmPos(4) if (args.debug_keyboard dan keys[pygame. K_5]) atau item == "5": self. MeArmPos(5) if (args.debug_keyboard dan keys[pygame. K_6]) atau item == "6": self. MeArmPos(6) if (args.debug_keyboard dan keys[pygame. K_7]) atau item == "7": self. MeArmPos(7) if (args.debug_keyboard dan keys[pygame. K_8]) atau item == "8": self. MeArmPos(8) if (args.debug_keyboard dan keys[pygame. K_9]) atau item == "9": self. MeArmPos(9) if (args.debug_keyboard and keys[pygame. K_a]) atau item == "d": self. DancingMeArm() #dancing MeArm, pada "next_game" if (args.debug_keyboard dan keys[pygame. K_r]) atau item == "r": self. RandomMoves() #random dance "random game" if (args.debug_keyboard and keys[pygame. K_j]) atau item == "j": self. TransMeArm1() # objek transportasi: "lunch_game" if (args.debug_keyboard dan keys[pygame. K_k]) atau item == "k": self. TransMeArm2() # memindahkan objek ke arah sebaliknya: "next_game" ''' if (args.debug_keyboard dan keys[pygame. K_l]) atau 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='Gunakan keyboard untuk mengontrol MeArm.', action='store_true', default=False) model.add_model_flags(parser) args = parser.parse_args () the_app = Aplikasi() the_app.on_execute(args)

Direkomendasikan: