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

עוזר הגן Roomba Bot: 8 שלבים
עוזר הגן Roomba Bot: 8 שלבים

וִידֵאוֹ: עוזר הגן Roomba Bot: 8 שלבים

וִידֵאוֹ: עוזר הגן Roomba Bot: 8 שלבים
וִידֵאוֹ: סטטיק & אגם בוחבוט - טרנטולה 2024, נוֹבֶמבֶּר
Anonim
עוזר גן Roomba Bot
עוזר גן Roomba Bot

קיארה מאיירס, אחמד אלחאדר ומדיסון טיפט

מַטָרָה:

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

מאפיינים:

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

שלב 1: חומרים ואספקה:

  • מחשב נייד אחד
  • MATLAB 2017
  • מנקה חיסונים Roomba
  • פאי פטל
  • גושי עץ
  • נייר לבן
  • נייר שחור
  • סרט צבעוני/רצועה דקה של נייר צבעוני
  • אבן גדולה

שלב 2:

שלב 3: הרכבת ה"גן "שלך

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

    ניגוד זה יהיה נחוץ בעת גילוי פרי

  3. השתמש במחסני העץ שלך כדי לבנות שביל גן דמוי מבוך עבור הרובוט שלך לנווט

    בחרנו במסלול בצורת U כמו בתמונה למעלה

  4. בסוף הגן שלך הוסף סלע או דלת או חפץ אחר כדי שהרובוט שלך יידע שזה נעשה
  5. הדביקו את הנייר הלבן שלכם עם העיגול על קירות הגן

    השתמשנו בדליים כדי להדביק אותו מכיוון שהקירות שלנו היו קצרים מדי בשביל המצלמה

  6. הניחו קלטת צבעונית/רצועה דקה של נייר צבעוני על האדמה מול הפרי

שלב 4: כתיבת הקוד

ניווט בגן

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

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

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

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

שאר הקוד משמש לשרטוט הנתיב שעשה הרומבה ולאחר מכן שולח את התוצאות לדוא ל שלך

שלב 5: העתק את הקוד

מטרה: בהתבסס על הגדלים שלהם הרומבה תעבור בגינה ותבדיל ירקות/פירות שמוכנים להרים. % כניסות: חיישני Lightbump, חיישני צוק, חיישני בליטה, תמונה מהמצלמה % תפוקות: בכל פעם שחיישני אור גדולים מהסף החדר יפנה ותצלם תמונה, צפצופים אם הרדיוס של % ירקות/פירות נמצא בין טווח ספציפי. הקוד נשבר כאשר רומבה נתקלת באובייקט %, שולחת לאסטרונאוט מייל לגבי כמה פירות מוכנים לאסוף % ומיפוי של תנועת החדר. % שימוש: אם ובזמן הצהרות, פקודות תכנון, קוד דוא ל מ- MATLAB

k = 0

עֲוִית

timerVal = tic

בעוד שזה נכון

v =.2; % מהירות r.setDriveVelocity (v, v);% roomba קדימה L = r.getLightBumpers; LC = L. leftCenter; Rr = L. נכון; Lf = L. שמאל; RC = L.rightCenter; LF = L. leftFront; RF = L.rightFront; ש = 75; % מפתן. RTH = 30; %סף אדום גבוה RTL = 10; %סף אדום נמוך B = r.getBumpers S = r.getCliffSensors; r1 = 24; r3 = 10; PL1 = 1800; אם S.leftFront> PL1 || S.rightFront> PL1 % מזהה אם הצבע על הקרקע נמצא מעל הסף r.stop stop (2) elapsedTime = toc (timerVal-2) tic timerVal = tic % pause במשך 2 שניות img = r.getImage; %לקחת תמונה imshow (img)%להציג תמונה [centers3, radii3] = imfindcircles (img, [30 50], 'ObjectPolarity', 'dark', 'Sensitivity', 0.9); h = עיגולים (מרכזי 3, רדיוס 3); %חפש עיגולים של רדיוסים בטווח שצוין בתמונה אם radii3> = r1 T = 1 k = k+1 dist1 = 0.2.*חלף זמן %אם הרדיוס שזוהה גדול או שווה לדרישת %המינימלית של פרי בשל., אז Roomba סופר את הפרי הזה if radii3 <= r3 T = 0 else T = 0 dist2 = 0.2.*elappedTime %אם לא, אז זה לא סופר את סוף הפרי

אם T == 1 r.setLEDDigits (num2str (k)) r.beep r.beep r.beep r.turnAngle (78) %אם זוהה פרי, הצג את המספר ב- Roomba, %השמיע רעש וסובב elseif T == 2 r.turnAngle (78) %אם מזוהים 2 פירות, פנה כדי להמשיך דרך %garden אחר r.turnAngle (78) %אם לא מזוהים פירות, פנה להמשך דרך סוף סוף הגן אם LC> Q r.stop r.turnAngle (-7) elseif RC> Q r.stop r.turnAngle (7) elseif LF> Q r.stop r.turnAngle (-7) elseif RF> Q r.stop r. turnAngle (7) elseif Lf> Q r.stop r.turnAngle (-7) elseif Rr> Q r.stop r.turnAngle (7) end %אם אחד מערכי הפגושים הקלים עולה על הסף, אז %הרומבה יסתובב מעט בכיוון המתאים כדי למנוע פגיעה באחוזים בקיר

אם B.right == 1 || B. שמאל == 1 || B.front == 1 dist3 = 0.2.*Elapped Time r.stop r.beep ('F#*2, F#*2, c, F#*2, F#*2') r.turnAngle (360) %אם כל אחד מ מכשולים נפגעים, ואז הרומבה מנגנת צליל, מסתובב, %ושובר את הקוד

סוף הפסקה

סוף פיזור (0.533, 0, '^') החזק בפיזור (0.533, dist1, '<') החזק בפיזור (-dist2, dist1, 'v') החזק בפיזור (-dist2, 0, 'd') saveas (gcf, 'Movement.png')

kmsg = num2str (k) mail = '[email protected]' password = 'Srsora123#' host = 'smtp.gmail.com' port = '465'

setpref ('אינטרנט', 'דואר אלקטרוני', דואר); setpref ('אינטרנט', 'SMTP_Server', מארח) props = java.lang. System.getProperties; props.setProperty ('mail.smtp.user', דואר); props.setProperty ('mail.smtp.host', מארח); props.setProperty ('mail.smtp.port', יציאה); props.setProperty ('mail.smtp.starttls.enable', 'true'); props.setProperty ('mail.smtp.debug', 'true'); props.setProperty ('mail.smtp.auth', 'true'); props.setProperty ('mail.smtp.socketFactory.port', יציאה); props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty ('mail.smtp.socketFactory.fallback', 'false'); sendmail (מייל, 'שלום אסטרונאוט! יש הרבה פירות בגן', kmsg, {'movement.png'})

מוּמלָץ: