Mobot#
מאמר מאת Cosku Acay, Edwin Cho, Kenneth Li, ו-Nishant Pol. PDF.
תיאור הפרויקט#
בתחרות Mobot של Carnegie Mellon, רובוטים חייבים לעבור דרך סדרה של 14 שערים הממוקמים מעל קו לבן מעוקל באורך 255 רגל על מדרכה חיצונית. המסלול כולל שני מדרונות תלולים ואזור נקודת החלטה שבו הרובוט חייב לבחור את המסלול הנכון כדי לעבור דרך 14 השערים בסדר טורי. מכיוון שהקו נמצא בחוץ ותחת מזג האוויר של פיטסבורג, הרובוט חייב לתפקד במגוון תנאים. השנה היה גשום וסוער ביום התחרות. מידע נוסף ניתן למצוא בכתובת http://www.cs.cmu.edu/mobot/mobot.html


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

ה-CMUcam4 לוכד תמונה של הקו ב-30 מסגרות לשנייה ומזין את תמונת מעקב הצבע ל-Arduino Mega דרך אחד משלושה קווים טוריים. ה-Arduino Mega לאחר מכן מעבד תמונה זו (אנא ראו Software Description למטה) ומספק פקודות מהירות מנוע ופנייה לבקר ה-PID דרך קו טורי אחר. בקר ה-PID בתורו מספק ל-Arduino Mega ספירות מקודד (encoder) עבור שני הגלגלים הימני והשמאלי, מה שמאפשר לנו לעקוב אחר המיקום והכיוון שלנו יחסית ל-gate 0.
בקר ה-PID (MD-25) מיוצר על ידי Robot-Electronics בבריטניה. הוא מניע שני מנועי מברשת DC עם גלגלי שיניים ומקודדים מגנטיים על ציר המנוע. מסך ה-LCD מיועד למטרות ניפוי באגים. היו לנו שני מסילות הספק, 12V למנועים ו-5V ללוגיקה, החולקות את אותה הארקה ושתיהן ממקור מסוללת 12V נטענת יחידה.
בתחילה תכננו לבנות אב-טיפוס מבסיס עץ כדי להיכנס במהירות לשלב התכנות, ואז לעבוד על בסיס מהיר ואמין יותר כגון מכונית RC. עם זאת, גילינו שהאב-טיפוס היה אמין מאוד וקל לעבודה, אז שמרנו אותו לתכנון הסופי. אטימת המים לגוף כללה שכבת ניילון נצמד תחת שכבת סרט אריזה. עם זאת, גשם דלף דרך סרט האריזה אך למרבה המזל לא דרך הניילון הנצמד. המצלמה כוסתה בריבוע של פלסטיק משקית Ziploc מכיוון שגילינו שה-”פילטר“ שיפר את יכולת המצלמה להתעלם מכתמים קטנים של הקו ש, למצלמה, נראו כמו הבטון של הרקע.
תיאור האלגוריתם#
רקע#
אנו משתמשים ב-CMUcam4 במצב מעקב צבע עם מצב YUV מופעל, מה שנותן לנו ייצוג תמונה בינארי של הקו. תוכנת המצלמה מסננת החוצה כל דבר שאינו לבן (כלומר הרקע) ומציבה פיקסל ”דולק“ היכן שיש קו (היכן שהוא לבן). אנו משתמשים במצב YUV כך שמעקב הצבע יהיה חסין לעוצמת האור, כדי שהרובוט שלנו יוכל לתפקד במגוון רחב של תנאים כולל בתוך מבנים ובחוץ.
עקיבה אחר קו#
ה-CMUcam4 מספק לשבב ה-Arduino שלנו תמונה בינארית של 80 על 60. אנו דוגמים 10 שורות פיקסלים במרווחים שווים מהתמונה ומחשבים את מרכז המסה של הפיקסלים ה“דלוקים“ (ראו כאן: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). לאחר מכן אנו מניחים שהקו נמצא על מרכז המסה. על ידי ביצוע זה על 10 שורות שונות בתמונה, אנו מקבלים קירוב טוב של הקו על ידי חיבור הנקודות. לאחר מכן אנו יכולים להשתמש בנתונים אלה על ידי מציאת המרחק של כל נקודה על הקו מהקו האנכי הנמצא במרכז התמונה כדי לקבל ערך המייצג עד כמה הקו מעוקל. ניתן לראות זאת כמשהו כמו מציאת השטח בין קו המשיק לעקומה ושימוש בשטח זה כדי לקבוע כמה עלינו לפנות. הסימן קובע אם הפנייה שמאלה או ימינה, בעוד הגודל קובע כמה עלינו לפנות כדי לעקוב אחר הקו. כפי שהייתם מצפים, אם מדדנו שטח אפס, אזי הקו נמצא ישירות מול הרובוט והוא קו ישר. אם גודל השטח גדול, אזי הרובוט צריך לפנות כדי לנסות למזער את גודל שטח זה.
נקודות החלטה#
כדי לקבוע אם הרובוט נמצא בנקודת החלטה, אנו לוקחים את הנתונים שהמצלמה אוספת מעקיבה אחר קו ובודקים כמה נקודות מרכז ממוצעות מופיעות במרחב שחור. זה עובד בהתבסס על ההנחה שהנקודה הממוצעת בין שני קווים לא צריכה להיות על אף אחד מהקווים, אלא אם הקווים הם אותו קו. אם הרובוט מזהה נקודות ממוצעות מרובות במרחב השחור, הוא יכול להסיק שחייבים להיות שני קווים כאן. אז הוא בוחר את הפנייה המתאימה ומטה את פנייתו לעבר אותו כיוון עד שהוא רואה רק קו אחד.
אנא עברו אל https://github.com/cacay/Mobot כדי לראות גרסה מפושטת של הקוד שלנו או כאן לעותק מקומי.

