Мазмұны:

Kinect көмегімен дыбысты локализациялау манекенінің басы: 9 қадам (суреттермен)
Kinect көмегімен дыбысты локализациялау манекенінің басы: 9 қадам (суреттермен)

Бейне: Kinect көмегімен дыбысты локализациялау манекенінің басы: 9 қадам (суреттермен)

Бейне: Kinect көмегімен дыбысты локализациялау манекенінің басы: 9 қадам (суреттермен)
Бейне: Kinect Sound Box 2024, Қараша
Anonim
Kinect көмегімен дыбысты локализациялау манекені
Kinect көмегімен дыбысты локализациялау манекені

Жүргізушінің шаршауын бақылау жүйесін тестілеудің муляжі Маргаретпен танысыңыз. Ол жақында өз міндетінен зейнеткерлікке шығып, біздің кеңсеге жол тапты, содан бері ол өзін «сұмдық» деп санайтындардың назарын аударды. Мен әділдік үшін оған айыптаушылармен бетпе-бет келуге мүмкіндік бердім; сені жансыз көзқараспен аңдып жүргеннің орнына, қазір ол осылай істейді. Жүйе оны Microsoft Kinect микрофонының жиынтығын және сервоприводты қолданып, оны жақын адамдармен сөйлесуге бағыттайды.

1 -қадам: Теория

Теория
Теория

Бұрышты есептеу

Біз бір нәрсені естігенде, егер бұл шу біздің көз алдымызда болмаса, ол бір құлағымызға жетеді. Біздің миымыз келудің кешігуін қабылдайды және оны шу шығаратын жалпы бағытқа айналдырады, бұл бізге көзді табуға мүмкіндік береді. Біз микрофонды қолдана отырып, дәл осындай локализацияға қол жеткізе аламыз. Микрофон жұбы мен дыбыс көзі бар көрсетілген диаграмманы қарастырыңыз. Егер біз жоғарыдан төмен қарайтын болсақ, дыбыс толқындары дөңгелек, бірақ егер көзге дейінгі қашықтық микрофондар арасындағы қашықтыққа қарағанда үлкен болса, онда біздің датчиктердің көзқарасы бойынша толқын шамамен планарлы болады. Бұл алыстағы болжам деп аталады және біздің проблемамыздың геометриясын жеңілдетеді.

Сонымен, толқын фронты түзу сызық деп есептеңіз. Егер дыбыс оң жақтан шықса, ол t2 уақытында №2 микрофонға және t1 уақытында №1 микрофонға соғылады. 2 -ші микрофон мен 1 -ші микрофонның арасындағы дыбыстың жүріп өткен қашықтығы - бұл дыбысты анықтаудағы уақыттың айырмашылығы, дыбыс жылдамдығына v с:

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

Біз бұл қашықтықты микрофон жұбы мен жұптан θ бұрыш арасындағы дыбыс көзіне дейінгі d 12 қашықтыққа байланыстыра аламыз:

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

Бізде тек екі микрофон болғандықтан, дыбыс көзі біздің алдымызда ма, әлде артында ма екені туралы екіұштылық болады. Бұл жүйеде біз дыбыс көзі жұптың алдында орналасқан деп есептейміз және 0 градус (жұптың оң жағында) арасындағы бұрышты 180 градусқа (толық солға) қысамыз.

Ақырында, біз кері косинусты алу арқылы тетаны шеше аламыз:

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

Бұрышты сәл табиғи ету үшін 0 градусты жұптың алдында және +/- 90 градус толық солға немесе толық оңға болатындай етіп тетадан 90 градусқа шегеруге болады. Бұл біздің өрнекті кері косинустан кері синусқа айналдырады.

  • cos (θ-π/2) = sin (θ) = d/d12 = vs*Δt/d12
  • θ = асин (vs*Δt/d12), -π/2 <= θ <= π/2

Кешіктіруді табу

Жоғарыдағы теңдеуден көріп отырғанымыздай, бұрышты шешу үшін бізге екінші микрофонмен салыстырғанда микрофонға келетін дыбыс толқынының кідіруі қажет; дыбыс жылдамдығы мен микрофондар арасындағы қашықтық бекітілген және белгілі. Мұны істеу үшін біз алдымен fs жиілігіндегі дыбыстық сигналдарды іріктеп аламыз, оларды аналогтан цифрлыққа түрлендіреміз және деректерді кейін пайдалану үшін сақтаймыз. Біз дыбыс толқынының айрықша ерекшеліктерін түсіру үшін жеткілікті ұзақ уақытқа созылатын іріктеу терезесі деп аталатын уақыт ішінде сынама аламыз. Мысалы, біздің терезе соңғы жарты секундтық дыбыстық ақпарат болуы мүмкін.

Терезелі дыбыстық сигналдарды алғаннан кейін, олардың өзара байланысын есептеу арқылы екеуінің арасындағы кідірісті табамыз. Кросс-корреляцияны есептеу үшін біз бір микрофоннан терезе сигналын бекітеміз және екінші сигналды уақыт осінің бойымен біріншісінің артынан бірінші жолға дейін сырғытыңыз. Слайд бойындағы әр қадамда біз бекітілген сигналдың әрбір нүктесін сырғымалы сигналдың сәйкес нүктесіне көбейтеміз, содан кейін сол нәтижеге корреляция коэффициентін есептеу үшін барлық нәтижелерді жинаймыз. Біздің слайдты аяқтағаннан кейін ең жоғары корреляция коэффициенті бар қадам екі сигналдың ұқсастығы сәйкес келеді, ал біз қандай қадамда n сигналының екі сигнал 1 сигналынан қанша сынама алынғанын айтады., онда екінші сигнал бірінші сигналдан артта қалып отыр, егер оң болса, онда екінші сигнал алда, ал егер ол нөл болса, онда екеуі қазірдің өзінде реттелген. Біз бұл үлгіні delayt = n/fs қатынасымен іріктеу жиілігін пайдаланып уақытты кешіктіруге айналдырамыз, осылайша:

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

2 -қадам: компоненттер

Бөлшектер

  • Microsoft Kinect for Xbox 360, 1414 немесе 1473 үлгісі. Kinect -те біз қолданатын сызықтық жиымда орналасқан төрт микрофон бар.
  • Kinect меншікті коннекторын USB + айнымалы ток қуатына түрлендіруге арналған адаптер.
  • Raspberry Pi 2 немесе 3 Raspbian Stretch жұмыс істейді. Мен бастапқыда Pi 1 Model B+қолдануға тырыстым, бірақ оның қуаты жеткіліксіз болды. Менде Kinect -тен ажырату мәселесі туындады.
  • Сіз таба алатын ең қорқынышты манекен басы
  • Манекеннің басын айналдыруға жеткілікті күшті аналогты серво
  • 5В USB қабырға зарядтау құрылғысы Pi мен серво мен кем дегенде екі портты қуаттандыру үшін жеткілікті қуаты бар. (Мен осыған ұқсас 5А 3 портты штепсельді қолдандым
  • Екі розеткасы бар ұзартқыш сым (бірі USB қабырға зарядтағышына, екіншісі Kinect айнымалы ток адаптеріне арналған.
  • Екі USB кабелі: Pi-ді қосуға арналған микро-USB кабелінің A түрі, ал екіншісі-сервоға қуат беру үшін, оны кесуге қарсы емессіз.
  • Барлығы отыруға арналған алаң және манекен басына арналған тағы бір кіші платформа. Мен пластикалық қызмет көрсетуге арналған науаны негіз ретінде және пластикалық пластинаны басты платформа ретінде қолдандым. Екеуі де Walmart компаниясынан болды және бағасы бірнеше доллар
  • 4x #8-32 1/2 дюймдік болттар мен гайкалар сервопластиканы үлкен платформаға бекіту үшін
  • 2x М3 8 мм болт шайбалары бар (немесе кез келген мөлшерде сервопроводты кіші платформаға бекіту үшін қажет)
  • Екі еркек-еркек қосқыш сым, бір қызыл және бір қара, және бір аналық-еркек секіргіш сым
  • Желімделген велкро жолақтары
  • Электрлік таспа
  • Кабельді басқаруға арналған таспа

Құралдар

  • Дремель дөңгелегі бар
  • Бұрғылау
  • 7/64 «, 11/16» және 5/16 «бұрғылау биттері
  • M3 түрту (қосымша, сіздің серво мүйізіне байланысты)
  • Бұрауыш
  • Дәнекерленген дәнекерленген темір
  • Көмек қолы (міндетті емес)
  • Маркер
  • Компас
  • Сымды тазартқыштар
  • Мультиметр (міндетті емес)

ЖҚҚ

  • Қауіпсіздік көзілдірігі

  • Бет маскасы (пластмассадан жасалған ұштар үшін).

3 -қадам: Платформаның төменгі жиыны

Платформаның төменгі жиыны
Платформаның төменгі жиыны
Платформаның төменгі жиыны
Платформаның төменгі жиыны
Платформаның төменгі жиыны
Платформаның төменгі жиыны

Біз жасайтын бірінші бөлім - бұл төменгі платформа, онда біздің Kinect, servo және біздің барлық электроникамыз болады. Платформаны жасау үшін сізге қажет:

  • Пластикалық қызмет көрсетуге арналған табақ
  • Серво
  • 4х № 8-32 1/2 дюймдік болттар
  • Дөңгелегі бар Дремель
  • Бұрауыш
  • Бұрғылау
  • 11/16 «бұрғылау ұшы
  • Маркер

Қалай жасау керек

  1. Науаны төңкеріңіз.
  2. Серваңызды науаның артқы жағына қарай бүйірге қойыңыз, сервоприводтың шығыс берілісінің науаның ортаңғы сызығы бойында тұрғанына көз жеткізіңіз, содан кейін сервопривод негізінің айналасына белгі қойыңыз.
  3. Дремель мен кесу дөңгелегінің көмегімен белгіленген аймақты кесіңіз, содан кейін сервоны оның ұясына сырғытыңыз.
  4. Науаға сервво корпусының бекітетін тесіктерінің орталарын белгілеңіз, содан кейін сервоны алып тастаңыз және осы тесіктерді 11/16 дюймдік бұрғымен бұрғылаңыз. Тесіктерді бұрғылау кезінде мұндай жұқа пластикті жарып алу өте оңай, сондықтан мен оны әлдеқайда қауіпсіз деп санаймын. бұрғылауды керісінше жүргізіп, материалды ақырын алып тастаңыз, бұл тесіктерді дұрыс бұрғылауға қарағанда әлдеқайда баяу, бірақ жарықтардың болмауын қамтамасыз етеді.
  5. Сервоңызды қайтадан ұяға салыңыз, содан кейін оны науаға № 8-32 болттар мен гайкалармен бекітіңіз.

4 -қадам: Бас платформаны жинау

Платформаның Бас Ассамблеясы
Платформаның Бас Ассамблеясы
Платформаның Бас Ассамблеясы
Платформаның Бас Ассамблеясы
Платформаның Бас Ассамблеясы
Платформаның Бас Ассамблеясы
Платформаның Бас Ассамблеясы
Платформаның Бас Ассамблеясы

Біз жасайтын келесі бөлік манекеннің басын сервоға қосатын платформа болады. Бас платформаны жасау үшін сізге қажет:

  • Пластикалық пластина
  • Серво мүйізі
  • Шайғыштары бар 2х M3 8мм болт
  • Бұрауыш
  • Бұрғылау
  • 7/64 «және 5/16» бұрғылау биттері
  • Компас
  • Дремель дөңгелегі бар

Қалай жасау керек

  1. Компасыңызды манекен басының негізінің радиусына қойыңыз.
  2. Пластинаның ортасында орналасқан шеңберді белгілеу үшін компасты қолданыңыз. Бұл біздің платформаның нақты өлшемі болады.
  3. Кіші платформаны пластинадан кесу үшін дремель мен кескіш дөңгелекті пайдаланыңыз.
  4. 5/16 дюймдік бұрғымен жаңа платформаның ортасын бұрғылаңыз. Бұл бізге серво мүйізін сервоға бекітетін бұрандаға қол жеткізуге мүмкіндік береді. Мен тесікті бұрғылау кезінде платформаның тұрақтылығын қамтамасыз ету үшін мен катушканы қойдым. астындағы сым және катушканың ортасы арқылы бұрғыланды.
  5. Серво мүйізін платформаның ортасына қойыңыз және мүйізді платформаға бекіту үшін екі тесікті белгілеңіз. Бұл бекіту тесіктері бір -бірінен жеткілікті қашықтықта екеніне көз жеткізіңіз, сондықтан M3 болт бастары мен шайбаларына орын бар.
  6. Бұл белгіленген тесіктерді 7/64 дюймдік бұрғымен бұрғылаңыз.
  7. Менің серво мүйізімнің төменгі тесігі тегіс болды, яғни M3 болтына арналған жіптер жоқ. Осылайша, мен бұрғылауды және M3 шүмегін жіптерді жасау үшін қолдандым.
  8. Серво мүйізін бас платформасына бекіту үшін болттар мен шайбаларды қолданыңыз.

5 -қадам: Серво қуат кабелі

Серво қуат кабелі
Серво қуат кабелі
Серво қуат кабелі
Серво қуат кабелі
Серво қуат кабелі
Серво қуат кабелі
Серво қуат кабелі
Серво қуат кабелі

Аналогты сервоприводтар әдетте 4.8-6В кернеуімен жұмыс істейді. Raspberry Pi қазірдің өзінде USB -ден 5В қуат алатындықтан, біз сервомызды USB -ден қуаттандыру арқылы жүйені жеңілдетеміз. Ол үшін бізге USB кабелін өзгерту қажет. Серво қуат кабелін жасау үшін сізге қажет:

  • А түрі бар қосалқы USB кабелі (компьютерге қосылатын түрі)
  • Бір қызыл және бір қара секіргіш сым
  • Пісіру темірі
  • Дәнекер
  • Сымды тазартқыштар
  • Электрлік таспа
  • Көмек қолы (міндетті емес)
  • Мультиметр (міндетті емес)

Қалай жасау керек

  1. Кабельден USB түріндегі A емес қосқышты кесіңіз, содан кейін төрт ішкі сымды ашу үшін оқшаулаудың бір бөлігін алыңыз. Ашық сымдардың айналасындағы қорғанысты кесіңіз.
  2. Әдетте USB кабелінде төрт сым болады: екеуі деректерді беру мен қабылдауға, екеуі қуат пен жерге қосуға арналған. Біз әдетте қызыл және қара болып табылатын билік пен жерге қызығамыз. Қызыл және қара сымдардың оқшаулауын алып тастаңыз, жасыл және ақ сымдарды кесіңіз. Егер сізде дұрыс қуат пен жерге қосу сымдары жоқ деп қорқатын болсаңыз, кабельді USB қуат адаптеріне қосып, шығыс кернеуін мультиметрмен тексере аласыз.
  3. Содан кейін қызыл және қара өтпелі кабельдердің бір ұшын кесіп, оқшаулаудың бір бөлігін алып тастаңыз.
  4. Енді секіргіш пен USB кабельдерінің ашық қара сымдарын біріктіріңіз. Ашық сымдардың ортасынан өтіңіз және оларды бір -біріне айналдырыңыз. Содан кейін біріктірілген сымдарға дәнекерлеп, оларды бір -біріне жабыстырыңыз. Көмек қолдары кабельдерді орнында ұстау арқылы мұны жеңілдетеді.
  5. Қызыл сымдар үшін 4 -қадамды қайталаңыз.
  6. Ашық сымдарды электрлік таспамен жабыңыз немесе егер сіз өзіңізді жақсы сезінсеңіз, жылуды төмендететін құбырмен жабыңыз. Сымдар өте кішкентай болғандықтан, бұл қосылыстар нәзік болады, сондықтан USB кабелінің сыртқы оқшаулауына қосқыш кабельдерді ұстайтын таспаның екінші қабатын қосыңыз. Бұл құрастыруды қаттырақ етеді және осылайша майысудан үзілу ықтималдығын төмендетеді.

6 -қадам: электрониканы орнату

Электрониканы орнату
Электрониканы орнату
Электрониканы орнату
Электрониканы орнату
Электрониканы орнату
Электрониканы орнату

Ақырында, біз электрониканы және басқаларын төменгі платформаға орнатып, бәрін біріктіреміз. Саған қажет болады:

  • Төменгі платформа
  • Бас платформа
  • Манекен басы
  • USB+айнымалы ток адаптерімен байланыс
  • USB қуат адаптері
  • Ұзартқыш сым
  • Микро USB кабелі
  • Серво қуат кабелі
  • Raspberry Pi
  • Еркектен әйелге секіргіш кабель
  • Желімді желім
  • Қайшы

Қалай жасау керек

  1. Пиді науаның түбіне Velcro көмегімен орнатыңыз.
  2. USB қуат адаптерін Velcro көмегімен жалғаңыз.
  3. Серво мен Pi -ді USB қуат адаптеріне қосыңыз.
  4. Pi -дің 12 -ші түйінін (GPIO18) серво сигналдық кабеліне қосыңыз. Бұл оң жақтағы 6 -түйреуіш.
  5. Ұзартқыш сымды науаның артқы тұтқасынан өткізіп, USB қуат адаптерін бір жағына қосыңыз.
  6. Kinect USB+айнымалы ток адаптерін алыңыз және қуат адаптерін ұзартқыш сымның екінші жағына, ал USB -ді Pi -ге қосыңыз.
  7. Kinect сымын науаның алдыңғы тұтқасынан өткізіп, Kinect адаптеріне қосыңыз.
  8. Мен кабельдерді платформаның астына бекіту үшін жабысқақ таспаны қолдандым. Бұл ең талғампаз болып көрінбейді, бірақ, бәрі де жасырын.
  9. Платформаны оң жаққа жоғары қаратып, Kinect платформаның алдыңғы жағына бекіту үшін Velcro пайдаланыңыз.
  10. Манекеннің басын платформаға бекіту үшін Velcro пайдаланыңыз. Барлығы реттелгеннен кейін, екі бөлікті бөліп алыңыз, осылайша біз серво мүйізіне бекіту бұрандасына қол жеткізе аламыз. Мүйізді сервоға әлі бұрамаңыз, бірақ біз бірінші кезекте серваның орталық күйде екеніне көз жеткізуіміз керек, сондықтан біз бәрін реттей аламыз. Біз мұны кейінгі қадамда жасаймыз.

7 -қадам: Бағдарламалық қамтамасыз ету және алгоритм

Бағдарламалық қамтамасыз ету және алгоритм
Бағдарламалық қамтамасыз ету және алгоритм

Шолу

Бұл жобаның бағдарламалық жасақтамасы C ++ тілінде жазылған және робототехникалық бағдарламалық қамтамасыз етуді жазуға арналған Robot Operating System (ROS) жүйесімен біріктірілген. ROS жүйесінде бағдарламалық жасақтама түйіндер деп аталатын бағдарламалар жиынтығына бөлінеді, онда әр түйін жүйенің функционалдылығының белгілі бір бөлімін жүзеге асырады. Деректер жариялау/жазылу әдісі арқылы түйіндер арасында беріледі, мұнда деректерді шығаратын түйіндер оны жариялайды және деректерді тұтынатын түйіндер оған жазылады. Кодты осылайша ажырату жүйенің функционалдығын оңай кеңейтуге мүмкіндік береді және тезірек даму үшін түйіндерді жүйелер арасында бөлісуге мүмкіндік береді.

Бұл жүйеде ROS бірінші кезекте дыбыс көзінің келу бағытын (DOA) есептейтін кодты сервоны басқаратын кодтан ажырату үшін пайдаланылады, бұл басқа жобаларға Kinect DOA бағалауын қосуға мүмкіндік береді, олар қажет емес немесе қажет емес серво кодын қоспай.. Егер сіз кодтың өзін қарағыңыз келсе, оны GitHub сайтынан табуға болады:

github.com/raikaDial/kinect_doa

Kinect DOA түйіні

Kinect_doa торабы - бұл жүйенің еті мен сүйектері, олар негізінен қызықты нәрсені жасайды. Іске қосылғанда, ол ROS түйінін инициализациялайды, бұл барлық ROS сиқырларын жасайды, содан кейін Kinect -ке микробағдарламаны жүктейді, осылайша дыбыстық ағындар қол жетімді болады. Содан кейін ол жаңа ағынды шығарады, ол аудио ағындарын ашады және микрофон деректерінде оқи бастайды. Kinect әрқайсысы 16 кГц жиіліктегі төрт микрофонын сынамалайды, сондықтан есептік жүктеме салдарынан деректердің жоғалуын болдырмау үшін өзара байланыс және деректерді бөлек ағындарда жинау жақсы. Kinect-пен қарым-қатынас танымал көзі ашық драйвер libfreenect көмегімен жүзеге асады.

Жинау ағыны жаңа деректер алынған кезде кері шақыру функциясын орындайды және екеуі де деректерді сақтайды және DOA -ны қашан бағалау керектігін анықтайды. Әр микрофоннан алынған деректер біздің таңдау тереземізге тең ұзындықтағы буферлерде сақталады, мұнда 8192 үлгі бар. Бұл нәтиже мен есептеу жүктемесі арасындағы жақсы тепе-теңдік болу үшін мен эксперимент нәтижесінде тапқан соңғы жарты секундтық мәліметтердің өзара байланысын есептейді. DOA бағалауы әрбір 4096 үлгі үшін негізгі ағынды сигнал беру арқылы іске қосылады, осылайша дәйекті кросс-корреляциялар 50%сәйкес келеді. Бір -біріне сәйкес келмейтін жағдайды қарастырыңыз, және сіз өте тез шу шығарасыз, ол іріктеу терезесінен екіге бөлінеді. Сіздің ерекше дыбысқа дейін және кейін ақ шуыл болуы мүмкін, оны кросс-корреляциямен сәйкестендіру қиын болуы мүмкін. Терезелердің қабаттасуы бізге дыбыстың неғұрлым толық үлгісін ұсынады, бұл бізді айқындау ерекшеліктерін бере отырып, өзара байланыстың сенімділігін арттырады.

Негізгі ағын жинау ағынынан сигналды күтеді, содан кейін DOA бағасын есептейді. Біріншіден, ол түсірілген толқындардың ақ шуылдан айтарлықтай ерекшеленетінін тексереді. Бұл тексерусіз, біз қызықты дыбыстардың бар -жоқтығына қарамастан, секундына төрт рет өз бағамызды есептеп шығаратын едік, ал біздің манекен басы спастикалық тәртіпсіздікке айналады. Бұл жүйеде қолданылатын ақ шуды анықтау алгоритмі мұнда көрсетілген екеуінің біріншісі болып табылады. Біз толқын түрінің туындысының абсолюттік интегралының оның абсолютті интегралына қатынасын есептейміз; ақ шу деңгейі жоғары сигналдар үшін бұл коэффициент аз шулы сигналдарға қарағанда жоғары. Шуды шуылдан ажырататын осы коэффициентке шекті орнату арқылы біз кросс-корреляцияны қажет болған жағдайда ғана іске қосамыз. Әрине, бұл коэффициент жүйе жаңа ортаға көшкен сайын қайта реттелуі керек нәрсе.

Толқын формаларында шуылсыз мазмұн бар екенін анықтағаннан кейін бағдарлама кросс-корреляциямен жүреді. Бұл есептеулерде үш маңызды оңтайландыру бар:

  1. Kinect-те төрт микрофон бар, яғни біз өзара корреляциялай алатын толқындардың алты жұп формасы бар. Алайда, егер сіз микрофон массивінің кеңістіктік орналасуына қарасаңыз, 2, 3 және 4 микрофондардың бір -біріне өте жақын орналасқанын көре аласыз. Шындығында, олар соншалықты жақын, сондықтан дыбыс жылдамдығына және біздің іріктеу жиілігіне байланысты 2, 3, 4 -те алынған толқындық формалар ең көбі бір үлгіге бөлініп алынады, біз maxlag = Δd есебімен тексере аламыз. *fs/vs, мұнда Δd - микрофон жұбының бөлінуі, fs - іріктеу жиілігі, vs - дыбыс жылдамдығы. Осылайша, осы үшеудің арасындағы жұптарды корреляциялау пайдасыз, және бізге тек 1, 2, 3 және 4 микрофонды қиыстыру қажет.
  2. Дыбыстық сигналдардың стандартты кросс-корреляциясы реверберация (эхо) болған кезде нашар жұмыс жасайтыны белгілі. Күшті балама фазалық түрлендірумен жалпыланған кросс-корреляция деп аталады (GCC-PHAT). Бұл әдіс бастапқы сигналды жаңғырықтан ажыратуды жеңілдететін кросс-корреляция шыңдарын күшейтетін салмақтау функциясын қолдануға негізделген. Мен GCC-PHAT өнімділігін реверберация камерасындағы қарапайым кросс-корреляциямен салыстырдым (оқыңыз: бетон ванна бөлмесі қайта жөнделуде) және GCC-PHAT дұрыс бұрышты бағалауда 7 есе тиімді деп таптым.
  3. Кросс-корреляцияны орындау кезінде біз екі сигналды қабылдаймыз, бір-бірінің бойымен сырғып, әр қадамда бекітілген сигналдың әр нүктесін жылжымалы сигналдың әр нүктесіне көбейтеміз. N ұзындықтағы екі сигнал үшін бұл n^2 есептеулеріне әкеледі. Біз мұны жиіліктік облыста кросс-корреляцияны орындау арқылы жақсартуға болатын едік, ол жылдам фурье түрлендіруді (nlogn есептеулері), бір түрлендірілген сигналдағы әр нүктені екіншісіндегі сәйкес нүктеге көбейтуді (n есептеулер), содан кейін кері әрекетті орындау арқылы жақсарта алады. уақыт доменіне қайту үшін Fourier түрлендіруі (nlogn есептеулері), нәтижесінде n+2*nlogn есептеулері, n^2 -ден аз. Алайда, бұл ақымақтық әдіс. Біздің массивтегі микрофондар бір -біріне соншалықты жақын және дыбыс жылдамдығы салыстырмалы түрде баяу, сондықтан дыбыс толқындарының формалары негізінен реттеледі. Осылайша, біз сәл ілгері немесе артта болатын ығысуларды қарастыру үшін өзара байланыстылықты анықтай аламыз. 1 және 4 микрофондар үшін кідіріс +/- 12 сынама арасында болуы керек, яғни әрбір кросс-корреляция үшін бізге тек 24*n есептеулерді орындау қажет, бұл біздің толқын пішіндеріміз 2900 үлгіден ұзақ болған кезде есептік үнемдеуге әкеледі.

Бұл жүйе minidsp кітапханасын қолданады, ол GCC-PHAT алгоритмін 3 оңтайландырумен жүзеге асырады.

Әр микрофон жұбының сигналдарындағы кідірісті тапқаннан кейін, бағдарлама кідірістің медианалық мәнін таңдайды, оны есептік бұрышты есептеу үшін қолданады және нәтижені жариялайды, осылайша оны серво басқару үшін қолдануға болады.

Серво басқару торабы

Kinect_doa түйінімен салыстырғанда, серво түйіні салыстырмалы түрде қарапайым. Оның міндеті - болжамды DOA -ны ғана алу және сервоны сол бұрышқа жылжыту. Ол WirelessPi кітапханасын Raspberry Pi аппараттық PWM модуліне кіру үшін пайдаланады, оның көмегімен серво бұрышын орнатады. Көптеген аналогты серводар 0 -ден 180 ° бұрышқа сәйкес келетін импульс ені 1000 мкс -тен 2000 мкс дейінгі PWM сигналымен басқарылады, бірақ мен қолданған серво бұрышқа сәйкес келетін 500 мкс -ден 2500 мкс дейін басқарылды. 0 ° - 270 ° аралығында. Осылайша, түйін импульстің минималды ені, максималды импульстік ені және максималды және минималды бұрыштар арасындағы айырмашылықты орнату арқылы әр түрлі сервоприемник үшін конфигурацияланады. Сонымен қатар, серво мақсатты бұрышқа бірден ауыспайды, керісінше, бұрышқа қарай реттелетін жылдамдықпен қозғалады, бұл Маргаретке біртіндеп, сұмдық вибус береді (сонымен қатар, серво дыбысының алға -артқа тез қозғалуы шынымен тез тітіркендіреді.).

8 -қадам: құрастыру және орнату

Тәуелділікті орнату:

Алдымен libfreenect орнатыңыз. Біз оны дереккөзден құрастыруымыз керек, себебі пакет менеджерімен алуға болатын нұсқада дыбысты қолдау жоқ. Бұл дыбысты қосу үшін біз Kinect -ке микробағдарламаны жүктеуіміз керек және бұл микробағдарламаны қайта тарату белгілі бір юрисдикцияларда заңды емес. Сонымен қатар, біз Raspbian бассыз қондырғылары үшін қажет емес OpenGL және glut талап ететін мысалдарды құрудан аулақ бола аламыз.

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 құрады.. -DCMAKE_BUILD_REDIST_PACKAGE = ӨШІРУ -DCMAKE_BUILD_EXAMPLES = ӨШІРУ sudo cp ~/linbfreen -sudo орнатуға мүмкіндік береді..rules /etc/udev/rules.d udevadm басқару-қайта жүктеу ережелері && udevadm триггері

Әрі қарай, бізге GPIO түйреуіштерін басқаруға мүмкіндік беретін wiringPi пакетін орнату керек:

cd

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

Манекен басын бекітіңіз:

WiringPi орнатылған кезде біз енді манекен басын төменгі платформаға бекіту үшін аппараттық жерге тез айнала аламыз. Сервоны пәрмен жолы арқылы орталықтандыру үшін келесі пәрмендерді енгізіңіз:

gpio pwm-ms

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

Егер қозғалыс болмаса, онда сіздің серво қазірдің өзінде орталықтандырылған. Дегенмен, сенімді болу үшін сіз серводы орталық емес мәнге орната аласыз, мысалы: gpio -g pwm 18 200, содан кейін оны 150 -ге орнатыңыз.

Серво орталықта екеніне сенімді болғаннан кейін, манекеннің басы тіке алға қарайтындай етіп, басты платформаның серво мүйізін сервоға бекітіңіз. Содан кейін мүйізді сервоға бұрап, басыңызды Velcro биттері арқылы бекітіңіз.

ROS орнату:

Содан кейін Pi -ге ROS орнатыңыз. Орнату бойынша керемет нұсқаулықты мына жерден табуға болады; біздің жүйе үшін бізге OpenCV қажет емес, сондықтан сіз 3 -қадамды өткізіп жібере аласыз. Бұл құрастыруды аяқтауға бірнеше сағат кетеді. Орнату нұсқаулығын орындауды аяқтағаннан кейін, жаңадан орнатылған ROS пакеттерін пайдалану үшін bashrc -ке орнатуды қосыңыз:

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

Kinect DOA пакетін жасаңыз:

Мұның бәрін жасағаннан кейін, біздің жобаның жұмыс кеңістігін жасаңыз және src каталогына кіріңіз:

mkdir -p ~/kinect_doa_ws/src

cd ~/kinect_doa_ws/src

Бұл жобаның коды kinect_doa бумасында бар, сондықтан оны жаңа жұмыс кеңістігінің src каталогына клондау:

git clone

Robot_upstart бумасы іске қосу файлдарын іске қосу кезінде іске қосылатындай етіп орнатуға арналған құралмен қамтамасыз етеді, сондықтан оны жұмыс кеңістігіне клондау:

git clone

Енді біз жұмыс кеңістігінің жоғарғы деңгейдегі каталогынан catkin_make -ке қоңырау шалу арқылы жоба кодын құра аламыз, содан кейін біздің пакеттер қол жетімді болуы үшін біздің құрылымды қайнар көзге айналдырамыз:

cd ~/kinect_doa_ws

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

Жүгіру және баптау:

Егер бәрі қосылған және қосылған болса деп ойласаңыз, енді сіз жүйені іске қосып, Kinect трекіне дауыс бере аласыз! Алайда, егер сізде Kinect 1473 болса, алдымен ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch файлын мәтіндік редакторда ашып, using_kinect_1473 параметрін шын деп орнатыңыз. Сонымен қатар, егер сіз менікінен басқа серво қолдансаңыз, бұл стандартты аналогтық серво болуы мүмкін, сондықтан іске қосу файлында min_us параметрін 1000 -ға, max_us -ты 2000 -ға және max_deg 180 -ге өзгертіңіз.

roslaunch kinect_doa kinect_doa.launch

Онымен біраз уақыт ойнаңыз. Егер сіз жүйенің тым сезімтал екенін сезсеңіз (дауысқа немесе ерекше шуылға сәйкес келмейтін кездейсоқ бағыттарды іздеңіз), іске қосу файлындағы white_noise_ratio параметрін өзгертуге тырысыңыз және жауаптылық сізге қолайлы деңгейде болғанша жүйені қайта іске қосыңыз.. Арақатынаны жоғарылату жүйені аз жауап береді және керісінше. Сізге қажет өнімділікті алу үшін жүйені басқа орынға жылжытқан кезде сізге бұл баптауды орындау қажет болуы мүмкін.

Бағдарламаны Pi қосқан кезде іске қосу үшін біз іске қосу файлын орнату үшін robot_upstart пакетін қолданамыз. Егер ROS қазір жұмыс істемесе, оны roscore пәрменімен бастаңыз. Содан кейін жаңа терминалды ашып, іске қосуды орнатыңыз:

rosrun robot_upstart kinect_doa/launch/kinect_doa.launch -user root --symlink орнатыңыз

Біз ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch өңдеу арқылы параметрлерді өзгерту үшін көшірудің орнына іске қосу файлына символдық сілтеме жасаймыз.

9 -қадам: Оны кеңседе жасыру

Оны кеңседе жасыру
Оны кеңседе жасыру

Енді көңілді бөлікке. Бірнеше сағаттан кейін жұмысқа кірісіңіз және манекеннің басын жасырыңыз. Содан кейін жай отырыңыз және сіздің әріптестеріңізге қанша уақыт қажет екенін көріңіз! Сіздің жаңа туындыңыз бірнеше адамға бұрылуға кепілдік береді …

Ұсынылған: