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

הפיכת הרומבה שלך למאדים רובר: 5 שלבים
הפיכת הרומבה שלך למאדים רובר: 5 שלבים

וִידֵאוֹ: הפיכת הרומבה שלך למאדים רובר: 5 שלבים

וִידֵאוֹ: הפיכת הרומבה שלך למאדים רובר: 5 שלבים
וִידֵאוֹ: דניאל שמאכטנברגר: האם הטכנולוגיה תהרוס אותנו? 2024, דֵצֶמבֶּר
Anonim
הפיכת הרומבה שלך למאדים רובר
הפיכת הרומבה שלך למאדים רובר

שלב 1: אסוף את החומרים שלך

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

רובוט 1 Roomba

1 ערכת פטל פטל

מצלמת וידאו אחת

גישה ל- MATLAB

שלב 2: הורד את ארגזי הכלים של Roomba עבור MATLAB

הורד את ארגזי הכלים של Roomba עבור MATLAB
הורד את ארגזי הכלים של Roomba עבור MATLAB
הורד את ארגזי הכלים של Roomba עבור MATLAB
הורד את ארגזי הכלים של Roomba עבור MATLAB

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

חדר פונקציות התקנת

clc;

רשימת קבצים % להתקנה

files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% מיקום להתקנה

options = weboptions ('CertificateFilename', ''); % אמרו לו להתעלם מדרישות התעודה

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'התקנת/עדכון Roomba';

מטרת תצוגה % וקבל אישור

הנחיה = {

'תוכנית זו תוריד את קבצי EF 230 Roomba הבאים:'

''

strjoin (קבצים, '')

''

'לתיקיה זו:'

''

CD

''

'האם אתה רוצה להמשיך? '

};

ביפ;

yn = questdlg (הנחיה, …

dlgTitle,…

'כן', 'לא', 'כן');

אם ~ strcmp (yn, 'כן'), חזור; סוֹף

% get רשימת הקבצים הקיימים

הקיימים_קבצים = קבצים (cellfun (@exist, קבצים)> 0);

אם ~ הוא ריק (קיים_קבצים)

ודא שזה באמת בסדר להחליף אותם

prompt = {'אתה מחליף את הקבצים האלה:'

''

strjoin (קיים_קבצים, '')

''

'בסדר להחליף?'

};

ביפ;

yn = questdlg (הנחיה, …

dlgTitle,…

'כן', 'לא', 'כן');

אם ~ strcmp (yn, 'כן'), חזור; סוֹף

סוֹף

הורד את הקבצים %

cnt = 0;

עבור i = 1: אורך (קבצים)

f = קבצים {i};

disp (['הורדה' ו]);

לְנַסוֹת

url = [שרת f];

websave (f, url, אופציות); % נוספו אפשרויות למניעת טעויות אבטחה

cnt = cnt + 1;

לתפוס

disp (['שגיאה בהורדה' f]);

דמה = [f '.html'];

אם קיים (דמה, 'קובץ') == 2

מחק (דמה)

סוֹף

סוֹף

סוֹף

אם cnt == אורך (קבצים)

msg = 'ההתקנה הצליחה';

waitfor (msgbox (msg, dlgTitle));

אַחֵר

msg = 'שגיאת התקנה - ראה חלון פקודה לפרטים';

waitfor (errordlg (msg, dlgTitle));

סוֹף

סוף %roombaInstall

שלב 3: התחבר ל- Roomba שלך

עכשיו הגיע הזמן להתחבר לרומבה שלך באמצעות WiFi. באמצעות 2 אצבעות, לחץ על לחצני העגינה והנקודה בו זמנית כדי להפעיל או לאפס את Roomba שלך. לאחר מכן, הפעל את הקוד r = roomba (# של Roomba שלך) בחלון הפקודה של MATLAB כדי להתחבר לרובוט שלך. לאחר שתבצע את הפקודה הזו, Roomba שלך אמור להיות מוכן לצאת לדרך.

שלב 4: בחר כיצד ברצונך לשלוט ב- Roomba שלך

בחר כיצד ברצונך לשלוט ב- Roomba שלך
בחר כיצד ברצונך לשלוט ב- Roomba שלך
בחר כיצד ברצונך לשלוט ב- Roomba שלך
בחר כיצד ברצונך לשלוט ב- Roomba שלך

ישנן שתי דרכים בהן אתה יכול לשלוט ב- Roomba שלך: באופן אוטונומי או שימוש בסמארטפון כבקר.

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

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

הערה: המחשב והסמארטפון שלך צריכים להיות באותה רשת WiFi כדי להתחבר כראוי!

1. הורד את אפליקציית MATLAB מחנות האפליקציות במכשיר שלך.

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

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

4. בחלון הפקודה במחשב, הקלד את הקוד m = mobiledev וזה אמור לאתחל את הסמארטפון שלך כבקר עבור Roomba שלך.

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

שלב 5: נהג ב- Roomba שלך

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

נהיגה אוטונומית

פונקציה Explore_modified (r)

%טיעוני קלט: אובייקט roomba אחד, r

%פלט ארגומנטים: אין

%תיאור:

פונקציית %משתמשת בלולאה אינסופית תוך כדי לאפשר אוטונומית

חקר %של סביבת הבוט.

%

%funciton מספקת גם הוראות לרומבה מה לעשות

%המצבים הבאים: גלגלים מאבדים מגע עם הקרקע, א

אובייקט %מזוהה מול או משני צדי הבוט, וא

%ירידה פתאומית מזוהה מול או משני צדי הבוט.

%

%הוראות אופייניות כוללות פקודות תנועה שנועדו למקסם

חקר %או הימנע מסכנה שזוהתה ופקודות לתקשר

מידע על תגליות הבוטים (תמונות), מיקום (גרף), %וציין (אזהרה תקועה) עם המשתמש באמצעות matlab ו/או דוא ל. כַּמָה

%פקודות צליל מתווספות להנאה.

%הגדרת יכולות דוא ל

mail = '[email protected]';

password = 'EF230Roomba';

setpref ('אינטרנט', 'SMTP_Server', 'smtp.gmail.com');

setpref ('אינטרנט', 'דואר אלקטרוני', דואר);

setpref ('אינטרנט', 'SMTP_Username', דואר);

setpref ('אינטרנט', 'SMTP_Password', סיסמה);

props = java.lang. System.getProperties;

props.setProperty ('mail.smtp.starttls.enable', 'true');

props.setProperty ('mail.smtp.auth', 'true');

props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');

props.setProperty ('mail.smtp.socketFactory.port', '465');

% r = roomba (19)

r.beep ('G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C1 ^^, C1 ^^, D1 ^^, C1 ^^, D2 ^^, E4 ^^, G2 ^^, G2 ^^, G2 ^^, G2 ^^, A2 ^^, A2 ^^, G1 ^^, E1 ^^, C2 ^^, C2 ^^, C2 ^^, E1 ^^, E1 ^^, E1 ^^, D1 ^^, C4 ^^ ');

v =.1;

reflect_datum = 2700; %הגדר ערך התייחסות לחיישני צוק

lightBumper_datum = 200; ערך מוגדר של %חיישני פגוש ערך התייחסות

pos = [0, 0]; משתנה %לאחסון מיקום עם נתח אתחול

זווית = 0; %להגדיר זווית התייחסות

netangle = 0; %עקירת זווית נטו

i = 2; איטרציה %להוספת שורות למיקום משתנה אחסון

dist = 0;

r.setDriveVelocity (v, v); %להתחיל roomba להתקדם

בעוד שזה נכון

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %מייצר זווית אקראית אחת בין 20 ל -60 מעלות. משמש כדי למנוע מבוט להיתקע בלולאה

%מה לעשות אם גלגל אחד או יותר מאבד את הקשר עם הקרקע:

%עצור תנועה, שלח מייל אזהרה עם תמונה של הסביבה, %ושאל את המשתמש אם להמשיך או לחכות לעזרה

אם Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

r.beep ('F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^, F#1 ^^, C1 ^^ ')

img = r.getImage;

imwrite (img, 'stuck.png');

%--------------------------

imfile = 'stuck.png';

מיקום = savepos (pos);

%---------------------------

sendmail (מייל, 'עזרה!', 'אני תקוע על צוק!', {imfile, position})

list = {'המשך', 'עצור'};

idx = menu ('מה עלי לעשות?', רשימה);

אם idx == 2

לשבור

סוֹף

%מה לעשות אם אובייקט מזוהה מול הבוט:

%עצור, חזור אחורה, צלם, התראה למשתמש על גילוי

%באמצעות דואר אלקטרוני, סובב 90 מעלות והמשך לחקור

elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

r.beep ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')

img = r.getImage;

imwrite (img, 'FrontBump.png')

%--------------------------

imfile = 'FrontBump.png';

מיקום = savepos (pos);

%---------------------------

sendmail (מייל, 'התראה!', 'מצאתי משהו!', {imfile, position})

זווית = 90;

netangle = netangle+זווית;

r.turnAngle (זווית);

r.setDriveVelocity (v, v);

%מה לעשות אם אובייקט מזוהה משמאל לבוט:

%עצור, פנה לכיוון אובייקט, גבה, צלם, התראה

%משתמש הגילוי באמצעות דוא ל, סובב 90 מעלות והמשך חקר

elseif Light.leftFront> lightBumper_datum || Light. left> lightBumper_datum || בליטה.שמאל == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

זווית = 30;

netangle = netangle+זווית;

r.turnAngle (זווית);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

r.beep ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')

img = r.getImage;

imwrite (img, 'LeftBump.png')

%--------------------------

imfile = 'LeftBump.png';

מיקום = savepos (pos);

%---------------------------

sendmail (מייל, 'התראה!', 'מצאתי משהו!', {imfile, position})

זווית = -90;

netangle = netangle+זווית;

r.turnAngle (זווית);

r.setDriveVelocity (v, v);

%מה לעשות אם אובייקט מזוהה מימין לבוט:

עצור %, פנה לכיוון אובייקט, גבה, צלם, התראה

%משתמש הגילוי באמצעות דוא ל, סובב 90 מעלות והמשך חקר

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

זווית = -30;

netangle = netangle+זווית;

r.turnAngle (זווית);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

הפסקה (1.5);

r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getImage;

imwrite (img, 'RightBump.png')

%--------------------------

imfile = 'RightBump.png';

מיקום = savepos (pos);

%---------------------------

sendmail (מייל, 'התראה!', 'מצאתי משהו!', {imfile, position});

זווית = 90;

netangle = netangle+זווית;

r.turnAngle (זווית);

r.setDriveVelocity (v, v);

%מה לעשות אם צוק מזוהה משמאל לבוט:

%עוצרים, נעים אחורה, פונים ימינה, ממשיכים לחקור

elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %לקבל x לתאם

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %קבל תיאום y

i = i+1;

זווית = -RandAngle;

netangle = netangle+זווית;

r.turnAngle (זווית);

r.setDriveVelocity (v, v);

%מה לעשות אם צוק מזוהה מימין לבוט:

%עוצרים, נעים אחורה, פונים שמאלה, ממשיכים לחקור

elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (זווית); %לקבל x לתאם

pos (i, 2) = dist * cosd (זווית); %קבל תיאום y

i = i+1;

r.moveDistance (-. 125);

זווית = RandAngle;

netangle = netangle+זווית;

r.turnAngle (זווית);

r.setDriveVelocity (v, v);

סוֹף

סוֹף

בקר סמארטפון

Options = {'אוטונומי', 'שליטה ידנית'}

הנחיה = תפריט ('כיצד היית רוצה לשלוט ברובר?', אפשרויות)

m = mobiledev

r = roomba (19)

אם הנחיה == 1

מגלה ארצות)

אַחֵר

בעוד שזה נכון

השהה (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Pitch = PhoneData (2);

צד = PhoneData (3);

אם צד> 130 || צד <-130 %אם הטלפון מתהפך עם הפנים כלפי מטה עצור את החדר ויצא מהלולאה

r.stop

r.bep ('C, C, C, C')

לשבור

elseif צד> 25 && צד <40 %אם הטלפון מופנה הצידה בין 25 ל 40 מעלות פנה 5 שמאלה

r.turnAngle (-5);

הצד אחר> 40 %אם הטלפון מופנה הצידה מעל 40 מעלות פנה שמאלה 45 מעלות

r.turnAngle (-45)

אחרת צד -40 %אם הטלפון מופנה הצידה בין -25 ל -40 מעלות פנה ימינה 5 מעלות

r.turnAngle (5);

elseif צד <-40 %אם הטלפון מופנה הצידה פחות מ -40 מעלות פנה שמאלה 45 מעלות

r.turnAngle (45)

סוֹף

%אם הטלפון מוחזק ליד האנכיים קח תמונה וצייר אותה

אם Pitch <-60 && image <= 9

r.bep

img = r.getImage;

עלילת משנה (3, 3, תמונה)

imshow (img)

סוֹף

%לנוע קדימה ואחורה בהתבסס על הכיוון הקדמי והאחור

אם Pitch> 15 && Pitch <35 %אם המגרש בין 15 ל- 35 מעלות נעים קדימה למרחק קצר

%מקבלים נתוני פגוש קל לפני המעבר

litBump = r.getLightBumpers;

אם litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %אם משהו נמצא לפני החדר, והוא יפגע אם הוא זז קדימה תעשה רעש ותציג הודעה

r.beep ('C ^^, F#^, C ^^, F#^')

אחר מהלך של %

r.moveDistance (.03);

קבל נתוני באמפר לאחר המעבר

Bump = r.getBumpers;

אם Bump.right == 1 || בליטה.שמאל == 1 || Bump.front == 1

r.bep ('A, C, E')

r.moveDistance (-.01)

סוֹף

%מקבלים נתוני חיישן מצוק

Cliff = r.getCliffSensors;

אם צוק.שמאל> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %אם משהו גורם לחיישן המצוק להתייחס אליו כאל לבה ולגבות

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

סוֹף

סוֹף

elseif Pitch> 35 %אם המגרש גדול יותר מ -35 מעלות נעים קדימה למרחק רב יותר

%מקבלים נתוני פגוש קל לפני המעבר

litBump = r.getLightBumpers;

אם litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %אם משהו נמצא לפני החדר, והוא יפגע אם הוא זז קדימה, תעשה רעש ותציג הודעה

r.beep ('C ^^, F#^, C ^^, F#^')

אחר מהלך של %

r.moveDistance (.3)

קבל נתוני באמפר לאחר המעבר

Bump = r.getBumpers;

אם Bump.right == 1 || בליטה.שמאל == 1 || Bump.front == 1 %אם אתה מכה במשהו, עשה רעש, הצג הודעה וגבה

r.bep ('A, C, E')

r.moveDistance (-.01)

סוֹף

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

Cliff = r.getCliffSensors;

אם צוק.שמאל> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %אם משהו גורם לחיישן המצוק להתייחס אליו כאל לבה ולגבות

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

סוֹף

סוֹף

elseif Pitch -35 %אם המגרש בין -15 ל -35 מעלות זז אחורה למרחק קצר

r.moveDistance (-. 03);

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

Cliff = r.getCliffSensors;

אם צוק.שמאל> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %אם משהו גורם לחיישן המצוק להתייחס אליו כאל לבה ולגבות

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

סוֹף

elseif Pitch -60 %אם המגרש בין -35 ל -60 מעלות זז אחורה למרחק רב יותר

r.moveDistance (-. 3)

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

Cliff = r.getCliffSensors;

אם צוק.שמאל> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %אם משהו גורם לחיישן המצוק להתייחס אליו כאל לבה ולגבות

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

סוֹף

סוֹף

סוֹף

סוֹף

מוּמלָץ: