Indholdsfortegnelse:
- Trin 1: Saml dine materialer
- Trin 2: Download Roomba Toolboxes til MATLAB
- Trin 3: Opret forbindelse til din Roomba
- Trin 4: Vælg, hvordan du vil styre din Roomba
- Trin 5: Kør din Roomba
Video: Gør din Roomba til en Mars Rover: 5 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:25
Trin 1: Saml dine materialer
For at gennemføre dette projekt skal du samle følgende materialer:
1 Roomba -robot
1 Raspberry Pi -sæt
1 videokamera
Adgang til MATLAB
Trin 2: Download Roomba Toolboxes til MATLAB
Kør følgende kode for at installere de nødvendige værktøjskasser til at fuldføre dette projekt.
funktionsrumbaInstall
clc;
% liste over filer, der skal installeres
filer = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% placering at installere fra
muligheder = weboptioner ('CertificateFilename', ''); % fortæl det at ignorere certifikatkrav
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Roomba -installation/opdatering';
% visningsformål og få bekræftelse
prompt = {
'Dette program vil downloade disse EF 230 Roomba -filer:'
''
strjoin (filer, '')
''
'til denne mappe:'
''
cd
''
'Vil du fortsætte? '
};
bip;
yn = questdlg (prompt, …
dlgTitle,…
'Ja', 'Nej', 'Ja');
hvis ~ strcmp (yn, 'Ja'), returneres; ende
% få liste over filer, der findes
eksisterende_filer = filer (cellfun (@exist, filer)> 0);
hvis ~ isempty (eksisterende_filer)
% sørg for, at det virkelig er ok at udskifte dem
prompt = {'Du erstatter disse filer:'
''
strjoin (eksisterende_filer, '')
''
'OK at udskifte?'
};
bip;
yn = questdlg (prompt, …
dlgTitle,…
'Ja', 'Nej', 'Ja');
hvis ~ strcmp (yn, 'Ja'), returneres; ende
ende
% download filerne
cnt = 0;
for i = 1: længde (filer)
f = filer {i};
disp (['Downloader' f]);
prøve
url = [server f];
websave (f, url, muligheder); % tilføjede muligheder for at undgå sikkerhedsfejl
cnt = cnt + 1;
fangst
disp (['Fejl ved download' f]);
dummy = [f '.html'];
hvis der findes (dummy, 'fil') == 2
slet (dummy)
ende
ende
ende
hvis cnt == længde (filer)
msg = 'Installation vellykket';
waitfor (msgbox (msg, dlgTitle));
andet
msg = 'Installationsfejl - se kommandovinduet for detaljer';
waitfor (errordlg (msg, dlgTitle));
ende
slut %roombaInstall
Trin 3: Opret forbindelse til din Roomba
Nu er det tid til at oprette forbindelse til din Roomba ved hjælp af WiFi. Brug 2 fingre til at trykke på Dock- og Spot -knapperne samtidigt for at tænde eller nulstille din Roomba. Kør derefter koden r = roomba (# af din Roomba) i kommandovinduet i MATLAB for at oprette forbindelse til din robot. Når du har udført denne kommando, skal din Roomba være klar til at gå.
Trin 4: Vælg, hvordan du vil styre din Roomba
Der er to måder, du kan styre din Roomba på: autonomt eller ved hjælp af en smartphone som controller.
Hvis du vælger at køre Roomba autonomt, skal du bruge de tre indbyggede sensorer: cliff sensorer, bump sensorer og lys sensorer.
For at bruge en smartphone skal du først forbinde din smartphone til din computer ved at følge nedenstående trin.
BEMÆRK: Din computer og smartphone skal være på det samme WiFi -netværk for at kunne tilslutte korrekt!
1. Download MATLAB -appen fra appbutikken på din enhed.
2. Indtast "connector on" i dit kommandovindue, og angiv en adgangskode, der skal indtastes i begge enheder.
3. Efter at have gjort det, giver MATLAB dig din computers IP -adresse. Du skal gå ind på indstillingssiden i MATLAB -appen på din smartphone og tilføje en computer ved hjælp af den angivne IP -adresse og den adgangskode, du har indtastet tidligere.
4. Indtast koden m = mobiledev i kommandovinduet på din computer, og dette skulle initialisere din smartphone som controller til din Roomba.
5. Din computer og smartphone skal være klar til at gå nu.
Trin 5: Kør din Roomba
Nu hvor du har alle de nødvendige værktøjer til at oprette din Mars Rover, er du klar til at oprette din egen kode. Vi har vedhæftet en eksempelkode nedenfor for både den autonome kørsel og den smartphone-kontrollerede kørsel.
Autonom kørsel
funktion Explore_modified (r)
%inputargumenter: 1 roomba -objekt, r
%output -argumenter: ingen
%beskrivelse:
%funktion anvender en uendelig mens loop for at tillade autonom
%udforskning af botens omgivelser.
%
%funciton giver også instruktioner til roomba om, hvad de skal gøre i
%følgende situationer: Hjul (er) mister kontakten med jorden, en
%objekt registreres foran eller på hver side af boten, og a
%pludselig fald registreres foran eller til hver side af botten.
%
%typiske instruktioner inkluderer bevægelseskommandoer beregnet til at maksimere
%efterforskning eller undgå en opdaget fare og kommandoer til at kommunikere
%oplysninger om botens opdagelser (billeder), position (graf), %og angiv (strandet advarsel) med brugeren via matlab og/eller e -mail. Flere
%lydkommandoer tilføjes for nydelse.
%opsætning af e -mail -muligheder
mail = '[email protected]';
password = 'EF230Roomba';
setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Internet', 'E_mail', mail);
setpref ('Internet', 'SMTP_Username', mail);
setpref ('Internet', 'SMTP_Password', adgangskode);
rekvisitter = 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; %indstiller cliff sensorer referenceværdi
lightBumper_datum = 200; %indstillet lys Kofangersensorer referenceværdi
pos = [0, 0]; %variabel til positionsopbevaring med initialiseret initial
vinkel = 0; %angivet referencevinkel
netangle = 0; %nettovinkelforskydning
i = 2; %iterator til tilføjelse af rækker til placeringslagervariabel
dist = 0;
r.setDriveVelocity (v, v); %start roomba fremad
mens det er sandt
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Light = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %genererer 1 tilfældig vinkel mellem 20 og 60 grader. Bruges til at forhindre bot i at sidde fast i en loop
%Hvad skal man gøre, hvis et eller flere hjul mister kontakten med jorden:
%stop bevægelse, send en advarselsmail med billede af omgivelserne, %og spørg brugeren om at fortsætte eller vente på hjælp
hvis Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r. stop
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
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';
position = savepos (pos);
%---------------------------
sendmail (mail, 'HJÆLP!', 'Jeg er strandet på en klippe!', {imfile, position})
list = {'Fortsæt', 'Stop'};
idx = menu ('Hvad skal jeg gøre?', liste);
hvis idx == 2
pause
ende
%Hvad skal jeg gøre, hvis der registreres et objekt foran boten:
%stop, gå tilbage, tag billede, advar bruger om opdagelse
%via e -mail, drej 90 grader, og bliv ved med at udforske
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); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
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';
position = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position})
vinkel = 90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Hvad skal man gøre, hvis objektet registreres til venstre for bot:
%stop, drej mod objektet, sikkerhedskopier, tag billede, advarsel
%bruger af opdagelse via e -mail, drej 90 grader og fortsæt med at udforske
elseif Light.leftFront> lightBumper_datum || Light. venstre> lightBumper_datum || Bump. venstre == 1
r. stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
vinkel = 30;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
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';
position = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position})
vinkel = -90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Hvad skal jeg gøre, hvis objektet registreres til højre for bot:
%stop, drej mod objektet, sikkerhedskopier, tag billede, advarsel
%bruger af opdagelse via e -mail, drej 90 grader og fortsæt med at udforske
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); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
vinkel = -30;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
pause (1,5);
r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
position = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position});
vinkel = 90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Hvad skal jeg gøre, hvis der registreres en klippe til venstre for botten:
%stop, bevæg baglæns, drej til højre, fortsæt med at udforske
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r. stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat
i = i+1;
vinkel = -RandAngle;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Hvad skal jeg gøre, hvis klippen opdages til højre for bot:
%stop, bevæg baglæns, drej til venstre, fortsæt med at udforske
elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum
r. stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (vinkel); %få x koordinat
pos (i, 2) = dist * cosd (vinkel); %få y koordinat
i = i+1;
r.moveDistance (-. 125);
vinkel = RandAngle;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
ende
ende
Smartphone -controller
Options = {'Autonom', 'Manuel kontrol'}
Prompt = menu ('Hvordan vil du styre roveren?', Valgmuligheder)
m = mobiledev
r = roomba (19)
hvis Spørg == 1
Udforsk (r)
andet
mens det er sandt
pause (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Side = PhoneData (3);
hvis Side> 130 || Side <-130 %, hvis telefonen vendes med forsiden nedad, stop roombaen og afslut sløjfen
r. stop
r.bip ('C, C, C, C')
pause
elseif Side> 25 && Side <40 %, hvis telefonen vendes sidelæns mellem 25 og 40 grader, drej til venstre 5 grader
r.turnAngle (-5);
elseif Side> 40 %, hvis telefonen drejes sidelæns over 40 grader, drej 45 grader til venstre
r.turnAngle (-45)
elseif Side -40 %, hvis telefonen drejes sidelæns mellem -25 og -40 grader, drej til højre 5 grader
r.turnAngle (5);
elseif Side <-40 %, hvis telefonen drejes sidelæns mindre end -40 grader, drej 45 grader til venstre
r.turnAngle (45)
ende
%Hvis telefonen holdes i nærheden af lodret, skal du tage et billede og plotte det
hvis Pitch <-60 && image <= 9
r.bip
img = r.getImage;
delplot (3, 3, billede)
imshow (img)
ende
%bevæge sig frem og tilbage baseret på for- og bagretning
hvis Pitch> 15 && Pitch <35 %, hvis pitch mellem 15 og 35 grader bevæger sig kort afstand frem
%får lys kofangerdata, før du flytter
litBump = r.getLightBumpers;
hvis litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, hvis noget er foran roombaen og vil ramme, hvis det bevæger sig frem, lave støj og vise besked
r.beep ('C ^^, F#^, C ^^, F#^')
ellers %flytte
r.moveDistance (.03);
%Få bumperdata efter at have flyttet
Bump = r.getBumpers;
hvis Bump.right == 1 || Bump. venstre == 1 || Bump.front == 1
r.bip ('A, C, E')
r.moveDistance (-. 01)
ende
%få cliff sensor data
Cliff = r.getCliffSensors;
hvis Cliff. venstre> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, hvis noget udløser cliff -sensoren, behandler det som lava og sikkerhedskopierer
r.bip ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
ende
ende
elseif Pitch> 35 %, hvis pitch større 35 grader bevæger sig længere afstand
%får lys kofangerdata, før du flytter
litBump = r.getLightBumpers;
hvis litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, hvis noget er foran roomba'en og vil ramme, hvis det bevæger sig frem, lave støj og vise besked
r.beep ('C ^^, F#^, C ^^, F#^')
ellers %flytte
r.moveDistance (.3)
%Få bumperdata efter at have flyttet
Bump = r.getBumpers;
hvis Bump.right == 1 || Bump. venstre == 1 || Bump.front == 1 %hvis du rammer noget, larmer, viser meddelelse og tager backup
r.bip ('A, C, E')
r.moveDistance (-. 01)
ende
%får cliff sensordata efter flytning
Cliff = r.getCliffSensors;
hvis Cliff. venstre> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, hvis noget udløser cliff -sensoren, behandler det som lava og sikkerhedskopierer
r.bip ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
ende
ende
elseif Pitch -35 %, hvis pitch mellem -15 og -35 deg bevæger sig kort afstand tilbage
r.moveDistance (-. 03);
%får cliff sensordata efter flytning
Cliff = r.getCliffSensors;
hvis Cliff. venstre> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, hvis noget udløser cliff -sensoren, behandler det som lava og sikkerhedskopierer
r.bip ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
ende
elseif Pitch -60 %, hvis pitch mellem -35 og -60 deg bevæger sig tilbage længere afstand
r.moveDistance (-. 3)
%får cliff sensordata efter flytning
Cliff = r.getCliffSensors;
hvis Cliff. venstre> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, hvis noget udløser cliff -sensoren, behandler det som lava og sikkerhedskopierer
r.bip ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
ende
ende
ende
ende
Anbefalede:
Sådan gør du din Raspberry Pi til en fjernadgangsport: 6 trin
Sådan gør du din Raspberry Pi til en fjernadgangsport: Hej fyre! I lyset af den seneste gang har vores team på remote.it arbejdet hårdt på at brainstorme idéer til at gøre fjernarbejde smertefrit og tilgængeligt. Vi har fundet frem til remote.itPi SD -kortbilledet, som er et SD -kort, du kan sætte i et nyt
GØR DIN EGEN GPS -BASEREDE DIGITAL DASHBOARD TIL EBIKE ELLER ELEKTRISK MOTORCYKLUS: 13 trin
GØR DIN EGEN GPS -BASEREDE DIGITAL DASHBOARD TIL EBIKE ELLER ELEKTRISK MOTORCYKLUS: HI ALTID denne gang kom jeg med en ny instruerbar med både standalone display samt logger ved hjælp af arduino mega 2560 og Nextion Lcd displayOg til sporingsformål kan du også logge NMEA -sætninger af Gps i sdcardog selvfølgelig projekt
Sådan gør du din LG EnV 2 -mobiltelefon til et bærbart opkaldsmodem til din bærbare computer (eller skrivebord): 7 trin
Sådan gør du din LG EnV 2 -mobiltelefon til et bærbart opkaldsmodem til din bærbare computer (eller skrivebord): Vi har alle på et tidspunkt haft brug for at bruge internettet, hvor det bare ikke har været muligt, f.eks. I bilen , eller på ferie, hvor de opkræver et dyrt beløb i timen for at bruge deres wifi. endelig har jeg fundet på en simpel måde at få
Gør en ødelagt dvd -afspiller til et tilbehørskabinet til din hjemmebiograf -pc: 10 trin
Gør en ødelagt dvd-afspiller til et tilbehørskabinet til din hjemmebiograf-pc: For omkring $ 30 (forudsat at du allerede har et DVD-RW-drev og mediecenterfjernbetjening) kan du gøre en gammel ødelagt dvd-afspiller til et kabinet til din grimme/ hårde for at nå HTPC -tilbehør. Tag et kig på trin 2 for en omkostningsfordeling. Tilbage
Sådan gør du din tilpassede firmware MOD Din PSP: 12 trin
Sådan gør du din tilpassede firmware MOD Din PSP: I denne instruktive vil jeg vise dig, hvordan du opretter et pandora -batteri, en magisk hukommelsesstick og installationsprocessen! Jeg vil også vise dig, hvordan du konverterer dit Pandora -batteri tilbage til et normalt batteri! Video inkluderet! Materialer: -Først af alt din