İçindekiler:

İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı: 3 Adım
İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı: 3 Adım

Video: İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı: 3 Adım

Video: İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı: 3 Adım
Video: Elimi kestim. Demir kanaması deneyi #kimya #shorts 2024, Kasım
Anonim
Bir İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı
Bir İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı
Bir İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı
Bir İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı
Bir İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı
Bir İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı
Bir İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı
Bir İşitme MeArm, Google Coral TPU Hızlandırıcı Odaklı

Aşağıda, tutuculu küçük bir xyz robot kolu olan MeArm'ın ses kontrollü bir versiyonunu anlatmak istiyorum. MIME endüstrilerinden MeArm Pi'yi kullandım, ancak sistem MeArm'ın herhangi bir sürümüne veya benzeri servo tahrikli cihazlara uygulanabilir olmalıdır.

Google Coral TPU Accelerator'ı kullanmak, Raspberry Pi'de hızlı çevrimdışı TensorFlow ses tanıma komut dosyalarını çalıştırmaya ve böylece bir saniyenin altında bir gecikmeyle sözlü siparişlerle fiziksel cihazları kontrol etmeye olanak tanır.

Burada açıklanan cihaz, önceki iki talimatta açıklanan kavramların bir kombinasyonu ve uzantısıdır. Bu, Google Coral ses kontrolünün daha önceki bir uygulamasının bir uzantısıdır, burada açıklanan bir Jumping Jack ve burada açıklanan bir Google AIY ses kontrollü MeArm'ın büyük bir iyileştirmesidir.

Google Voice AIY sistemini kullanan ses kontrollü MeArm, çevrimiçi erişim gerektiriyordu, uygulanması kolay değildi, sesli siparişleri dinlemeyi etkinleştirmek için bir düğmeye basılması gerekiyordu ve uzun bir gecikme süresi vardı. Artık kullanılan Google Coral TPU Accelerator, TensorFlowLite modellerinin bir Raspberry Pi veya diğer Linux cihazlarında yüksek bir hızla çevrimdışı olarak çalıştırılmasına izin veriyor. Google Coral Github sayfasındaki örnekler arasında 140 anahtar cümleyi (Eylül 2019) anlayabilen ve daha sonra sanal tuş vuruşlarıyla eşleştirilen bir ses tanıma sistemi için "işitme yılanı" adlı bir örnek var. Bu "tuş vuruşlarını" Python'da programlanmış bazı işlevlerin yürütülmesiyle birleştirmek, sesli komutla kontrol edilen bir cihaz oluşturmayı mümkün kılar. Geçenlerde bir ilk uygulamayı, ses kontrollü bir elektromekanik atlama jakını tanımlamıştım. Buradaki uygulama biraz daha karmaşıktır ve MeArm'ın dört servosunun tümünü kontrol ederek MeArm'ı sürekli hareket ettirmeye veya önceden tanımlanmış bir dizi hareket ettirmeye izin verir. pozisyonlar veya bazı daha karmaşık görevleri gerçekleştirmek için.

Burada örnek olarak verilen komut dosyasını kullanarak, diğer ses kontrollü cihazları oluşturmak nispeten basit olmalıdır, örn. robotik arabalar veya yardımcı teknik birimler.

Gereçler

  • MeArm. Burada kullanılır: MIME Industries'den MeArm Pi
  • Ahududu Pi 4
  • Google Coral TPU Hızlandırıcı
  • Adafruit 16 kanal servo motor kaputu
  • bazı atlama kabloları
  • isteğe bağlı: servo kaput için kapasitör, 4 servo için yaklaşık 400 µF (Adafruit tarafından önerilir)
  • Servo kaporta için 5-6 V güç kaynağı. Burada eski bir 6V şarj cihazı kullandım, 4x AA pil takımı da çalışıyor
  • Mikrofon. Mikrofon olarak eski bir Microsoft HD3000 web kamerasını kullandım.

Adım 1: Sistemin Kurulması

Sistemi Kurma
Sistemi Kurma
Sistemi Kurma
Sistemi Kurma

Google Coral TPU Accelerator için önceden yapılandırılmış Raspian görüntüsünü Google Coral Github sayfasından indirin ve bir µSD karta yükleyin. Görüntü ayrıca bir dizi örnek komut dosyası içerir. Pi'yi belirtildiği gibi ayarlayın.

Resimde yoksa Google Coral GitHub sitesinden örnek Anahtar Kelime tespit aracını ve gerekli tüm programları yükleyin. Mikrofonu Pi'ye takın. Her şeyin çalıştığından emin olmak için "İşitme Yılanı" örneğiyle oynamanızı tavsiye ederim.

Adafruit 16 kanal bonnet yazılımını burada anlatıldığı gibi indirin ve kurun. Kaputu takın ve her şeyin düzgün çalıştığından emin olmak için Adafruit örnekleriyle oynayın.

Bu talimata ekli dosyaları indirin ve bunları "Project Keyword Spotter" klasörüne kopyalayın. "commands_v1_MeArm.txt" dosyası "config" alt klasörüne kopyalanmalıdır.

MeArm'ınızın servolarını belirtilen şekilde servo kaputa bağlayın. Yukarı/aşağı için bağlantı noktası 15, ileri/geri için bağlantı noktası 11, dönüş için bağlantı noktası 7 ve tutucu servolar için bağlantı noktası 3'ü kullandım.

Komut dosyası içinde her bir servo için min/merkez/maks değerlerini konfigürasyonunuza göre ayarlamanız gerekebilir, Bu ayarlar servoların zarar görmesini önlemeye yardımcı olur. Dahil edilen "konumlar", "taşıma1" ve "taşıma2" listelerini de değiştirmeniz gerekebilir.

Komut dosyasını çalıştırın. Şimdiye kadar IDE'den çalıştırıyordum.

Belirli bir işlevi uyandıran anahtar sözcükleri ihtiyacınıza göre değiştirmek isterseniz. Kullanılabilir Anahtar Sözcüklerin tam listesi, yapılandırma alt klasöründeki "labels_gc2 raw.txt" dosyasında bulunur.

Sistemin yaklaşık 1 saniyelik bir gecikme süresi vardır, ancak bu, büyük ölçüde hangi eylemlerin gerçekleştirildiğine bağlıdır. Bazı durumlarda kilit aşamanın tekrarlanması gerekir, tanıma doğruluğu her zaman %100 değildir.

2. Adım: Cihazı Kullanma

Her şey ayarlanmış ve kontrol edilmişse, cihazı çalıştırabilirsiniz.

Mevcut bir sınırlama, belirli bir emrin durdurulmadığı ("stop game" kullanılarak) veya başka bir emir verilmediği sürece tekrar tekrar uygulanmasıdır. Karmaşık çok adımlı görevler, örn. "transport1" ("başlatma oyunu" ifadesi ile çağrıştırılır) her zaman son adıma kadar yürütülür.

Böylece "sağa dön" ile cihaz, durana veya önceden ayarlanmış maksimum değere ulaşılana kadar küçük adımlarla sağa hareket edecektir. "oyunu başlat", "sonraki oyun" veya "start_video", belirli bir adımda her servo için ayarı içeren listelerle tanımlanan bir dizi hareketi başlatacaktır. "rastgele oyun", cihaz bir ayar listesinden rastgele seçilen bir adımdan diğerine atlayacaktır.

Ekteki videoda görebileceğiniz gibi, MeArm tarafından alınabilen ve önceden tanımlanmış bir dizi hareketle bir konumdan diğerine taşınabilen LEGO'dan diabolo şeklinde bir nesne inşa etmiştim. 'transport1' veya 'transport2' listelerini değiştirerek kendi işlevlerinizi tanımlayabilirsiniz.

3. Adım: Komut Dosyası

Burada listelenen komut dosyası, "Project Keyword Spotter"daki "Hearing Snake" örneğinin bir modifikasyonudur. Örnek minimuma indirildi, ardından Adafruit servo kaputu için sağlanan yazılım ve örneklere dayalı olarak servoları sürmek için parça eklendi.

Senaryo şimdiye kadar optimize edilmedi. Kendi sorumluluğunuzda kullanın, değiştirmekten ve optimize etmekten çekinmeyin.

Python betiğine ek olarak, komutlar dosyası ve kullanılan etiketler dosyası vardır. config-alt klasörüne yerleştirin.

Daha önce belirtildiği gibi, komut dosyasını özel MeArm veya başka bir cihaza uyarlamak için birkaç parametre ayarı gerekebilir.

# Telif hakkı 2019 Google LLC#

# Apache Lisansı, Sürüm 2.0 ("Lisans"); # bu dosyayı Lisansa uygun olmadıkça kullanamazsınız. # Lisansın bir kopyasını # # href="https://www.apache.org/licenses/LICENSE-2.0" href="https://www.apache.org/licenses/LICENSE-2.0" adresinden edinebilirsiniz. https://www.apache.org/licenses/LICENSE-2.0 # # Yürürlükteki yasalar gerektirmedikçe veya yazılı olarak kabul edilmedikçe, Lisans kapsamında dağıtılan yazılım #, "OLDUĞU GİBİ", # GARANTİ YA DA KOŞULLARI OLMADAN, "OLDUĞU GİBİ" dağıtılır. HER TÜRLÜ, açık veya zımni. # Belirli bir dili yöneten izinler ve # Lisans kapsamındaki sınırlamalar için Lisansa bakın. # orijinal "hearing_snake" kodu, Dr H tarafından MeArm için bir uygulama için değiştirildi. ''' Talimatlar Uygulamam, Google Coral hızlandırıcısı ve Adafruit 16 kanal servo kapağı takılı bir Raspbery Pi 4 kullanıyor. Bir MeArm'ın (MIME endüstrileri) servoları, kaputun 3, 7, 11 ve 15 numaralı bağlantı noktalarına bağlandı. Ayrıntılar için lütfen "İşitme MeArm" Talimatına bakın. Komutlar: "x konumu", x= 0 ila 9, cihazı önceden tanımlanmış belirli bir konuma taşır. "hareket/yukarı git", "hareket/aşağı git", "ileri/ileri dön", "geri git/geri dön", "sola dön/sağa git" ve "dön/sağa git" verilen yerde yavaş, kademeli bir hareket uyandırır. yön, "oyunu durdur" hareketlerini durdurur. "açık sekme" ve "kapatma sekmesi" tutucuyu açar veya kapatır. "videoyu başlat", cihazı "konumlar" listesiyle tanımlanan önceden ayarlanmış bir konum sırasını izlemeye yönlendirir. "rastgele oyun", rastgele bir hareket modeliyle sonuçlanır, "oyunu durdur" onu bitirir. "oyunu başlat", 'transport1' listesi tarafından önceden tanımlanmış başka bir hamle dizisini başlatır, "sonraki oyun", 'transport2' tarafından önceden tanımlanmış ters işlem. ''' _future_'den mutlak_import'u _future_'den içeri aktar bölümü _future_'dan içeri aktar print_function içeri aktar argparse içeri aktarma işletim sistemini rastgele içeri aktarmadan randint içeri aktarma içe aktarma edgetpu.basic.basic_engine'den iş parçacığı içe aktarma süresi, BasicEngine içe aktarma modeli içe aktarma pygame.locals'tan içe aktarma * içe aktarma kuyruğu adafruit_servokit'ten rastgele içe aktarma randrange import ServoKit import board import busio import adafruit_pca9685 import time i2c = busio. I2C(board. SCL, board. SDA) hat = adafruit_pca9685. PCA9685(i2c) hat.frequency = 60 kit = ServoKit(channels=16) # kanal sayısı ayar #kit.servo[0].actuation_range = 160 #kit.servo[0].set_pulse_width_range(1000, 2000) # min, merkez ve maksimum ayarlar up_l = 145 # servo yukarı/aşağı: yukarı md_l = 95 dn_l = 45 up_r = 135 # servo ileri/geri md_r = 90 dn_r = 50 ri_t = 30 # kolu sağa veya sola döndürme: sağ konum md_t = 90 # kolu sağa veya sola döndürme: orta konum le_t = 150 op_g = 65 # tutucu açık md_g = 90 # tutucu merkezli cl _g = 130 # tutucu kapalı dikey = 15 # servo bağlantı noktası sayısı, servo yukarı/aşağı ileri = 11 # servo bağlantı noktası sayısı, ileri/geri hareketli servo dönüşü = 7 # servo kavrama için servo bağlantı noktası = 3 # kavrama için servo bağlantı noktası servo #dokuz pozisyon için kol ayarları listesi pozisyon = [(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_), (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_r, dn_r, dn_r, dn_r,), (dn_l, dn_r, le_t, md_g)] # 0-9 tamsayılarıyla gösterilen 10 temel konumu tanımlar # taşıma prosedürleri [dikey/ileri/dönüş/tutuş] taşıma1 = [(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 nesnesi (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, işlem_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, işlem_g)]

dans1 =(0, 8, 7, 4, 1, 2, 3, 6, 9, 8, 5, 2, 1, 4, 7, 8, 9, 6, 3, 2, 0) # bir "dans"

#moving MeArm to Zero pozisyon durumu =[md_l, md_r, md_t, md_g] kit.servo[vert].angle = status[0] kit.servo[forw].angle = status[1] kit.servo[turn]. açı = durum[2] kit.servo[grip].angle = durum[3] yazdırma (durum) sınıfı Kontrolör(nesne): #Geri arama işlevi def _init_(kendi kendine, q): self._q = q def geri arama(kendi kendine, komut): self._q.put(command) class Uygulama: def _init_(self): self._running = Gerçek def on_init(self): pygame.init() self.game_started = Gerçek self._running = Gerçek dönüş Gerçek def on_event (self, event): if event.type == pygame. QUIT: self._running = False def MeArmPos(self, keyler): # MeArm'ı önceden ayarlanmış pozisyonlara yönlendirir, anahtar kelimeler: "position x" key = int(keys) p = pozisyon[anahtar] a = p[0] b = p[1] c = p[2] d = p[3] yazdır ("Konumlar: ", tuş, " vert/forw/turn/grip: ", a, "/", b, "/", c, "/", d, "derece") durum = [a, b, c, d] # belgeler mevcut durum yazdır (durum) # sys.stdout.write("Pozisyon: ", anahtar, " sol/sağ: ", a, "/", b, "derece") kit.servo[vert].angle = bir kit.servo[forw].angle = b kit.servo[turn].angle = c kit.servo[grip].angle = d time.sleep(0.5) def DancingMeArm(self): # kontroller MeArm dance, keyword: "start_video" dnce = dance1 sp=(len(dnce)) r aralığında (sp): #konumların dans sırası, sp adımları dc = dnce[r] p = konum[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 zaman.uyku (1) # hareketlerin hızını ayarlar time.sleep(0.5) # prosedürün sonunda mola def TransMeArm1(self): # MeArm taşıma 1'i kontrol eder, anahtar kelime: "oyunu başlat" tr1 = transport1 sp=(len(tr1)) #aralıktaki (sp) r için adım sayısını hesapla: #herhangi bir adıma git p = tr1[r] a = p[0] b = p[1] c = p[2] d = p[3] kiti. 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 hareketlerin hızı time.sleep(0.5) def TransMeArm2(self): # MeArm dansını kontrol eder, anahtar kelime: "sonraki oyun" tr2 = transport2 sp=(len(tr2)) aralıktaki r için (sp): #dans pozisyon sırası, sp adımları 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) # hareketlerin hızını ayarlar time.sleep(0.5) def RandomMoves(self): # önceden tanımlanmış konumlar arasında rastgele atlar, anahtar kelime: "rastgele oyun" dr= randrange (9) #rastgele bir konum seçer p = konum[dr] # konum parametrelerini okur 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) # hareketlerin hızını ayarlar def MoveUp(self): # küçük adımlarla kıskaç kaldırma u0 = durum[0] # mevcut durumu oku u1 = u0 + 5 # artı x derece eğer (u1) > up_l): # min/maks parametrelerini geçmiyorsa test eder u1 = up_l # aksi takdirde min/maks değerine ayarlanır kit.servo[vert].angle = u1 # servo durumunu hareket ettir[0] = u1 # durum değerini ayarla yazdır (" yukarı ", durum) time.sleep (1) # hızı ayarlar def MoveDown(self): d 0 = durum[0] d1 = d0 - 5 #eksi x derece eğer (d1 yukarı_r): f1 = yukarı_r kit.servo[forw].angle = f1 # servoyu hareket ettir[1] = f1 yazdır ("ileri", durum) time.sleep (1) def MoveBack(self): b0 = durum[1] b1 = b0 - 5 #minus x derece if (b1 le_t): l1 = le_t kit.servo[turn].angle = l1 # servoyu hareket ettir durum[2] = l1 yazdır ("sol ", durum) zaman.uyku (0,2) def MoveRight(self): r0 = durum[2] r1 = r0 - 2 #eksi x derece eğer (r1 < ri_t): r1 = ri_t kit.servo[turn].angle = r1 # servo durumu hareket[2] = r1 print ("sağ", durum) time.sleep (0.2) def OpenGrip(self): kit.servo[grip].angle = op_g # kavramayı "açık" konuma ayarlayın: "open_tab" time.sleep(0.5) durumu[3] = op_g def CloseGrip(self): kit.servo[grip].angle = cl_g # kavramayı "kapalı" konuma ayarlayın: " close_tab" time.sleep(0.5) status[3] = cl_g def StopMove(self): # hiçbir şey yapmaz, ancak hareketleri durdurur print ("stop ", durum) time.sleep(0.25) def gözcü(self, args): motor = BasicEngine(args.model_file) mic = args.mic args.mic ise None else int(args.mic) model.classify_audio(mikrofon, motor, 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),_n=n=hop int(args.num_frames_hop)) def on_execute(self, args): değilse self.on_init(): self._running = False q = model.get_queue() self._controler = Controler(q) değilse args.debug_keyboard: t = Thread(target=self.spotter, args=(args,)) t.daemon = True t.start() item = -1 while self._running: pygame.event.pump() eğer args.debug_keyboard: tuşlar = pygame.key.get_pressed() başka: deneyin: yeni_item = q.get(True, 0.1) sıra hariç. or item == "stop": self._running = False # if (args.debug_keyboard ve anahtarlar[pygame. K_SPACE]) veya item == "go": # self. MeArmPos(7) # if (args.debug_keyboard ve anahtarlar) [pygame. K_RIGHT]) veya item == "right": # sağa dön self. MoveRight() if (args.debug_ke yboard ve anahtarlar[pygame. K_LEFT]) veya item == "left": # sola self. MoveLeft() if (args.debug_keyboard ve anahtarlar[pygame. K_UP]) veya item == "yukarı": self. MoveUp() if (args.debug_keyboard ve anahtarlar[pygame. K_DOWN]) veya item == "down": self. MoveDown() if (args.debug_keyboard ve keys[pygame. K_B]) veya item == "b": # geriye doğru self. MoveBack() if (args.debug_keyboard ve anahtarlar[pygame. K_F]) veya item == "f": # forwards self. MoveForw() if (args.debug_keyboard ve anahtarlar[pygame. K_O]) veya item == "o": # açık kavrama: self. OpenGrip() if (args.debug_keyboard ve anahtarlar[pygame. K_C]) veya item == "c": # close grip: self. CloseGrip() if (args.debug_keyboard ve anahtarlar) [pygame. K_S]) veya item == "s": # hareketi durdur: "start_game" self. StopMove() if (args.debug_keyboard ve anahtarlar[pygame. K_0]) veya item == "0": self. MeArmPos (0) if (args.debug_keyboard ve anahtarlar[pygame. K_1]) veya öğe == "1": self. MeArmPos(1) if (args.debug_keyboard ve anahtarlar[pygame. K_2]) veya öğe == "2": self. MeArmPos(2) if (args.debug_keyboard ve anahtarlar[pygame. K_3]) veya it em == "3": self. MeArmPos(3) if (args.debug_keyboard ve anahtarlar[pygame. K_4]) veya öğe == "4": self. MeArmPos(4) if (args.debug_keyboard ve anahtarlar[pygame. K_5]) veya item == "5": self. MeArmPos(5) if (args.debug_keyboard ve anahtarlar[pygame. K_6]) veya item == "6": self. MeArmPos(6) if (args.debug_keyboard ve anahtarlar[pygame. K_7]) veya item == "7": self. MeArmPos(7) if (args.debug_keyboard ve anahtarlar[pygame. K_8]) veya item == "8": self. MeArmPos(8) if (args.debug_keyboard ve anahtarlar[pygame. K_9]) veya item == "9": self. MeArmPos(9) if (args.debug_keyboard ve anahtarlar[pygame. K_a]) veya item == "d": self. DancingMeArm() #dancing MeArm, "next_game" if (args.debug_keyboard ve anahtarlar[pygame. K_r]) veya item == "r": self. RandomMoves() #random dance "rastgele oyun" if (args.debug_keyboard ve anahtarlar[pygame. K_j]) veya item == "j": self. TransMeArm1() # taşıma nesnesi: "lunch_game" if (args.debug_keyboard ve anahtarlar[pygame. K_k]) veya item == "k": self. TransMeArm2() # taşıma nesnesi ters yön: "next_game" ''' if (args.debug_keyboard ve anahtarlar[pygame. K_l]) veya öğe == "l": self. JumpingJack2(1) #LED yanıp sönme "target" ''' time.sleep(0.05) self.on_cleanup() if _name_ == '_main_': ayrıştırıcı = argparse. ArgumentParser() parser.add_argument('--debug_keyboard', help='MeArm'ı kontrol etmek için klavyeyi kullanın.', action='store_true', default=False) model.add_model_flags(parser) args = parser.parse_args () the_app = App() the_app.on_execute(args)

Önerilen: