Բովանդակություն:

Ձայնի տեղայնացման մանեկենի գլուխ Kinect- ով. 9 քայլ (նկարներով)
Ձայնի տեղայնացման մանեկենի գլուխ Kinect- ով. 9 քայլ (նկարներով)

Video: Ձայնի տեղայնացման մանեկենի գլուխ Kinect- ով. 9 քայլ (նկարներով)

Video: Ձայնի տեղայնացման մանեկենի գլուխ Kinect- ով. 9 քայլ (նկարներով)
Video: Ձայնի արագություն | 8-րդ և 10-րդ դասարան. ֆիզիկա | «Քան» ակադեմիա 2024, Հուլիսի
Anonim
Ձայնի տեղայնացման մանեկենի գլուխ Kinect- ով
Ձայնի տեղայնացման մանեկենի գլուխ Kinect- ով

Meանոթացեք Մարգարետին ՝ վարորդի հոգնածության մոնիտորինգի համակարգի փորձարկման կեղծիքին: Նա վերջերս հեռացել է իր պարտականություններից և գտել է մեր գրասենյակի տարածքը, և այդ ժամանակվանից ի վեր ուշադրություն է գրավում նրանց վրա, ովքեր կարծում են, որ նա «սողացող» է: Արդարության շահերից ելնելով ՝ ես նրան հնարավորություն եմ տվել առերեսորեն հանդիպել իր մեղադրողներին. իր անհոգ հայացքով քեզ հետևելու փոխարեն այժմ նա իրականում այդպես է վարվում: Համակարգը օգտագործում է Microsoft Kinect- ի և սերվոյի խոսափողի զանգվածը `նրան ուղղորդելու իր մոտ գտնվող մարդկանց ուղղությամբ:

Քայլ 1: Տեսություն

Տեսություն
Տեսություն

Անկյունի հաշվարկ

Երբ մենք ինչ -որ բան ենք լսում, եթե այդ աղմուկը մեր առջև չէ, այն հասնում է մի ականջից մյուսին: Մեր ուղեղը ընկալում է այդ ժամանման ուշացումը և այն վերածում է ընդհանուր ուղղության, որից աղմուկ է գալիս, ինչը թույլ է տալիս մեզ գտնել աղբյուրը: Մենք կարող ենք հասնել նույն տեսակի տեղայնացման ՝ օգտագործելով մի զույգ խոսափող: Հաշվի առեք ցուցադրված դիագրամը, որը պարունակում է խոսափողի զույգ և ձայնի աղբյուր: Եթե մենք վերևից ներքև ենք նայում, ձայնային ալիքները շրջանաձև են, բայց եթե աղբյուրից հեռավորությունը մեծ է խոսափողերի միջև եղած տարածության համեմատ, ապա մեր տվիչների տեսանկյունից ալիքը մոտավորապես հարթ է: Սա հայտնի է որպես հեռավոր դաշտի ենթադրություն և պարզեցնում է մեր խնդրի երկրաչափությունը:

Այսպիսով, ենթադրենք, որ ալիքի ճակատը ուղիղ գիծ է: Եթե ձայնը հնչում է աջից, ապա այն t2 և «t1» ժամերին կխփի #2 խոսափողին և t1 ժամանակին: #2 խոսափողին և #1 խոսափողին հարվածելու միջև անցած հեռավորությունը ձայնի հայտնաբերման ժամանակային տարբերությունն է `բազմապատկված ձայնի արագությամբ v s:

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

Այս հեռավորությունը մենք կարող ենք կապել խոսափողի զույգի d 12 հեռավորության և զույգից θ անկյունի հետ ձայնի աղբյուրի հետ հարաբերության հետ.

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

Քանի որ մենք ունենք ընդամենը երկու խոսափող, մեր հաշվարկի մեջ երկիմաստություն կլինի, թե արդյոք ձայնի աղբյուրը մեր առջևից է, թե՞ հետևից: Այս համակարգում մենք ենթադրելու ենք, որ ձայնի աղբյուրը զույգի դիմաց է և սեղմում ենք 0 աստիճանի (ամբողջությամբ զույգի աջից) մինչև 180 աստիճանի անկյունը (ամբողջությամբ ձախից):

Վերջապես, մենք կարող ենք լուծել theta- ն ՝ վերցնելով հակադարձ կոսինուսը.

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

Անկյունը մի փոքր ավելի բնական դարձնելու համար մենք կարող ենք թետայից հանել 90 աստիճան, այնպես որ 0 աստիճանը գտնվում է անմիջապես զույգի դիմաց, իսկ +/- 90 աստիճանը լրիվ ձախ կամ լրիվ աջ: Սա մեր արտահայտությունը շրջում է հակադարձ կոսինուսից դեպի հակադարձ սինուս:

  • cos (θ-π/2) = մեղք (θ) = d/d12 = vs*Δt/d12
  • θ = ասին (vs*Δt/d12), -π/2 <= θ <= π/2

Գտնելով ուշացումը

Ինչպես տեսնում եք վերևի հավասարումից, այն, ինչ մենք պետք է լուծենք անկյունի համար, դա միկրոֆոն մեկին հասնող ձայնային ալիքի ուշացումն է ՝ խոսափողի երկրորդի համեմատ: ձայնի արագությունը և խոսափողների միջև հեռավորությունը և՛ ֆիքսված են, և՛ հայտնի: Դա իրականացնելու համար մենք նախ նմուշառում ենք աուդիո ազդանշանները fs հաճախականությամբ `դրանք անալոգայինից դարձնելով թվային և պահելով տվյալները հետագա օգտագործման համար: Մենք նմուշառում ենք որոշակի ժամանակ, որը հայտնի է որպես նմուշառման պատուհան, որը բավական երկար տևողություն ունի `մեր ձայնային ալիքի տարբերակիչ հատկությունները գրավելու համար: Օրինակ, մեր պատուհանը կարող է լինել վերջին կես վայրկյանի ձայնային տվյալները:

Պատուհանների ձայնային ազդանշանները ստանալուց հետո մենք գտնում ենք երկուսի միջև ուշացումը `հաշվարկելով նրանց խաչմերուկի հարաբերակցությունը: Խաչաձև հարաբերակցությունը հաշվարկելու համար մենք պահում ենք մեկ խոսափողից ամրացված պատուհանի ազդանշանը և երկրորդ ազդանշանը սահում ենք ժամանակային առանցքի երկայնքով ՝ առաջինի հետևից մինչև առաջինից ամբողջ ճանապարհը: Մեր սահիկի երկայնքով յուրաքանչյուր քայլում մենք բազմապատկում ենք մեր ֆիքսված ազդանշանի յուրաքանչյուր կետ մեր լոգարիթմական ազդանշանի համապատասխան կետով, այնուհետև գումարում ենք բոլոր արդյունքները `այդ քայլի մեր հարաբերակցության գործակիցը հաշվարկելու համար: Մեր սլայդն ավարտելուց հետո այն աստիճանը, որն ունի ամենաբարձր հարաբերակցության գործակիցը, համապատասխանում է այն կետին, որտեղ երկու ազդանշաններն ամենից շատ նման են, և այն քայլը, որով մենք գտնվում ենք, մեզ ասում է, թե քանի նմուշ n ազդանշան երկու անջատված է ազդանշանից 1. Եթե n- ը բացասական է, ապա ազդանշանը երկու հետ է մնում մեկից, եթե այն դրական է, ապա ազդանշանը երկու առջևում է, և եթե այն զրո է, ապա երկուսն արդեն հավասարեցված են: Մենք այս նմուշի փոխհատուցումը փոխակերպում ենք ժամանակի ուշացման ՝ օգտագործելով մեր ընտրանքի հաճախականությունը Δt = n/fs հարաբերությամբ, այսպիսով.

θ = ասին (vs*n/(d12*fs)), -π/2 <= θ <= π/2

Քայլ 2: Բաղադրիչներ

Մասեր

  • Microsoft Kinect for Xbox 360, մոդել 1414 կամ 1473. Kinect- ն ունի չորս խոսափող, որոնք դասավորված են գծային զանգվածի մեջ, որը մենք կօգտագործենք:
  • Ադապտեր ՝ Kinect- ի սեփական միակցիչը USB + AC հոսանքի վերածելու համար, ինչպես սա է:
  • Raspberry Pi 2 կամ 3 գործարկող Raspbian Stretch: Սկզբում ես փորձեցի օգտագործել Pi 1 Model B+, բայց այն բավականաչափ հզոր չէր: Ես անընդհատ խնդիրներ ունեի Kinect- ից անջատվելու հետ:
  • Ամենասարսափելի մանեկենի գլուխը, որը կարող եք գտնել
  • Անալոգային սերվո այնքան ուժեղ, որ կարող է շրջել ձեր մանեկենի գլուխը
  • 5V USB պատի լիցքավորիչ ՝ բավականաչափ հզորությամբ ՝ Pi- ն և servo- ն սնուցելու համար և առնվազն երկու նավահանգիստ: (Ես օգտագործեցի 5A 3 պորտի նման վարդակ, որը նման է դրան
  • Երկու վարդակով երկարացման լար (մեկը USB պատի լիցքավորիչի համար, իսկ մյուսը Kinect AC ադապտերի համար):
  • Երկու USB մալուխ ՝ A- ից միկրո- USB մալուխ ՝ Pi- ն սնուցելու համար, և մյուսը ՝ սերվոյին միացնելու համար, որը դեմ չեք կտրել
  • Հարթակ ամեն ինչի վրա նստելու համար և ևս մեկ փոքր հարթակ մանեկենի գլխի համար: Ես որպես հիմք օգտագործեցի պլաստմասե սկուտեղ, իսկ պլաստիկ ափսե ՝ որպես գլխի հարթակ: Երկուսն էլ Walmart- ից էին և արժեր ընդամենը մի քանի դոլար
  • 4x #8-32 1/2 "պտուտակներ և ընկույզներ` ձեր servo- ն ավելի մեծ հարթակին ամրացնելու համար
  • 2x M3 8 մմ պտուտակ լվացող մեքենաներով (կամ ինչ չափի էլ որ անհրաժեշտ լինի ձեր սերվո եղջյուրը փոքր հարթակին ամրացնելու համար)
  • Երկու տղամարդու և տղամարդու ցատկող մետաղալարեր ՝ մեկը կարմիր և մեկը սև, և մեկ կինից արու թռչկոտող մետաղալար
  • Կպչուն թիկունքով Velcro շերտեր
  • Էլեկտրական ժապավեն
  • Մալուխների կառավարման համար կպչուն ժապավեն

Գործիքներ

  • Դրեմել կտրող անիվով
  • Գայլիկոն
  • 7/64 ", 11/16" և 5/16 "փորվածքներ
  • M3 թակել (ըստ ցանկության ՝ կախված ձեր սերվո եղջյուրից)
  • Պտուտակահան
  • Oldոդման երկաթ `զոդումով
  • Օգնող ձեռքեր (ըստ ցանկության)
  • Մարկեր
  • Կողմնացույց
  • Մետաղալարեր
  • Բազմաչափ (ըստ ցանկության)

PPE

  • Անվտանգության ակնոցներ

  • Դեմքի դիմակ (dremmel-ed պլաստիկ բիտերի համար):

Քայլ 3. Ստորին հարթակի հավաքում

Ստորին հարթակի ժողով
Ստորին հարթակի ժողով
Ստորին հարթակի ժողով
Ստորին հարթակի ժողով
Ստորին հարթակի ժողով
Ստորին հարթակի ժողով

Առաջին մասը, որը մենք կկատարենք, ստորին հարթակն է, որը կպահի մեր Kinect- ը, servo- ն և մեր ամբողջ էլեկտրոնիկան: Հարթակը պատրաստելու համար ձեզ հարկավոր է.

  • Պլաստիկ սպասարկող սկուտեղ
  • Սերվո
  • 4x #8-32 1/2 "պտուտակներ ընկույզով
  • Դրեմել կտրող անիվով
  • Պտուտակահան
  • Գայլիկոն
  • 11/16 «Գայլիկոն
  • Մարկեր

Ինչպես պատրաստել

  1. Շրջեք ձեր սկուտեղը գլխիվայր:
  2. Տեղադրեք ձեր servo- ն կողքից սկուտեղի հետևի մասում, համոզվեք, որ servo- ի ելքային հանդերձանքը գտնվում է սկուտեղի կենտրոնական գծի երկայնքով, այնուհետև նշեք servo- ի հիմքի շուրջը:
  3. Օգտագործելով ձեր dremel և կտրող անիվը, կտրեք ձեր նշած տարածքը, այնուհետև ձեր սերվոն սահեցրեք իր անցքի մեջ:
  4. Նշեք սկուտեղի վրա սերվոյի պատյանների տեղադրման անցքերի կենտրոնները, այնուհետև հանեք servo- ն և այդ անցքերը հանեք ձեր 11/16 դյույմանոց փորվածքով: Շատ հեշտ է նման բարակ պլաստիկը ճեղքել, երբ փոսեր փորելիս, ուստի ես դա ավելի անվտանգ եմ համարում: վարժությունը հակառակ ուղղությամբ գործարկել և դանդաղորեն փոշիացնել նյութը: Դա շատ ավելի դանդաղ է, քան անցքերը ճիշտ փորելը, բայց դա ապահովում է, որ ճաքեր չկան:
  5. Տեղադրեք ձեր servo- ն նորից անցքի մեջ, այնուհետև ամրացրեք այն սկուտեղի վրա #8-32 պտուտակներով և ընկույզներով:

Քայլ 4. Գլխավոր պլատֆորմի հավաքում

Գլխավոր պլատֆորմի ժողով
Գլխավոր պլատֆորմի ժողով
Գլխավոր հարթակի ժողով
Գլխավոր հարթակի ժողով
Գլխավոր պլատֆորմի ժողով
Գլխավոր պլատֆորմի ժողով
Գլխավոր պլատֆորմի ժողով
Գլխավոր պլատֆորմի ժողով

Հաջորդ մասը, որը մենք կանենք, կլինի հարթակ, որը պետք է միացնի մանեկենի գլուխը սերվոյին: Գլխի հարթակ պատրաստելու համար ձեզ հարկավոր է.

  • Պլաստիկ ափսե
  • Սերվո եղջյուր
  • 2x M3 8 մմ պտուտակ լվացարաններով
  • Պտուտակահան
  • Գայլիկոն
  • 7/64 "և 5/16" փորվածքներ
  • Կողմնացույց
  • Դրեմել կտրող անիվով

Ինչպես պատրաստել

  1. Տեղադրեք ձեր կողմնացույցը ձեր մանեկենի գլխի հիմքի շառավղով:
  2. Օգտագործեք ձեր կողմնացույցը ՝ ափսեի կենտրոնում կենտրոնացված շրջան նշելու համար: Սա կլինի մեր գլխի հարթակի իրական չափը:
  3. Օգտագործեք ձեր dremel և կտրող անիվը ՝ ափսեից կտրելու ավելի փոքր հարթակը:
  4. Հորատեք ձեր նոր հարթակի կենտրոնը 5/16 դյույմ հորատիչով: Սա մեզ հնարավորություն կտա մուտք գործել պտուտակ, որը ամրացնում է մեր սերվոյի եղջյուրը մեր սերվոյին: Որպեսզի հարթակին կայունություն հաղորդեմ, երբ ես փոսը փորել եմ, ես դնում եմ մի պտուտակ: դրա տակ գտնվող մետաղալարեր և փորված պարանի կենտրոնով:
  5. Պլատֆորմի կենտրոնով շարեք ձեր servo եղջյուրը և նշեք երկու անցք ՝ եղջյուրը հարթակին ամրացնելու համար: Համոզվեք, որ տեղադրման այս անցքերը բավականաչափ հեռու են միմյանցից, այնպես որ տեղ կա ձեր M3 պտուտակների գլուխների և լվացքի մեքենաների համար:
  6. Հորատեք այս նշված անցքերը 7/64 դյույմ հորատիչով:
  7. Իմ servo եղջյուրի ստորին անցքը հարթ էր, այսինքն ՝ M3 պտուտակի թելեր չուներ: Այսպիսով, ես օգտագործեցի իմ հորատիչը և M3 ծորակը ՝ թելերը պատրաստելու համար:
  8. Օգտագործեք պտուտակներ և լվացքի մեքենաներ ՝ սերվոյի եղջյուրը ամրացնելու գլխի հարթակին:

Քայլ 5: Servo հոսանքի մալուխ

Servo հոսանքի մալուխ
Servo հոսանքի մալուխ
Servo հոսանքի մալուխ
Servo հոսանքի մալուխ
Servo հոսանքի մալուխ
Servo հոսանքի մալուխ
Servo հոսանքի մալուխ
Servo հոսանքի մալուխ

Անալոգային սերվերը սովորաբար սնվում են 4.8-6 Վ լարման միջոցով: Քանի որ Raspberry Pi- ն արդեն սնուցվելու է USB- ից 5 Վ լարման միջոցով, մենք պարզեցնելու ենք մեր համակարգը `սերվոն USB- ից նույնպես սնուցելով: Դա անելու համար մենք պետք է փոփոխենք USB մալուխը: Servo հոսանքի մալուխը պատրաստելու համար ձեզ հարկավոր է.

  • Պահեստային USB մալուխ ՝ տիպ A- ծայրով (այն տեսակը, որը միանում է ձեր համակարգչին)
  • Մեկ կարմիր և մեկ սև ցատկող մետաղալար
  • Sոդման երկաթ
  • Sոդող
  • Մետաղալարեր
  • Էլեկտրական ժապավեն
  • Օգնող ձեռքեր (ըստ ցանկության)
  • Բազմաչափ (ըստ ցանկության)

Ինչպես պատրաստել

  1. Կտրեք ոչ USB Type-A միակցիչը ձեր մալուխից, այնուհետև մի փոքր հեռացրեք մեկուսացումը ՝ չորս ներքին լարերը բացահայտելու համար: Կտրեք բացված լարերը շրջապատող վահանը:
  2. Սովորաբար USB մալուխը կունենա չորս լար `երկուսը տվյալների փոխանցման և ընդունման համար, և երկուսը` հոսանքի և միացման համար: Մենք շահագրգռված ենք հզորությամբ և հիմքով, որոնք սովորաբար համապատասխանաբար կարմիր և սև են: Հեռացրեք կարմիր և սև լարերի մեկուսացման մի մասը և կտրեք կանաչ և սպիտակ լարերը: Եթե մտահոգված եք, որ դուք չունեք ճիշտ հոսանքի և գրունտի լարերը, կարող եք միացնել ձեր մալուխը USB հոսանքի ադապտերին և միլիմետրով ստուգել ելքային լարումը:
  3. Հաջորդը, կտրեք ձեր կարմիր և սև ցատկող մալուխների մի ծայրը և հանեք մեկուսացման մի մասը:
  4. Այժմ ոլորեք ձեր ցատկողի և USB մալուխների սև լարերը: Անցեք բաց լարերի կենտրոնները և ոլորեք դրանք միմյանց շուրջ: Այնուհետև զոդման լարերին կպցրեք դրանք միասին պահելու համար: Օգնական ձեռքերը դա կդարձնեն ավելի հեշտ ՝ ձեր մալուխները տեղում պահելով:
  5. Կրկնեք 4 -րդ քայլը կարմիր լարերի համար:
  6. Theածկեք բաց էլեկտրագծերը էլեկտրական ժապավենով կամ ջերմության նվազեցման խողովակներով, եթե ձեզ դուր է գալիս: Այս հոդերը փխրուն կլինեն, քանի որ լարերը այնքան փոքր են, ուստի ավելացրեք ժապավենի երկրորդ շերտը, որը պահպանում է jumper մալուխները USB մալուխի արտաքին մեկուսացմանը: Սա հավաքը կդարձնի ավելի կոշտ և, հետևաբար, ավելի քիչ հավանական է, որ այն ճեղքվի:

Քայլ 6: Էլեկտրոնիկայի տեղադրում

Էլեկտրոնիկայի տեղադրում
Էլեկտրոնիկայի տեղադրում
Էլեկտրոնիկայի տեղադրում
Էլեկտրոնիկայի տեղադրում
Էլեկտրոնիկայի տեղադրում
Էլեկտրոնիկայի տեղադրում

Վերջապես, մենք ամեն ինչ կհամախմբենք ՝ ամրացնելով մեր էլեկտրոնիկան և մնացած ամեն ինչ ստորին հարթակին: Ձեզ հարկավոր կլինի.

  • Ստորին հարթակ
  • Գլխի հարթակ
  • Մանեկենի գլուխ
  • Kinect USB+AC ադապտերով
  • USB հոսանքի ադապտեր
  • Երկարացման լար
  • Միկրո USB մալուխ
  • Servo հոսանքի մալուխ
  • Ազնվամորի Պի
  • Արականից իգական ցատկող մալուխ
  • Կպչուն Velcro
  • Մկրատ

Ինչպես պատրաստել

  1. Տեղադրեք Pi- ն սկուտեղի ներքևում Velcro- ով:
  2. Կցեք USB հոսանքի ադապտեր Velcro- ով:
  3. Միացրեք servo- ն և Pi- ն USB հոսանքի ադապտերին:
  4. Միացրեք Pi- ի 12 -րդ կապը (GPIO18) սերվոյի ազդանշանային մալուխին: Դա 6 -րդ քորոցն է աջից ներքև:
  5. Օձի՛ր երկարացման լարդ սկուտեղի հետևի բռնակով և միացրու USB հոսանքի ադապտերը մի կողմից:
  6. Վերցրեք Kinect USB+AC ադապտերը և միացրեք հոսանքի ադապտերը երկարացման լարի մյուս կողմում, իսկ USB- ը ՝ Pi- ին:
  7. Օձեցրեք Kinect- ի լարը սկուտեղի առջևի բռնակով և միացրեք Kinect ադապտերին:
  8. Ես օգտագործեցի կպչուն ժապավեն `մալուխները հարթակի ներքևի մասում պահելու համար: Սա ամենանրբագեղ տեսք չունի, բայց բարեբախտաբար այս ամենը թաքնված է:
  9. Հարթակը շրջեք աջ կողմով և Velcro- ի միջոցով տեղադրեք Kinect- ը հարթակի առջև:
  10. Օգտագործեք Velcro ՝ մանեկենի գլուխը գլխի հարթակին ամրացնելու համար: Երբ ամեն ինչ շարվի, առանձնացրեք երկու կտորները, որպեսզի մենք կարողանանք մուտք գործել servo եղջյուրի ամրացման պտուտակ: Այնուամենայնիվ, դեռ մի պտուտակեք սերվոյի վրա, քանի որ մենք պետք է համոզվենք, որ սերվոն նախ գտնվում է իր կենտրոնական դիրքում, որպեսզի կարողանանք ամեն ինչ շարել: Մենք դա կանենք հետագա քայլին:

Քայլ 7: Softwareրագրակազմ և ալգորիթմ

Softwareրագրային ապահովում և ալգորիթմ
Softwareրագրային ապահովում և ալգորիթմ

Ակնարկ

Այս ծրագրի ծրագրակազմը գրված է 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 հաշվարկներ), այնուհետև կատարելով հակադարձ չորս անգամ փոխակերպվել ՝ վերադառնալու ժամանակի տիրույթ (nlogn հաշվարկներ), որի արդյունքում ստացվել են n+2*nlogn հաշվարկներ, n^2 -ից պակաս: Այնուամենայնիվ, սա միամիտ մոտեցում է: Մեր զանգվածի խոսափողերն այնքան մոտ են իրար, և ձայնի արագությունն այնքան համեմատաբար դանդաղ է, որ աուդիոալիքային ձևերն արդեն հիմնականում հավասարեցված կլինեն:Այսպիսով, մենք կարող ենք պատուհան տալ մեր փոխկապակցվածությանը `հաշվի առնելով միայն փոքր-ինչ առաջ կամ հետ ընկած փոխհատուցումները: Խոսափողերի համար 1 և 4, հետաձգումը պետք է ընկնի +/- 12 նմուշների միջև, ինչը նշանակում է, որ յուրաքանչյուր փոխկապակցման համար մեզ անհրաժեշտ է կատարել միայն 24*n հաշվարկ, ինչը կհանգեցնի հաշվարկների խնայողության, երբ մեր ալիքի ձևերը ավելի քան 2900 նմուշ են:

Այս համակարգը գործի է դնում minidsp գրադարանը, որն իրականացնում է GCC-PHAT ալգորիթմը օպտիմալացմամբ 3:

Խոսափողի յուրաքանչյուր զույգի ազդանշանների մեջ հետաձգումը գտնելուց հետո ծրագիրն ընտրում է հետաձգման միջին արժեքը, այն օգտագործում է մոտավոր անկյունը հաշվարկելու համար և հրապարակում արդյունքը, որպեսզի այն կարողանա օգտագործվել սերվոն վերահսկելու համար:

Servo կառավարման հանգույց

Համեմատած kinect_doa հանգույցի հետ, servo հանգույցը համեմատաբար պարզ է: Նրա խնդիրն է միայն վերցնել գնահատված DOA- ն և սերվոն տեղափոխել այդ անկյան տակ: Այն օգտագործում է wiringPi գրադարանը ՝ Raspberry Pi- ի ապարատային PWM մոդուլին մուտք գործելու համար ՝ օգտագործելով այն սերվոյի անկյունը սահմանելու համար: Անալոգային սերվերի մեծ մասը վերահսկվում է PWM ազդանշանով `զարկերակի լայնությամբ` 1000 μs- ից մինչև 2000 μs, որը համապատասխանում է 0 ° -ից մինչև 180 ° անկյունին, սակայն իմ օգտագործած սերվոն վերահսկվում էր 500 μs- ից մինչև 2500 μs, համապատասխան անկյունին: 0 -ից 270 ° -ից: Այսպիսով, հանգույցը կարող է կարգավորվել տարբեր servo սարքավորումների համար `սահմանելով պարամետրեր նվազագույն զարկերակի լայնության, զարկերակի առավելագույն լայնության և առավելագույն և նվազագույն անկյունների միջև տարբերության համար: Բացի այդ, servo- ն անմիջապես չի շարժվում դեպի թիրախային անկյունը, այլ շարժվում է դեպի անկյունը կարգավորելի արագությամբ, ինչը Մարգարեթին տալիս է ավելի աստիճանական, սողացող տրամադրություն (գումարած ՝ արագ և առաջ շարժվող սերվոյի ձայնը շատ արագ նյարդայնացնում է)):

Քայլ 8: Կառուցեք և տեղադրեք

Կախվածության տեղադրում

Նախ, տեղադրեք libfreenect- ը: Մենք պետք է այն կառուցենք սկզբնաղբյուրից, քանի որ այն տարբերակը, որը կարող եք ձեռք բերել փաթեթի կառավարչի հետ, չի ներառում ձայնի աջակցություն: Դա տեղի է ունենում այն պատճառով, որ մենք պետք է ներբեռնենք որոնվածը Kinect- ում `ձայնը միացնելու համար, և այս որոնվածի վերաբաշխումը օրինական չէ որոշակի իրավասությունների շրջանակներում: Բացի այդ, մենք կարող ենք խուսափել օրինակների ստեղծումից, որոնք պահանջում են OpenGL և շատակերություն, որոնք անհարկի են Raspbian անգլուխ տեղակայանքների համար:

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

cd git clone https://github.com/OpenKinect/libfreenect cd libfreenect mkdir build cd build cmake.. -DCMAKE_BUILD_REDIST_PACKAGE = OFF -DCMAKE_BUILD_EXAMPLES = OFF make sudo make/sudo//.rules /etc/udev/rules.d udevadm հսկողություն-վերաբեռնում-կանոններ && udevadm ձգան

Հաջորդը, մենք պետք է տեղադրենք wiringPi փաթեթը, որը թույլ է տալիս մեզ վերահսկել Pi- ի GPIO կապերը.

CD

git clone git: //git.drogon.net/wiringPi cd ~/wiringPi./ շինություն

Կցեք մանեկենի գլուխը

Տեղադրելով wiringPi- ն, մենք այժմ կարող ենք արագ ճանապարհով վերադառնալ ապարատային հող `մանեկենի գլուխը ստորին հարթակին ամրացնելու համար: Servo- ն հրամանի տողի միջոցով կենտրոնացնելու համար մուտքագրեք հետևյալ հրամանները.

gpio pwm-ms

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

Եթե շարժում չկա, ապա ձեր սերվոն հավանաբար արդեն կենտրոնացած է: Այնուամենայնիվ, վստահ լինելու համար, դուք կարող եք սերվոն սահմանել ոչ կենտրոնական արժեքի, օրինակ. gpio -g pwm 18 200, այնուհետև այն կրկին դրեք 150 -ի:

Երբ համոզվեք, որ servo- ն կենտրոնացած է, գլխի պլատֆորմի servo եղջյուրը կցեք servo- ին այնպես, որ ձեր մանեկենի գլուխը նայի ուղիղ առաջ: Այնուհետև եղջյուրը պտուտակացրեք սերվոյի վրա և ամրացրեք ձեր գլուխը Velcro բիտերի միջոցով:

Տեղադրեք ROS:

Հաջորդը, տեղադրեք ROS ձեր Pi- ի վրա: Տեղադրման հիանալի ուղեցույց կարելի է գտնել այստեղ. մեր համակարգի համար մեզ պետք չէ OpenCV, այնպես որ կարող եք բաց թողնել 3 -րդ քայլը: Այս կառուցումն ավարտելու համար կպահանջվի մի քանի ժամ: Տեղադրման ուղեցույցին հետևելուց հետո ավելացրեք տեղադրման աղբյուրը ձեր bashrc- ին, որպեսզի մենք կարողանանք օգտագործել մեր նոր տեղադրված ROS փաթեթները.

արձագանք "աղբյուր /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 կլոն

Robot_upstart փաթեթը տրամադրում է գործածման ֆայլերի տեղադրման համար դյուրին գործիք, որպեսզի դրանք գործարկվեն գործարկման ժամանակ, այնպես որ սա նույնպես կլոնավորեք ձեր աշխատանքային տարածքի մեջ.

git կլոն

Այժմ, մենք կարող ենք կառուցել ծրագրի կոդը ՝ զանգահարելով 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: գործարկեք տեքստային խմբագրիչում և պարամետրը օգտագործելով_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/start/kinect_doa.launch -օգտագործողի արմատ --symlink

Գործարկման ֆայլին պատճենելու փոխարեն մենք ստեղծում ենք համացանց, որպեսզի կարողանանք փոխել պարամետրերը ՝ խմբագրելով ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch:

Քայլ 9: Թաքցնել այն գրասենյակում

Թաքցնել այն գրասենյակում
Թաքցնել այն գրասենյակում

Հիմա զվարճալի մասի համար: Hoursամից հետո գործի անցեք և գաղտնի դրեք ձեր մանեկենը: Այնուհետև պարզապես նստեք և տեսեք, թե որքան ժամանակ է պահանջվում, որ ձեր գործընկերները հասնեն առաջ: Ձեր նոր ստեղծագործությունը երաշխավորված է, որ մի քանի գլուխ կշրջի…

Խորհուրդ ենք տալիս: