Isi kandungan:

MeArm yang Mendengar, Pemacu TPU Google Coral Didorong: 3 Langkah
MeArm yang Mendengar, Pemacu TPU Google Coral Didorong: 3 Langkah

Video: MeArm yang Mendengar, Pemacu TPU Google Coral Didorong: 3 Langkah

Video: MeArm yang Mendengar, Pemacu TPU Google Coral Didorong: 3 Langkah
Video: Spookiz театральная версия 2024, November
Anonim
MeArm Mendengar, Pemacu TPU Coral Google Didorong
MeArm Mendengar, Pemacu TPU Coral Google Didorong
MeArm Mendengar, Pemacu TPU Google Coral Didorong
MeArm Mendengar, Pemacu TPU Google Coral Didorong
MeArm Mendengar, Pemacu TPU Google Coral Didorong
MeArm Mendengar, Pemacu TPU Google Coral Didorong
MeArm Mendengar, Pemacu TPU Google Coral Didorong
MeArm Mendengar, Pemacu TPU Google Coral Didorong

Berikut ini saya ingin menerangkan versi kawalan suara MeArm, lengan robot xyz kecil dengan gripper. Saya menggunakan MeArm Pi dari industri MIME, tetapi sistemnya harus berlaku untuk versi MeArm apa pun, atau peranti yang disokong oleh servo yang serupa.

Menggunakan Google Coral TPU Accelerator memungkinkan untuk menjalankan skrip pengenalan suara TensorFlow luar talian yang pantas pada Raspberry Pi, dan dengan ini mengawal peranti fizikal dengan pesanan lisan, dengan kependaman di bawah satu saat.

Peranti yang dijelaskan di sini adalah gabungan, dan peluasan, konsep yang dijelaskan dalam dua arahan sebelumnya. Ini adalah lanjutan dari pelaksanaan kawalan suara Google Coral sebelumnya, Jumping Jack, yang dijelaskan di sini dan peningkatan besar dari MeArm kawalan suara AIY Google yang dijelaskan di sini.

MeArm yang dikendalikan suara menggunakan sistem Google Voice AIY memerlukan akses dalam talian, tidak mudah dilaksanakan, diperlukan untuk menekan butang untuk mengaktifkan mendengar pesanan suara dan mempunyai waktu latensi yang panjang. Google Coral TPU Accelerator yang digunakan sekarang memungkinkan untuk menjalankan model TensorFlowLite di luar talian dengan halaju tinggi pada Raspberry Pi atau peranti Linux lain. Di antara contoh di halaman Google Coral Github ada contoh yang disebut "pendengaran ular" untuk sistem pengenalan suara yang dapat memahami 140 frasa kunci (Sept 2019), yang kemudian dipetakan ke penekanan tombol maya. Menggabungkan "penekanan tombol" ini dengan pelaksanaan beberapa fungsi yang diprogramkan di Python memungkinkan untuk membangun perangkat yang dikendalikan perintah suara. Baru-baru ini saya telah menerangkan pelaksanaan pertama, bicu lompatan elektromekanik yang dikendalikan oleh suara. Pelaksanaan di sini sedikit lebih kompleks dan memungkinkan untuk mengawal keempat-empat servo MeArm untuk memindahkan MeArm secara berterusan atau memindahkannya ke sejumlah yang telah ditentukan kedudukan, atau untuk melaksanakan beberapa tugas yang lebih kompleks.

Menggunakan skrip yang disediakan di sini sebagai contoh, agak mudah untuk membuat peranti kawalan suara yang lain, mis. kereta robotik atau unit teknologi bantu.

Bekalan

  • MeArm. Digunakan di sini: MeArm Pi dari MIME Industries
  • Raspberry Pi 4
  • Pemecut TPU Google Coral
  • Adafruit 16 saluran servo bonet
  • beberapa kabel pelompat
  • pilihan: kapasitor untuk bonet servo, kira-kira 400 µF untuk 4 servo (disyorkan oleh Adafruit)
  • Sumber kuasa 5-6 V untuk bonet servo. Saya di sini menggunakan pengecas 6V lama, pek bateri 4x AA juga berfungsi
  • Mikrofon. Saya menggunakan kamera web Microsoft HD3000 lama sebagai mikrofon.

Langkah 1: Menyiapkan Sistem

Menyiapkan Sistem
Menyiapkan Sistem
Menyiapkan Sistem
Menyiapkan Sistem

Muat turun gambar Raspian yang telah dikonfigurasikan untuk Google Coral TPU Accelerator dari halaman Google Coral Github dan pasangkannya pada kad µSD. Gambar itu juga mengandungi sejumlah skrip contoh. Siapkan Pi seperti yang ditunjukkan.

Pasang contoh Keyword spotter dari laman Google Coral GitHub, jika tidak termasuk dalam gambar, dan semua program yang diperlukan. Pasang mikrofon ke Pi. Saya akan mengesyorkan bermain dengan contoh "Mendengar Ular" untuk memastikan semuanya berfungsi.

Muat turun dan pasang perisian bonet 16 saluran Adafruit, seperti yang dijelaskan di sini. Pasang bonet dan mainkan dengan contoh Adafruit untuk memastikan semuanya berfungsi dengan baik.

Muat turun fail yang dilampirkan pada arahan ini dan salin ke folder "Project Keyword Spotter". Fail "Command_v1_MeArm.txt" mesti disalin ke subfolder "config".

Sambungkan servo MeArm anda ke bonet servo seperti yang ditunjukkan. Saya menggunakan port 15 untuk naik / turun, port 11 untuk maju / belakang, port 7 untuk giliran dan port 3 untuk servo gripper.

Dalam skrip anda mungkin harus menyesuaikan nilai min / center / max untuk setiap servo ke konfigurasi anda, Tetapan ini membantu mengelakkan kerosakan pada servo. Anda mungkin juga perlu mengubah senarai "posisi", "transport1" dan "transport2" yang disertakan.

Jalankan skrip. Setakat ini saya menjalankannya dari IDE.

Sekiranya anda ingin mengubah frasa kunci yang membangkitkan fungsi tertentu mengikut keperluan anda. Senarai lengkap Frasa Utama yang tersedia terdapat dalam fail "labels_gc2 raw.txt" dalam subfolder konfigurasi.

Sistem ini mempunyai masa latensi sekitar 1 saat, tetapi bergantung banyak pada tindakan yang dilakukan. Dalam beberapa kes, fasa utama harus diulang, ketepatan pengiktirafan tidak selalu 100%.

Langkah 2: Menggunakan Peranti

Sekiranya semuanya disiapkan dan diperiksa, anda boleh menjalankan peranti.

Batasan semasa adalah bahawa pesanan yang diberikan dilaksanakan berulang kali selagi tidak dihentikan (menggunakan "stop game") atau pesanan lain diberikan. Tugas bertingkat yang kompleks, mis. "transport1" (dibangkitkan oleh frasa "pelancaran permainan") selalu dilaksanakan hingga ke tahap terakhir.

Oleh itu dengan "belok kanan" peranti akan bergerak dengan langkah kecil ke kanan hingga berhenti, atau nilai maksimum yang telah ditetapkan tercapai. "launch game", "next game" atau "start_video" akan memulakan serangkaian pergerakan yang ditentukan oleh senarai yang berisi pengaturan untuk setiap servo pada langkah tertentu. "permainan rawak" akan peranti melompat dari satu ke langkah yang lain, dipilih secara rawak dari senarai tetapan.

Seperti yang anda lihat dalam video yang disertakan, saya telah membangun objek berbentuk diabolo dari LEGO yang dapat diambil oleh MeArm dan diangkut dari satu lokasi ke lokasi lain oleh satu set pergerakan yang telah ditentukan. Anda boleh menentukan fungsi anda sendiri dengan mengubah senarai 'transport1' atau 'transport2'.

Langkah 3: Skrip

Skrip yang disenaraikan di sini adalah pengubahsuaian contoh "Mendengar Ular" dari "Project Keyword Spotter". Contohnya telah diturunkan ke minimum, kemudian bagian untuk mengendarai servo ditambahkan, berdasarkan pada perangkat lunak dan contoh yang disediakan untuk bonet servo Adafruit.

Skrip belum dioptimumkan sekarang. Gunakan dengan risiko anda sendiri, jangan ragu untuk mengubah dan mengoptimumkan.

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

Seperti disebutkan sebelumnya, mungkin diperlukan beberapa penyesuaian parameter untuk menyesuaikan skrip untuk MeArm khas anda atau beberapa peranti lain.

# Hak Cipta 2019 Google LLC #

# Berlesen di bawah Lesen Apache, Versi 2.0 ("Lesen"); # anda tidak boleh menggunakan fail ini kecuali mematuhi Lesen. # Anda boleh mendapatkan salinan Lesen 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 diperlukan oleh undang-undang yang berlaku atau dipersetujui secara bertulis, perisian # yang diedarkan di bawah Lesen diedarkan pada ASAS "SEBAGAIMANA ADANYA", # TANPA JAMINAN ATAU SYARAT SETIAP JENIS, baik tersurat atau tersirat. # Lihat Lesen untuk bahasa tertentu yang mengatur kebenaran dan # batasan di bawah Lesen. # kod "pendengaran_snake" yang asli telah diubah suai untuk implementasi untuk MeArm oleh Dr H. Servo MeArm (industri MIME) dilampirkan ke port 3, 7, 11 dan 15 bonet. Untuk maklumat lanjut, sila lihat "Hearing MeArm" Instructable. Perintah: "kedudukan x", x = 0 hingga 9, mengalihkan peranti ke kedudukan yang ditentukan sebelumnya. "bergerak / naik", "bergerak / turun", "pergi / pusing ke depan", "pergi / pusing ke belakang", "pusing / pergi ke kiri" dan "pusing / pergi ke kanan" membangkitkan pergerakan perlahan dan bertahap dalam yang diberikan arah, "hentikan permainan" menghentikan pergerakan. "tab terbuka" dan "tab tutup" membuka atau menutup pencengkam. "memulakan video" membangkitkan peranti untuk mengikuti susunan kedudukan yang telah ditetapkan, yang ditentukan oleh senarai 'kedudukan'. "permainan rawak" menghasilkan corak pergerakan secara rawak, "permainan berhenti" mengakhirinya. "pelancaran permainan" memulakan siri pergerakan lain yang ditentukan oleh senarai 'transport1', "permainan seterusnya" operasi terbalik yang telah ditentukan oleh 'transport2' Gunakan atas risiko anda sendiri. '' 'dari _future_ import mutlak_import dari _future_ bahagian import dari _future_ import print_function import argparse import os dari randint import rawak dari threading import Thread import time dari edgetpu.basic.basic_engine import Model import BasicEngine import pygame dari pygame.locals import * import queue randrport import rawak dari adafruit_servokit import papan import ServoKit import busio import adafruit_pca9685 import time i2c = busio. I2C (board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685 (i2c) hat.frequency = 60 kit = ServoKit (saluran = 16) # tetapkan bilangan saluran # kit.servo [0].actuation_range = 160 # kit.servo [0].set_pulse_width_range (1000, 2000) # min, center and max setting up_l = 145 # servo up / down: up md_l = 95 dn_l = 45 up_r = 135 # servo maju / mundur md_r = 90 dn_r = 50 ri_t = 30 # lengan pusing kanan atau kiri: kedudukan kanan md_t = 90 # lengan putar kanan atau kiri: kedudukan tengah le_t = 150 op_g = 65 # gripper terbuka md_g = 90 # gripper berpusat cl _g = 130 # gripper vert vert = 15 # bilangan port servo, servo atas / bawah forw = 11 # bilangan port servo, putaran servo bergerak maju / mundur = 7 # port servo untuk memutar cengkaman servo = 3 # port servo untuk cengkaman servo # senarai tetapan lengan untuk posisi sembilan 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_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, dn_r, mn), (dn_l, dn_r, le_t, md_g)] # menentukan 10 kedudukan asas, ditunjukkan oleh bilangan bulat 0-9 # prosedur pengangkutan [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), objek #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)]

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 "tarian"

#pindah MeArm ke status kedudukan sifar = [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 (objek): #Callback function def _init _ (self, q): self._q = q def callback (diri, command): self._q.put (command) class App: def _init _ (self): self._running = True def on_init (self): pygame.init () self.game_started = Self self._running = True return True def on_event (self, event): if event.type == pygame. QUIT: self._running = False def MeArmPos (self, keys): # mendorong MeArm ke kedudukan yang telah ditetapkan, kata kunci: "kedudukan x" kunci = int (kunci) p = kedudukan [kunci] a = p [0] b = p [1] c = p [2] d = p [3] cetak ("Posisi:", kunci, "vert / forw / turn / grip:", a, "/", b, "/", c, "/", d, "darjah") status = [a, b, c, d] # dokumen cetakan status terkini (status) # sys.stdout.write ("Kedudukan: ", kunci," kiri / kanan: ", a," / ", b," darjah ") 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): # mengawal tarian MeArm, kata kunci: "start_video" dnce = dance1 sp = (len (dnce)) untuk r dalam julat (sp): # urutan kedudukan menari, langkah sp dc = dnce [r] p = kedudukan [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) # menetapkan kelajuan masa pergerakan. Tidur (0,5) # rehat pada akhir prosedur def TransMeArm1 (diri): # mengawal pengangkutan MeArm 1, kata kunci: "pelancaran permainan" tr1 = transport1 sp = (len (tr1)) #kira bilangan langkah untuk r dalam julat (sp): #pergi ke langkah mana 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 halaju pergerakan masa. tidur (0,5) def TransMeArm2 (diri): # mengawal tarian MeArm, kata kunci: "permainan seterusnya" tr2 = transport2 sp = (len (tr2)) untuk r dalam jarak (sp): urutan kedudukan menari, langkah 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) # menetapkan kelajuan masa pergerakan.sleep (0.5) def RandomMoves (self): # melompat secara rawak antara kedudukan yang telah ditentukan, kata kunci: "permainan rawak" dr = randrange (9) # secara rawak memilih kedudukan p = kedudukan [dr] # membaca parameter kedudukan 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) # menetapkan kelajuan pergerakan def MoveUp (self): # mengangkat gripper dalam langkah kecil u0 = status [0] # baca status semasa u1 = u0 + 5 # plus x darjah jika (u1 > up_l): # ujian jika tidak melebihi parameter min / max u1 = up_l # sebaliknya ditetapkan ke kit nilai min / max.servo [vert].angle = u1 # pindahkan status servo [0] = u1 # sesuaikan cetakan nilai status (" naik ", status) time.sleep (1) # set velocity def MoveDown (diri): d 0 = status [0] d1 = d0 - 5 #minus x darjah jika (d1 up_r): f1 = up_r kit.servo [forw].angle = f1 # status servo bergerak [1] = cetakan f1 ("maju", status) time.sleep (1) def MoveBack (self): b0 = status [1] b1 = b0 - 5 #minus x darjah if (b1 le_t): l1 = le_t kit.servo [turn].angle = l1 # bergerak servo status [2] = cetakan l1 ("kiri", status) masa. tidur (0.2) def MoveRight (diri): r0 = status [2] r1 = r0 - 2 #minus x darjah jika (r1 <ri_t): r1 = ri_t kit.servo [turn].angle = r1 # move servo status [2] = r1 print ("right", status) time.sleep (0.2) def OpenGrip (self): kit.servo [grip].angle = op_g # tetapkan cengkaman ke posisi "buka": status "open_tab" time.sleep (0.5) [3] = op_g def CloseGrip (diri): kit.servo [grip].angle = cl_g # set grip ke posisi "tertutup": " close_tab "time.sleep (0.5) status [3] = cl_g def StopMove (self): # tidak melakukan apa-apa, tetapi menghentikan pergerakan mencetak (" stop ", status) time.sleep (0.25) def spotter (self, args): engine = BasicEngine (args.model_file) mic = args.mic jika args.mic tidak lain int (args.mic) model.classify_audio (mic, engine, labels_file = "config / labels_gc2.raw.txt", Command_file = "config / command_v1_MeArm.txt", dectection_callback = self._controler.callback, sample_rate_hz = int (args.sample_rate_ht int (args.num_frames_hop)) def on_execute (self, args): if not self.on_init (): self._running = False q = model.get_queue () self._controler = Pengawal (q) jika tidak args.debug_keyboard: t = Thread (target = self.spotter, args = (args,)) t.daemon = True t.start () item = -1 sambil 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 = None if new_item not None: item = new_item if (args.debug_keyboard dan kunci [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 dan kunci [pygame. K_RIGHT]) atau item == "kanan": # belok kanan diri. MoveRight () if (args.debug_ke yboard dan kekunci [pygame. K_LEFT]) atau item == "kiri": # pusing kiri kiri. MoveLeft () if (args.debug_keyboard dan kunci [pygame. K_UP]) atau item == "atas": self. MoveUp () jika (args.debug_keyboard dan kunci [pygame. K_DOWN]) atau item == "bawah": self. MoveDown () if (args.debug_keyboard dan kunci [pygame. K_B]) atau item == "b": # mundur self. MoveBack () if (args.debug_keyboard dan kunci [pygame. K_F]) atau item == "f": # maju ke hadapan self. MoveForw () if (args.debug_keyboard dan kunci [pygame. K_O]) atau item == "o": # pegangan terbuka: self. OpenGrip () if (args.debug_keyboard dan kunci [pygame. K_C]) atau item == "c": # cengkaman dekat: self. CloseGrip () if (args.debug_keyboard dan kekunci [pygame. K_S]) atau item == "s": # stop pergerakan: "start_game" self. StopMove () if (args.debug_keyboard and keys [pygame. K_0]) atau item == "0": self. MeArmPos (0) if (args.debug_keyboard dan kunci [pygame. K_1]) atau item == "1": self. MeArmPos (1) if (args.debug_keyboard dan kunci [pygame. K_2]) atau item == "2": self. MeArmPos (2) jika (args.debug_keyboard dan kunci [pygame. K_3]) atau itu em == "3": self. MeArmPos (3) if (args.debug_keyboard dan kunci [pygame. K_4]) atau item == "4": self. MeArmPos (4) if (args.debug_keyboard dan kekunci [pygame. K_5]) atau item == "5": self. MeArmPos (5) if (args.debug_keyboard dan kunci [pygame. K_6]) atau item == "6": self. MeArmPos (6) jika (args.debug_keyboard dan kunci [pygame. K_7]) atau item == "7": self. MeArmPos (7) if (args.debug_keyboard dan kunci [pygame. K_8]) atau item == "8": self. MeArmPos (8) jika (args.debug_keyboard dan kunci [pygame. K_9]) atau item == "9": self. MeArmPos (9) if (args.debug_keyboard dan kunci [pygame. K_a]) atau item == "d": self. DancingMeArm () #dancing MeArm, pada "next_game" jika (args.debug_keyboard dan kunci [pygame. K_r]) atau item == "r": self. RandomMoves () #random dance "permainan rawak" jika (args.debug_keyboard dan kekunci [pygame. K_j]) atau item == "j": self. TransMeArm1 () # objek pengangkutan: "lunch_game" if (args.debug_keyboard dan kunci [pygame. K_k]) atau item == "k": self. TransMeArm2 (# arah objek arah belakang: "next_game" '' 'if (args.debug_keyboard dan kekunci [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 papan kekunci untuk mengawal MeArm.', action = 'store_true', default = False) model.add_model_flags (parser) args = parser.parse_args () the_app = Aplikasi () the_app.on_execute (args)

Disyorkan: