תוכן עניינים:

צליל לוקליזציה של ראש בובה עם Kinect: 9 שלבים (עם תמונות)
צליל לוקליזציה של ראש בובה עם Kinect: 9 שלבים (עם תמונות)

וִידֵאוֹ: צליל לוקליזציה של ראש בובה עם Kinect: 9 שלבים (עם תמונות)

וִידֵאוֹ: צליל לוקליזציה של ראש בובה עם Kinect: 9 שלבים (עם תמונות)
וִידֵאוֹ: כְּאֵב רֹאשׁ. תרגילים מסוכנים ובטוחים 2024, יולי
Anonim
צליל לוקליזציה ראש בובה עם Kinect
צליל לוקליזציה ראש בובה עם Kinect

הכירו את מרגרט, בובת בדיקה למערכת ניטור עייפות בנהגים. לאחרונה פרשה מתפקידיה ומצאה את דרכה לחלל המשרד שלנו, ומאז משכה את תשומת ליבם של אלה שחושבים שהיא 'מצמררת'. למען הצדק, נתתי לה את היכולת להתמודד עם האשמות שלה בחבטה; במקום לכאורה לעקוב אחריך במבטה חסר נשמה, עכשיו היא בעצם עושה זאת. המערכת משתמשת במערך המיקרופונים של Microsoft Kinect ובסרוו כדי לכוון אותה לכיוון שאנשים מדברים בקרבתה.

שלב 1: תיאוריה

תֵאוֹרִיָה
תֵאוֹרִיָה

חישוב הזווית

כאשר אנו שומעים משהו, אלא אם כן הרעש הזה נמצא מולנו הוא מגיע לאוזן אחת לפני השניה. המוח שלנו תופס את עיכוב ההגעה הזה והופך אותו לכיוון כללי שממנו מגיע רעש, ומאפשר לנו למצוא את המקור. אנו יכולים להשיג את אותו סוג לוקליזציה בדיוק באמצעות זוג מיקרופונים. שקול את התרשים המוצג, המכיל זוג מיקרופונים ומקור צליל. אם אנו מסתכלים מלמעלה למטה, גלי הקול מעגליים, אך אם המרחק למקור גדול ביחס למרווח בין המיקרופונים, אז מנקודת המבט של החיישנים שלנו הגל מישורי בערך. זה ידוע בשם הנחת השדה הרחוק ומפשט את הגיאומטריה של הבעיה שלנו.

אז נניח שחזית הגל היא קו ישר. אם הצליל מגיע מימין, הוא יפגע במיקרופון 2 בזמן t2 ובמיקרופון #1 בזמן t1. המרחק d שהצליל עבר בין פגיעה במיקרופון מס '2 למיקרופון מס' 1 הוא הפרש הזמן באיתור הצליל כפול מהירות הקול:

d = v s *(t1-t2) = לעומת *Δ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
  • θ = asin (לעומת*Δt/d12), -π/2 <= θ <= π/2

מציאת העיכוב

כפי שאתה יכול לראות מהמשוואה למעלה, כל שעלינו לפתור לזווית הוא העיכוב בגל הקול המגיע למיקרופון הראשון בהשוואה למיקרופון השני; מהירות הקול והמרחק בין המיקרופונים קבועים וידועים כאחד. כדי להשיג זאת, אנו מדגימים תחילה את אותות השמע בתדר fs, ממירים אותם מאנלוגי לדיגיטלי ושומרים את הנתונים לשימוש מאוחר יותר. אנו מדגמים לפרק זמן המכונה חלון דגימה, שאורכו ארוך מספיק כדי ללכוד תכונות מובחנות של גל הקול שלנו. לדוגמה, החלון שלנו עשוי להיות נתוני שמע בשווי של חצי השניה האחרונה.

לאחר קבלת אותות השמע החלוניים, אנו מוצאים את העיכוב בין השניים על ידי חישוב המתאם החוצה שלהם. כדי לחשב את המתאם הצולב, אנו מחזיקים את האות החלון ממיקרופון אחד קבוע, ומחליקים את האות השני לאורך ציר הזמן מכל הדרך מאחורי הראשון עד כל הדרך לפני הראשון. בכל שלב לאורך השקופית שלנו אנו מכפילים כל נקודה באות הקבוע שלנו בנקודה המתאימה באות הזזה שלנו, ואז מסכמים את כל התוצאות לחישוב מקדם המתאם שלנו לשלב זה. לאחר השלמת השקופית, השלב בעל מקדם המתאם הגבוה ביותר תואם את הנקודה שבה שני האותות דומים ביותר, ובאיזה שלב אנו מספרים לנו כמה דוגמאות n אות שתיים מקוזזות מהאות 1. אם n הוא שלילי, אז האות שתיים מפגר מאחורי האות הראשון, אם הוא חיובי אז האות שתיים לפניו, ואם הוא אפס, השניים כבר מיושרים. אנו ממירים קיזוז מדגם זה לעיכוב בזמן באמצעות תדר הדגימה שלנו עם היחס Δt = n/fs, ובכך:

θ = asin (לעומת*n/(d12*fs)), -π/2 <= θ <= π/2

שלב 2: רכיבים

חלקים

  • Microsoft Kinect ל- Xbox 360, דגם 1414 או 1473. ל- Kinect ארבעה מיקרופונים מסודרים במערך לינארי בו נשתמש.
  • מתאם להמרת המחבר הקנייני של Kinect לכוח USB + AC כמו זה.
  • Raspberry Pi 2 או 3 פועל Raspbian Stretch. במקור ניסיתי להשתמש ב- Pi 1 דגם B+, אך הוא לא היה מספיק חזק. כל הזמן נתקלתי בבעיות בהתנתקות מה- Kinect.
  • ראש הבובה המפחיד ביותר שתוכל למצוא
  • סרוו אנלוגי חזק מספיק כדי להפוך את ראש הבובה שלך
  • מטען קיר 5V USB עם מספיק אמפר בכדי להפעיל גם את הפי וגם את הסרוו ולפחות שתי יציאות. (השתמשתי בתקע 5A בעל 3 יציאות הדומה לזה
  • כבל מאריך עם שני שקעים (האחד למטען קיר USB והשני למתאם AC Kinect.
  • שני כבלי USB: כבל מסוג A למיקרו- USB להפעלת ה- Pi ועוד אחד כדי להפעיל את הסרוו שלא אכפת לך לחתוך
  • פלטפורמה להכל לשבת ועוד פלטפורמה קטנה יותר לראש הבובה. השתמשתי במגש הגשה מפלסטיק כבסיס ובצלחת פלסטיק כפלטפורמת הראש. שניהם היו מוולמארט ועלו רק כמה דולרים
  • 4x #8-32 ברגים ואומים 1/2 "לחיבור הסרוו לרציף הגדול יותר
  • 2x בורג 8 מ"מ M3 עם מכונות כביסה (או בכל גודל שאתה צריך כדי לחבר את קרן הסרוו שלך לרציף הקטן יותר)
  • שני חוטי מגשר בין זכר לזכר, אחד אדום ואחד שחור, וחוט מגשר בין נקבה לגבר
  • רצועות סקוטש מגובות בדבק
  • קלטת חשמל
  • סרט דביק לניהול כבלים

כלים

  • דרמל עם גלגל חיתוך
  • תרגיל
  • מקדחי 7/64 ", 11/16" ו- 5/16"
  • ברז M3 (אופציונלי, תלוי בקרן הסרוו שלך)
  • מברג
  • מגהץ עם הלחמה
  • ידיים עוזרות (לא חובה)
  • סַמָן
  • מצפן
  • חשפניות חוטים
  • מולטימטר (אופציונלי)

PPE

  • משקפי בטיחות

  • מסכת פנים (לחתיכות פלסטיק בעלות דרמלים).

שלב 3: הרכבת הפלטפורמה התחתונה

מכלול פלטפורמה תחתונה
מכלול פלטפורמה תחתונה
מכלול פלטפורמה תחתונה
מכלול פלטפורמה תחתונה
מכלול פלטפורמה תחתונה
מכלול פלטפורמה תחתונה

החלק הראשון שנעשה הוא הפלטפורמה התחתונה, שתכיל את הקינקט, הסרוו וכל האלקטרוניקה שלנו. כדי ליצור את הפלטפורמה תצטרך:

  • מגש הגשה מפלסטיק
  • סרוו
  • ברגים 4x #8-32 1/2 "עם אגוזים
  • דרמל עם גלגל חיתוך
  • מברג
  • תרגיל
  • 11/16 "מקדחה
  • סַמָן

איך להכין

  1. הפוך את המגש הפוך.
  2. הנח את סרווך הצידה בחלק האחורי של המגש, וודא כי ציוד הפלט של הסרוו מונח לאורך הקו המרכזי של המגש, ולאחר מכן סמן מסביב לבסיס הסרוו.
  3. חותכים את האזור שסימנתם בעזרת הדרמל והגלגל החיתוך ואז מחליקים את הסרוו לתוך החריץ שלו.
  4. סמנו את מרכזי חורי ההרכבה של בית הסרוו במגש, ולאחר מכן הסירו את הסרוו וקדחו את החורים בעזרת המקדח בגודל 11/16 אינץ '. קל מאוד לפצח פלסטיק דק כזה בעת קידוח חורים, כך שזה נראה לי הרבה יותר בטוח. להריץ את המקדח לאחור ולהלבין לאט את החומר. זה הרבה יותר איטי מאשר לקדוח את החורים כמו שצריך אבל זה מבטיח שלא יהיו סדקים.
  5. הנח את סרווך בחזרה בחריץ ולאחר מכן הרכיב אותו למגש עם הברגים והאומים #8-32.

שלב 4: הרכבת פלטפורמת ראש

מכלול פלטפורמת ראש
מכלול פלטפורמת ראש
מכלול פלטפורמת ראש
מכלול פלטפורמת ראש
מכלול פלטפורמת ראש
מכלול פלטפורמת ראש
מכלול פלטפורמת ראש
מכלול פלטפורמת ראש

החלק הבא שנעשה יהיה פלטפורמה לחיבור ראש הבובה לסרוו. כדי להפוך את פלטפורמת הראש תצטרך:

  • צלחת פלסטיק
  • קרן סרוו
  • בריח 2x M3 8 מ"מ עם מכונות כביסה
  • מברג
  • תרגיל
  • מקדחי 7/64 "ו- 5/16"
  • מצפן
  • דרמל עם גלגל חיתוך

איך להכין

  1. הגדר את המצפן שלך לרדיוס של בסיס ראש הבובה שלך.
  2. השתמש במצפן כדי לסמן עיגול שבמרכזו במרכז הצלחת. זה יהיה הגודל האמיתי של פלטפורמת הראש שלנו.
  3. השתמש בדרמל ובגלגל החיתוך שלך כדי לחתוך את הפלטפורמה הקטנה יותר מהצלחת.
  4. קדח את מרכז הפלטפורמה החדשה שלך בעזרת מקדח בגודל 5/16 אינץ '. זה ייתן לנו גישה לבורג המחבר את קרן הסרוו שלנו לסרוו שלנו. כדי לתת לרציף יציבות בזמן שקידחתי את החור, הנחתי סליל של חוט מתחתיו ונקדח דרך מרכז הסליל.
  5. יישר את קרן הסרוו שלך במרכז הפלטפורמה וסמן שני חורים לחיבור הצופר לרציף. וודא שחורי ההרכבה האלה רחוקים זה מזה, כך שיהיה מקום לראשי הבורג ולמכניסות M3 שלך.
  6. קדחו את החורים המסומנים האלה בעזרת מקדח 7/64 אינץ '.
  7. החור התחתון של קרן הסרוו שלי היה חלק, כלומר לא היו לו החוטים לבורג M3. לפיכך, השתמשתי במקדח ובברז M3 ליצירת החוטים.
  8. השתמש בברגים ובמדיחי הכביסה כדי להצמיד את קרן הסרוו לרציף הראש.

שלב 5: כבל חשמל סרוו

כבל חשמל סרוו
כבל חשמל סרוו
כבל חשמל סרוו
כבל חשמל סרוו
כבל חשמל סרוו
כבל חשמל סרוו
כבל חשמל סרוו
כבל חשמל סרוו

סרוויים אנלוגיים מופעלים בדרך כלל עם 4.8-6V. מכיוון ש- Raspberry Pi כבר יופעל על ידי 5V מ- USB, נפשט את המערכת שלנו על ידי הפעלת סרוו גם מ- USB. לשם כך נצטרך לשנות כבל USB. כדי לייצר את כבל החשמל של סרוו תצטרך:

  • כבל USB נוסף עם קצה מסוג A (מהסוג שמחובר למחשב שלך)
  • חוט מגשר אחד אדום ושחור
  • מלחם
  • לְרַתֵך
  • חשפניות חוטים
  • קלטת חשמל
  • ידיים עוזרות (לא חובה)
  • מולטימטר (אופציונלי)

איך להכין

  1. חתכו את המחבר שאינו מסוג USB מסוג A מהכבל שלכם, ואז הסירו מעט מהבידוד כדי לחשוף את ארבעת החוטים הפנימיים. חותכים את הסיכוך המקיף את החוטים החשופים.
  2. בדרך כלל לכבל ה- USB יהיו ארבעה חוטים: שניים להעברת נתונים וקליטה ושניים לחשמל ולקרקע. אנו מתעניינים בכוח ובאדמה, שהם בדרך כלל אדומים ושחורים, בהתאמה. הפשיטו חלק מהבידוד מהחוטים האדומים והשחורים וחתכו את החוטים הירוקים והלבנים. אם אתה חושש שאין לך את כבלי החשמל והארקה הנכונים, תוכל לחבר את הכבל למתאם החשמל USB ולבדוק את מתח היציאה באמצעות מודד.
  3. לאחר מכן, חתוך קצה אחד מכבלי המגשר האדומים והשחורים שלך והסר חלק מהבידוד.
  4. כעת, סובב יחד את החוטים השחורים החשופים של המגשר וכבלי ה- USB שלך. חצו את מרכזי החוטים החשופים וסובבו אותם זה סביב זה. לאחר מכן, החילו הלחמה על החוטים המשודכים כדי להחזיק אותם יחד. עזרה בידיים תקל על כך על ידי החזקת הכבלים במקומם.
  5. חזור על שלב 4 עבור החוטים האדומים.
  6. כסה את החיווט החשוף בעזרת סרט חשמלי או צינורות כיווץ חום אם אתה מרגיש מפואר. המפרקים הללו יהיו שבירים מכיוון שהחוטים כה קטנים, לכן הוסיפו שכבה נוספת של סרט המחזיק את כבלי המגשר לבידוד החיצוני של כבל ה- USB. זה יהפוך את ההרכבה לנוקשה יותר ובכך פחות סיכוי להישבר מהכפפה.

שלב 6: הרכבה אלקטרוניקה

הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה
הרכבה אלקטרוניקה

לבסוף, נביא את הכל יחד, ונרכיב את האלקטרוניקה שלנו וכל השאר לפלטפורמה התחתונה. אתה תצטרך:

  • פלטפורמה תחתונה
  • פלטפורמת ראש
  • ראש בובה
  • Kinect עם מתאם USB+AC
  • מתאם מתח USB
  • חוט מאריך
  • כבל מיקרו USB
  • כבל חשמל סרוו
  • פאי פטל
  • כבל מגשר זכר לנקבה
  • סקוטש דבק
  • מספריים

איך להכין

  1. הרכיבו את הפי לחלק התחתון של המגש בעזרת סקוטש.
  2. חבר את מתאם החשמל USB באמצעות סקוטש.
  3. חבר סרוו ופי למתאם החשמל USB.
  4. חבר את פין 12 (GPIO18) של ה- Pi לכבל האות של הסרוו. זהו הסיכה השישית למטה מימין.
  5. נחש את כבל המאריך שלך באמצעות הידית האחורית של המגש וחבר את מתאם החשמל USB לצד אחד.
  6. קח את מתאם ה- USB+AC של Kinect וחבר את מתאם המתח לצד השני של כבל המאריך ואת ה- USB ל- Pi.
  7. נחמד את כבל הקינקט דרך הידית הקדמית של המגש וחבר למתאם Kinect.
  8. השתמשתי בדבק כדי להחזיק את הכבלים בחלק התחתון של הרציף. זה לא נראה הכי אלגנטי, אבל למרבה המזל כל זה מוסתר.
  9. הפוך את הרציף כלפי מעלה והפעל בעזרת הוולקרו את הקינקט לחזית הרציף.
  10. השתמש בוולקרו כדי להרכיב את ראש הבובה לרציף הראש. אך לאחר שהכל מסודר, הפרידו את שתי החלקים כדי שנוכל לגשת לבורג ההרכבה של קרן הסרו. עם זאת, אל תברג את הקרן לסרוו, מכיוון שעלינו לוודא שהשרוו נמצא במיקומו המרכזי תחילה, כך שנוכל לסדר הכל. נעשה זאת בשלב מאוחר יותר.

שלב 7: תוכנה ואלגוריתם

תוכנה ואלגוריתם
תוכנה ואלגוריתם

סקירה כללית

התוכנה לפרויקט זה כתובה ב- C ++ ומשולבת עם מערכת הפעלה רובוטית (ROS), מסגרת לכתיבת תוכנות רובוטיקה. ב- ROS התוכנה למערכת מחולקת לאוסף של תוכניות הנקראות צמתים, כאשר כל צומת מיישם תת -חלק ספציפי של פונקציונליות המערכת. הנתונים מועברים בין צמתים בשיטת פרסום/הרשמה, כאשר צמתים המייצרים את הנתונים מפרסמים אותם וצמתים הצורכים את הנתונים נרשמים אליהם. ניתוק הקוד בצורה זו מאפשר להרחיב את פונקציונליות המערכת בקלות, ומאפשר לחלק צמתים בין מערכות לפיתוח מהיר יותר.

במערכת זו, ROS משמשת בעיקר להפרדת הקוד המחושב את כיוון ההגעה (DOA) של מקור הקול מהקוד השולט בסרוו, ומאפשרת לפרויקטים אחרים לכלול את הערכת Kinect DOA מבלי לכלול קוד סרוו שאולי הם לא צריכים או ירצו. אם ברצונך להסתכל על הקוד עצמו, ניתן למצוא אותו ב- GitHub:

github.com/raikaDial/kinect_doa

צומת Kinect DOA

הצומת kinect_doa הוא הבשר והעצמות של מערכת זו, שעושה בעצם כל דבר מעניין. עם ההפעלה, הוא מאתחל את צומת ROS, מה שהופך את כל הקסם של ROS לאפשרי, ואז מעלה קושחה ל- 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.

לאחר מציאת הפיגור באותות מכל זוג מיקרופונים, התוכנית בוחרת את הערך החציוני של השהיה, משתמשת בו לחישוב הזווית המשוערת ומפרסמת את התוצאה כך שניתן להשתמש בה לשליטה בסרוו.

צומת בקרת סרוו

בהשוואה לצומת kinect_doa, צומת הסרווו פשוטה יחסית. תפקידו לקחת אך ורק את ה- DOA המשוער ולהעביר את הסרוו לזווית זו. הוא משתמש בספריית wiringPi כדי לגשת למודול PWM החומרה של ה- Raspberry Pi, באמצעותו כדי להגדיר את זווית הסרוו. רוב הסרבים האנלוגיים נשלטים על ידי אות PWM עם רוחב דופק הנע בין 1000 µs ל- 2000 µs, המתאים לזווית של 0 ° עד 180 °, אך הסרוו בו השתמשתי נשלט עם 500 µs עד 2500 µs, המתאים לזווית של 0 ° עד 270 °. לפיכך, ניתן להגדיר את הצומת עבור חומרת סרוו שונה על ידי הגדרת פרמטרים לרוחב הדופק המינימלי, לרוחב הדופק המרבי ולהפרש בין הזוויות המקסימליות למינימום. בנוסף, סרוו לא זז מיד לזווית המטרה, אלא נע לכיוון הזווית במהירות הניתנת להגדרה, ומעניק למרגרט אווירה הדרגתית ומפחידה יותר (בנוסף, צליל סרוו הנע במהירות הלוך ושוב הופך לעצבן ממש מהר).

שלב 8: בנייה והתקנה

התקן תלות:

ראשית, התקן את libfreenect. עלינו לבנות אותו מהמקור מכיוון שהגרסה שתוכל לקבל באמצעות מנהל החבילות אינה כוללת תמיכה באודיו. הסיבה לכך היא שעלינו להעלות קושחה ל- Kinect כדי לאפשר אודיו, והפצת הקושחה הזו אינה חוקית בתחומי שיפוט מסוימים. בנוסף, אנו יכולים להימנע מבניית הדוגמאות הדורשות OpenGL ו- glut, מיותרות עבור התקנות Raspbian ללא ראש.

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

שיבוט cd git https://github.com/OpenKinect/libfreenect cd libfreenect mkdir build cd build cmake.. -DCMAKE_BUILD_REDIST_PACKAGE = OFF -DCMAKE_BUILD_EXAMPLES = כבוי להפוך את sudo להתקין sudo cp ~/libfreenect/platform/linux/udev/51 -kinv.rules /etc/udev/rules.d שליטה udevadm-טעינה מחדש של כללים && udevadm

לאחר מכן, עלינו להתקין את חבילת wiringPi, המאפשרת לנו לשלוט בסיכות ה- GPIO של ה- Pi:

CD

שיבוט git 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.

ברגע שאתה בטוח שהשרוו במרכז, חבר את קרן הסרווו של פלטפורמת הראש לסרוו כך שראש הבובה שלך יסתכל ישר קדימה. לאחר מכן, הברג את הצופר על הסרוו והצמד את ראשך באמצעות פיסות הוולקרו.

התקן את ROS:

לאחר מכן, התקן את ROS ב- Pi שלך. ניתן למצוא מדריך התקנה נהדר; עבור המערכת שלנו אנו לא זקוקים ל- OpenCV, כך שתוכל לדלג על שלב 3. הבנייה תימשך מספר שעות. כשתסיים לעקוב אחר מדריך ההתקנה, הוסף את מקור ההתקנה ל- bashrc שלך כך שנוכל להשתמש בחבילות ה- ROS החדשות שלנו:

הד "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

חבילת robot_upstart מספקת כלי קל לשימוש להתקנת קבצי השקה כך שיפעלו בעת ההפעלה, לכן גם שיבוט זאת לתוך סביבת העבודה שלך:

שיבוט git

כעת, אנו יכולים לבנות את קוד הפרויקט על ידי התקשרות ל catkin_make מספריית הרמה העליונה של סביבת העבודה שלנו, ולאחר מכן המקור את המבנה שלנו כך שהחבילות שלנו יהיו זמינות:

cd ~/kinect_doa_ws

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

ריצה וכוונון:

בהנחה שהכל מחובר ומופעל, כעת אתה אמור להיות מסוגל להפעיל את המערכת ולהשאיר את מסלול הקינקט שאתה משמיע! עם זאת, אם יש לך Kinect 1473, פתח תחילה את הקובץ ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch בעורך טקסט והגדר את הפרמטר using_kinect_1473 ל- true. בנוסף, אם השתמשת בסרוו שונה ממה שעשיתי זה כנראה סרוו אנלוגי סטנדרטי, כך שבקובץ ההשקה, שנה את הפרמטר 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 -root root --symlink

אנו יוצרים סימנק לקובץ ההשקה במקום להעתיק אותו כדי שנוכל לשנות פרמטרים על ידי עריכת ~/kinect_doa_ws/src/kinect_doa/launch/kinect_doa.launch.

שלב 9: הסתרתו במשרד

מסתיר את זה במשרד
מסתיר את זה במשרד

עכשיו לחלק המהנה. צא לעבודה אחרי שעות והרם את ראש הבובה שלך בסתר. אז פשוט תשען לאחור ותראה כמה זמן לוקח לעמיתים שלך להתגבר! מובטח שהיצירה החדשה שלך תסובב כמה ראשים …

מוּמלָץ: