विषयसूची:

ध्वनि स्थानीयकरण पुतला सिर Kinect के साथ: 9 कदम (चित्रों के साथ)
ध्वनि स्थानीयकरण पुतला सिर Kinect के साथ: 9 कदम (चित्रों के साथ)

वीडियो: ध्वनि स्थानीयकरण पुतला सिर Kinect के साथ: 9 कदम (चित्रों के साथ)

वीडियो: ध्वनि स्थानीयकरण पुतला सिर Kinect के साथ: 9 कदम (चित्रों के साथ)
वीडियो: ✨Law of Devil EP 01 - EP 14 Full Version [MULTI SUB] 2024, जुलाई
Anonim
Kinect. के साथ ध्वनि स्थानीयकरण पुतला सिर
Kinect. के साथ ध्वनि स्थानीयकरण पुतला सिर

ड्राइवर थकान निगरानी प्रणाली के लिए एक परीक्षण डमी मार्गरेट से मिलें। वह हाल ही में अपने कर्तव्यों से सेवानिवृत्त हुई और हमारे कार्यालय की जगह के लिए अपना रास्ता खोज लिया, और तब से उन लोगों का ध्यान आकर्षित किया है जो सोचते हैं कि वह 'डरावना' है। न्याय के हित में, मैंने उसे अपने आरोप लगाने वालों का डटकर सामना करने की क्षमता दी है; अपनी निष्कपट निगाहों से आपका पीछा करने के बजाय, अब वह वास्तव में ऐसा करती है। सिस्टम उसे अपने आस-पास बात करने वाले लोगों की दिशा में चलाने के लिए Microsoft Kinect और एक सर्वो के माइक्रोफ़ोन सरणी का उपयोग करता है।

चरण 1: सिद्धांत

सिद्धांत
सिद्धांत

कोण की गणना

जब हम कुछ सुनते हैं, जब तक कि वह शोर सीधे हमारे सामने न हो, वह एक कान से दूसरे कान तक पहुंच जाता है। हमारा दिमाग उस आगमन में देरी का अनुभव करता है और उसे एक सामान्य दिशा में परिवर्तित कर देता है जिससे शोर आ रहा है, जिससे हमें स्रोत खोजने की अनुमति मिलती है। हम माइक्रोफोन की एक जोड़ी का उपयोग करके ठीक उसी तरह के स्थानीयकरण को प्राप्त कर सकते हैं। दिखाए गए आरेख पर विचार करें, जिसमें एक माइक्रोफ़ोन जोड़ी और एक ध्वनि स्रोत है। यदि हम ऊपर से नीचे की ओर देख रहे हैं, तो ध्वनि तरंगें गोलाकार होती हैं, लेकिन यदि स्रोत से दूरी माइक्रोफोन के बीच की दूरी के सापेक्ष बड़ी है, तो हमारे सेंसर के दृष्टिकोण से तरंग लगभग समतल है। इसे दूर-क्षेत्र की धारणा के रूप में जाना जाता है और हमारी समस्या की ज्यामिति को सरल करता है।

तो मान लें कि तरंगाग्र एक सीधी रेखा है। यदि ध्वनि दाईं ओर से आ रही है, तो यह t2 समय पर माइक्रोफ़ोन #2 और t1 समय पर माइक्रोफ़ोन #1 से टकराएगी। माइक्रोफ़ोन #2 और माइक्रोफ़ोन # 1 से टकराने के बीच d ध्वनि की दूरी, ध्वनि की गति से गुणा की गई ध्वनि का पता लगाने में समय का अंतर है v:

डी = वी एस * (टी 1-टी 2) = बनाम * Δt

हम इस दूरी को माइक्रोफोन जोड़ी के बीच की दूरी d 12 और युग्म से कोण से ध्वनि स्रोत के बीच संबंध के साथ जोड़ सकते हैं:

cos(θ) = d/d 12 = बनाम*Δt /d12

चूंकि हमारे पास केवल दो माइक्रोफोन हैं, इसलिए हमारी गणना में अस्पष्टता होगी कि ध्वनि स्रोत हमारे सामने है या पीछे। इस प्रणाली में, हम मान लेंगे कि ध्वनि स्रोत जोड़ी के सामने है और कोण को 0 डिग्री (जोड़ी के पूरी तरह से दाईं ओर) से 180 डिग्री (पूरी तरह से बाईं ओर) के बीच में जकड़ें।

अंत में, हम थीटा के लिए व्युत्क्रम कोज्या लेकर हल कर सकते हैं:

θ = acos(बनाम*Δt/d12), 0 <= θ <=

कोण को थोड़ा और प्राकृतिक बनाने के लिए, हम थीटा से 90 डिग्री घटा सकते हैं, ताकि 0 डिग्री सीधे जोड़े के सामने हो और +/- 90 डिग्री पूर्ण बाएं या पूर्ण दाएं हो। यह हमारे व्यंजक को व्युत्क्रम कोज्या से व्युत्क्रम ज्या में बदल देता है।

  • cos(θ-π/2) = sin(θ) = d/d12 = बनाम*Δt/d12
  • θ = असिन(बनाम*Δt/d12), -π/2 <= θ <= π/2

देरी का पता लगाना

जैसा कि आप ऊपर के समीकरण से देख सकते हैं, हमें कोण के लिए हल करने की आवश्यकता है, माइक्रोफ़ोन दो की तुलना में माइक्रोफ़ोन एक पर आने वाली ध्वनि तरंग में देरी; ध्वनि की गति और माइक्रोफोन के बीच की दूरी दोनों निश्चित और ज्ञात हैं। इसे पूरा करने के लिए, हम पहले आवृत्ति fs पर ऑडियो सिग्नल का नमूना लेते हैं, उन्हें एनालॉग से डिजिटल में परिवर्तित करते हैं और बाद में उपयोग के लिए डेटा संग्रहीत करते हैं। हम नमूना विंडो के रूप में ज्ञात समय की अवधि के लिए नमूना लेते हैं, जो हमारी ध्वनि तरंग की विशिष्ट विशेषताओं को पकड़ने के लिए पर्याप्त लंबी अवधि की होती है। उदाहरण के लिए, हमारी विंडो पिछले आधे सेकेंड के लायक ऑडियो डेटा हो सकती है।

विंडोड ऑडियो सिग्नल प्राप्त करने के बाद, हम दोनों के बीच उनके क्रॉस-सहसंबंध की गणना करके देरी का पता लगाते हैं। क्रॉस-सहसंबंध की गणना करने के लिए, हम एक माइक्रोफ़ोन से विंडोड सिग्नल को स्थिर रखते हैं, और दूसरे सिग्नल को टाइम एक्सिस के साथ पहले से सभी तरह से पहले से आगे तक स्लाइड करते हैं। हमारी स्लाइड के साथ प्रत्येक चरण पर हम अपने निश्चित सिग्नल में प्रत्येक बिंदु को हमारे स्लाइडिंग सिग्नल में संबंधित बिंदु से गुणा करते हैं, फिर उस चरण के लिए हमारे सहसंबंध गुणांक की गणना करने के लिए सभी परिणामों को एक साथ जोड़ते हैं। हमारी स्लाइड को पूरा करने के बाद, उच्चतम सहसंबंध गुणांक वाला चरण उस बिंदु से मेल खाता है जहां दो सिग्नल सबसे समान हैं, और हम किस चरण पर हैं, हमें बताता है कि सिग्नल 1 से कितने नमूने n सिग्नल दो ऑफसेट हैं। यदि n नकारात्मक है, तो सिग्नल दो सिग्नल एक से पिछड़ रहा है, यदि यह सकारात्मक है तो सिग्नल दो आगे है, और यदि यह शून्य है तो दोनों पहले से ही संरेखित हैं। हम इस नमूना ऑफ़सेट को t = n/fs संबंध के साथ हमारी नमूना आवृत्ति का उपयोग करके समय विलंब में परिवर्तित करते हैं, इस प्रकार:

= असिन(बनाम*n/(d12*fs)), -π/2 <= θ <= /2

चरण 2: घटक

पार्ट्स

  • Xbox 360 के लिए Microsoft Kinect, मॉडल 1414 या 1473। Kinect में चार माइक्रोफ़ोन एक रैखिक सरणी में व्यवस्थित हैं जिनका हम उपयोग करेंगे।
  • इस तरह से Kinect के मालिकाना कनेक्टर को USB + AC पावर में बदलने के लिए एडेप्टर।
  • रास्पबेरी पाई 2 या 3 रास्पियन स्ट्रेच चल रहा है। मैंने मूल रूप से पीआई 1 मॉडल बी + का उपयोग करने की कोशिश की, लेकिन यह पर्याप्त शक्तिशाली नहीं था। मुझे किनेक्ट से डिस्कनेक्ट करने में समस्याएँ आती रहीं।
  • सबसे अजीब पुतला सिर जो आप पा सकते हैं
  • एक एनालॉग सर्वो आपके पुतले के सिर को मोड़ने के लिए पर्याप्त मजबूत है
  • एक 5V USB वॉल चार्जर जिसमें Pi और सर्वो और कम से कम दो पोर्ट दोनों को पावर देने के लिए पर्याप्त एम्परेज है। (मैंने इसके समान 5A 3-पोर्ट प्लग का उपयोग किया है
  • दो आउटलेट के साथ एक एक्सटेंशन कॉर्ड (एक USB वॉल चार्जर के लिए और दूसरा Kinect AC अडैप्टर के लिए।
  • दो यूएसबी केबल: पाई को पावर देने के लिए एक टाइप-ए से माइक्रो-यूएसबी केबल और दूसरा सर्वो को पावर देने के लिए जिसे आपको काटने में कोई आपत्ति नहीं है
  • सब कुछ बैठने के लिए एक मंच और पुतला सिर के लिए एक और छोटा मंच। मैंने बेस के रूप में एक प्लास्टिक सर्विंग ट्रे और हेड प्लेटफॉर्म के रूप में एक प्लास्टिक प्लेट का इस्तेमाल किया। दोनों वॉलमार्ट से थे और इसकी कीमत केवल कुछ डॉलर थी
  • 4x #8-32 1/2" बोल्ट और नट आपके सर्वो को बड़े प्लेटफॉर्म से जोड़ने के लिए
  • वाशर के साथ 2x M3 8 मिमी बोल्ट (या जो भी आकार आपको अपने सर्वो हॉर्न को छोटे प्लेटफॉर्म से जोड़ने की आवश्यकता है)
  • दो पुरुष-से-पुरुष जम्पर तार, एक लाल और एक काला, और एक महिला-से-पुरुष जम्पर तार
  • चिपकने वाला समर्थित वेल्क्रो स्ट्रिप्स
  • विद्युत टेप
  • केबल प्रबंधन के लिए डक्ट टेप

उपकरण

  • कटिंग व्हील के साथ डरमेल
  • ड्रिल
  • 7/64", 11/16 ", और 5/16" ड्रिल बिट
  • M3 टैप (वैकल्पिक, आपके सर्वो हॉर्न पर निर्भर करता है)
  • पेंचकस
  • सोल्डर के साथ सोल्डरिंग आयरन
  • मदद करने वाले हाथ (वैकल्पिक)
  • निशान
  • दिशा सूचक यंत्र
  • वायर स्ट्रिपर्स
  • मल्टीमीटर (वैकल्पिक)

पीपीई

  • सुरक्षा कांच

  • फेस मास्क (ड्रेमेल-एड प्लास्टिक बिट्स के लिए)।

चरण 3: निचला प्लेटफ़ॉर्म असेंबली

लोअर प्लेटफार्म असेंबली
लोअर प्लेटफार्म असेंबली
लोअर प्लेटफार्म असेंबली
लोअर प्लेटफार्म असेंबली
लोअर प्लेटफार्म असेंबली
लोअर प्लेटफार्म असेंबली

पहला भाग जो हम बनाएंगे वह निचला मंच है, जो हमारे किनेक्ट, सर्वो और हमारे सभी इलेक्ट्रॉनिक्स को धारण करेगा। मंच बनाने के लिए आपको आवश्यकता होगी:

  • प्लास्टिक सर्विंग ट्रे
  • इमदादी
  • ४x #८-३२ १/२" नट के साथ बोल्ट
  • कटिंग व्हील के साथ डरमेल
  • पेंचकस
  • ड्रिल
  • 11/16 "ड्रिल बिट
  • निशान

कैसे बनाना है

  1. अपनी ट्रे को उल्टा पलटें।
  2. अपने सर्वो को ट्रे के पीछे के पास रखें, सुनिश्चित करें कि सर्वो का आउटपुट गियर ट्रे की केंद्र रेखा के साथ स्थित है, फिर सर्वो के आधार के चारों ओर चिह्नित करें।
  3. अपने डरमेल और कटिंग व्हील का उपयोग करके, आपके द्वारा चिह्नित क्षेत्र को काट लें, फिर अपने सर्वो को उसके स्लॉट में स्लाइड करें।
  4. ट्रे पर सर्वो हाउसिंग माउंटिंग होल के केंद्रों को चिह्नित करें, फिर सर्वो को हटा दें और उन छेदों को अपने 11/16 "ड्रिल बिट के साथ ड्रिल करें। छेद ड्रिल करते समय इस तरह पतली प्लास्टिक को तोड़ना बहुत आसान है, इसलिए मुझे यह अधिक सुरक्षित लगता है ड्रिल को उल्टा चलाने के लिए और धीरे-धीरे सामग्री को दूर भगाना। यह छेदों को ठीक से ड्रिल करने की तुलना में बहुत धीमा है लेकिन यह सुनिश्चित करता है कि कोई दरार न हो।
  5. अपने सर्वो को वापस स्लॉट में रखें, फिर इसे # 8-32 बोल्ट और नट्स के साथ ट्रे पर माउंट करें।

चरण 4: हेड प्लेटफार्म असेंबली

हेड प्लेटफार्म असेंबली
हेड प्लेटफार्म असेंबली
हेड प्लेटफार्म असेंबली
हेड प्लेटफार्म असेंबली
हेड प्लेटफार्म असेंबली
हेड प्लेटफार्म असेंबली
हेड प्लेटफार्म असेंबली
हेड प्लेटफार्म असेंबली

अगला भाग हम पुतले के सिर को सर्वो से जोड़ने के लिए एक मंच होगा। हेड प्लेटफॉर्म बनाने के लिए आपको आवश्यकता होगी:

  • प्लास्टिक की प्लेट
  • सर्वो हॉर्न
  • वाशर के साथ 2x M3 8mm बोल्ट
  • पेंचकस
  • ड्रिल
  • 7/64" और 5/16" ड्रिल बिट
  • दिशा सूचक यंत्र
  • कटिंग व्हील के साथ डरमेल

कैसे बनाना है

  1. अपने कंपास को अपने पुतले के सिर के आधार की त्रिज्या पर सेट करें।
  2. प्लेट के केंद्र पर केंद्रित एक वृत्त को चिह्नित करने के लिए अपने कंपास का उपयोग करें। यह हमारे हेड प्लेटफॉर्म का वास्तविक आकार होगा।
  3. प्लेट से छोटे प्लेटफॉर्म को काटने के लिए अपने डरमेल और कटिंग व्हील का उपयोग करें।
  4. 5/16" ड्रिल बिट के साथ अपने नए प्लेटफ़ॉर्म के केंद्र को ड्रिल करें। यह हमें उस स्क्रू तक पहुंच प्रदान करेगा जो हमारे सर्वो हॉर्न को हमारे सर्वो पर माउंट करता है। प्लेटफॉर्म को स्थिरता देने के लिए जैसे ही मैंने छेद ड्रिल किया, मैंने एक स्पूल लगाया इसके नीचे तार और स्पूल के केंद्र के माध्यम से ड्रिल किया गया।
  5. प्लेटफ़ॉर्म के केंद्र के साथ अपने सर्वो हॉर्न को लाइन अप करें और हॉर्न को प्लेटफ़ॉर्म से जोड़ने के लिए दो छेदों को चिह्नित करें। सुनिश्चित करें कि ये बढ़ते छेद काफी दूर हैं इसलिए आपके M3 बोल्ट सिर और वाशर के लिए जगह है।
  6. इन चिह्नित छेदों को 7/64 "ड्रिल बिट के साथ ड्रिल करें।
  7. मेरे सर्वो हॉर्न का निचला छेद चिकना था, यानी इसमें M3 बोल्ट के लिए धागे नहीं थे। इस प्रकार, मैंने धागे बनाने के लिए अपनी ड्रिल और एक M3 टैप का उपयोग किया।
  8. सर्वो हॉर्न को हेड प्लेटफॉर्म से जोड़ने के लिए बोल्ट और वाशर का उपयोग करें।

चरण 5: सर्वो पावर केबल

सर्वो पावर केबल
सर्वो पावर केबल
सर्वो पावर केबल
सर्वो पावर केबल
सर्वो पावर केबल
सर्वो पावर केबल
सर्वो पावर केबल
सर्वो पावर केबल

एनालॉग सर्वो आमतौर पर 4.8-6V के साथ संचालित होते हैं। चूंकि रास्पबेरी पाई पहले से ही यूएसबी से 5 वी द्वारा संचालित होने जा रही है, हम यूएसबी से सर्वो को भी पावर करके अपने सिस्टम को सरल बना देंगे। ऐसा करने के लिए हमें एक यूएसबी केबल को संशोधित करने की आवश्यकता होगी। सर्वो पावर केबल बनाने के लिए आपको आवश्यकता होगी:

  • टाइप-ए एंड के साथ अतिरिक्त यूएसबी केबल (जिस तरह से आपके कंप्यूटर में प्लग होता है)
  • एक लाल और एक काला जम्पर तार
  • सोल्डरिंग आयरन
  • मिलाप
  • वायर स्ट्रिपर्स
  • विद्युत टेप
  • मदद करने वाले हाथ (वैकल्पिक)
  • मल्टीमीटर (वैकल्पिक)

कैसे बनाना है

  1. अपने केबल से गैर यूएसबी टाइप-ए कनेक्टर को काटें, फिर चार आंतरिक तारों को प्रकट करने के लिए थोड़ा सा इंसुलेशन हटा दें। उजागर तारों के आसपास के परिरक्षण को काट दें।
  2. आमतौर पर यूएसबी केबल में चार तार होंगे: दो डेटा ट्रांसमिशन और रिसेप्शन के लिए और दो पावर और ग्राउंड के लिए। हम सत्ता और जमीन में रुचि रखते हैं, जो क्रमशः लाल और काले रंग के होते हैं। लाल और काले तारों से कुछ इन्सुलेशन हटा दें और हरे और सफेद तारों को काट दें। यदि आप चिंतित हैं कि आपके पास सही पावर और ग्राउंड वायर नहीं हैं, तो आप अपने केबल को अपने यूएसबी पावर एडॉप्टर में प्लग कर सकते हैं और एक मल्टीमीटर के साथ आउटपुट वोल्टेज की जांच कर सकते हैं।
  3. इसके बाद, अपने लाल और काले जम्पर केबल्स के एक छोर को काट लें और कुछ इन्सुलेशन बंद कर दें।
  4. अब, अपने जम्पर और यूएसबी केबल के खुले काले तारों को एक साथ मोड़ें। उजागर तारों के केंद्रों को पार करें और उन्हें एक दूसरे के चारों ओर घुमाएं। फिर, उन्हें एक साथ पकड़ने के लिए मिलाप वाले तारों को मिलाप करें। हाथों की मदद करने से आपके केबल को जगह में पकड़कर यह आसान हो जाएगा।
  5. लाल तारों के लिए चरण 4 दोहराएँ।
  6. बिजली के टेप के साथ उजागर तारों को कवर करें, या यदि आप फैंसी महसूस कर रहे हैं तो टयूबिंग को गर्म करें। ये जोड़ नाजुक होंगे क्योंकि तार इतने छोटे होते हैं, इसलिए जम्पर केबल को पकड़े हुए टेप की दूसरी परत को USB केबल के बाहरी इंसुलेशन में जोड़ें। यह असेंबली को और अधिक कठोर बना देगा और इस प्रकार झुकने से टूटने की संभावना कम होगी।

चरण 6: इलेक्ट्रॉनिक्स माउंटिंग

इलेक्ट्रॉनिक्स माउंटिंग
इलेक्ट्रॉनिक्स माउंटिंग
इलेक्ट्रॉनिक्स माउंटिंग
इलेक्ट्रॉनिक्स माउंटिंग
इलेक्ट्रॉनिक्स माउंटिंग
इलेक्ट्रॉनिक्स माउंटिंग

अंत में, हम सब कुछ एक साथ लाएंगे, अपने इलेक्ट्रॉनिक्स और अन्य सभी चीजों को निचले प्लेटफॉर्म पर बढ़ाएंगे। आपको चाहिये होगा:

  • निचला मंच
  • प्रमुख मंच
  • पुतला सिर
  • यूएसबी + एसी एडाप्टर के साथ किनेक्ट
  • यूएसबी पावर एडाप्टर
  • एक्स्टेंशन कॉर्ड
  • माइक्रो यूएसबी केबल
  • सर्वो पावर केबल
  • रास्पबेरी पाई
  • पुरुष-से-महिला जम्पर केबल
  • चिपकने वाला वेल्क्रो
  • कैंची

कैसे बनाना है

  1. वेल्क्रो के साथ पाई को ट्रे के नीचे माउंट करें।
  2. वेल्क्रो के साथ यूएसबी पावर एडाप्टर संलग्न करें।
  3. USB पावर एडॉप्टर में सर्वो और पाई प्लग करें।
  4. पाई के पिन 12 (GPIO18) को सर्वो के सिग्नल केबल से कनेक्ट करें। यह दायीं ओर छठा पिन है।
  5. ट्रे के पिछले हैंडल के माध्यम से अपने एक्सटेंशन कॉर्ड को स्नेक करें और USB पावर एडॉप्टर को एक तरफ प्लग करें।
  6. Kinect USB+AC अडैप्टर लें और पावर एडॉप्टर को एक्सटेंशन कॉर्ड के दूसरी ओर और USB को Pi में प्लग करें।
  7. ट्रे के सामने वाले हैंडल के माध्यम से Kinect के कॉर्ड को स्नेक करें और Kinect एडॉप्टर में प्लग करें।
  8. मैंने प्लेटफॉर्म के नीचे की ओर केबल रखने के लिए डक्ट टेप का इस्तेमाल किया। यह सबसे सुंदर नहीं दिखता है, लेकिन सौभाग्य से यह सब छिपा हुआ है।
  9. प्लेटफ़ॉर्म को दाईं ओर फ़्लिप करें और प्लेटफ़ॉर्म के सामने Kinect को माउंट करने के लिए वेल्क्रो का उपयोग करें।
  10. पुतला सिर को हेड प्लेटफॉर्म पर माउंट करने के लिए वेल्क्रो का उपयोग करें। एक बार सब कुछ पंक्तिबद्ध हो जाने के बाद, दो टुकड़ों को अलग करें ताकि हम सर्वो हॉर्न माउंटिंग स्क्रू तक पहुंच सकें। हालांकि, अभी तक सर्वो को हॉर्न न दें, क्योंकि हमें यह सुनिश्चित करने की आवश्यकता है कि सर्वो पहले इसके केंद्र की स्थिति में है ताकि हम सब कुछ लाइन कर सकें। हम इसे बाद के चरण में करेंगे।

चरण 7: सॉफ्टवेयर और एल्गोरिथम

सॉफ्टवेयर और एल्गोरिथम
सॉफ्टवेयर और एल्गोरिथम

अवलोकन

इस परियोजना के लिए सॉफ्टवेयर सी ++ में लिखा गया है और रोबोट ऑपरेटिंग सिस्टम (आरओएस) के साथ एकीकृत है, जो रोबोटिक्स सॉफ्टवेयर लिखने के लिए एक ढांचा है। आरओएस में, सिस्टम के लिए सॉफ्टवेयर को नोड्स नामक कार्यक्रमों के संग्रह में विभाजित किया जाता है, जहां प्रत्येक नोड सिस्टम की कार्यक्षमता के एक विशिष्ट उपखंड को लागू करता है। डेटा को प्रकाशित/सदस्यता विधि का उपयोग करके नोड्स के बीच पारित किया जाता है, जहां डेटा उत्पन्न करने वाले नोड्स इसे प्रकाशित करते हैं और डेटा का उपभोग करने वाले नोड्स इसकी सदस्यता लेते हैं। कोड को इस तरह से अलग करने से सिस्टम की कार्यक्षमता को आसानी से विस्तारित किया जा सकता है, और त्वरित विकास के लिए सिस्टम के बीच नोड्स को साझा करने की अनुमति देता है।

इस प्रणाली में, आरओएस का उपयोग मुख्य रूप से सर्वो को नियंत्रित करने वाले कोड से ध्वनि स्रोत के आगमन की दिशा (डीओए) की गणना करने वाले कोड को अलग करने के लिए किया जाता है, जिससे अन्य परियोजनाओं को सर्वो कोड को शामिल किए बिना किनेक्ट डीओए अनुमान शामिल करने की अनुमति मिलती है, जिनकी उन्हें आवश्यकता या आवश्यकता नहीं हो सकती है।. यदि आप कोड को ही देखना चाहते हैं, तो इसे GitHub पर पाया जा सकता है:

github.com/raikaDial/kinect_doa

किनेक्ट डीओए नोड

kinect_doa नोड इस प्रणाली का मांस और हड्डियाँ हैं, जो मूल रूप से सब कुछ दिलचस्प करते हैं। स्टार्टअप पर, यह ROS नोड को इनिशियलाइज़ करता है, जिससे सभी ROS मैजिक संभव हो जाते हैं, फिर फर्मवेयर को Kinect पर अपलोड कर देता है ताकि ऑडियो स्ट्रीम उपलब्ध हो सकें। यह तब एक नया थ्रेड बनाता है जो ऑडियो स्ट्रीम खोलता है और माइक्रोफ़ोन डेटा में पढ़ना शुरू करता है। Kinect 16 kHz की आवृत्ति पर अपने चार माइक्रोफ़ोन का नमूना लेती है, इसलिए कम्प्यूटेशनल लोड के कारण लापता डेटा से बचने के लिए अलग-अलग थ्रेड में क्रॉस-सहसंबंध और डेटा संग्रह होना अच्छा है। Kinect के साथ इंटरफेसिंग एक लोकप्रिय ओपन-सोर्स ड्राइवर, libfreenect का उपयोग करके पूरा किया जाता है।

जब भी नया डेटा प्राप्त होता है तो संग्रह थ्रेड कॉलबैक फ़ंक्शन निष्पादित करता है, और दोनों डेटा संग्रहीत करते हैं और निर्धारित करते हैं कि डीओए का अनुमान कब लगाया जाए। प्रत्येक माइक्रोफ़ोन का डेटा हमारी सैंपलिंग विंडो की लंबाई के बराबर रोलिंग बफ़र्स में संग्रहीत किया जाता है, जो यहाँ 8192 नमूने हैं। यह पिछले आधे सेकेंड के डेटा के साथ क्रॉस-सहसंबंध की गणना करने के लिए अनुवाद करता है, जो मैंने प्रयोग के माध्यम से प्रदर्शन और कम्प्यूटेशनल लोड के बीच एक अच्छा संतुलन होने के लिए पाया। मुख्य धागे को संकेत देकर प्रत्येक ४०९६ नमूनों के लिए डीओए अनुमान को ट्रिगर किया जाता है, ताकि लगातार क्रॉस-सहसंबंध ५०% तक ओवरलैप हो जाए। ऐसे मामले पर विचार करें जहां कोई ओवरलैप नहीं है, और आप बहुत तेज़ शोर करते हैं जो नमूना विंडो द्वारा आधे में कट जाता है। आपकी विशिष्ट ध्वनि से पहले और बाद में सफेद शोर होने की संभावना है, जिसे क्रॉस-सहसंबंध के साथ पंक्तिबद्ध करना कठिन हो सकता है। ओवरलैपिंग विंडो हमें ध्वनि का एक अधिक संपूर्ण नमूना प्रदान करती है, जिससे हमें लाइन अप करने के लिए और अधिक विशिष्ट सुविधाएं देकर हमारे क्रॉस-सहसंबंध की विश्वसनीयता बढ़ जाती है।

मुख्य धागा संग्रह धागे से संकेत की प्रतीक्षा करता है, फिर डीओए अनुमान की गणना करता है। सबसे पहले, हालांकि, यह जांचता है कि कैप्चर की गई तरंगें सफेद शोर से काफी अलग हैं या नहीं। इस जांच के बिना, हम अपने अनुमान की गणना एक सेकंड में चार बार करेंगे, भले ही दिलचस्प शोर हो या न हो, और हमारा पुतला सिर एक स्पास्टिक गड़बड़ होगा। इस सिस्टम में इस्तेमाल किया जाने वाला व्हाइट नॉइज़ डिटेक्शन एल्गोरिथम यहां सूचीबद्ध दो में से पहला है। हम अपने तरंग के व्युत्पन्न के पूर्ण अभिन्न के अनुपात को इसके पूर्ण अभिन्न के अनुपात की गणना करते हैं; उच्च श्वेत-शोर सामग्री वाले संकेतों के लिए यह अनुपात कम शोर वाले संकेतों की तुलना में अधिक है। शोर को गैर-शोर से अलग करने वाले इस अनुपात के लिए एक सीमा निर्धारित करके, हम उपयुक्त होने पर ही क्रॉस-सहसंबंध को ट्रिगर कर सकते हैं। बेशक, यह अनुपात कुछ ऐसा है जिसे हर बार सिस्टम को एक नए वातावरण में ले जाने पर फिर से ट्यून करना पड़ता है।

एक बार यह निर्धारित करने के बाद कि तरंगों में महत्वपूर्ण गैर-शोर सामग्री होती है, कार्यक्रम क्रॉस-सहसंबंधों के साथ आगे बढ़ता है। हालांकि इन गणनाओं में तीन महत्वपूर्ण अनुकूलन शामिल हैं:

  1. Kinect पर चार माइक्रोफ़ोन होते हैं, जिसका अर्थ है कि कुल छह वेवफ़ॉर्म जोड़े हैं जिन्हें हम क्रॉस-सहसंबंध कर सकते हैं। हालाँकि, यदि आप माइक्रोफ़ोन सरणी की स्थानिक व्यवस्था को देखते हैं, तो आप देख सकते हैं कि माइक्रोफ़ोन 2, 3 और 4 एक दूसरे के बहुत करीब हैं। वास्तव में, वे इतने करीब हैं कि ध्वनि की गति और हमारी नमूना आवृत्ति के कारण 2, 3, और 4 पर प्राप्त तरंगों को आगे या पीछे एक से अधिक नमूने द्वारा अलग किया जाएगा, जिसे हम गणना के साथ सत्यापित कर सकते हैं maxlag = Δd *fs/vs, जहां Δd माइक्रोफोन जोड़ी का पृथक्करण है, fs नमूना आवृत्ति है, और बनाम ध्वनि की गति है। इस प्रकार, इन तीनों के बीच सहसंबंधी जोड़े बेकार हैं, और हमें केवल माइक्रोफ़ोन 1 को 2, 3, और 4 के साथ क्रॉस-सहसंबंध करने की आवश्यकता है।
  2. ऑडियो संकेतों के मानक क्रॉस-सहसंबंध को पुनर्संयोजन (इकोस) की उपस्थिति में खराब प्रदर्शन करने के लिए जाना जाता है। एक मजबूत विकल्प को चरण परिवर्तन (जीसीसी-पीएचएटी) के साथ सामान्यीकृत क्रॉस-सहसंबंध के रूप में जाना जाता है। यह विधि एक वेटिंग फ़ंक्शन को लागू करने के लिए उबलती है जो क्रॉस-सहसंबंध में चोटियों को बढ़ाती है, जिससे मूल सिग्नल को इकोस से अलग करना आसान हो जाता है। मैंने GCC-PHAT के प्रदर्शन की तुलना एक पुनर्संयोजन कक्ष में साधारण क्रॉस-सहसंबंध से की (पढ़ें: कंक्रीट बाथरूम को फिर से तैयार किया जा रहा है), और GCC-PHAT को सही कोण का अनुमान लगाने में 7 गुना अधिक प्रभावी पाया।
  3. क्रॉस-सहसंबंध करते समय, हम दो सिग्नल ले रहे हैं, एक दूसरे के साथ फिसल रहे हैं, और प्रत्येक चरण में हमारे निश्चित सिग्नल में प्रत्येक बिंदु को हमारे स्लाइडिंग सिग्नल में प्रत्येक बिंदु से गुणा कर रहे हैं। लंबाई n के दो संकेतों के लिए, इसका परिणाम n^2 संगणनाओं में होता है। हम इसके बजाय फ़्रीक्वेंसी डोमेन में क्रॉस-सहसंबंध का प्रदर्शन करके इसे सुधार सकते हैं, जिसमें एक तेज़ फूरियर ट्रांसफ़ॉर्म (nlogn गणना) शामिल है, प्रत्येक बिंदु को एक ट्रांसफ़ॉर्म किए गए सिग्नल में दूसरे (n गणना) में संबंधित बिंदु से गुणा करना, फिर एक उलटा प्रदर्शन करना समय डोमेन (nlogn गणना) पर वापस जाने के लिए फूरियर रूपांतरण, जिसके परिणामस्वरूप n+2*nlogn गणना, n^2 से कम है। हालाँकि, यह भोला दृष्टिकोण है। हमारे सरणी में माइक्रोफ़ोन एक साथ इतने करीब हैं और ध्वनि की गति इतनी धीमी है कि ऑडियो तरंगों को पहले से ही अधिकतर संरेखित किया जाएगा।इस प्रकार, हम अपने क्रॉस-सहसंबंध को केवल उन ऑफसेट पर विचार करने के लिए विंडो कर सकते हैं जो थोड़ा आगे या पीछे हैं। माइक्रोफ़ोन 1 और 4 के लिए, अंतराल +/-12 नमूनों के बीच होना चाहिए, जिसका अर्थ है कि प्रत्येक क्रॉस-सहसंबंध के लिए हमें केवल 24*n गणना करने की आवश्यकता होती है, जिसके परिणामस्वरूप कम्प्यूटेशनल बचत होती है जब हमारे तरंग 2900 नमूनों से अधिक लंबे होते हैं।

यह सिस्टम मिनीडस्प लाइब्रेरी का लाभ उठाता है, जो ऑप्टिमाइज़ेशन 3 के साथ GCC-PHAT एल्गोरिथम को लागू करता है।

एक बार प्रत्येक माइक्रोफ़ोन जोड़ी से संकेतों में अंतराल खोजने के बाद, प्रोग्राम अंतराल के लिए औसत मान चुनता है, अनुमानित कोण की गणना करने के लिए इसका उपयोग करता है, और परिणाम प्रकाशित करता है ताकि इसका उपयोग सर्वो को नियंत्रित करने के लिए किया जा सके।

सर्वो नियंत्रण नोड

Kinect_doa नोड की तुलना में, सर्वो नोड अपेक्षाकृत सरल है। इसका काम केवल अनुमानित डीओए लेना और सर्वो को उस कोण पर ले जाना है। यह रास्पबेरी पाई के हार्डवेयर पीडब्लूएम मॉड्यूल तक पहुंचने के लिए वायरिंगपी लाइब्रेरी का उपयोग करता है, इसका उपयोग सर्वो के कोण को सेट करने के लिए करता है। अधिकांश एनालॉग सर्वो को PWM सिग्नल द्वारा नियंत्रित किया जाता है, जिसकी पल्स चौड़ाई १००० µs से २००० µs तक होती है, जो ०° से १८०° के कोण के अनुरूप होती है, लेकिन मेरे द्वारा उपयोग किए जाने वाले सर्वो को ५०० µs से २५०० µs के साथ नियंत्रित किया जाता था, जो एक कोण के अनुरूप होता है। 0° से 270° तक। इस प्रकार, नोड न्यूनतम पल्स चौड़ाई, अधिकतम पल्स चौड़ाई और अधिकतम और न्यूनतम कोणों के बीच अंतर के लिए पैरामीटर सेट करके विभिन्न सर्वो हार्डवेयर के लिए कॉन्फ़िगर करने योग्य है। इसके अतिरिक्त, सर्वो तुरंत लक्ष्य कोण पर नहीं जाता है, बल्कि एक विन्यास योग्य गति से कोण की ओर बढ़ता है, मार्गरेट को एक अधिक क्रमिक, डरावना खिंचाव देता है (साथ ही, एक सर्वो की आवाज तेजी से आगे और पीछे चलती है वास्तव में परेशान हो जाती है तेज)

चरण 8: निर्माण और स्थापना

निर्भरता स्थापित करें:

सबसे पहले, libfreenect स्थापित करें। हमें इसे स्रोत से बनाना होगा क्योंकि पैकेज प्रबंधक के साथ आप जो संस्करण प्राप्त कर सकते हैं उसमें ऑडियो के लिए समर्थन शामिल नहीं है। ऐसा इसलिए है क्योंकि ऑडियो को सक्षम करने के लिए हमें किनेक्ट पर फर्मवेयर अपलोड करना होगा, और इस फर्मवेयर को पुनर्वितरित करना कुछ न्यायालयों में कानूनी नहीं है। इसके अतिरिक्त, हम उन उदाहरणों के निर्माण से बच सकते हैं जिनमें ओपनजीएल और ग्लूट की आवश्यकता होती है, जो बिना सिर वाले रास्पियन प्रतिष्ठानों के लिए अनावश्यक है।

sudo apt-get install git cmake बिल्ड-एसेंशियल libusb-1.0-0-dev

cd git क्लोन https://github.com/OpenKinect/libfreenect cd libfreenect mkdir cd बिल्ड cmake.. -DCMAKE_BUILD_REDIST_PACKAGE=OFF -DCMAKE_BUILD_EXAMPLES=OFF सुडो मेक इंस्टाल करें sudo cp ~/libfreenect/platform/linux/udev.rules /etc/udev/rules.d udevadm control --reload-rules && udevadm ट्रिगर

इसके बाद, हमें वायरिंगपीआई पैकेज स्थापित करने की आवश्यकता है, जो हमें पीआई के जीपीआईओ पिन को नियंत्रित करने की अनुमति देता है:

सीडी

git क्लोन git://git.drogon.net/wiringPi cd ~/wiringPi./build

पुतला सिर संलग्न करें:

वायरिंग पीआई स्थापित होने के साथ अब हम निचले प्लेटफॉर्म पर पुतला सिर को संलग्न करने के लिए हार्डवेयर-भूमि पर एक त्वरित चक्कर लगा सकते हैं। कमांड लाइन के माध्यम से सर्वो को केन्द्रित करने के लिए, निम्नलिखित कमांड दर्ज करें:

जीपीओ पीडब्लूएम-एमएस

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

यदि कोई गति नहीं है, तो आपका सर्वो शायद पहले से ही केंद्रित है। यह सुनिश्चित करने के लिए, हालांकि, आप सर्वो को गैर-केंद्र मान पर सेट कर सकते हैं, उदा। gpio -g pwm 18 200, फिर इसे वापस 150 पर सेट करें।

एक बार जब आप सुनिश्चित हो जाएं कि सर्वो केंद्रित है, तो हेड प्लेटफॉर्म के सर्वो हॉर्न को सर्वो से इस तरह संलग्न करें कि आपका पुतला सिर सीधे आगे की ओर दिखे। फिर, हॉर्न को सर्वो पर पेंच करें और अपने सिर को वेल्क्रो बिट्स के माध्यम से संलग्न करें।

आरओएस स्थापित करें:

इसके बाद, अपने पाई पर ROS इंस्टॉल करें। एक महान इंस्टॉल गाइड यहां पाया जा सकता है; हमारे सिस्टम के लिए हमें OpenCV की आवश्यकता नहीं है, इसलिए आप चरण 3 को छोड़ सकते हैं। इस निर्माण को पूरा होने में कई घंटे लगेंगे। जब इंस्टाल गाइड का पालन करना समाप्त हो जाए, तो इंस्टॉलेशन को अपने बैशआरसी में जोड़ें ताकि हम अपने नए स्थापित आरओएस पैकेज का उपयोग कर सकें:

इको "सोर्स /ऑप्ट/रोस/काइनेटिक/सेटअप.बैश" >> ~/.bashrc

Kinect DOA पैकेज बनाएँ:

सब कुछ हो जाने के बाद, हमारे प्रोजेक्ट के लिए एक कैटकिन वर्कस्पेस बनाएं और src डायरेक्टरी दर्ज करें:

mkdir -p ~/kinect_doa_ws/src

सीडी ~/kinect_doa_ws/src

इस प्रोजेक्ट के लिए कोड kinect_doa पैकेज में निहित है, इसलिए इसे अपने नए कार्यक्षेत्र की src निर्देशिका में क्लोन करें:

गिट क्लोन

रोबोट_अपस्टार्ट पैकेज लॉन्च फ़ाइलों को स्थापित करने के लिए उपयोग में आसान टूल प्रदान करता है ताकि वे स्टार्टअप पर चले, इसलिए इसे अपने कार्यक्षेत्र में भी क्लोन करें:

गिट क्लोन

अब, हम अपने कार्यक्षेत्र के शीर्ष स्तर की निर्देशिका से catkin_make को कॉल करके प्रोजेक्ट कोड बना सकते हैं, फिर हमारे बिल्ड को सोर्स करें ताकि हमारे पैकेज उपलब्ध हों:

सीडी ~/kinect_doa_ws

catkin_make गूंज "स्रोत /होम/पीआई/kinect_doa_ws/devel/setup.bash" >> ~/.bashrc

चल रहा है और ट्यूनिंग:

यह मानते हुए कि सब कुछ प्लग इन और चालू है, अब आपको सिस्टम लॉन्च करने में सक्षम होना चाहिए और किनेक्ट ट्रैक आपको आवाज देता है! हालाँकि, यदि आपके पास Kinect 1473 है, तो पहले फ़ाइल ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch को टेक्स्ट एडिटर में खोलें और उपयोग_kinect_1473 को true पर पैरामीटर सेट करें। इसके अतिरिक्त, यदि आपने मेरे द्वारा किए गए किसी भिन्न सर्वो का उपयोग किया है, तो यह संभवतः एक मानक एनालॉग सर्वो है, इसलिए लॉन्च फ़ाइल में, पैरामीटर 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: इसे कार्यालय में छिपाना

इसे कार्यालय में छिपाना
इसे कार्यालय में छिपाना

अब मज़ेदार हिस्से के लिए। घंटों के बाद काम पर जाएं और अपने पुतले के सिर को गुप्त रूप से सेट करें। फिर बस वापस बैठें और देखें कि आपके सहकर्मियों को पकड़ने में कितना समय लगता है! आप नई रचना कर रहे हैं, कुछ सिर मुड़ने की गारंटी है …

सिफारिश की: