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

וולטס אוטונומי רובוט - חלק 4 - הוסף חיישני מרחק IR וחיישני "אמפר": 6 שלבים
וולטס אוטונומי רובוט - חלק 4 - הוסף חיישני מרחק IR וחיישני "אמפר": 6 שלבים

וִידֵאוֹ: וולטס אוטונומי רובוט - חלק 4 - הוסף חיישני מרחק IR וחיישני "אמפר": 6 שלבים

וִידֵאוֹ: וולטס אוטונומי רובוט - חלק 4 - הוסף חיישני מרחק IR וחיישני
וִידֵאוֹ: חלק 2- מסביב לעולם 🌍, ״אולסטאר וגופיות״😉 2024, יולי
Anonim
Image
Image
הוסף מעגל תומך (MCP3008)
הוסף מעגל תומך (MCP3008)

שלום, היום אנו מתחילים את השלב הבא של שיפור היכולות של וואלאס. באופן ספציפי, אנו מנסים לשפר את יכולתו לזהות ולהימנע ממכשולים באמצעות חיישני מרחק אינפרא אדום, וגם לנצל את יכולתו של בקר המנוע של רובוקלאו לפקח על הזרם ולהפוך אותו ל"חיישן "וירטואלי (תוכנה). לבסוף, נסתכל על אופן הניווט ללא SLAM (מיקום סימולטני ומיפוי) (לעת עתה), מכיוון שלרובוט אין עדיין חיישני IMU (יחידת מדידת אינרציה) או ToF (זמן טיסה).

בניווט, בתחילה יהיו אלה רק שתי מטרות עיקריות:

  1. להימנע ממכשולים
  2. לזהות מתי הוא תקוע איפשהו ולא מתקדם. ("התקדמות" פירושה האם התקדמה כל מרחק משמעותי)
  3. מטרה שלישית אפשרית יכולה להיות שהיא תנסה להתיישר ממש לקיר.

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

השלב השני היה הוספת מעגלים תומכים מספיק כדי להתכונן להוספת חיישנים רבים.

ב- Instructable הקודם, אכן הוספנו מספר חיישנים אקוסטיים HCSR04 והרובוט יכול כעת להימנע ממכשולים כשהוא מסתובב בדירה.

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

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

(עדכון: למעשה, נכון לעכשיו, ניטור זרם הוא תוכנית א 'בעת נסיעה לאחור מכיוון שהסרתי וחיישנים מאחור).

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

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

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

לבסוף, הוא מנצל את ההיסטוריה של 100 המהלכים האחרונים, וכמה ניתוחים בסיסיים כדי לענות על שאלה אחת:

"האם לאחרונה הייתה התקדמות אמיתית קדימה (או שהיא תקועה בריקוד חוזר כלשהו)?"

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

המטרה היחידה המתוכנתת של גרסה זו של התוכנה הייתה לנסות להתקדם קדימה קדימה ולנסות להימנע ממכשולים.

שלב 1: הוסף מעגל תומך (MCP3008)

הוסף מעגל תומך (MCP3008)
הוסף מעגל תומך (MCP3008)
הוסף מעגל תומך (MCP3008)
הוסף מעגל תומך (MCP3008)
הוסף מעגל תומך (MCP3008)
הוסף מעגל תומך (MCP3008)

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

נוסיף ממיר אנלוגי לדיגיטלי MCP3008. ישנם משאבים מקוונים רבים כיצד לחבר שבב זה ל- Raspberry Pi, כך שלא אכנס לכך רבות.

בעיקרו של דבר, יש לנו ברירה. אם גרסת חיישני ה- IR פועלת ב -3 וולט, כך יכול גם MCP3008, ואז נוכל להתחבר ישירות לפטל.

[חיישן IR 3V] - [MCP3008] - [Raspberrry Pi]

במקרה שלי, עם זאת, אני מפעיל בעיקר 5V, כך שזה אומר מחלף רמה דו כיווני.

[חיישן IR 5V]-[MCP3008]-[אוטובוס דו כיווני 5V עד 3V]-[פטל פטל]

הערה: יש פלט אות אחד בלבד מחיישן ה- IR. הוא עובר ישירות לאחד מקווי האות האנלוגיים של קלט ה- MCP3008. מ- MCP3008, ישנם 4 קווי נתונים שעלינו לחבר (באמצעות האוטובוס הדו-כיווני) ל- Raspberry Pi.

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

שלב 2: הר חיישני IR

הר חיישני IR
הר חיישני IR
הר חיישני IR
הר חיישני IR
הר חיישני IR
הר חיישני IR
הר חיישני IR
הר חיישני IR

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

(עדכון: עם זאת, זה אולי לא משנה, מכיוון שנראה שחיישן אלה מתבלבלים מתאורת הסביבה הפנימית. אני עדיין בוחן את הנושא)

ישנן שלוש דרכים לפחות להתקין חיישנים אלה על הרובוט.

  1. הניחו אותם במיקום קבוע, בחזית, פונים מעט זה מזה.
  2. הניחו אותם על סרוו, בחזית, פונים מעט זה מזה.
  3. מקם אותם במיקום קבוע, בחזית, אך בפינות השמאליות והימניות ביותר, בזווית זו לזו.

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

עם בחירה מספר 1, ככל שהחיישנים מזויקים זה מזה, כך נקודה עיוורת יותר במרכז.

יכולנו לעשות מס '2, (הוספתי כמה תמונות עם סרוו כאפשרות) ולגרום להם לבצע סריקה, וברור שזה יכול לכסות את האזור הגדול ביותר. עם זאת, אני רוצה לעכב את השימוש בסרוו ככל שניתן, משתי סיבות לפחות:

  • נשתמש באחד מערוצי התקשורת PWM ב- Raspberry Pi. (אפשר לשפר את זה אבל עדיין …)
  • התיקו הנוכחי עם סרוו יכול להיות משמעותי
  • זה מוסיף יותר לחומרה ותוכנה

ברצוני להשאיר את אופציית הסרווו מאוחר יותר בעת הוספת חיישנים חשובים יותר, כגון Time-of-Flight (ToF), או אולי מצלמה.

יש יתרון אפשרי נוסף עם בחירה מס '2 שאינו זמין בשתי האפשרויות האחרות. חיישני IR אלה יכולים להתבלבל, בהתאם לתאורה. יכול להיות שהרובוט מקבל קריאה של אובייקט שקרוב באופן מיידי כאשר למעשה אין אובייקט קרוב. עם בחירה מס '3, מכיוון שהשדות שלהם יכולים לחפוף, שני החיישנים יכולים לרשום את אותו אובייקט (מזוויות שונות).

אז אנחנו הולכים עם בחירת מיקום מס '3.

שלב 3: זמן לבדיקה

Image
Image

לאחר שביצענו את כל החיבורים בין ה- Raspberry Pi, MCP3008 ADC וחיישני ה- IR Sharp, הגיע הזמן לבדוק. רק בדיקה פשוטה לוודא שהמערכת עובדת עם החיישנים החדשים.

כמו בהוראות הקודמות, אני משתמש כמה שיותר בספריית wiringPi C. מקל על העניינים. משהו שאינו ברור במיוחד מביקורת אתר wiringPi, הוא שיש תמיכה ישירה ב- MCP3004/3008.

אפילו בלי זה, אתה יכול פשוט להשתמש בתוסף SPI. אבל אין צורך. אם תסתכל מקרוב על מאגר git של גורדון עבור wiringPi, תתקל ברשימה של שבבים נתמכים, מתוכם אחד עבור MCP3004/3008.

החלטתי לצרף את הקוד כקובץ מכיוון שלא הצלחתי להציג אותו בצורה תקינה בדף זה.

שלב 4: חיישן וירטואלי - AmpSensor

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

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

נוכל לעטוף את שיחת השאילתה הזו לבקר המנוע למחלקה C ++ ולקרוא לה AmpSensor.

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

אם נוסיף גמישות מסוימת לתוכנה (ארגוני שורת פקודה ו / או קלט מקלדת במהלך הפעולה), נוכל להגדיל / להקטין את סף ה"קריטי-אמפר "תוך כדי ניסוי על ידי מתן הרובוט לנוע ולהיתקל באובייקטים, שניהם ישר פנימה, או תוך כדי סיבוב.

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

שלב 5: ניווט

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

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

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

בחרתי בכוונה לא להשתמש בבקר מיקרו כגון Arduino כי א) אני לא אוהב את הסביבה psuedo-C ++, ב) וכי פיתוח רב מדי ישחק את זיכרון הקריאה-כתיבה (?), וכי אני צריך מחשב מארח כדי לפתח (?). או שאולי אני פשוט קורה כמו ה- Raspberry Pi.

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

גישה זו נראתה מסובכת ועם לא הרבה תועלת, כאשר נוכל להשתמש בחיישני ToF (זמן טיסה) טובים יותר (מאוחר יותר) למטרה זו (SLAM).

אחת הגישות בהן אנו יכולים להשתמש היא לעקוב אחר מעקב אחר אילו פקודות תנועה הונפקו בתוך X השניות האחרונות או הפקודות.

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

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

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

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

אני יכול לחשוב על שתי דרכים בסיסיות (בסיסיות) לשימוש בהיסטוריה התנועתית.

  • עבור מספר המהלכים X האחרונים, האם הם תואמים לפטר Y. דוגמא פשוטה יכולה להיות (וזה קרה) "קדימה, היפוך, קדימה, הפוך, …". אז יש את פונקציית ההתאמה הזו שמחזירה TRUE (נמצא תבנית) או FALSE (לא נמצאה). אם TRUE, בחלק הניווט של התוכנית, נסה רצפי תנועה אחרים.
  • עבור מספר המהלכים X האחרונים, האם יש תנועה כללית או נטו קדימה. כיצד ניתן לקבוע מהי תנועת קדימה אמיתית? ובכן.. השוואה קלה אחת היא שבמהלכי ה- X האחרונים, "קדימה" מתרחשת יותר מ"הפוך ". אבל זה לא חייב להיות היחיד. מה עם זה: "ימין, ימין, שמאל, ימין". במקרה זה, הרובוט צריך לבצע פניות ימינה כדי לצאת מהפינה או מכיוון שהתקרב לקיר בזווית, זה יכול להיחשב כהתקדמות אמיתית קדימה. מצד שני, "שמאל, ימינה, שמאל, ימינה …" אולי לא ייחשב להתקדמות אמיתית קדימה. לפיכך, אם "ימין" מתרחש יותר מ"שמאל ", או" שמאל מתרחש יותר מ"ימין ", אז זו יכולה להיות התקדמות של ממש.

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

שלב 6: מחשבות אחרונות, השלב הבא …

מקווה שהמדריך הזה נתן כמה רעיונות.

הוספת חיישנים נוספים מציגה כמה יתרונות ואתגרים.

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

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

ולכן האתגר היה מה לעשות אם חיישן אקוסטי אומר לנו שאין מכשול, אבל חיישן ה- IR כן.

לעת עתה, לאחר ניסוי וטעייה, הדברים הגיעו לסדר עדיפויות זה:

  1. חישת מגבר
  2. חישת IR
  3. חישה אקוסטית

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

עד כה, לא היה צורך לבצע תוכנות מרובות נושאים או מונעות הפרעות, אם כי מדי פעם אני נתקלת באובדן שליטה בין ה- Raspberry Pi לבקר המנוע של Roboclaw (אובדן תקשורת סדרתית).

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

בסופו של דבר, סביר להניח שיהיה צורך ברב-שרשור.

הצעדים הבאים…

תודה שהצלחת להגיע עד כאן.

השגתי כמה חיישני VL53L1X IR לייזר ToF (זמן טיסה), כך שסביר להניח שזה הנושא של ה- Instructable הבא, יחד עם סרוו.

מוּמלָץ: