Mundarija:

Kinect bilan maneken boshini ovozli lokalizatsiya qilish: 9 qadam (rasmlar bilan)
Kinect bilan maneken boshini ovozli lokalizatsiya qilish: 9 qadam (rasmlar bilan)

Video: Kinect bilan maneken boshini ovozli lokalizatsiya qilish: 9 qadam (rasmlar bilan)

Video: Kinect bilan maneken boshini ovozli lokalizatsiya qilish: 9 qadam (rasmlar bilan)
Video: Как охотиться на людей ► 1 Прохождение Manhunt (PS2) 2024, Iyul
Anonim
Kinect yordamida tovushni lokalizatsiya qiluvchi maneken boshi
Kinect yordamida tovushni lokalizatsiya qiluvchi maneken boshi

Haydovchining charchashini nazorat qilish tizimining sinov qo'g'irchog'i Margaret bilan tanishing. U yaqinda o'z vazifalarini bajarib nafaqaga chiqdi va bizning ofisimizga yo'l topdi va o'shandan beri o'zini "dahshatli" deb hisoblaganlarning e'tiborini tortdi. Men adolat manfaati uchun unga ayblovchilar bilan yuzma-yuz uchrashish qobiliyatini berdim; aftidan, u sizni jonsiz nigohi bilan kuzatib turgandek, endi u shunday qiladi. Tizim Microsoft Kinect va servo mikrofonidan foydalanadi va uni yonida gaplashayotgan odamlar tomon yo'naltiradi.

1 -qadam: nazariya

Nazariya
Nazariya

Burchakni hisoblash

Biror narsani eshitganimizda, agar bu shovqin to'g'ridan -to'g'ri oldimizda bo'lmasa, u bir qulog'imizdan boshqasiga yetib boradi. Bizning miyalarimiz kelishning kechikishini sezadi va uni shovqin keladigan umumiy yo'nalishga aylantiradi, bu bizga manbani topishga imkon beradi. Biz bir xil mikrofon yordamida aynan bir xil lokalizatsiyaga erishishimiz mumkin. Ko'rsatilgan diagrammada mikrofon jufti va ovoz manbai mavjud. Agar biz yuqoridan pastga qarasak, tovush to'lqinlari dumaloq, lekin agar manbagacha bo'lgan masofa mikrofonlar orasidagi masofaga nisbatan katta bo'lsa, u holda sensorlarimiz nuqtai nazaridan to'lqin taxminan tekislikdir. Bu uzoqdan taxmin deb ataladi va bizning muammoning geometriyasini soddalashtiradi.

Shunday qilib, to'lqin chizig'i to'g'ri chiziq deb taxmin qiling. Agar ovoz o'ngdan chiqayotgan bo'lsa, u t2 vaqtida 2 -chi mikrofonga va 1 -chi mikrofonga uriladi. 2 -chi mikrofon va 1 -chi mikrofon orasidagi tovush d masofasi - bu tovushni v s tovush tezligiga ko'paytirilgan vaqt farqi:

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

Biz bu masofani mikrofon jufti bilan θ burchagidan tovush manbaigacha bo'lgan d 12 masofaga bog'lay olamiz:

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

Chunki bizda faqat ikkita mikrofon bor, hisob -kitobimizda ovoz manbai oldimizda yoki orqamizda noaniqlik bo'ladi. Bu tizimda biz ovoz manbai juftlik oldida deb taxmin qilamiz va 0 gradus (juftlikning to'liq o'ng tomoni) orasidagi burchakni 180 gradusgacha (to'liq chapda) qisamiz.

Nihoyat, teskari kosinusni olib, teta uchun hal qila olamiz:

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

Burchakni bir oz tabiiyroq qilish uchun biz 0 gradusni to'g'ridan-to'g'ri juftlik oldida va +/- 90 gradus to'liq chap yoki to'liq o'ngda bo'lishi uchun tetadan 90 gradusni olib tashlashimiz mumkin. Bu bizning ifodamizni teskari kosinusdan teskari sinusga aylantiradi.

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

Kechikishni topish

Yuqoridagi tenglamadan ko'rinib turibdiki, burchak uchun hal qilishimiz kerak bo'lgan narsa - bu mikrofonga kelgan tovush to'lqinining ikkinchi mikrofonga nisbatan kechikishi; tovush tezligi va mikrofonlar orasidagi masofa ham aniq, ham ma'lum. Buni amalga oshirish uchun biz birinchi navbatda fs chastotasida audio signallarni namuna olamiz, ularni analogdan raqamliga o'tkazamiz va ma'lumotlarni keyinchalik ishlatish uchun saqlaymiz. Biz namuna olish oynasi deb nomlanuvchi ma'lum vaqt davomida namuna olamiz, bu bizning ovoz to'lqinimizning ajralib turadigan xususiyatlarini olish uchun etarlicha uzoq davom etadi. Masalan, bizning oynamiz oxirgi yarim soniyadagi audio ma'lumot bo'lishi mumkin.

Oynali ovozli signallarni olgandan so'ng, biz ularning o'zaro bog'liqligini hisoblash orqali ularning orasidagi kechikishni topamiz. O'zaro o'zaro bog'liqlikni hisoblash uchun biz bitta mikrofondan derazali signalni ushlab turamiz va ikkinchi signalni vaqt o'qi bo'ylab birinchisidan oxirigacha birinchisidan oldinga siljitamiz. Slaydimiz bo'ylab har bir qadamda biz doimiy signalimizdagi har bir nuqtani siljish signalimizning mos keladigan nuqtasiga ko'paytiramiz, so'ngra barcha natijalarni yig'amiz va bu qadam uchun korrelyatsion koeffitsientimizni hisoblaymiz. Slaydni tugatgandan so'ng, eng yuqori korrelyatsion koeffitsientga ega bo'lgan qadam, ikkita signalning eng o'xshash nuqtasiga to'g'ri keladi va biz qaysi qadamda, n signalning ikkita signal 1 -signaldan o'rnashganligini ko'rsatadi., keyin ikkinchi signal birinchi signaldan orqada qolmoqda, agar u ijobiy bo'lsa, ikkinchi signal oldinda, va agar u nol bo'lsa, ikkalasi allaqachon birlashtirilgan. Biz bu namunaviy ofsetni tanlab olish chastotamizdan foydalanib, tt = n/fs nisbati bilan vaqt kechikishiga aylantiramiz, shunday qilib:

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

2 -qadam: komponentlar

Qismlar

  • Microsoft Kinect for Xbox 360, model 1414 yoki 1473. Kinect biz foydalanadigan chiziqli qatorda joylashtirilgan to'rtta mikrofonga ega.
  • Kinect -ning xususiy ulagichini USB + AC quvvatiga aylantirish uchun adapter.
  • Raspberry Pi 2 yoki 3 ishlaydigan Raspbian Stretch. Men dastlab Pi 1 Model B+dan foydalanishga harakat qildim, lekin u etarlicha kuchli emas edi. Men Kinect -dan uzilishda muammolarga duch keldim.
  • Siz topa oladigan eng dahshatli maneken boshi
  • Maneken boshini burish uchun etarlicha kuchli analog servo
  • Pi va servo va kamida ikkita portni quvvatlantirish uchun etarli kuchga ega 5V USB devor zaryadlovchi qurilmasi. (Men shunga o'xshash 5A 3 portli vilkasidan foydalanardim
  • Ikkita rozetkali uzaytirgich kabeli (biri USB devor zaryadlovchi uchun, ikkinchisi Kinect AC adapteri uchun).
  • Ikkita USB kabeli: Pi-ni quvvatlantirish uchun A tipidagi mikro-USB kabeli, ikkinchisi esa servo quvvatini uzish uchun.
  • Hamma o'tirish uchun platforma va maneken boshi uchun boshqa kichikroq platforma. Men tayanch sifatida plastmassa xizmat ko'rsatish tepsisini va bosh platformasi sifatida plastik plastinani ishlatardim. Ikkalasi ham Walmartdan edi va narxi atigi bir necha dollar
  • 4x #8-32 1/2 dyuymli boltlar va yong'oqlar servoingizni katta platformaga ulash uchun
  • 2x yuvgichli M3 8 mm murvat (yoki servo shoxini kichikroq platformaga ulash uchun kerak bo'ladigan o'lcham)
  • Erkak-erkak ikkita o'tish simlari, bitta qizil va bitta qora va bitta urg'ochi-erkak o'tish kabeli
  • Yopishqoq tayanchli Velcro chiziqlar
  • Elektr tasmasi
  • Kabelni boshqarish uchun yopishqoq lenta

Asboblar

  • Dremel chiqib ketish g'ildiragi bilan
  • Matkap
  • 7/64 dyuymli, 11/16 dyuymli va 5/16 dyuymli matkaplar
  • M3 teging (ixtiyoriy, servo shoxingizga bog'liq)
  • Tornavida
  • Lehim bilan lehimlanadigan temir
  • Yordam qo'llari (ixtiyoriy)
  • Marker
  • Kompas
  • Tel -chiziqlar
  • Multimetr (ixtiyoriy)

PPE

  • Xavfsizlik ko'zoynaklari

  • Yuz niqobi (plastmassa bitlar uchun).

3 -qadam: Pastki platforma yig'ilishi

Pastki platforma yig'ilishi
Pastki platforma yig'ilishi
Pastki platforma yig'ilishi
Pastki platforma yig'ilishi
Pastki platforma yig'ilishi
Pastki platforma yig'ilishi

Biz qiladigan birinchi qism - bu Kinect, servo va barcha elektronikamizni ushlab turadigan pastki platforma. Platformani yaratish uchun sizga kerak bo'ladi:

  • Plastik xizmat ko'rsatish tepsisi
  • Servo
  • 4x #8-32 1/2 dyuymli yong'oqli murvat
  • Dremel g'ildirak bilan
  • Tornavida
  • Matkap
  • 11/16 dyuymli matkap
  • Marker

Qanday qilish kerak

  1. Tovoqlaringizni teskari aylantiring.
  2. Servoingizni tepsining orqa tomoniga yon tomonga joylashtiring, servo chiqish tishli qutining o'rta chizig'i bo'ylab joylashganligiga ishonch hosil qiling, so'ngra servo poydevorining atrofini belgilang.
  3. Dremel va kesish g'ildiragidan foydalanib, siz belgilagan joyni kesib oling, so'ng servo uyasiga kiriting.
  4. Tovoqlar ustidagi servo korpus o'rnatish teshiklarining markazlarini belgilang, so'ng servo olib tashlang va bu teshiklarni 11/16 dyuymli matkap bilan burg'ulang. Teshiklarni burg'ilashda bunday plastmassani yorish juda oson, shuning uchun men buni ancha xavfsizroq deb bilaman. burg'ulashni teskari yo'nalishda bajarish va materialni asta -sekin olib tashlash, bu teshiklarni to'g'ri burg'ilashdan ko'ra sekinroq, lekin hech qanday yoriq bo'lmasligini ta'minlaydi.
  5. Servoingizni uyaga qaytaring, so'ngra #8-32 murvat va yong'oqlar bilan laganda tagiga joylashtiring.

4 -qadam: Bosh platforma yig'ilishi

Bosh platforma yig'ilishi
Bosh platforma yig'ilishi
Bosh platforma yig'ilishi
Bosh platforma yig'ilishi
Bosh platforma yig'ilishi
Bosh platforma yig'ilishi
Bosh platforma yig'ilishi
Bosh platforma yig'ilishi

Biz tayyorlaydigan keyingi qism manken boshini servoga ulash uchun platforma bo'ladi. Bosh platformani yaratish uchun sizga kerak bo'ladi:

  • Plastik plastinka
  • Servo shoxi
  • 2x M3 8 mm boltli kir yuvish mashinasi
  • Tornavida
  • Matkap
  • 7/64 dyuymli va 5/16 dyuymli matkaplar
  • Kompas
  • Dremel chiqib ketish g'ildiragi bilan

Qanday qilish kerak

  1. Kompasni maneken boshining tagining radiusiga qo'ying.
  2. Plitaning markazida joylashgan aylanani belgilash uchun kompasdan foydalaning. Bu bizning bosh platformamizning haqiqiy o'lchami bo'ladi.
  3. Kichkina platformani plastinkadan kesib tashlash uchun dremel va kesish g'ildiragidan foydalaning.
  4. 5/16 dyuymli matkap yordamida yangi platformangiz markazini burg'ilang. Bu bizga servo shoximizni servoga o'rnatadigan vintga kirishga imkon beradi. Teshikni burg'ilab turganimda platformaning barqarorligini ta'minlash uchun men g'altakni qo'ydim. uning ostidagi sim va g'altakning o'rtasidan burg'ulash.
  5. Servo shoxingizni platformaning o'rtasiga qo'ying va shoxni platformaga ulash uchun ikkita teshikni belgilang. O'rnatish teshiklari bir -biridan etarlicha masofada joylashganligiga ishonch hosil qiling, shunda M3 murvat boshlari va yuvish uchun joy bor.
  6. Belgilangan teshiklarni 7/64 dyuymli matkap bilan burg'ulang.
  7. Mening servo shoximning pastki teshigi silliq edi, ya'ni M3 murvatining iplari yo'q edi. Shunday qilib, men matkap va M3 kranidan foydalanib, iplarni yasadim.
  8. Servo shoxini bosh platformasiga ulash uchun murvat va yuvish vositalarini ishlating.

5 -qadam: Servo quvvat kabeli

Servo quvvat kabeli
Servo quvvat kabeli
Servo quvvat kabeli
Servo quvvat kabeli
Servo quvvat kabeli
Servo quvvat kabeli
Servo quvvat kabeli
Servo quvvat kabeli

Analog servolar odatda 4.8-6V bilan quvvatlanadi. Raspberry Pi allaqachon USB -dan 5V quvvat oladigan bo'lgani uchun, biz servo -ni USB -dan quvvatlantirish orqali tizimimizni soddalashtiramiz. Buning uchun biz USB kabelini o'zgartirishimiz kerak. Servo quvvat kabelini yaratish uchun sizga kerak bo'ladi:

  • A tipidagi zaxira USB kabeli (kompyuterga ulangan)
  • Bitta qizil va bitta qora o'tish simlari
  • Lehimlash temir
  • Lehim
  • Tel -chiziqlar
  • Elektr tasmasi
  • Yordam qo'llari (ixtiyoriy)
  • Multimetr (ixtiyoriy)

Qanday qilish kerak

  1. USB-A tipidagi bo'lmagan ulagichni kabelingizdan uzing, so'ngra to'rtta ichki simni ochish uchun izolyatsiyani biroz uzing. Ochiq simlarni o'rab turgan ekranni kesib oling.
  2. Odatda USB kabeli to'rtta simga ega bo'ladi: ikkitasi ma'lumotlarni uzatish va qabul qilish uchun, ikkitasi quvvat va er uchun. Biz kuch va erga qiziqamiz, ular odatda qizil va qora. Qizil va qora simlarning izolyatsiyasini olib tashlang va yashil va oq simlarni kesib oling. Agar sizda to'g'ri quvvat va topraklama simlari yo'qligidan xavotirda bo'lsangiz, kabelingizni USB quvvat adapteriga ulang va multimetr yordamida chiqish kuchlanishini tekshiring.
  3. Keyin, qizil va qora o'tish kabellarining bir uchini kesib oling va izolyatsiyaning bir qismini olib tashlang.
  4. Endi, o'tish kabeli va USB kabellarining ochiq qora simlarini bir -biriga bog'lang. Ochilgan simlarning markazlarini kesib o'ting va ularni bir -biriga aylantiring. Keyin, bir -biriga bog'lab qo'yish uchun bog'langan simlarga lehim qo'llang. Kabellarni joyida ushlab turish yordam qo'llarini osonlashtiradi.
  5. Qizil simlar uchun 4 -bosqichni takrorlang.
  6. Ochiq simlarni elektr tasmasi bilan yoping yoki o'zingizni yaxshi his qilsangiz issiqlik o'tkazmaydigan quvurlar bilan yoping. Simlar juda kichik bo'lgani uchun bu bo'g'inlar mo'rt bo'ladi, shuning uchun USB kabelining tashqi izolyatsiyasiga o'tish kabellarini ushlab turuvchi ikkinchi lentani qo'shing. Bu yig'ilishni yanada qattiqroq qiladi va shuning uchun egilishdan buzilish ehtimoli kamroq bo'ladi.

6 -qadam: Elektronni o'rnatish

Elektronni o'rnatish
Elektronni o'rnatish
Elektronni o'rnatish
Elektronni o'rnatish
Elektronni o'rnatish
Elektronni o'rnatish

Nihoyat, biz hamma narsani birlashtiramiz, elektronikamizni va boshqa hamma narsani pastki platformaga o'rnatamiz. Sizga kerak bo'ladi:

  • Pastki platforma
  • Bosh platformasi
  • Maneken boshi
  • USB+AC adapteri bilan ulang
  • USB quvvat adapteri
  • Uzatma kabeli
  • Mikro USB kabeli
  • Servo quvvat kabeli
  • Raspberry Pi
  • Erkak-Ayol jumper kabeli
  • Yopishtiruvchi Velcro
  • Qaychi

Qanday qilish kerak

  1. Pi -ni tovoqlar tagiga Velcro yordamida joylashtiring.
  2. USB quvvat adapterini Velcro bilan ulang.
  3. USB quvvat adapteriga servo va Pi -ni ulang.
  4. Pi ning 12 -pinini (GPIO18) servo signal kabeliga ulang. Bu o'ngdagi 6 -pin.
  5. Uzaytirgich simini taglikning orqa dastagidan o'tkazing va USB quvvat adapterini bir tomonga ulang.
  6. Kinect USB+AC adapterini oling va quvvat adapterini uzaytirgichning boshqa tomoniga, USB -ni esa Pi -ga ulang.
  7. Kinect simini laganda old ushlagichidan o'tkazing va Kinect adapteriga ulang.
  8. Kabellarni platformaning pastki qismiga ushlab turish uchun yopishqoq lentani ishlatardim. Bu eng oqlangan ko'rinmaydi, lekin baxtga ko'ra, bularning barchasi yashiringan.
  9. Platformani o'ng tomonga burang va Velcro yordamida Kinectni platformaning old tomoniga o'rnating.
  10. Maneken boshini bosh platformasiga o'rnatish uchun Velcro -dan foydalaning. Hamma narsa joylashtirilgandan so'ng, ikkita qismni ajratib oling, shunda biz servo shoxni o'rnatish vintiga kirishimiz mumkin. Shoxni hali servoga burama, lekin biz servo birinchi navbatda markazda ekanligiga ishonch hosil qilishimiz kerak, shuning uchun biz hamma narsani bir qatorga qo'yamiz. Buni keyingi bosqichda qilamiz.

7 -qadam: dasturiy ta'minot va algoritm

Dasturiy ta'minot va algoritm
Dasturiy ta'minot va algoritm

Sharh

Ushbu loyiha uchun dasturiy ta'minot C ++ da yozilgan va robototexnika dasturlarini yozish uchun asos bo'lgan Robot Operating System (ROS) bilan birlashtirilgan. ROSda tizimning dasturiy ta'minoti tugunlar deb nomlangan dasturlar to'plamiga bo'linadi, bu erda har bir tugun tizim funktsiyasining ma'lum bir kichik bo'limini amalga oshiradi. Ma'lumotlar nashr qilish/obuna qilish usuli yordamida tugunlar o'rtasida uzatiladi, bu erda ma'lumotlarni ishlab chiqaruvchi tugunlar va ularni iste'mol qiladigan tugunlar unga obuna bo'lishadi. Kodni shu tarzda ajratish tizim funksionalligini osonlikcha kengaytirishga imkon beradi va tezroq rivojlanish uchun tugunlarni tizimlar o'rtasida bo'lishishga imkon beradi.

Bu tizimda ROS asosan ovoz manbasining kelish yo'nalishini (DOA) hisoblaydigan kodni servo boshqaruvchi koddan ajratish uchun ishlatiladi, bu esa boshqa loyihalarga Kinect DOA bahosini o'z ichiga kerak bo'lmagan yoki kerak bo'lmagan servo kodni kiritmasdan kiritish imkonini beradi.. Agar siz kodning o'ziga qarashni xohlasangiz, uni GitHub -da topishingiz mumkin:

github.com/raikaDial/kinect_doa

Kinect DOA tuguni

Kinect_doa tuguni bu tizimning go'shti va suyaklari bo'lib, u asosan hamma narsani qiziqtiradi. Ishga tushgandan so'ng, u ROS tugunini ishga tushiradi va barcha ROS sehrlarini bajaradi, so'ngra Kinect -ga dasturiy ta'minotni yuklaydi, shunda audio oqimlar mavjud bo'ladi. Keyin u audio oqimlarni ochadigan va mikrofon ma'lumotlarini o'qishni boshlaydigan yangi ipni ochadi. Kinect to'rtta mikrofonni har biri 16 kHz chastotasida namuna oladi, shuning uchun hisoblash yuki tufayli ma'lumotlarning etishmasligini oldini olish uchun o'zaro bog'liqlik va ma'lumotlarni alohida tarmoqlarda yig'ish yaxshi. Kinect bilan aloqa ochiq manbali mashhur drayver libfreenect yordamida amalga oshiriladi.

To'plamlar tarmog'i har safar yangi ma'lumotlar kelganda qayta qo'ng'iroq qilish funktsiyasini bajaradi va ikkalasi ham ma'lumotlarni saqlaydi va DOAni qachon taxmin qilish kerakligini aniqlaydi. Har bir mikrofondan olingan ma'lumotlar bizning namuna olish oynamizga teng uzunlikdagi buferlarda saqlanadi, bu erda 8192 ta namuna. Bu shuni anglatadiki, tajriba natijasida topilgan ma'lumotlarning oxirgi yarim soniyadagi ma'lumotlari o'zaro bog'liqlikni hisoblab chiqadi, bu esa ishlash va hisoblash yuki o'rtasida yaxshi muvozanatdir. DOA bahosi har 4096 namunaga asosiy ipni signal berish orqali ishga tushiriladi, shunda ketma-ket o'zaro bog'liqlik 50%ga to'g'ri keladi. Bir -birining ustiga chiqmaydigan holatni ko'rib chiqing va siz juda tez shovqin chiqarasiz, u namuna olish oynasi bilan yarmiga bo'linadi. Sizning o'ziga xos ovozingizdan oldin va keyin, ehtimol, oq shovqin bo'ladi, bu o'zaro bog'liqlik bilan mos kelishi qiyin. Derazalarning bir-biriga yopishishi bizga tovushning to'liq namunasini taqdim etadi, bu esa o'zaro bog'liqlik ishonchliligini oshiradi va bizni bir-biridan farq qiladigan xususiyatlarni beradi.

Asosiy ip yig'ish ipidan signalni kutadi, so'ng DOA bahosini hisoblab chiqadi. Birinchidan, u to'lqin shakllarining oq shovqindan sezilarli farq qilishini tekshiradi. Bu tekshiruvsiz, biz qiziqarli shovqinlar bo'ladimi yoki yo'qligidan qat'i nazar, soniyamizni to'rt marta hisoblab chiqardik va maneken boshimiz beparvo bo'lardi. Bu tizimda ishlatiladigan oq shovqinlarni aniqlash algoritmi bu erda sanab o'tilganlardan birinchisidir. Biz to'lqin shakli lotinining mutlaq integralining mutlaq integraliga nisbatini hisoblaymiz; yuqori oq shovqinli signallar uchun bu nisbat kamroq shovqinli signallarga qaraganda yuqori. Shovqinni shovqinsizlikdan ajratib turadigan bu nisbat uchun chegarani belgilab, biz faqat o'zaro bog'liqlik holatida o'zaro bog'liqlikni ishga sola olamiz. Albatta, bu nisbat har safar tizim yangi muhitga ko'chganda qayta sozlanishi kerak.

To'lqin shakllari shovqinsiz tarkibga ega ekanligini aniqlagandan so'ng, dastur o'zaro bog'liqlik bilan davom etadi. Biroq, bu hisob -kitoblarda uchta muhim optimallashtirish mavjud:

  1. Kinect-da to'rtta mikrofon mavjud, ya'ni biz o'zaro bog'laydigan oltita to'lqin shakli mavjud. Ammo, agar siz mikrofon massivining fazoviy joylashuviga nazar tashlasangiz, 2, 3 va 4 mikrofonlar bir -biriga juda yaqin joylashganligini ko'rasiz. Darhaqiqat, ular shunchalik yaqinki, ovoz tezligi va namuna olish chastotasi tufayli 2, 3 va 4 da qabul qilingan to'lqin shakllari ko'pi bilan bitta namuna oldinga yoki orqaga bo'linadi, biz buni maxlag = dd hisoblash bilan tekshirishimiz mumkin. *fs/vs, bu erda d - mikrofon juftligini ajratish, fs - namuna olish chastotasi va vs - tovush tezligi. Shunday qilib, bu uchlik o'rtasidagi juftlarni o'zaro bog'lash foydasiz va biz faqat 1, 2, 3 va 4 mikrofonlarni o'zaro bog'lashimiz kerak.
  2. Ma'lumki, ovozli signallarning o'zaro o'zaro korrelyatsiyasi reverberatsiya (echo) mavjud bo'lganda yomon ishlaydi. Kuchli muqobil fazali transformatsiya (GCC-PHAT) bilan umumiy korrelyatsiya sifatida tanilgan. Bu usul o'zaro bog'liqlikdagi cho'qqilarni kuchaytiradigan og'irlik funktsiyasini qo'llash bilan bog'liq bo'lib, asl signalni echolardan farqlashni osonlashtiradi. Men GCC-PHAT ishlashini reverberatsiya kamerasidagi oddiy o'zaro bog'liqlik bilan taqqosladim (o'qing: beton hammom qayta ishlanmoqda) va GCC-PHAT to'g'ri burchakni hisoblashda 7 barobar samaraliroq deb topdim.
  3. O'zaro o'zaro bog'liqlikni amalga oshirayotganda, biz ikkita signalni olamiz, bir-birining bo'ylab siljiymiz va har bir qadamda biz doimiy signalimizning har bir nuqtasini siljish signalimizning har bir nuqtasiga ko'paytiramiz. N uzunlikdagi ikkita signal uchun bu n^2 hisob -kitoblarga olib keladi. Biz buni tezlik sohasidagi o'zaro bog'liqlikni amalga oshirish orqali yaxshilashimiz mumkin, bu tezkor Fourier transformatsiyasini o'z ichiga oladi (nlogn hisoblari), bitta o'zgartirilgan signalning har bir nuqtasini ikkinchisining mos nuqtasiga ko'paytirish (n hisoblar), keyin teskari bajarish. Vaqt maydoniga qaytish uchun Fourier konvertatsiyasi (nlogn hisoblari), natijada n+2*nlogn hisoblari, n^2 dan kam. Biroq, bu sodda yondashuv. Bizning qatorimizdagi mikrofonlar bir -biriga juda yaqin va tovush tezligi shunchalik sekinki, ovoz to'lqinlari asosan bir hil bo'ladi. Shunday qilib, biz ozgina oldinga yoki orqada joylashgan ofsetlarni ko'rib chiqish uchun o'zaro bog'liqligimizni ochishimiz mumkin. 1 va 4 mikrofonlar uchun kechikish +/- 12 ta namuna oralig'ida bo'lishi kerak, ya'ni har bir o'zaro bog'liqlik uchun biz faqat 24*n hisob-kitoblarni bajarishimiz kerak, natijada to'lqin shakllarimiz 2900 ta namunadan uzun bo'lsa, hisobni tejash mumkin bo'ladi.

Bu tizim minidsp kutubxonasidan foydalanadi, u GCC-PHAT algoritmini optimallashtirish 3 bilan amalga oshiradi.

Har bir mikrofon juftidan signallarda kechikish topilgach, dastur kechikishning o'rtacha qiymatini tanlaydi, undan taxmin qilingan burchakni hisoblash uchun foydalanadi va natijani e'lon qiladi, shunda servo boshqaruv uchun ishlatilishi mumkin.

Servo boshqaruv tuguni

Kinect_doa tuguniga nisbatan servo tugun nisbatan sodda. Uning vazifasi faqat taxmin qilingan DOAni olish va servoni shu burchakka siljitishdir. U wiringPi kutubxonasidan Raspberry Pi -ning apparat PWM moduliga kirish uchun servo burchagini o'rnatish uchun foydalanadi. Ko'pgina analog servolar PWM signali bilan nazorat qilinadi, puls kengligi 1000 mks dan 2000 mks gacha, 0 ° dan 180 ° gacha burchakka to'g'ri keladi, lekin men ishlatgan servo burchakka mos keladigan 500 ms dan 2500 mks gacha boshqariladi. 0 ° dan 270 ° gacha. Shunday qilib, tugun har xil servo uskunalar uchun minimal impuls kengligi, maksimal impuls kengligi va maksimal va minimal burchaklar orasidagi farqni sozlash orqali sozlanishi mumkin. Bundan tashqari, servo darhol maqsadli burchakka o'tmaydi, balki burchakka qarab sozlanishi tezlikda harakat qiladi, bu esa Margaretga asta -sekin, dahshatli tebranish beradi (bundan tashqari, tez va oldinga siljigan servo ovozi juda tez bezovta qiladi)).

8 -qadam: Qurilish va o'rnatish

Bog'liqliklarni o'rnatish:

Birinchidan, libfreenect -ni o'rnating. Biz uni manbadan tuzishimiz kerak, chunki paket menejeri bilan olishingiz mumkin bo'lgan versiyada audio qo'llab -quvvatlanmaydi. Buning sababi, biz ovozni yoqish uchun Kinect -ga dasturiy ta'minotni yuklashimiz kerak va bu dasturiy ta'minotni qayta tarqatish ba'zi yurisdiktsiyalarda qonuniy emas. Bundan tashqari, biz OpenGL va glutni talab qiladigan, boshsiz Raspbian qurilmalari uchun kerak bo'lmagan misollarni tuzishdan qochishimiz mumkin.

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

cd git clone https://github.com/OpenKinect/libfreenect cd libfreenect mkdir cd build cmake quradi.. -DCMAKE_BUILD_REDIST_PACKAGE = O'chirilgan -DCMAKE_BUILD_EXAMPLES = O'chirishni sudo cp ~/linb -kin -sudo cp ~/libfreen -ga o'rnatadi..rules /etc/udev/rules.d udevadm nazorati-qayta yuklash qoidalari && udevadm tetiği

Keyinchalik, biz Pi ning GPIO pinlarini boshqarishga imkon beradigan wiringPi paketini o'rnatishimiz kerak:

CD

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

Maneken boshini mahkamlang:

WiringPi o'rnatilgandan so'ng, maneken boshini pastki platformaga mahkamlash uchun endi biz tez aylanib o'tamiz. Buyruqlar satri orqali servoni markazlashtirish uchun quyidagi buyruqlarni kiriting:

gpio pwm-ms

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

Agar harakat bo'lmasa, unda sizning servoingiz allaqachon markazlashtirilgan. Ishonch hosil qilish uchun siz servoni markaziy bo'lmagan qiymatga o'rnatishingiz mumkin, masalan. gpio -g pwm 18 200, keyin uni 150 ga qaytaring.

Servo markazlashtirilganligiga ishonch hosil qilganingizdan so'ng, bosh platformasining servo shoxini servoga mahkamlang, shunda sizning maneken boshingiz oldinga qarab turadi. Keyin shoxni servoga mahkamlang va boshingizni Velcro bitlari orqali mahkamlang.

ROS -ni o'rnating:

Keyin Pi -ga ROS -ni o'rnating. Bu erda ajoyib o'rnatish qo'llanmasini topishingiz mumkin; bizning tizimimiz uchun bizga OpenCV kerak emas, shuning uchun siz 3 -bosqichni o'tkazib yuborishingiz mumkin. Bu qurilish bir necha soat davom etadi. O'rnatish bo'yicha qo'llanmani bajarishni tugatgandan so'ng, bashrc -ga manba manbasini qo'shing, shunda biz yangi o'rnatilgan ROS -paketlardan foydalanishimiz mumkin:

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

Kinect DOA paketini yaratish:

Hammasi tugagandan so'ng, bizning loyihamiz uchun ish joyini yarating va src katalogiga kiring:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Ushbu loyihaning kodi kinect_doa paketida mavjud, shuning uchun uni yangi ish joyingizning src katalogiga klonlang:

git klon

Robot_upstart to'plami ishga tushirish fayllarini ishga tushirish vaqtida o'rnatish uchun ulardan foydalanish uchun qulay vositani taqdim etadi, shuning uchun uni ish joyingizga klonlang:

git klon

Endi biz loyiha kodini ish joyimizning yuqori darajali katalogidan catkin_make -ga qo'ng'iroq qilib, keyin bizning paketlarimiz mavjud bo'lishi uchun tuzishni manba qilib yaratishimiz mumkin:

cd ~/kinect_doa_ws

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

Yugurish va sozlash:

Hamma narsa elektr tarmog'iga ulangan va yoqilgan deb hisoblasangiz, endi siz tizimni ishga tushirishingiz va ovozingizni Kinect trekka ega bo'lishingiz kerak! Ammo, agar sizda Kinect 1473 bo'lsa, avval ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch faylini matn muharririda oching va using_kinect_1473 parametrini rost qilib qo'ying. Bundan tashqari, agar siz mendan boshqa servo ishlatgan bo'lsangiz, bu standart analog servo bo'lishi mumkin, shuning uchun ishga tushirish faylida min_us parametrini 1000 ga, max_usni 2000 ga va max_degni 180 ga o'zgartiring.

roslaunch kinect_doa kinect_doa.launch

Bir muncha vaqt u bilan o'ynang. Agar siz tizimni juda sezgir deb hisoblasangiz (tovushlarga yoki o'ziga xos shovqinlarga mos kelmaydigan tasodifiy yo'nalishlarga qarasangiz), ishga tushirish faylidagi white_noise_ratio parametrini o'zgartiring va javob berish darajasi siz yoqadigan darajada bo'lguncha tizimni qayta ishga tushiring.. Bu nisbatni ko'tarish tizimni sezgirligini pasaytiradi va aksincha. Siz xohlagan ishlashni olish uchun tizimni boshqa joyga ko'chirganingizda, bu sozlashni bajarishingiz kerak bo'ladi.

Biz Pi -ni ishga tushirganimizda dasturni ishga tushirish uchun biz robot_upstart paketidan ishga tushirish faylini o'rnatamiz. Agar ROS hozirda ishlamayotgan bo'lsa, uni roscore buyrug'i bilan boshlang. Keyin yangi terminalni oching va ishga tushirishni o'rnating:

rosrun robot_upstart o'rnatish kinect_doa/launch/kinect_doa.launch --user root --symlink

Biz ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch -ni tahrirlash orqali parametrlarni o'zgartirish uchun ishga tushirish faylini nusxa ko'chirish o'rniga, unga simli havola yaratamiz.

9 -qadam: Ofisda yashirish

Ofisda yashirish
Ofisda yashirish

Endi qiziqarli qism uchun. Bir necha soatdan keyin ishga kirishing va yashirincha maneken boshingizni qo'ying. Keyin o'tirib, hamkasblaringizga qancha vaqt kerak bo'lishini ko'ring! Sizning yangi ijodingiz bir necha bosh aylanishi kafolatlangan …

Tavsiya: