İçindekiler:

Kinect ile Ses Yerelleştirme Manken Kafası: 9 Adım (Resimli)
Kinect ile Ses Yerelleştirme Manken Kafası: 9 Adım (Resimli)

Video: Kinect ile Ses Yerelleştirme Manken Kafası: 9 Adım (Resimli)

Video: Kinect ile Ses Yerelleştirme Manken Kafası: 9 Adım (Resimli)
Video: Designing for Accessibility with BitwiseAndrea, WooleyWool, and ControlCoreAngel 2024, Temmuz
Anonim
Kinect ile Ses Yerelleştirme Manken Kafası
Kinect ile Ses Yerelleştirme Manken Kafası

Sürücü yorgunluğu izleme sistemi için bir test mankeni olan Margaret ile tanışın. Kısa süre önce görevinden emekli oldu ve ofisimizin yolunu buldu ve o zamandan beri 'ürkütücü' olduğunu düşünenlerin dikkatini çekti. Adalet adına, ona suçlayanlarla yüz yüze gelme yeteneği verdim; ruhsuz bakışlarıyla seni takip ediyormuş gibi yapmak yerine, şimdi gerçekten yapıyor. Sistem, Microsoft Kinect'in mikrofon dizisini ve onu yakınında konuşan insanlara yönlendirmek için bir servo kullanır.

1. Adım: Teori

teori
teori

Açıyı Hesaplamak

Bir şey duyduğumuzda, o ses doğrudan önümüzde olmadıkça, bir kulağa diğerinden önce ulaşır. Beynimiz varış gecikmesini algılar ve bunu gürültünün geldiği genel bir yöne çevirerek kaynağı bulmamızı sağlar. Bir çift mikrofon kullanarak aynı tür yerelleştirmeyi başarabiliriz. Bir mikrofon çifti ve bir ses kaynağı içeren gösterilen şemayı düşünün. Yukarıdan aşağıya bakıyorsak, ses dalgaları daireseldir, ancak kaynağa olan mesafe, mikrofonlar arasındaki boşluğa göre büyükse, o zaman sensörlerimizin bakış açısından dalga yaklaşık olarak düzlemseldir. Bu uzak alan varsayımı olarak bilinir ve problemimizin geometrisini basitleştirir.

Öyleyse dalga cephesinin düz bir çizgi olduğunu varsayalım. Ses sağdan geliyorsa, t2 zamanında mikrofon #2'ye ve t1 zamanında mikrofon #1'e çarpacaktır. Vuruş mikrofonu #2 ile mikrofon #1 arasında sesin kat ettiği d mesafesi, sesin algılanmasındaki zaman farkının ses hızıyla çarpımıdır v s:

d = v s *(t1-t2) = vs*Δt

Bu mesafeyi, mikrofon çifti arasındaki d 12 mesafesi ile çiftten ses kaynağına olan θ açısı arasındaki bağıntıyla ilişkilendirebiliriz:

cos(θ) = d/d 12 = vs*Δt /d12

Sadece iki mikrofonumuz olduğu için, ses kaynağının önümüzde mi yoksa arkamızda mı olduğu konusunda hesaplamamızda belirsizlik olacaktır. Bu sistemde ses kaynağının çiftin önünde olduğunu varsayacağız ve açıyı 0 derece (çiftin tam sağına) ile 180 derece (tamamen sola) arasında sıkıştıracağız.

Son olarak, ters kosinüsü alarak tetayı çözebiliriz:

θ = acos(vs*Δt/d12), 0 <= θ <= π

Açıyı biraz daha doğal hale getirmek için tetadan 90 derece çıkarabiliriz, böylece 0 derece doğrudan çiftin önünde ve +/- 90 derece tam sol veya tam sağ olur. Bu, ifademizi ters kosinüsten ters sinüse çevirir.

  • cos(θ-π/2) = günah(θ) = d/d12 = vs*Δt/d12
  • θ = asin(vs*Δt/d12), -π/2 <= θ <= π/2

Gecikmeyi Bulma

Yukarıdaki denklemden de görebileceğiniz gibi, açı için çözmemiz gereken tek şey, birinci mikrofona gelen ses dalgasının ikinci mikrofona göre gecikmesidir; sesin hızı ve mikrofonlar arasındaki mesafe hem sabittir hem de bilinir. Bunu başarmak için, önce ses sinyallerini fs frekansında örnekler, onları analogdan dijitale çevirir ve verileri daha sonra kullanmak üzere saklarız. Ses dalgamızın ayırt edilebilir özelliklerini yakalamak için yeterince uzun olan ve örnekleme penceresi olarak bilinen bir süre boyunca örnekleme yaparız. Örneğin, penceremiz son yarım saniye değerindeki ses verisi olabilir.

Pencereli ses sinyallerini elde ettikten sonra, çapraz korelasyonlarını hesaplayarak ikisi arasındaki gecikmeyi buluruz. Çapraz korelasyonu hesaplamak için, bir mikrofondan gelen pencereli sinyali sabit tutuyoruz ve ikinci sinyali zaman ekseni boyunca birincinin tamamen arkasından birincinin sonuna kadar kaydırıyoruz. Slaytımızdaki her adımda, sabit sinyalimizdeki her noktayı kayan sinyalimizdeki karşılık gelen nokta ile çarparız, sonra o adım için korelasyon katsayımızı hesaplamak için tüm sonuçları toplarız. Slaytımızı tamamladıktan sonra, en yüksek korelasyon katsayısına sahip olan adım, iki sinyalin en benzer olduğu noktaya karşılık gelir ve hangi adımda olduğumuz bize, n sinyali 2'nin sinyal 1'den kaç tane örneklem olduğunu söyler. n negatif ise., o zaman sinyal iki sinyal birin gerisinde kalıyor, pozitifse sinyal iki önde ve sıfır ise ikisi zaten hizalanmış durumda. Δt = n/fs ilişkisi ile örnekleme frekansımızı kullanarak bu örnek ofsetini bir zaman gecikmesine dönüştürürüz, böylece:

θ = asin(vs*n/(d12*fs))), -π/2 <= θ <= π/2

2. Adım: Bileşenler

Parçalar

  • Xbox 360 için Microsoft Kinect, model 1414 veya 1473. Kinect, kullanacağımız doğrusal bir dizide düzenlenmiş dört mikrofona sahiptir.
  • Kinect'in tescilli konektörünü bunun gibi USB + AC gücüne dönüştürmek için adaptör.
  • Raspberry Pi 2 veya 3, Raspbian Stretch çalıştırıyor. Başlangıçta bir Pi 1 Model B+ kullanmaya çalıştım ama yeterince güçlü değildi. Kinect'ten bağlantı kesilirken sorun yaşamaya devam ettim.
  • Bulabileceğiniz en ürkütücü manken kafası
  • Manken kafanızı çevirecek kadar güçlü bir analog servo
  • Hem Pi'ye hem de servoya güç sağlamak için yeterli amper değerine ve en az iki bağlantı noktasına sahip 5V USB duvar şarj cihazı. (Buna benzer bir 5A 3 bağlantı noktalı fiş kullandım
  • İki çıkışlı bir uzatma kablosu (Biri USB duvar şarj cihazı için, diğeri Kinect AC adaptörü için.
  • İki USB kablosu: Pi'ye güç sağlamak için bir A tipi - mikro USB kablosu ve kesmeyi düşünmediğiniz servoya güç sağlamak için bir diğeri
  • Her şeyin oturabileceği bir platform ve manken kafası için daha küçük bir platform. Taban olarak plastik servis tepsisi ve baş platform olarak plastik tabak kullandım. Her ikisi de Walmart'tandı ve sadece birkaç dolara mal oldu
  • Servonuzu daha büyük platforma takmak için 4x #8-32 1/2" cıvata ve somun
  • 2x M3 8mm rondelalı cıvata (veya servo kornanızı daha küçük platforma takmak için ihtiyacınız olan boyut ne olursa olsun)
  • Bir kırmızı ve bir siyah olmak üzere iki erkekten erkeğe aktarma kablosu ve bir kadından erkeğe aktarma kablosu
  • Yapışkan destekli Velcro şeritler
  • Elektrik bandı
  • Kablo yönetimi için koli bandı

Aletler

  • Kesme diskli Dremel
  • Delmek
  • 7/64", 11/16" ve 5/16" matkap uçları
  • M3 musluk (Servo kornanıza bağlı olarak isteğe bağlı)
  • Tornavida
  • Lehim ile havya
  • Yardım eli (isteğe bağlı)
  • İşaretleyici
  • Pusula
  • Tel striptizci
  • Multimetre (Opsiyonel)

KKD

  • Emniyet gözlükleri

  • Yüz Maskesi (dremmel ile işlenmiş plastik parçalar için).

3. Adım: Alt Platform Düzeneği

Alt Platform Düzeneği
Alt Platform Düzeneği
Alt Platform Düzeneği
Alt Platform Düzeneği
Alt Platform Düzeneği
Alt Platform Düzeneği

Yapacağımız ilk kısım, Kinect, servo ve tüm elektroniklerimizi tutacak olan alt platformdur. Platformu yapmak için ihtiyacınız olacak:

  • Plastik Servis Tepsisi
  • Servo
  • 4x #8-32 1/2" somunlu cıvata
  • Kesme Diskli Dremel
  • Tornavida
  • Delmek
  • 11/16" Matkap Ucu
  • İşaretleyici

Nasıl yapılır

  1. Tepsinizi ters çevirin.
  2. Servonuzu tepsinin arkasına yakın bir yere yerleştirin, servo çıkış dişlisinin tepsinin orta çizgisi boyunca uzandığından emin olun, ardından servonun tabanını işaretleyin.
  3. Dremel'inizi ve kesme çarkını kullanarak işaretlediğiniz alanı kesin ve ardından servonuzu yuvasına kaydırın.
  4. Tepsideki servo muhafaza montaj deliklerinin merkezlerini işaretleyin, ardından servoyu çıkarın ve 11/16" matkap ucunuzla bu delikleri delin. Delik açarken bunun gibi ince plastikleri kırmak çok kolay, bu yüzden çok daha güvenli buluyorum matkabı ters yönde çalıştırmak ve malzemeyi yavaşça yontmak için kullanılır. Delikleri düzgün delmekten çok daha yavaştır ancak çatlak olmamasını sağlar.
  5. Servonuzu tekrar yuvaya yerleştirin, ardından #8-32 cıvata ve somunlarla tepsiye monte edin.

Adım 4: Baş Platformu Montajı

Kafa Platformu Montajı
Kafa Platformu Montajı
Kafa Platformu Montajı
Kafa Platformu Montajı
Kafa Platformu Montajı
Kafa Platformu Montajı
Kafa Platformu Montajı
Kafa Platformu Montajı

Bundan sonraki yapacağımız kısım ise manken kafasını servoya bağlayacak bir platform olacak. Kafa platformunu yapmak için ihtiyacınız olacak:

  • Plastik tabak
  • Servo korna
  • 2x M3 8mm rondelalı cıvata
  • Tornavida
  • Delmek
  • 7/64" ve 5/16" matkap uçları
  • Pusula
  • Kesme diskli Dremel

Nasıl yapılır

  1. Pusulayı manken kafanızın tabanının yarıçapına ayarlayın.
  2. Plakanın ortasındaki bir daireyi işaretlemek için pusulanızı kullanın. Bu, baş platformumuzun gerçek boyutu olacaktır.
  3. Daha küçük platformu plakadan kesmek için dremel'inizi ve kesme diskinizi kullanın.
  4. Yeni platformunuzun merkezini 5/16" matkap ucuyla delin. Bu, servo kornamızı servomuza bağlayan vidaya erişmemizi sağlayacak. Deliği açarken platforma stabilite kazandırmak için bir makara koydum. altına tel geçirin ve makaranın ortasından delin.
  5. Servo kornanızı platformun ortasına hizalayın ve kornayı platforma takmak için iki delik işaretleyin. Bu montaj deliklerinin birbirinden yeterince uzakta olduğundan emin olun, böylece M3 cıvata başlarınız ve pullarınız için yer kalır.
  6. Bu işaretli delikleri 7/64" matkap ucuyla delin.
  7. Servo kornamın alt deliği pürüzsüzdü, yani M3 cıvatası için dişleri yoktu. Böylece, dişleri yapmak için matkabımı ve bir M3 musluğu kullandım.
  8. Servo kornayı kafa platformuna takmak için cıvataları ve rondelaları kullanın.

Adım 5: Servo Güç Kablosu

Servo Güç Kablosu
Servo Güç Kablosu
Servo Güç Kablosu
Servo Güç Kablosu
Servo Güç Kablosu
Servo Güç Kablosu
Servo Güç Kablosu
Servo Güç Kablosu

Analog servolar tipik olarak 4.8-6V ile çalışır. Raspberry Pi zaten USB'den 5V ile besleneceği için servoyu da USB'den besleyerek sistemimizi sadeleştireceğiz. Bunu yapmak için bir USB kablosunu değiştirmemiz gerekecek. Servo güç kablosunu yapmak için ihtiyacınız olacak:

  • A tipi uçlu yedek USB kablosu (bilgisayarınıza takılan türden)
  • Bir kırmızı ve bir siyah jumper tel
  • Havya
  • Lehim
  • Tel striptizci
  • Elektrik bandı
  • Yardım eli (isteğe bağlı)
  • Multimetre (isteğe bağlı)

Nasıl yapılır

  1. USB olmayan A tipi konektörü kablonuzdan kesin, ardından dört iç kabloyu ortaya çıkarmak için yalıtımın bir kısmını soyun. Açıkta kalan kabloları çevreleyen koruyucuyu kesin.
  2. Tipik olarak USB kablosunun dört kablosu olacaktır: ikisi veri iletimi ve alımı için ve ikisi güç ve toprak için. Sırasıyla genellikle kırmızı ve siyah olan güç ve toprakla ilgileniyoruz. Kırmızı ve siyah kabloların yalıtımının bir kısmını soyun ve yeşil ve beyaz kabloları kesin. Doğru güç ve topraklama kablolarına sahip olmadığınızdan endişeleniyorsanız, kablonuzu USB güç adaptörünüze takabilir ve bir multimetre ile çıkış voltajını kontrol edebilirsiniz.
  3. Ardından, kırmızı ve siyah atlama kablolarınızın bir ucunu kesin ve yalıtımın bir kısmını soyun.
  4. Şimdi, atlama telinizin ve USB kablolarınızın açıkta kalan siyah kablolarını birlikte bükün. Açıkta kalan tellerin merkezlerini çaprazlayın ve birbirlerinin etrafında bükün. Ardından, bir arada tutmak için eşleştirilmiş tellere lehim uygulayın. Yardım eden eller, kablolarınızı yerinde tutarak bunu kolaylaştıracaktır.
  5. Kırmızı teller için 4. adımı tekrarlayın.
  6. Havalı hissediyorsanız, açıkta kalan kabloları elektrik bandıyla veya ısıyla daralan makaronla kapatın. Teller çok küçük olduğu için bu bağlantılar kırılgan olacaktır, bu nedenle USB kablosunun dış yalıtımına atlama kablolarını tutan ikinci bir bant katmanı ekleyin. Bu, montajı daha sert hale getirecek ve dolayısıyla bükülmeden kırılma olasılığını azaltacaktır.

Adım 6: Elektronik Montaj

Elektronik Montaj
Elektronik Montaj
Elektronik Montaj
Elektronik Montaj
Elektronik Montaj
Elektronik Montaj

Son olarak, her şeyi bir araya getireceğiz, elektroniklerimizi ve diğer her şeyi alt platforma monte edeceğiz. İhtiyacın olacak:

  • Alt platform
  • Baş platformu
  • manken kafa
  • USB+AC adaptörlü Kinect
  • USB güç adaptörü
  • Uzatma kablosu
  • Mikro USB kablosu
  • Servo güç kablosu
  • Ahududu Pi
  • Erkek-Dişi atlama kablosu
  • Yapıştırıcı Velcro
  • Makas

Nasıl yapılır

  1. Pi'yi Velcro ile tepsinin altına monte edin.
  2. USB güç adaptörünü Velcro ile takın.
  3. Servo ve Pi'yi USB güç adaptörüne takın.
  4. Pi'nin 12 pinini (GPIO18) servonun sinyal kablosuna bağlayın. Sağdaki 6. iğnedir.
  5. Uzatma kablonuzu tepsinin arka kolundan geçirin ve USB güç adaptörünü bir tarafa takın.
  6. Kinect USB+AC adaptörünü alın ve güç adaptörünü uzatma kablosunun diğer tarafına ve USB'yi Pi'ye takın.
  7. Kinect kablosunu tepsinin ön kolundan geçirin ve Kinect adaptörüne takın.
  8. Kabloları platformun alt tarafında tutmak için koli bandı kullandım. Bu pek zarif görünmüyor, ama neyse ki tüm bunlar gizli.
  9. Platformu sağa çevirin ve Kinect'i platformun önüne monte etmek için Velcro kullanın.
  10. Manken kafasını kafa platformuna monte etmek için Velcro kullanın. Yine de her şey sıralandığında, servo korna montaj vidasına erişebilmemiz için iki parçayı ayırın. Yine de kornayı servoya vidalamayın, çünkü her şeyi sıraya koyabilmemiz için önce servonun merkez konumunda olduğundan emin olmamız gerekiyor. Bunu daha sonraki bir adımda yapacağız.

7. Adım: Yazılım ve Algoritma

Yazılım ve Algoritma
Yazılım ve Algoritma

genel bakış

Bu projenin yazılımı C++ ile yazılmıştır ve robotik yazılımı yazmak için bir çerçeve olan Robot İşletim Sistemi (ROS) ile entegre edilmiştir. ROS'ta, bir sistemin yazılımı, her bir düğümün sistem işlevselliğinin belirli bir alt bölümünü uyguladığı, düğüm adı verilen bir program koleksiyonuna bölünür. Veriler, bir yayınla/abone ol yöntemi kullanılarak düğümler arasında geçirilir; burada, verileri üreten düğümler bunu yayınlar ve verileri tüketen düğümler buna abone olur. Kodun bu şekilde ayrıştırılması, sistem işlevselliğinin kolayca genişletilmesine ve daha hızlı geliştirme için düğümlerin sistemler arasında paylaşılmasına olanak tanır.

Bu sistemde, ROS öncelikle ses kaynağının geliş yönünü (DOA) hesaplayan kodu servoyu kontrol eden koddan ayırmak için kullanılır ve diğer projelerin ihtiyaç duymayabilecekleri veya istemeyebilecekleri servo kodunu dahil etmeden Kinect DOA tahminini içermesine izin verir.. Kodun kendisine bakmak isterseniz, GitHub'da bulunabilir:

github.com/raikaDial/kinect_doa

Kinect DOA Düğümü

kinect_doa düğümü, temelde ilginç olan her şeyi yapan bu sistemin eti ve kemiğidir. Başlatıldığında, ROS düğümünü başlatır, tüm ROS sihrini mümkün kılar, ardından ses akışlarının kullanılabilir hale gelmesi için üretici yazılımını Kinect'e yükler. Ardından, ses akışlarını açan ve mikrofon verilerini okumaya başlayan yeni bir iş parçacığı oluşturur. Kinect, dört mikrofonunu her biri 16 kHz frekansında örnekler; bu nedenle, hesaplama yükü nedeniyle eksik verileri önlemek için çapraz korelasyon ve veri toplamanın ayrı iş parçacıklarında olması iyidir. Kinect ile arayüz oluşturma, popüler bir açık kaynaklı sürücü olan libfreenect kullanılarak gerçekleştirilir.

Toplama iş parçacığı, her yeni veri alındığında bir geri arama işlevi yürütür ve her ikisi de verileri depolar ve DOA'nın ne zaman tahmin edileceğini belirler. Her mikrofondan gelen veriler, burada 8192 örnek olan örnekleme penceremize eşit uzunlukta yuvarlanan tamponlarda saklanır. Bu, performans ve hesaplama yükü arasında iyi bir denge olduğunu deneyerek bulduğum son yarım saniyelik veri değerindeki çapraz korelasyonu hesaplamak anlamına geliyor. DOA tahmini, her 4096 örnek için ana iş parçacığına sinyal göndererek tetiklenir, böylece ardışık çapraz korelasyonlar %50 oranında örtüşür. Örtüşmenin olmadığı ve örnekleme penceresi tarafından yarı yarıya kesilen çok hızlı bir ses çıkardığınızı düşünün. Ayırt edici sesinizden önce ve sonra, çapraz korelasyon ile hizalanması zor olabilecek beyaz gürültü olacaktır. Üst üste binen pencereler bize sesin daha eksiksiz bir örneğini sağlar ve bize sıralanacak daha belirgin özellikler vererek çapraz korelasyonumuzun güvenilirliğini artırır.

Ana iş parçacığı, toplama iş parçacığından gelen sinyali bekler, ardından DOA tahminini hesaplar. İlk olarak, yakalanan dalga biçimlerinin beyaz gürültüden önemli ölçüde farklı olup olmadığını kontrol eder. Bu kontrol olmadan, ilginç sesler olup olmadığına bakılmaksızın tahminimizi saniyede dört kez hesaplıyor olurduk ve manken kafamız spastik bir karmaşa olurdu. Bu sistemde kullanılan beyaz gürültü algılama algoritması, burada listelenen iki algoritmadan ilkidir. Dalga biçimimizin türevinin mutlak integralinin mutlak integraline oranını hesaplıyoruz; yüksek beyaz gürültü içeriğine sahip sinyaller için bu oran, daha az gürültülü sinyallerden daha yüksektir. Gürültüyü gürültü olmayandan ayıran bu oran için bir eşik ayarlayarak, çapraz korelasyonu yalnızca uygun olduğunda tetikleyebiliriz. Elbette bu oran, sistem her yeni ortama taşındığında yeniden ayarlanması gereken bir şeydir.

Dalga biçimlerinin gürültü içermeyen önemli bir içerik içerdiğini belirledikten sonra program çapraz korelasyonlarla devam eder. Bununla birlikte, bu hesaplamalarda yerleşik olarak bulunan üç önemli optimizasyon vardır:

  1. Kinect'te dört mikrofon var, yani çapraz ilişki kurabileceğimiz toplam altı dalga biçimi çifti var. Ancak mikrofon dizisinin uzamsal düzenine bakarsanız, 2, 3 ve 4 numaralı mikrofonların birbirine çok yakın olduğunu görebilirsiniz. Aslında, o kadar yakındırlar ki, ses hızı ve örnekleme frekansımız nedeniyle 2, 3 ve 4'te alınan dalga biçimleri önde veya arkada en fazla bir örnekle ayrılacaktır, bunu maxlag = Δd hesaplamasıyla doğrulayabiliriz. *fs/vs, burada Δd mikrofon çiftinin ayrılmasıdır, fs örnekleme frekansıdır ve vs sesin hızıdır. Bu nedenle, bu üçü arasındaki ilişki çiftleri işe yaramaz ve sadece mikrofon 1'i 2, 3 ve 4 ile çapraz ilişkilendirmemiz gerekir.
  2. Ses sinyallerinin standart çapraz korelasyonunun, yankılanmaların (ekolar) varlığında zayıf performans gösterdiği bilinmektedir. Sağlam bir alternatif, faz dönüşümü (GCC-PHAT) ile genelleştirilmiş çapraz korelasyon olarak bilinir. Bu yöntem, çapraz korelasyondaki tepe noktalarını güçlendiren ve orijinal sinyali ekolardan ayırt etmeyi kolaylaştıran bir ağırlıklandırma fonksiyonunun uygulanmasına indirgenir. GCC-PHAT'ın performansını bir yankı odasındaki basit çapraz korelasyonla karşılaştırdım (okuyun: beton banyo yeniden şekillendiriliyor) ve GCC-PHAT'ın doğru açıyı tahmin etmede 7 kat daha etkili olduğunu buldum.
  3. Çapraz korelasyonu gerçekleştirirken, biri diğeri boyunca kayan iki sinyali alıyoruz ve her adımda sabit sinyalimizdeki her noktayı kayan sinyaldeki her noktayla çarpıyoruz. n uzunluğundaki iki sinyal için bu, n^2 hesaplamalarıyla sonuçlanır. Bunu, hızlı bir fourier dönüşümü (nlogn hesaplamaları) içeren, bir dönüştürülmüş sinyaldeki her noktayı diğerindeki karşılık gelen noktayla çarparak (n hesaplamaları) içeren, frekans alanında çapraz korelasyon gerçekleştirerek, ardından bir ters ilişki gerçekleştirerek geliştirebiliriz. Fourier dönüşümü, zaman alanına geri dönmek için (nlogn hesaplamaları), n+2*nlogn hesaplamalarıyla sonuçlanır, n^2'den az. Ancak bu naif bir yaklaşımdır. Dizimizdeki mikrofonlar birbirine o kadar yakındır ve ses hızı o kadar yavaştır ki, ses dalga biçimleri zaten çoğunlukla hizalanmış olacaktır. Böylece, çapraz korelasyonumuzu yalnızca biraz ileri veya geri olan uzaklıkları dikkate alacak şekilde pencereleyebiliriz. Mikrofon 1 ve 4 için, gecikme +/-12 örnek arasında düşmelidir, yani her çapraz korelasyon için yalnızca 24*n hesaplama yapmamız gerekir, bu da dalga formlarımız 2900 örnekten daha uzun olduğunda hesaplama tasarrufu sağlar.

Bu sistem, optimizasyon 3 ile GCC-PHAT algoritmasını uygulayan minidsp kitaplığından yararlanır.

Her mikrofon çiftinden gelen sinyallerdeki gecikmeyi bulduktan sonra, program gecikme için medyan değerini seçer, bunu tahmini açıyı hesaplamak için kullanır ve servoyu kontrol etmek için kullanılabilmesi için sonucu yayınlar.

Servo Kontrol Düğümü

kinect_doa düğümüyle karşılaştırıldığında, servo düğüm nispeten basittir. Görevi yalnızca tahmini DOA'yı almak ve servoyu bu açıya getirmektir. Raspberry Pi'nin donanım PWM modülüne erişmek için kablolama Pi kitaplığını kullanır ve bunu servo açısını ayarlamak için kullanır. Çoğu analog servo, 0° ila 180°'lik bir açıya karşılık gelen 1000 µs ila 2000 µs arasında değişen bir darbe genişliğine sahip bir PWM sinyali ile kontrol edilir, ancak kullandığım servo, bir açıya karşılık gelen 500 µs ila 2500 µs ile kontrol edildi. 0° ila 270°. Böylece düğüm, minimum darbe genişliği, maksimum darbe genişliği ve maksimum ve minimum açılar arasındaki fark için parametreler ayarlanarak farklı servo donanımları için yapılandırılabilir. Ek olarak, servo hemen hedef açıya hareket etmez, bunun yerine açıya doğru yapılandırılabilir bir hızda hareket eder ve Margaret'e daha kademeli, ürkütücü bir hava verir (artı, hızlı ileri geri hareket eden bir servonun sesi gerçekten hızlı bir şekilde can sıkıcı hale gelir)).

Adım 8: Oluşturma ve Kurulum

Bağımlılıkları Yükle:

İlk önce libfreenect'i kurun. Paket yöneticisi ile alabileceğiniz sürüm ses desteği içermediği için onu kaynaktan oluşturmamız gerekiyor. Bunun nedeni, sesi etkinleştirmek için Kinect'e üretici yazılımı yüklememiz gerektiğidir ve bu üretici yazılımının yeniden dağıtılması belirli yargı bölgelerinde yasal değildir. Ek olarak, başsız Raspbian kurulumları için gereksiz olan OpenGL ve glut gerektiren örnekleri oluşturmaktan kaçınabiliriz.

sudo apt-get install git cmake build-essential libusb-1.0-0-dev

cd git klon https://github.com/OpenKinect/libfreenect cd libfreenect mkdir build cd build cmake.. -DCMAKE_BUILD_REDIST_PACKAGE=OFF -DCMAKE_BUILD_EXAMPLES=OFF yap sudo make install sudo cp ~/libfreenect/platform-kin/udev.rules /etc/udev/rules.d udevadm kontrolü --yeniden yükleme kuralları && udevadm tetikleyicisi

Daha sonra, Pi'nin GPIO pinlerini kontrol etmemize izin veren wirePi paketini kurmamız gerekiyor:

CD

git klon git://git.drogon.net/wiringPi cd ~/wiringPi./build

Manken Kafasını Takın:

KablolamaPi takılıyken, manken kafasını alt platforma takmak için şimdi hızlı bir şekilde donanım alanına geri dönebiliriz. Servoyu komut satırı üzerinden ortalamak için aşağıdaki komutları girin:

gpio pwm-ms

gpio pwmc 192 gpio pwmr 2000 gpio -g pwm 18 150

Hareket yoksa, servonuz muhtemelen zaten ortalanmıştır. Yine de emin olmak için servoyu merkez dışı bir değere ayarlayabilirsiniz, örn. gpio -g pwm 18 200, ardından tekrar 150'ye ayarlayın.

Servonun ortalandığından emin olduktan sonra, manken kafanız ileriye bakacak şekilde baş platformunun servo kornasını servoya takın. Ardından kornayı servoya vidalayın ve başınızı Velcro uçlarıyla tutturun.

ROS'u yükleyin:

Ardından, Pi'nize ROS yükleyin. Harika bir kurulum kılavuzu burada bulunabilir; Sistemimiz için OpenCV'ye ihtiyacımız yok, bu nedenle 3. adımı atlayabilirsiniz. Bu derlemenin tamamlanması birkaç saat sürecektir. Kurulum kılavuzunu izlemeyi bitirdiğinizde, yeni kurulan ROS paketlerimizi kullanabilmemiz için kurulumun kaynak kullanımını bashrc'nize ekleyin:

echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc

Kinect DOA Paketi Oluşturun:

Tüm bunlar yapıldıktan sonra projemiz için bir catkin çalışma alanı oluşturun ve src dizinine girin:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Bu projenin kodu kinect_doa paketinde bulunur, bu yüzden onu yeni çalışma alanınızın src dizinine kopyalayın:

git klonu

robot_upstart paketi, başlatma dosyalarının başlangıçta çalışacak şekilde yüklenmesi için kullanımı kolay bir araç sağlar, bu nedenle bunu çalışma alanınıza da kopyalayın:

git klon

Şimdi, çalışma alanımızın en üst düzey dizininden catkin_make'i çağırarak proje kodunu oluşturabilir, ardından paketlerimizin kullanılabilir olması için derlememizi kaynaklayabiliriz:

cd ~/kinect_doa_ws

catkin_make echo "source /home/pi/kinect_doa_ws/devel/setup.bash" >> ~/.bashrc

Çalıştırma ve Ayarlama:

Her şeyin takılı ve açık olduğunu varsayarsak, şimdi sistemi başlatabilmeli ve Kinect izini seslendirebilmelisiniz! Ancak, bir Kinect 1473'ünüz varsa, önce ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch dosyasını bir metin düzenleyicide açın ve using_kinect_1473 parametresini true olarak ayarlayın. Ek olarak, benim yaptığımdan farklı bir servo kullandıysanız, muhtemelen standart bir analog servodur, Bu nedenle başlatma dosyasındayken min_us parametresini 1000, max_us 2000 ve max_deg parametresini 180 olarak değiştirin.

roslaunch kinect_doa kinect_doa.launch

Bir süre onunla oynayın. Sistemin çok hassas olduğunu düşünüyorsanız (seslere veya ayırt edici gürültülere karşılık gelmeyen rastgele yönlere bakarak), başlatma dosyasındaki white_noise_ratio parametresini değiştirmeyi ve yanıt verme düzeyi sizin için uygun olana kadar sistemi yeniden başlatmayı deneyin.. Oranı yükseltmek, sistemi daha az duyarlı hale getirir ve bunun tersi de geçerlidir. İstediğiniz performansı elde etmek için sistemi farklı bir konuma taşıdığınızda muhtemelen bu ayarı yapmanız gerekecektir.

Pi'yi açtığımızda programı başlatmak için başlatma dosyamızı yüklemek için robot_upstart paketini kullanıyoruz. ROS şu anda çalışmıyorsa, roscore komutuyla başlatın. Ardından, yeni bir terminal açın ve başlatmayı şu şekilde yükleyin:

rosrun robot_upstart kurulumu kinect_doa/launch/kinect_doa.launch --user root --symlink

~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch dosyasını düzenleyerek parametreleri değiştirebilmemiz için, başlatma dosyasına kopyalamak yerine bir sembolik bağlantı oluşturuyoruz.

9. Adım: Ofiste Gizlemek

Ofiste Gizlemek
Ofiste Gizlemek

Şimdi eğlenceli kısım için. Mesai saatinden sonra işe gidin ve mankeninizin başını gizlice yukarı kaldırın. O zaman arkanıza yaslanın ve iş arkadaşlarınızın bunu yakalamasının ne kadar sürdüğünü görün! Yeni yaratılışınızın birkaç kafa döndürmesi garantili…

Önerilen: