Daftar Isi:

A Hearing Jumping Jack, Versi Akselerator TPU Google Coral: 4 Langkah
A Hearing Jumping Jack, Versi Akselerator TPU Google Coral: 4 Langkah

Video: A Hearing Jumping Jack, Versi Akselerator TPU Google Coral: 4 Langkah

Video: A Hearing Jumping Jack, Versi Akselerator TPU Google Coral: 4 Langkah
Video: George Hotz | Programming | tinygrad Google Edge TPU has a custom ISA?!? | reverse engineering part3 2024, Juli
Anonim
A Hearing Jumping Jack, Versi Akselerator TPU Google Coral
A Hearing Jumping Jack, Versi Akselerator TPU Google Coral
A Hearing Jumping Jack, Versi Akselerator TPU Google Coral
A Hearing Jumping Jack, Versi Akselerator TPU Google Coral
A Hearing Jumping Jack, Versi Akselerator TPU Google Coral
A Hearing Jumping Jack, Versi Akselerator TPU Google Coral

Ia menggerakkan anggota tubuhnya, mendengarkan perintah Anda, digerakkan oleh teknologi pembelajaran mesin terbaru

"Hearing Jumping Jack" adalah Jumping Jack elektromekanis sederhana, yang digerakkan oleh dua servo mikro dan roda gigi yang sangat sederhana, memiliki LED sebagai "mata". Ini dikendalikan oleh perintah suara sederhana yang menunjukkan yang mana dari sembilan posisi yang telah ditentukan yang harus diambil, atau jika LED harus dinyalakan atau dimatikan, atau jika akan melakukan "tarian" yang telah ditentukan atau serangkaian gerakan acak.

Elemen inti dari sistem ini adalah akselerator TPU Google Coral, yang memungkinkan untuk menjalankan model Tensorflow Lite secara offline dengan kecepatan sangat tinggi, bahkan pada komputer "lemah" seperti Raspberry Pi. Ini memungkinkan mis. identifikasi dan klasifikasi objek yang cepat menggunakan kamera RPi, tetapi juga untuk menjalankan fungsi pengenalan suara berbasis pembelajaran mesin secara lokal.

Sepengetahuan saya, ini adalah contoh pertama yang diterbitkan untuk perangkat DIY fisik berbasis deteksi suara Coral Accelerator, dan contoh kode terlampir juga dapat digunakan untuk proyek lain yang lebih kompleks.

Kontrol suara didasarkan pada contoh "ular pendengaran" di "pencari kata kunci proyek" (https://github.com/google-coral/project-keyword-spotter) yang baru-baru ini (September 2019) ditempatkan di GitHub. Dalam konfigurasi saya, sistem ini terdiri dari Raspberry Pi 4 yang dilengkapi dengan kap servo Adafruit 16 saluran, Akselerator TPU Google Coral dan webcam, di sini digunakan sebagai mikrofon. Jumping Jack telah dijelaskan sebelumnya dalam instruksi sebelumnya, di mana ia didorong oleh kit Google Voice untuk membaca perintah suara, dilampirkan ke Servo Bonnet dalam versi 2.0 yang dijelaskan berikut ini.

Versi Google Voice Kit sebelumnya memiliki tiga batasan utama: itu tergantung pada layanan pengenalan suara berbasis web Google dan pengaturannya relatif rumit, diperlukan untuk menekan beberapa jenis tombol sebelum Anda dapat memberikan perintah, dan ada penundaan yang serius antara mengucapkan perintah dan respon dari sistem. Menggunakan akselerator Google Coral mengurangi waktu respons menjadi detik, tidak bergantung pada koneksi internet, dan mendengarkan sepanjang waktu. Dengan beberapa modifikasi, Anda dapat menggunakannya untuk mengontrol perangkat yang jauh lebih kompleks seperti Jumping Jack, sebagai robot atau mobil, atau apa pun yang dapat Anda buat dan kendalikan dengan Raspberry Pi.

Dalam versi saat ini, Pendeteksi Kata Kunci memahami satu set sekitar 140 kata kunci/frasa kunci pendek, yang didefinisikan dalam file model yang menyertainya (“voice_commands_v0.7_egetpu.tflite”) dan dijelaskan dalam file label terpisah (“labels_gc2.raw.txt”). Didefinisikan oleh file yang dapat dimodifikasi secara bebas (“commands_v2_hampelmann.txt”), kata kunci yang digunakan secara khusus oleh skrip kami kemudian dipetakan ke penekanan tombol pada keyboard virtual, mis. untuk huruf, angka, atas/bawah/kiri/kanan, crtl+c, dan lain-lain.

Kemudian, misalnya menggunakan pygame.key, "tekanan tombol" ini dibaca dan digunakan untuk mengontrol tindakan mana yang harus dilakukan oleh perangkat, di sini jack lompat. Dalam kasus kami, ini berarti menggerakkan dua servos ke posisi yang telah ditentukan, atau untuk menghidupkan atau mematikan LED. Saat pengintai kata kunci berjalan di tapak terpisah, itu dapat mendengarkan pesanan Anda secara permanen.

Versi 21 September 2019

Perlengkapan

Raspberry Pi 4, melalui Pimoroni

Akselerator TPU Google Coral, melalui Mouser Jerman, 72€

Adafruit 16 Servo Bonnet, melalui Pimoroni, sekitar 10 €

www.adafruit.com/product/3416

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

Header penumpuk (jika diperlukan)

www.adafruit.com/product/2223

Paket baterai 4x AA (atau sumber daya 5-6V lainnya) untuk Servo Bonnet

Webcam lama, sebagai mikrofon

Jumping Jack yang digerakkan oleh servo, seperti yang dijelaskan dalam instruksi sebelumnya. Gambar tata letak dilampirkan ke langkah berikutnya, tetapi mungkin memerlukan penyesuaian.

Bagian yang diperlukan untuk Jumping Jack:

- Pelat Forex 3 mm

- 2 servo mikro

- Sekrup dan mur 2 dan 3 mm

- 2 LED putih dan sebuah resistor

- sedikit kabel

Langkah 1: Menyiapkan Perangkat

Menyiapkan Perangkat
Menyiapkan Perangkat
Menyiapkan Perangkat
Menyiapkan Perangkat
Menyiapkan Perangkat
Menyiapkan Perangkat

Untuk membangun Jumping Jack, ikuti petunjuk yang diberikan dalam instruksi sebelumnya. Saya menggunakan Forex untuk prototipe saya, tetapi Anda dapat menggunakan pelat akrilik atau kayu lapis yang dipotong laser. Anda mungkin harus menyesuaikan tata letak sesuai dengan ukuran servo Anda, dll. Uji apakah tungkai dan roda gigi dapat bergerak tanpa gesekan.

Siapkan Raspberry Pi Anda. Di situs Coral Github, tersedia gambar Raspian yang berisi semua yang diperlukan untuk menjalankan akselerator Coral di Pi dan berisi banyak proyek, dengan semua pengaturan sudah ada.

Dapatkan pencari kata kunci proyek dari halaman Google Coral GitHub. Instal semua perangkat lunak yang diperlukan seperti yang ditunjukkan.

Instal file yang disediakan. Tempatkan skrip python jumping jack di folder spotter kata kunci proyek dan file perintah yang sesuai di subfolder konfigurasi.

Pasang Bonnet Servo Adafruit ke Pi. Karena saya menggunakan rumah RPI dengan kipas, saya perlu menggunakan penumpuk GPIO (mis. tersedia dari Pimoroni) untuk mengaktifkan koneksi. Instal semua perpustakaan yang diperlukan, seperti yang ditunjukkan pada instruksi Adafruit untuk kap servo.

Pasang sumber daya 5-6V ke kap servo. Pasang servo dan LED. Dalam kasus saya, saya menggunakan port 0 untuk LED dan port 11 dan 15 untuk servos.

Untuk memeriksa semuanya, saya akan merekomendasikan untuk mencoba contoh project keyword spotter "hearing snake" dan contoh bonnet servo Adafruit terlebih dahulu.

Langkah 2: Menjalankan Jumping Jack

Jika semua bagian sudah diatur dan berjalan, coba gunakan. Anda dapat menjalankan skrip di IDE atau dari baris perintah.

Meneriakkan "posisi 0" ke "posisi 9" akan membangkitkan Jumping Jack untuk mengambil salah satu posisi yang telah ditentukan. Saya mendefinisikan "1" sebagai kedua lengan ke atas (uu), "3" sebagai kiri atas, kanan bawah (ud), "9" sebagai kedua lengan bawah (dd) dan "5" sebagai kedua lengan berpusat (cc).

uu uc ud = 1 2 3

cu cc cd = 4 5 6

du dc dd = 7 8 9

"0" identik dengan "5". "3" dan "8" tidak dikenali dengan baik oleh pencari kata kunci dan mungkin harus diulang.

Anda mungkin harus menyesuaikan nilai minimum dan maksimum untuk setiap servo/sisi sehingga servos tidak akan terhalang dan kemudian menarik terlalu banyak daya.

"permainan berikutnya" akan memulai "tarian", yaitu urutan posisi yang ditentukan, sementara "permainan acak" akan memulai Jumping Jack untuk melakukan urutan gerakan secara acak. Dalam kedua kasus mereka akan berjalan selamanya, jadi Anda mungkin harus menghentikan gerakan, mis. dengan perintah "posisi nol".

"stop game" akan memunculkan "ctrl + c" dan menghentikan prosesnya.

"switch on" dan "switch off" dapat digunakan untuk menyalakan dan mematikan LED.

Dengan modifikasi nilai time.sleep Anda dapat mengatur kecepatan gerakan.

Langkah 3: Kode dan File Perintah

Kode yang disajikan di sini adalah modifikasi dari kode "pendengaran ular" yang merupakan bagian dari paket pengintai kata kunci proyek. Saya baru saja menghapus apa pun yang tidak perlu untuk aplikasi saya, tanpa pemahaman yang sebenarnya tentang detailnya. Setiap perbaikan dipersilakan.

Saya kemudian menambahkan bagian-bagian yang diperlukan untuk Adafruit Servo Bonnet, berdasarkan file contoh mereka.

Saya ingin mengucapkan terima kasih kepada programmer dari kedua bagian.

Kode dapat ditemukan terlampir sebagai file. Gunakan dengan risiko Anda sendiri, modifikasi, perbaiki, mainkan.

# 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 # # 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 di DASAR "SEBAGAIMANA ADANYA", # TANPA JAMINAN ATAU KETENTUAN APA PUN, baik tersurat maupun tersirat. # Lihat Lisensi untuk bahasa tertentu yang mengatur izin dan # batasan di bawah Lisensi. 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 dari 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 nomor saluran #kit.servo[0].actuation_range = 160 #kit.servo[0].set_pulse_width_range(1000, 2000) # pengaturan atas, tengah dan bawah untuk lengan kiri dan kanan up_l = 35 md_l = 90 dn_l = 160 up_r = 160 md_r = 90 dn_r = 35

lft= 15 # jumlah port servo, servo kiri (0-8)

rgt= 11 # jumlah port servo, servo kanan (0-8) led_channel_0 = hat.channels[0] # LED diatur pada port 0 led_channel_0.duty_cycle = 0 #menghidupkan LED 100% #daftar pengaturan lengan untuk posisi sembilan posisi = [(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)] # mendefinisikan 9 posisi JumpingJack, ditunjukkan oleh bilangan bulat 0-9 dance1 =(0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # kelas "menari" Kontroler(objek): #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 JumpingJack0(self, keys): # mengontrol Jumping Jack, kata kunci: "position x" key = int(keys) p = position [kunci] a = p[0] b = p[1] print ("Posisi: ", kunci, " kiri /kanan: ", a, "/", b, "derajat") # sys.stdout.write("Posisi: ", kunci, " kiri/kanan: ", a, "/", b, "derajat") kit.servo[lft].angle = a kit.servo[rgt].angle = b waktu.sleep(0.1) def JumpingJack1(self): # kontrol Jumping Jack dance, kata kunci: "permainan selanjutnya" dnce = dance1 sp=(len(dnce)) untuk r dalam rentang (sp): #urutan posisi menari, langkah sp dc = dnce[r] if (dc tidak dalam rentang(10)): # print ("kesalahan input pada posisi ", sp) dc=4 p = posisi[dc] a = p[0] b = p[1] kit.servo[lft].angle = a kit.servo[rgt].angle = b waktu.sleep(0.25) # set kecepatan gerakan def JumpingJack2(self, keys): # mengontrol LED Jumping Jack, kata kunci: "switch on/off" led = int(keys) jika led == 1: led_channel_0.duty_cycle = 0xffff #nyalakan LED 100% time.sleep (0,1) jika led == 0: led_channel_0.duty_cycle = 0 # matikan waktu LED. tidur (0,1) jika led == 2: # berkedip led_channel_0.duty_cycle = 0xffff # nyalakan LED 100% waktu. tidur (0,5) led_channel_0.duty_cycle = 0 #nyalakan LED 100% waktu.sleep (0,5) led_channel_0.duty_cycle = 0xffff #nyalakan LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0 #hidupkan LED 100% time.sleep (0.5) led_channel_0.duty_cycle = 0xffff #nyalakan LED 100% time.sleep (0.1) def JumpingJack3(self): # mengontrol tarian Jumping Jack, kata kunci: "permainan acak" # untuk h dalam rentang (10): dr= randrange (9) p = posisi[dr] a = p[0] b = p[1] kit.servo [lft].angle = a kit.servo[rgt].angle = b time.sleep(0.25) # mengatur kecepatan gerakan def spotter(self, args): engine = BasicEngine(args.model_file) mic = args.mic if args.mic adalah None else 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(sendiri, argumen):

jika bukan self.on_init(): self._running = False 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 (Benar, 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 dan keys[pygame. K_SPACE]) atau item == "go": # self. JumpingJack0(7) # if (args.debug_keyboard and keys[pygame. K_RIGHT]) atau item == "right": self. JumpingJack0(6) if (args.debug_keyboard and keys[pygame. K_LEFT]) atau item == "left": self. JumpingJack0(4) if (args.debug_keyboard and keys[pygame. K_UP]) atau item == " up": self. JumpingJack0(1) if (args.debug_keyboard dan keys[pygame. K_DOWN]) atau item == "down": self. JumpingJack0(9) if (args.debug_keyboard dan keys[pygam e. K_0]) atau item == "0": self. JumpingJack0(0) if (args.debug_keyboard dan keys[pygame. K_1]) atau item == "1": self. JumpingJack0(1) if (args. debug_keyboard dan keys[pygame. K_2]) atau item == "2": self. JumpingJack0(2) if (args.debug_keyboard and keys[pygame. K_3]) atau item == "3": self. JumpingJack0(3) if (args.debug_keyboard dan keys[pygame. K_4]) atau item == "4": self. JumpingJack0(4) if (args.debug_keyboard and keys[pygame. K_5]) atau item == "5": self. JumpingJack0(5) if (args.debug_keyboard and keys[pygame. K_6]) atau item == "6": self. JumpingJack0(6) if (args.debug_keyboard and keys[pygame. K_7]) atau item == "7 ": self. JumpingJack0(7) if (args.debug_keyboard and keys[pygame. K_8]) atau item == "8": self. JumpingJack0(8) if (args.debug_keyboard and keys[pygame. K_9]) atau item == "9": self. JumpingJack0(9) if (args.debug_keyboard and keys[pygame. K_a]) atau item == "d": self. JumpingJack1() #dancing Jack, pada "next_game" if (args. debug_keyboard dan keys[pygame. K_j]) atau item == "j": self. JumpingJack2(0) #LED on, ON " switch_on" if (args.debug_keyboard dan keys[pygame. K_k]) atau item == "k": self. JumpingJack2(1) #LED off, on "swithch off" if (args.debug_keyboard and keys[pygame. K_l]) atau item == "l": self. JumpingJack2(1) #LED berkedip "target" if (args.debug_keyboard and keys[pygame. K_r]) atau item == "r": self. JumpingJack3() #random dance "random game" time.sleep(0.05) self.on_cleanup() if _name_ == '_main_': parser = argparse. ArgumentParser() parser.add_argument('--debug_keyboard', help='Gunakan keyboard untuk mengontrol JumpingJack.', action='store_true', default=False) model.add_model_flags(parser) args = parser.parse_args() the_app = App() the_app.on_execute(args)

Ada juga file konfigurasi perintah "commands_v2_hampelmann.txt". Ubah sesuka Anda. Ini hanyalah daftar kombinasi "perintah, kunci, (kekuatan,)", berdasarkan file label.

posisi_nol, 0, position_one, 1, position_two, 2, position_three, 3, position_four, 4, position_five, 5, position_six, 6, position_seven, 7, position_eight, 8, position_nine, 9, move_up, up, go_up, up, move_down, down, go_down, bawah, gerak_mundur, kiri, gerak_maju, kanan, mundur_belakang, kiri, maju_maju, kanan, 0.8 target, l, bisu, z, ya, y, tidak, n, aktifkan_aktif, j, matikan_mati, k, volume_naik, atas, volume_turun, bawah, next_game, d, random_game, r, start_game, s, stop_game, ctrl+c,

Langkah 4: Ide Lebih Lanjut dan Contoh Lain

Sangat jelas bahwa pengaturan ini juga dapat digunakan untuk mengontrol robot atau perangkat lain. Pada dasarnya segala sesuatu yang mungkin dikendalikan oleh Raspberry Pi.

Saya sedang mengerjakan perpanjangan skrip untuk menggerakkan MeArm, dan berharap dapat mempresentasikannya pada Oktober 2019.

Saya juga mempertimbangkan untuk menggunakan Jumping Jack sebagai semaphore, dan untuk menggunakan program pengenalan posisi tungkai "project posenet" sebagai alat untuk membaca posisi Jumping Jack dan menerjemahkannya kembali ke angka. Dengan cara ini bahkan dapat mengkomunikasikan teks, mengingat posisi 2x 8 dapat menunjukkan 64 angka yang berbeda, lebih dari cukup untuk alfabet, angka, dan tanda. Ini dapat memungkinkan, meskipun sedikit dimodifikasi, realisasi fisik untuk IETF yang diusulkan "Transmisi Datagram IP melalui Sistem Pensinyalan Bendera Semaphore (SFSS)" (https://tools.ietf.org/html/rfc4824).

Tapi ini akan menjadi instruksi lain. Dan, seperti percobaan pertama yang menunjukkan bahwa jumping jack akan membutuhkan modifikasi yang signifikan sebelum dikenali sebagai manusia oleh sistem AI mungkin memerlukan beberapa waktu.

Saya ingin menarik perhatian Anda pada instruksi berikut: Object-Finding-Personal-Assistant-Robot-Ft-Raspberry, di mana robot pencari objek menggunakan kombinasi Raspberry Pi dan Google Coral TPU dijelaskan.

Direkomendasikan: