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

פרויקט מרס רומבה UTK: 4 שלבים
פרויקט מרס רומבה UTK: 4 שלבים

וִידֵאוֹ: פרויקט מרס רומבה UTK: 4 שלבים

וִידֵאוֹ: פרויקט מרס רומבה UTK: 4 שלבים
וִידֵאוֹ: פרוייקט אלירז - עקרונות הקליעה 2024, יולי
Anonim
פרויקט מרס רומבה UTK
פרויקט מרס רומבה UTK
פרויקט מרס רומבה UTK
פרויקט מרס רומבה UTK

כתב ויתור: זה יעבוד רק אם הרומבה תוקם ב- א

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

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

חומרים נדרשים:

· רומבה

· MATLAB

· מצלמת פטל פי ופי

שלב 1: השגת הספריות

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

שלב 2: כתיבת התוכניות

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

שלב 3: קוד

העתק והדבק אותו לקובץ MATLAB הממוקם באותה תיקייה של הספריות

functionMainRoombaFile (r)

r.setDriveVelocity (0.1, 0.1)

בעוד % Infinte בזמן לולאה אמיתית כדי לשמור על ריצה של קוד

dontFall = cliffCheck (r) % מקצה משתנה 'dontFall' לפונקציה 'cliffCheck'

אם dontFall % אם ההצהרה להמשיך בקוד לאחר השלמת 'cliffCheck'

r.setDriveVelocity (0.1, 0.1) % משאיר את Roomba בתנועה לאחר השלמת 'cliffCheck'

end % מסתיים בהצהרת 'dontFall' if

bumper = bumpcheck (r) % מקצה משתנה 'bumper' לפונקציה 'bumpcheck'

אם באמפר % אם ההצהרה להמשיך בקוד לאחר השלמת 'בדיקה'

r.setDriveVelocity (0.1, 0.1) % משאיר את Roomba בתנועה לאחר השלמת 'הבדיקה'

סוף % מסתיים 'באמפר' אם הצהרה

liquids = LiquidCheck (r) % מקצה משתנה 'נוזלים' לפונקציה 'LiquidCheck'

אם נוזלים % אם ההצהרה להמשיך בקוד לאחר השלמת 'LiquidCheck'

r.setDriveVelocity (0.1, 0.1) % משאיר את Roomba בתנועה לאחר השלמת 'LiquidCheck'

סוף % מסתיים בהצהרת 'נוזלים'

lightbumper = lightcheck (r) % מקצה משתנה 'lightbumper' לפונקציה 'lightcheck'

השהה (0.1) % השהה בקצרה כדי למנוע איטרציה של לולאה רציפה

סוף % מסתיים אינסופי בעוד לולאה

הפונקציה end % ends מסתיימת

פונקציה bumper = bumpcheck (r) % יוצר פונקציית 'bumpcheck'

bumpdata = r.getBumpers % מקצה את כל הנתונים מהפגוש למשתנה 'bumpdata'

bumper = bumpdata.right || bumpdata.left || bumpdata.front % יוצר משתנה מאוחסן, 'פגוש', עבור הפגושים השונים

אם bumpdata.right> 0 % אם הצהרה גורמת לפונקציות שונות של החדר להתרחש אם הפגוש נתקל

r.stop % עוצר Roomba

r.moveDistance (-0.3, 0.2) % הופך את Roomba 0.3 מ '

r.turnAngle (90, 0.5) % מסתובב Roomba 90 מעלות מהר ככל האפשר

סוֹף

אם bumpdata.front> 0

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (randi (270), 0.5) % מסובב את Roomba במרווח אקראי בין 0 ל -270 מעלות מהר ככל האפשר

סוֹף

אם bumpdata.left> 0

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (-90, 0.5) % מסתובב Roomba -90 מעלות מהר ככל האפשר

סוֹף

סוֹף

function lightbumper = lightcheck (r) % יוצר פונקציה 'lightcheck'

lightdata = r.getLightBumpers % מקצה את כל הנתונים מחיישן בליטות האור למשתנה 'lightdata'

lightbumper = lightdata.left || lightdata.right || lightdata.rightCenter || lightdata.leftCenter % יוצר משתנה מאוחסן, 'lightbumper', עבור פגשי האור השונים

אם lightbumper % If הצהרה להתקשר לנתוני lightbumper מלמעלה

אם lightdata.left> 10 % אם הצהרה גורמת לפונקציות שונות של החדר להתרחש אם פגוש האור מרגיש יותר מ -10 ערכים

r.setDriveVelocity (0.05, 0.05) % מאט את roomba להתכונן לבליטות

סוף % מסיים הצהרה ראשונית אם

אם lightdata.rightCenter> 10

r.setDriveVelocity (0.05, 0.05)

סוֹף

אם lightdata.right> 10

r.setDriveVelocity (0.05, 0.05)

סוֹף

אם lightdata.leftCenter> 10

r.setDriveVelocity (0.05, 0.05)

סוֹף

סוף % מסתיים 'lightbumper' if משפט

סוף %מסתיים פונקציית lightcheck

function dontFall = cliffCheck (r) % יוצר פונקציה 'cliffCheck'

data = r.getCliffSensors; % מקצה את כל הנתונים מחיישן המצוק ל'נתונים 'משתנים

dontFall = data.left <1020 || data.leftFront <1020 || data.rightFront <1020 || data.right <1020 % יוצר משתנה מאוחסן, 'dontFall', עבור חיישני המצוק השונים

אם dontFall % If הצהרה להתקשר לנתוני חיישן המצוק מלמעלה

אם data. left <1010 % אם הצהרה גורמת לפונקציות שונות של החדר להתרחש אם חיישן המצוק מרגיש פחות מ- 1010 ערכים

r.stop

r.moveDistance (-0.2, 0.2) % הופך את Roomba 0.2 מ '

r.turnAngle (-90, 0.5) % מסתובב Roomba -90 מעלות מהר ככל האפשר

נתוני elseif.leftFront <1010

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (90, 0.5) % מסתובב Roomba 90 מעלות מהר ככל האפשר

elseif data.rightFront <1010

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (90, 0.5) % מסתובב Roomba 90 מעלות מהר ככל האפשר

elseif data.right <1010

r.stop

r.moveDistance (-0.3, 0.2)

r.turnAngle (90, 0.5) % מסתובב Roomba 90 מעלות מהר ככל האפשר

סוֹף

סוֹף

סוֹף

פונקציית נוזלים = LiquidCheck (r) % יוצר את הפונקציה 'LiquidCheck'

בעוד % %מתחילים לולאה אינסופית לכיול

img = r.getImage; % קורא את המצלמה מהרובוט

image (img) % מציג את התמונה בחלון דמות

red_mean = ממוצע (ממוצע (img (200, 150, 1)))% קורא את הכמות הממוצעת של פיקסלים אדומים

blue_mean = ממוצע (ממוצע (img (200, 150, 3)))% קורא את הכמות הממוצעת של הפיקסלים הכחולים

נוזלים = אדום_מצע || blue_mean % יוצר משתנה מאוחסן, 'נוזלים', עבור משתני הצבעים השונים

אם נוזלים % If הצהרה לקרוא לנתוני התמונה מלמעלה

אם red_mean> 170 % אם הצהרה גורמת לפונקציות שונות של החדר להתרחש אם המצלמה רואה צבע אדום ממוצע גדול מ -170

r.stop % מפסיק את roomba

r.setLEDCenterColor (255) % מגדיר את העיגול לצבע אדום

r.setLEDDigits (); נקה את התצוגה %

f = סרגל המתנה (0, '*הודעה נכנסת*'); % יוצר סרגל המתנה להודעת טעינה

r.setLEDDigits ('HOT'); % מגדיר את תצוגת LED לפלט 'חם'

השהה (0.5) %השהה קצרה לקריאת מידע המופץ

r.setLEDDigits ('LAVA'); % מגדיר את תצוגת LED לפלט 'LAVA'

השהה (0.5)

סרגל המתנה (.33, f, '*הודעה נכנסת*'); %יוצר עלייה בסרגל ההמתנה

r.setLEDDigits ('HOT');

השהה (0.5)

r.setLEDDigits ('LAVA');

השהה (0.5)

סרגל המתנה (.67, f, '*הודעה נכנסת*'); % יוצר עלייה בסרגל ההמתנה

r.setLEDDigits ('HOT');

השהה (0.5)

r.setLEDDigits ('LAVA');

סרגל המתנה (1, ו, '*הודעה נכנסת*'); %משלים את סרגל ההמתנה

הפסקה (1)

close (f) %סוגר את סרגל ההמתנה

r.setLEDDigits (); % מנקה את תצוגת ה- LED

close all %סוגר את כל החלונות הקודמים

צירים ('צבע', 'אין', 'XColor', 'אין', 'YColor', 'אין') % מנקה את חלון העלילה של הצירים והתרשים

y = 0.5; % קובע את המיקום y של הטקסט בחלון התכנון

x = 0.06; % קובע את מיקום ה- x של הטקסט בחלון התכנון

title ('FROM MARS ROOMBA', 'fontsize', 32) % מוסיף כותרת לחלון התכנון

quadeqtxt = 'DANGER LAVA'; % מגדיר את המשתנה 'quadeqtxt' לפלט 0

טקסט (x, y, quadeqtxt, 'מתורגמן', 'לטקס', 'גודל גופנים', 36); % מציג את הטקסט quadeq בחלון התכנון

r.moveDistance (-0.2, 0.2) %הופך את החדר 0.2 מ '

r.turnAngle (180, 0.5) %הופך את החדר ל- 180 מעלות כמה שיותר מהר

r.setLEDCenterColor (128, 128); % מגדיר את ה- LED המרכזי של roomba לכתום

סגור את כל %סוגר את החלונות הפתוחים שנותרו

elseif blue_mean> 175 % אם הצהרה גורמת לפונקציות שונות של החדר להתרחש אם המצלמה רואה צבע כחול ממוצע גדול מ- 175

r.stop % מפסיק את roomba

r.setLEDCenterColor (255) % מגדיר את העיגול לצבע אדום

r.setLEDDigits (); נקה את התצוגה %

f = סרגל המתנה (0, '*הודעה נכנסת*'); % יוצר סרגל המתנה להודעת טעינה

r.setLEDDigits ('לוק'); % מגדיר את תצוגת LED לפלט 'LOOK'

השהה (0.5) %השהה קצרה לקריאת מידע המופץ

r.setLEDDigits ('WATR'); % מגדיר את תצוגת LED לפלט 'WATR'

השהה (0.5)

סרגל המתנה (.33, f, '*הודעה נכנסת*'); %יוצר עלייה בסרגל ההמתנה

r.setLEDDigits ('לוק');

השהה (0.5)

r.setLEDDigits ('WATR');

השהה (0.5)

סרגל המתנה (.67, f, '*הודעה נכנסת*'); % יוצר עלייה בסרגל ההמתנה

r.setLEDDigits ('לוק');

השהה (0.5)

r.setLEDDigits ('WATR');

סרגל המתנה (1, ו, '*הודעה נכנסת*'); %משלים את סרגל ההמתנה

הפסקה (1)

close (f) %סוגר את סרגל ההמתנה

r.setLEDDigits (); % מנקה את תצוגת ה- LED

close all %סוגר את כל החלונות הקודמים

צירים ('צבע', 'אין', 'XColor', 'אין', 'YColor', 'אין') % מנקה את חלון העלילה של הצירים והתרשים

y = 0.5; % קובע את המיקום y של הטקסט בחלון התכנון

x = 0.06; % קובע את מיקום ה- x של הטקסט בחלון התכנון

title ('FROM MARS ROOMBA', 'fontsize', 32) % מוסיף כותרת לחלון התכנון

quadeqtxt = 'מצא מים'; % מגדיר את המשתנה 'quadeqtxt' לפלט 0

טקסט (x, y, quadeqtxt, 'מתורגמן', 'לטקס', 'גודל גופנים', 36); % מציג את הטקסט quadeq בחלון התכנון

r.moveDistance (-0.2, 0.2) %הופך את החדר 0.2 מ '

r.turnAngle (180, 0.5) %הופך את החדר ל- 180 מעלות כמה שיותר מהר

r.setLEDCenterColor (128, 128); % מגדיר את ה- LED המרכזי של roomba לכתום

סגור את כל %סוגר את החלונות הפתוחים שנותרו

סוף %מסתיים 'red_mean' if משפט

סוף %מסתיים בהצהרת 'נוזלים'

סוף % נסגר בלולאה אינסופית

סוף % end פונקציה 'LiquidCheck'

שלב 4: הפעלת הקוד

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

מוּמלָץ: