Мазмуну:

Kinect менен үн локализациялоочу манекендин башы: 9 кадам (сүрөттөр менен)
Kinect менен үн локализациялоочу манекендин башы: 9 кадам (сүрөттөр менен)

Video: Kinect менен үн локализациялоочу манекендин башы: 9 кадам (сүрөттөр менен)

Video: Kinect менен үн локализациялоочу манекендин башы: 9 кадам (сүрөттөр менен)
Video: Saadat - Комуз менен ырды эзип салды - МЫНА САГА ГОЛОС 2024, Июль
Anonim
Kinect менен манекендин башын үн локалдаштыруу
Kinect менен манекендин башын үн локалдаштыруу

Айдоочунун чарчоосун көзөмөлдөө системасынын тестирлөөчү муляжы Маргарет менен таанышыңыз. Ал жакында эле кызматтан пенсияга чыгып, биздин кеңсеге кирди жана ошондон бери аны "сойлоп жүрөм" деп ойлогондордун көңүлүн бурду. Адилеттүүлүк үчүн мен ага айыптоочулар менен бетме-бет сүйлөшүү жөндөмүн бердим; анын жансыз көз карашы менен сизди ээрчип бараткандын ордуна, азыр ал чындыгында ушундай кылып жатат. Система аны Microsoft Kinectтин микрофонун жана сервосун колдонуп, аны жанында жүргөн адамдарга бурат.

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

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

Бурчту эсептөө

Биз бир нерсени укканда, бул ызы -чуу түздөн -түз биздин алдыбызда болбосо, бир кулакка башкасынан мурун жетет. Мээбиз бул келүүнүн кечигүүсүн сезет жана ызы -чуу келип чыккан жалпы багытка айлантат, булакты табууга мүмкүнчүлүк берет. Биз бир эле микрофонду колдонуп, локалдаштыруунун дал ушундай түрүнө жетише алабыз. Микрофон жуп жана үн булагын камтыган көрсөтүлгөн диаграмманы карап көрөлү. Эгерде биз өйдөдөн ылдый карай турган болсок, үн толкундары тегерек, бирок булакка чейинки аралык микрофондордун ортосундагы аралыкка салыштырмалуу чоң болсо, анда биздин сенсорлордун көз карашынан алганда толкун болжол менен тегиз. Бул алыскы талаа божомолу деп аталат жана биздин маселенин геометриясын жөнөкөйлөтөт.

Ошентип, толкун фронту түз сызык деп кабыл алыңыз. Эгерде үн оң тараптан чыгып жатса, анда ал t2 убагында №2 микрофонго жана t1 убактысында #1 микрофонго тийет. #2 микрофон менен #1 микрофондун ортосундагы үндүн басып өткөн жолу, үндү ылдамдыкка көбөйткөн үндү аныктоодогу убакыт айырмасы:

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

Биз бул аралыкты микрофон жуп менен the бурчунун ортосундагы жуптун үн булагына чейинки d 12 аралыкка байланыштыра алабыз:

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

Бизде болгону эки микрофон болгондуктан, үн булагы алдыбыздабы же артыбыздабы, айтор, биздин эсептөөдө бүдөмүк болот. Бул системада биз үн булагы жуптун алдында деп болжоп, 0 градустун (жуптун оң жагында) 180 градуска (толугу менен солго) чейинки бурчун кысабыз.

Акыр -аягы, биз тескери косинусту алуу менен тетаны чече алабыз:

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

Бурчту бир аз табигый кылуу үчүн, биз тетадан 90 градусту алып салабыз, андыктан 0 градус жуптун алдында жана +/- 90 градус толук солго же толук оңго. Бул биздин сөздү тескери косинустан тескери синуска айлантат.

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

Кечиктирүүнү табуу

Жогорудагы теңдемеден көрүнүп тургандай, бурчту чечишибиз керек болгон нерсе - бул микрофонго экинчи микрофонго салыштырмалуу микрофонго келген үн толкунунун кечигиши; үн ылдамдыгы жана микрофондордун ортосундагы аралык туруктуу жана белгилүү. Муну ишке ашыруу үчүн, адегенде fs жыштыгында аудио сигналдарды үлгү кылып, аларды аналогдуктан санарипке айландырабыз жана маалыматтарды кийин колдонуу үчүн сактайбыз. Биз үн толкунунун айырмалоочу өзгөчөлүктөрүн чагылдыруу үчүн жетишерлик узак убакытка созулган тандоо терезеси деп аталган белгилүү бир убакытка үлгү алабыз. Мисалы, биздин терезе акыркы жарым секунддук аудио маалыматтын баасы болушу мүмкүн.

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

θ = асин (vs*n/(d12*fs)), -π/2 <= θ <= π/2

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

Бөлүктөр

  • Xbox 360 үчүн Microsoft Kinect, модель 1414 же 1473. Kinectте биз колдоно турган сызыктуу массивде жайгашкан төрт микрофон бар.
  • Kinectтин менчик коннекторун ушул сыяктуу USB + AC кубатына айландыруу үчүн адаптер.
  • Raspberry Pi 2 же 3 Raspbian Stretch иштеп жатат. Мен башында Pi 1 Model B+колдонууга аракет кылдым, бирок анын күчү жетпеди. Менде Kinectтен ажыратуу көйгөйлөрү пайда болду.
  • Сиз тапкан эң коркунучтуу манекен башы
  • Манекендин башын айлантуу үчүн жетиштүү күчтүү аналогдук серво
  • 5В USB дубал заряддагыч түзүлүшү пи менен сервону жана жок дегенде эки портту иштетүү үчүн жетиштүү амперге ээ. (Мен ушуга окшош 5А 3 порттуу сайгычты колдондум
  • Эки розеткасы бар узартуу зымы (бири USB дубал кубаттагычы үчүн, экинчиси Kinect AC адаптери үчүн.
  • Эки USB кабели: Пити кубаттоо үчүн микро-USB кабелинин А түрү, экинчиси-сервону иштетүү үчүн, аны кесүүгө каршы эмессиз.
  • Баарына отура турган аянтча жана манекендин башы үчүн дагы бир кичине аянтча. Мен пластикалык табакты база катары, баштын платформасы катары пластикалык табакты колдондум. Экөө тең Walmartтан болушкан жана баасы бир нече доллар болчу
  • 4x #8-32 1/2 "болттор жана гайкалар сервону чоңураак платформага тиркөө үчүн
  • 2х M3 8мм болт, кир жуугучтар менен (же кичинекей платформага servo мүйүзүңүздү тиркөө үчүн керек болгон өлчөмдө)
  • Эркектен эркекке секирүүчү эки зым, бири кызыл жана бири кара жана бир ургаачыдан эркекке секирүүчү зым
  • Желимдүү колдоого алынган Velcro тилкелери
  • Электр лента
  • Кабелдик башкаруу үчүн скотч

Куралдар

  • Дремель кесүүчү дөңгөлөк менен
  • Бургулоо
  • 7/64 ", 11/16" жана 5/16 "бургулоо биттери
  • M3 таптоо (Милдеттүү эмес, сиздин servo мүйүзүнө жараша)
  • Screwdriver
  • Лайк менен темир
  • Жардам колу (милдеттүү эмес)
  • Маркер
  • Компас
  • Сым тазалагычтар
  • Мультиметр (Милдеттүү эмес)

PPE

  • Коопсуздук көз айнеги

  • Бет маскасы (пластикалык биттер үчүн).

3 -кадам: Төмөнкү Платформа Ассамблеясы

Төмөнкү Платформа Ассамблеясы
Төмөнкү Платформа Ассамблеясы
Төмөнкү Платформа Ассамблеясы
Төмөнкү Платформа Ассамблеясы
Төмөнкү Платформа Ассамблеясы
Төмөнкү Платформа Ассамблеясы

Биз жасай турган биринчи бөлүк төмөнкү платформа, анда биздин Kinect, servo жана биздин бардык электроникаларыбыз бар. Платформаны түзүү үчүн сизге керек болот:

  • Пластикалык табак
  • Servo
  • 4x #8-32 1/2 "болттор жаңгак менен
  • Dremel кесүүчү дөңгөлөк менен
  • Screwdriver
  • Бургулоо
  • 11/16 "бургу
  • Маркер

Кантип жасоо керек

  1. Табагыңызды өйдө караңыз.
  2. Сервону лотоктун артына жакын капталга коюңуз, сервонун чыгуучу тетиги лотоктун ортоңку сызыгында жайгашкандыгын текшериңиз, андан кийин сервонун түбүн белгилеңиз.
  3. Дремелди жана кесүүчү дөңгөлөктү колдонуп, сиз белгилеген аймакты кесип, анан сервону анын уясына жылдырыңыз.
  4. Табакта сервопрокаттын тешикчелеринин борборлорун белгилеңиз, андан кийин сервону алып салыңыз жана бул тешиктерди 11/16 "бургуңуз менен бургулаңыз. Тешип жатканда мындай пластикти сындыруу абдан оңой, ошондуктан мен аны коопсузураак деп эсептейм бургулоону тескери иштетүү жана материалды акырындык менен чайкоо. Тешиктерди туура бургандан алда канча жайыраак, бирок эч кандай жараканын жоктугун камсыз кылат.
  5. Сервону кайра оюгуңузга салыңыз, андан кийин #8-32 болт жана гайкалар менен табакка орнотуңуз.

4 -кадам: Head Platform Ассамблеясы

Платформа Ассамблеясынын башчысы
Платформа Ассамблеясынын башчысы
Платформа Ассамблеясынын башчысы
Платформа Ассамблеясынын башчысы
Платформа Ассамблеясынын башчысы
Платформа Ассамблеясынын башчысы
Платформа Ассамблеясынын башчысы
Платформа Ассамблеясынын башчысы

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

  • Пластикалык табак
  • Серво мүйүзү
  • 2х М3 8мм болт, шайбалар менен
  • Screwdriver
  • Бургулоо
  • 7/64 "жана 5/16" бургулоо биттери
  • Компас
  • Дремель кесүүчү дөңгөлөк менен

Кантип жасоо керек

  1. Компасыңызды манекен башыңыздын түбүнүн радиусуна коюңуз.
  2. Пластинанын ортосуна тегеректелген тегеректи белгилөө үчүн компасыңызды колдонуңуз. Бул биздин платформанын чыныгы өлчөмү болот.
  3. Дремелди жана кесүүчү дөңгөлөктү колдонуп, кичинекей платформаны табактан кесип салыңыз.
  4. Жаңы платформаңыздын борборун 5/16 "бургулоочу тешик менен бургулаңыз. Бул бизге servo мүйүзүбүздү биздин servoго орноткон бурамага мүмкүнчүлүк берет. Мен тешип жатканда платформанын туруктуулугун камсыз кылуу үчүн мен бир катушканы койгом. анын астындагы зым жана катушканын ортосунан бургуланган.
  5. Серво мүйүзүңүздү платформанын ортосуна тизип, мүйүздү платформага бекитүү үчүн эки тешикти белгилеңиз. Бул орнотуу тешиктери бири -биринен жетишерлик алыс экенин текшериңиз, андыктан M3 болттун баштары менен кир жуугучтарыңыз үчүн орун бар.
  6. Бул белгиленген тешиктерди 7/64 дюйм менен бургулаңыз.
  7. Менин servo мүйүзүмдүн ылдыйкы тешиги жылмакай болчу, башкача айтканда, M3 болттун жиптери жок болчу. Ошентип, мен жиптерди жасоо үчүн бургулачымды жана М3 кранын колдондум.
  8. Болттарды жана шайбаларды колдонуп, servo мүйүздү баштын платформасына бекиңиз.

5 -кадам: Servo Power Cable

Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable
Servo Power Cable

Аналогдук серволор адатта 4.8-6V менен иштейт. Raspberry Pi мурунтан эле USB аркылуу 5В менен иштей тургандыктан, биз сервому USBден иштетүү менен системабызды жөнөкөйлөтөбүз. Бул үчүн биз USB кабелин өзгөртүүбүз керек. Серво электр кабелин жасоо үчүн сизге керек болот:

  • А түрү бар запастык USB кабели (компьютериңизге туташтырылган)
  • Бир кызыл жана бир кара секирүүчү зым
  • Кандооч
  • Solder
  • Сым тазалагычтар
  • Электр лента
  • Жардам колу (милдеттүү эмес)
  • Мультиметр (милдеттүү эмес)

Кантип жасоо керек

  1. Кабелиңизден USB-A эмес туташтыргычты кесип, андан кийин төрт ички зымды ачуу үчүн изоляцияны бир аз сыйрып алыңыз. Ачык зымдарды курчап турган коргоону кесип.
  2. Адатта USB кабелинде төрт зым болот: экөө маалыматтарды берүү жана кабыл алуу үчүн, экөө электр жана жер үчүн. Биз көбүнчө кызыл жана кара түстөгү бийликке жана жерге кызыкдарбыз. Изоляциянын бир бөлүгүн кызыл жана кара зымдардан ажыратып, жашыл жана ак зымдарды кесип салыңыз. Эгерде сизде туура электр жана жер зымдары жок деп тынчсызданып жатсаңыз, кабелиңизди USB кубат адаптерине туташтырып, мультиметр менен чыгуу чыңалуусун текшере аласыз.
  3. Андан кийин, кызыл жана кара туташтыруучу кабелдериңиздин бир учун кесип, изоляциянын бир бөлүгүн сыйрып алыңыз.
  4. Эми, секиргичтериңиздин ачык USB зымдарын жана USB кабелдерин бириктирип коюңуз. Ачык зымдардын борборлорун кесип өтүңүз жана аларды бири -бирине айлантыңыз. Андан кийин, аларды бириктирүү үчүн жупташкан зымдарга ширетүүнү колдонуңуз. Жардам колдору кабелдериңизди кармап туруу менен бул ишти жеңилдетет.
  5. Кызыл зымдар үчүн 4 -кадамды кайталаңыз.
  6. Ачык зымдарды электр лента менен жабыңыз, же өзүңүздү жакшы сезип жатсаңыз, жылуулукту кысуучу түтүк менен жабыңыз. Бул муундар морт болот, анткени зымдар ушунчалык кичинекей, андыктан USB кабелинин сырткы изоляциясына секирүүчү кабелдерди кармап турган лентанын экинчи катмарын кошуңуз. Бул жыйналышты катуураак кылат жана ошону менен ийилип кетүү ыктымалдуулугун азайтат.

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

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

Акыр -аягы, биз электрониканы жана башка нерселерди төмөнкү платформага орнотуп, баарын чогултабыз. Сага керек болот:

  • Төмөнкү платформа
  • Баш платформа
  • Манекен башы
  • USB+AC адаптери менен Kinect
  • USB кубат адаптери
  • Узарткыч
  • Микро USB кабели
  • Серво электр кабели
  • Raspberry Pi
  • Эркектен Аялга секирүүчү кабель
  • Жабышкак велкро
  • Кайчы

Кантип жасоо керек

  1. Пиди лотоктун түбүнө Velcro менен орнотуңуз.
  2. USB кубат адаптерин Velcro менен тиркеңиз.
  3. USB кубат адаптерине сервоприёмду жана пи сайыңыз.
  4. Пинин 12 пинин (GPIO18) сервонун сигнал кабелине туташтырыңыз. Бул оң жакта жайгашкан 6 -пин.
  5. Узартуу шнуруңузду лотоктун арткы туткасынан жылдырып, USB кубат адаптерин бир жагына сайыңыз.
  6. Kinect USB+AC адаптерин алып, кубат адаптерин узартуу зымынын экинчи жагына, USBди Пи -ге туташтырыңыз.
  7. Kinectтин шнурун лотканын алдыңкы туткасы аркылуу жылдырып, Kinect адаптерине туташтырыңыз.
  8. Кабелдерди платформанын астына кармап туруу үчүн скотчту колдондум. Бул эң жарашыктуу көрүнбөйт, бирок бактыга жараша мунун баары жашырылган.
  9. Платформаны оң жагына өйдө караңыз жана Kinectти платформанын алдына орнотуу үчүн Velcro колдонуңуз.
  10. Манекендин башын платформага орнотуу үчүн Velcro колдонуңуз. Баары тизилгенден кийин, эки бөлүктү бөлүп алыңыз, ошондо биз servo мүйүзүн орнотуучу бурамага кире алабыз. Мүйүздү servoго бурап койбоңуз, бирок биз бардыгын тизип алышыбыз үчүн, биринчи кезекте сервонун борбордук абалында экенине ынануубуз керек. Муну кийинки кадамда жасайбыз.

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) менен жалпыланган кайчылаш корреляция деп аталат. Бул ыкма кайчылаш корреляциянын чокуларын күчөтүүчү салмактоочу функцияны колдонууга келип такалат, бул оригиналдуу сигналды echoдон айырмалоону жеңилдетет. Мен GCC-PHATтын аткарылышын реверберация камерасындагы жөнөкөй кайчылаш корреляцияга салыштырдым (окуңуз: бетон ванна оңдолуп жатат), жана GCC-PHAT туура бурчту баалоодо 7 эсе эффективдүү деп таптым.
  3. Кайчылаш корреляцияны аткарууда, биз эки сигналды алып жатабыз, бири-бирибизди жылдырабыз жана ар бир кадамда туруктуу сигналдагы ар бир чекитти жылма сигналдагы ар бир чекитке көбөйтүп жатабыз. Узундугу n болгон эки сигнал үчүн, бул n^2 эсептөөлөргө алып келет. Биз муну мунун ордуна жыштык чөйрөсүндө кросс-корреляцияны аткаруу аркылуу жакшырта алмакпыз, бул тез Фурье трансформациясын камтыйт (nlogn эсептөөлөрү), бир трансформацияланган сигналдын ар бир пунктун экинчисинин тиешелүү чекитине көбөйтүү (n эсептөөлөр), андан кийин тескери аткаруу убакыт доменине (nlogn эсептөөлөрү) кайтуу үчүн Fourier трансформациясы, n+2*nlogn эсептөөлөрү, n^2ден азыраак. Бирок, бул жөнөкөйлүк мамиле. Биздин массивдеги микрофондор бири -бирине ушунчалык жакын жана үндүн ылдамдыгы ушунчалык жай болгондуктан, аудио толкун формалары негизинен тегизделет. Ошентип, биз бир аз алдыда же артта болгон эсептешүүлөрдү кароо үчүн өз ара байланышты ача алабыз. 1 жана 4 микрофондор үчүн артта калуу +/- 12 үлгүлөрдүн ортосунда болушу керек, бул ар бир кросс-корреляция үчүн биз 24*n эсептөөлөрдү гана аткарышыбыз керек, натыйжада толкун формаларыбыз 2900 үлгүдөн узун болгондо эсептөө үнөмдөлөт.

Бул система minidsp китепканасын колдонот, ал GCC-PHAT алгоритмин оптималдаштыруу 3 менен ишке ашырат.

Ар бир микрофон жупундагы сигналдардын артта калышын тапкандан кийин, программа артта калуунун орточо маанисин тандайт, аны болжолдуу бурчту эсептөө үчүн колдонот жана натыйжаны чыгарат, андыктан сервону көзөмөлдөө үчүн колдонулушу мүмкүн.

Серво башкаруу түйүнү

Kinect_doa түйүнүнө салыштырмалуу, servo түйүн салыштырмалуу жөнөкөй. Анын милдети - болжолдуу DOAны алуу жана сервону ошол бурчка жылдыруу. Бул servo бурчун коюу үчүн аны колдонуп, Raspberry Piнин аппараттык PWM модулуна кирүү үчүн wiringPi китепканасын колдонот. Көпчүлүк аналогдук серволор PWM сигналы менен башкарылат, импульсунун туурасы 1000 µs - 2000 µs, 0 ° - 180 ° бурчка туура келет, бирок мен колдонгон серво бурчка туура келген 500 µs - 2500 µs менен башкарылган. 0 ° дан 270 ° чейин. Ошентип, түйүн минималдуу импульстун, максималдуу импульстун туурасынын параметрлерин жана максималдуу жана минималдуу бурчтардын ортосундагы айырмачылыкты белгилөө менен ар кандай сервопрограммалар үчүн конфигурацияланат. Кошумча катары, серво дароо эле максаттуу бурчка өтпөйт, тескерисинче, бурчка карай конфигурациялануучу ылдамдыкта кыймылдайт, Маргаретке акырындык менен коркунучтуу вибе тартуулайт (плюс, алдыга жана артка тез кыймылдаган сервонун үнү чынында эле кыжырды келтирет).

8 -кадам: куруу жана орнотуу

Көз карандылыкты орнотуу:

Биринчиден, libfreenectти орнотуңуз. Биз аны булактан түзүшүбүз керек, анткени пакет менеджери менен ала турган версияда аудио колдоо жок. Бул аудиону иштетүү үчүн биз Kinectке программаны жүктөшүбүз керек жана бул программаны кайра бөлүштүрүү айрым юрисдикцияларда мыйзамдуу эмес. Мындан тышкары, биз башы жок Raspbian орнотуулары үчүн керексиз OpenGL жана glut талап кылган мисалдарды түзүүдөн сактанабыз.

sudo apt-get install 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 = OFF -DCMAKE_BUILD_EXAMPLES = OFF кылыңыз sudo cp ~/linb -kin -sudo орнотуу.rules /etc/udev/rules.d udevadm control --reload-rules && udevadm trigger

Андан кийин, биз Pi 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 топтомун түзүү:

Мунун баары бүткөндөн кийин, биздин долбоор үчүн catkin жумушчу мейкиндигин түзүп, 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 параметрин өзгөртүп, реактивдүүлүк сизге ыңгайлуу болгон деңгээлге жеткенге чейин системаны кайра иштетип көрүңүз.. Коэффициентти жогорулатуу системаны азыраак жооп берет жана тескерисинче. Сиз каалаган системаны башка жерге жылдырганыңызда, бул тюнингди аткарышыңыз керек болот.

Пи күйгүзүлгөндө программаны ишке киргизүү үчүн, биз ишке киргизүү файлын орнотуу үчүн 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 -кадам: Аны офисте жашыруу

Аны офисте жашыруу
Аны офисте жашыруу

Эми кызыктуу бөлүгү үчүн. Сааттан кийин жумушка баштаңыз жана манекениңизди жашыруун түрдө орнотуңуз. Анан жөн отуруп, кесиптештериңизге канча убакыт керек экенин көрүңүз! Сиздин жаңы жаратууңуз бир нече башты бурууга кепилдик берет …

Сунушталууда: