Innholdsfortegnelse:
Video: Gjør Roomba til en Mars Rover: 5 trinn
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
Trinn 1: Samle materialet ditt
For å fullføre dette prosjektet må du samle følgende materialer:
1 Roomba -robot
1 bringebær Pi -sett
1 videokamera
Tilgang til MATLAB
Trinn 2: Last ned Roomba verktøykasser for MATLAB
Kjør følgende kode for å installere de nødvendige verktøykassene for å fullføre dette prosjektet.
funksjonsrombaInstall
clc;
% liste over filer som skal installeres
files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% sted å installere fra
options = weboptions ('CertificateFilename', ''); % fortell det å ignorere sertifikatkrav
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Roomba Install/Update';
% visningsformål og få bekreftelse
spør = {
'Dette programmet vil laste ned disse EF 230 Roomba -filene:'
''
strjoin (filer, '')
''
'til denne mappen:'
''
cd
''
'Vil du fortsette? '
};
pip;
yn = questdlg (spørsmål, …
dlgTitle,…
'Ja', 'Nei', 'Ja');
hvis ~ strcmp (yn, 'Ja'), returner; slutt
% få liste over filer som finnes
eksisterende filer = filer (cellfun (@exist, filer)> 0);
hvis ~ isempty (eksisterende_filer)
% sørg for at det er ok å bytte dem
prompt = {'Du erstatter disse filene:'
''
strjoin (eksisterende_filer, '')
''
'OK å bytte ut?'
};
pip;
yn = questdlg (spørsmål, …
dlgTitle,…
'Ja', 'Nei', 'Ja');
hvis ~ strcmp (yn, 'Ja'), returner; slutt
slutt
% last ned filene
cnt = 0;
for i = 1: lengde (filer)
f = filer {i};
disp (['Laster ned' f]);
prøve
url = [server f];
websave (f, url, alternativer); % lagt til alternativer for å unngå sikkerhetsfeil
cnt = cnt + 1;
å fange
disp (['Feil ved nedlasting' f]);
dummy = [f '.html'];
hvis finnes (dummy, 'fil') == 2
slett (dummy)
slutt
slutt
slutt
hvis cnt == lengde (filer)
msg = 'Installasjon vellykket';
waitfor (msgbox (msg, dlgTitle));
ellers
msg = 'Installasjonsfeil - se kommandovinduet for detaljer';
waitfor (errordlg (msg, dlgTitle));
slutt
slutt %roombaInstall
Trinn 3: Koble til Roomba
Nå er det på tide å koble til Roomba ved hjelp av WiFi. Trykk på Dock og Spot -knappene samtidig med to fingre for å slå på eller tilbakestille Roomba. Deretter kjører du koden r = roomba (# av din Roomba) i kommandovinduet på MATLAB for å koble til roboten din. Når du har utført denne kommandoen, bør Roomba din være klar til å gå.
Trinn 4: Velg hvordan du vil kontrollere Roomba
Det er to måter du kan kontrollere Roomba på: autonomt eller bruke en smarttelefon som kontroller.
Hvis du velger å kjøre Roomba autonomt, må du bruke de tre innebygde sensorene: klippesensorer, støtsensorer og lyssensorer.
For å bruke en smarttelefon må du først koble smarttelefonen til datamaskinen din ved å følge trinnene nedenfor.
MERK: Datamaskinen og smarttelefonen din må være på samme WiFi -nettverk for å kunne koble til ordentlig!
1. Last ned MATLAB -appen fra appbutikken på enheten din.
2. Skriv "connector on" i kommandovinduet og angi et passord som må skrives inn på begge enhetene.
3. Etter at du har gjort det, vil MATLAB gi deg datamaskinens IP -adresse. Du må gå inn på innstillingssiden i MATLAB -appen på smarttelefonen og legge til en datamaskin ved hjelp av den oppgitte IP -adressen og passordet du skrev inn tidligere.
4. I kommandovinduet på datamaskinen skriver du inn koden m = mobiledev, og dette bør initialisere smarttelefonen som en kontroller for Roomba.
5. Datamaskinen og smarttelefonen skal være klar til bruk nå.
Trinn 5: Kjør Roomba
Nå som du har alle de nødvendige verktøyene for å lage din Mars Rover, er du klar til å lage din egen kode. Vi har vedlagt en eksempelkode nedenfor for både autonom kjøring og smarttelefonstyrt kjøring.
Autonom kjøring
funksjon Explore_modified (r)
%input argumenter: 1 roomba objekt, r
%output -argumenter: ingen
%beskrivelse:
%funksjon benytter en uendelig mens loop for å tillate autonom
%utforskning av botens omgivelser.
%
%funciton gir også instruksjoner til roomba om hva du skal gjøre i
%følgende situasjoner: Hjul (e) mister kontakten med bakken, en
%objekt oppdages foran eller på hver side av boten, og a
%plutselig fall oppdages foran eller til hver side av boten.
%
%typiske instruksjoner inkluderer bevegelseskommandoer beregnet på å maksimere
%leting eller unngå en oppdaget fare og kommandoer for å kommunisere
%informasjon om robotenes funn (bilder), posisjon (graf), %og oppgi (strandet advarsel) med brukeren via matlab og/eller e -post. Flere
%lydkommandoer legges til for nytelse.
%konfigurere e -postmuligheter
mail = '[email protected]';
password = 'EF230Roomba';
setpref ('Internett', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Internett', 'E_mail', post);
setpref ('Internett', 'SMTP_Username', mail);
setpref ('Internett', 'SMTP_Password', passord);
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; %angitt referanseverdi for cliff -sensorer
lightBumper_datum = 200; %angitt lys Støtfanger sensorer referanseverdi
pos = [0, 0]; %variabel for posisjonslagring med datum initialisert
vinkel = 0; %angitt referansevinkel
netangle = 0; %nettovinkelforskyvning
i = 2; %iterator for å legge til rader i posisjonslagringsvariabelen
dist = 0;
r.setDriveVelocity (v, v); %start roomba fremover
mens det er sant
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Light = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %genererer 1 tilfeldig vinkel mellom 20 og 60 grader. Brukes for å forhindre at bot blir sittende fast i en loop
%Hva skal jeg gjøre hvis ett eller flere hjul mister kontakten med bakken:
%stopp bevegelsen, send en advarsels -e -post med bilde av omgivelsene, %og spør brukeren om han skal fortsette eller vente på hjelp
hvis Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r. stopp
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';
posisjon = savepos (pos);
%---------------------------
sendmail (mail, 'HJELP!', 'Jeg er strandet på en klippe!', {imfile, posisjon})
list = {'Fortsett', 'Stopp'};
idx = menu ('Hva skal jeg gjøre?', liste);
hvis idx == 2
gå i stykker
slutt
%Hva skal jeg gjøre hvis et objekt blir oppdaget foran boten:
%stopp, gå tilbake, ta bilde, varsle brukeren om oppdagelse
%via e -post, snu 90 grader, og fortsett å utforske
elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1
r. stopp;
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';
posisjon = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position})
vinkel = 90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Hva skal jeg gjøre hvis objektet oppdages til venstre for boten:
%stopp, snu mot objektet, sikkerhetskopier, ta bilde, varsel
%bruker av oppdagelse via e -post, snu 90 grader og fortsett å utforske
elseif Light.leftFront> lightBumper_datum || Light. venstre> lightBumper_datum || Bump. venstre == 1
r. stopp;
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';
posisjon = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position})
vinkel = -90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Hva skal jeg gjøre hvis objektet oppdages til høyre for bot:
%stopp, snu mot objektet, sikkerhetskopier, ta bilde, varsel
%bruker av oppdagelse via e -post, snu 90 grader og fortsett å utforske
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1
r. stopp;
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';
posisjon = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'I found something!', {imfile, position});
vinkel = 90;
netangle = netangle+vinkel;
r.turnAngle (vinkel);
r.setDriveVelocity (v, v);
%Hva skal jeg gjøre hvis det oppdages en klippe til venstre for boten:
%stopp, gå bakover, ta til høyre, fortsett å utforske
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r. stopp;
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);
%Hva skal jeg gjøre hvis klippen oppdages til høyre for bot:
%stopp, gå bakover, ta til venstre, fortsett å utforske
elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum
r. stopp;
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);
slutt
slutt
Smarttelefonkontroller
Options = {'Autonomous', 'Manual Control'}
Spør = meny ('Hvordan vil du kontrollere roveren?', Alternativer)
m = mobiledev
r = roomba (19)
hvis Spør == 1
Utforsk (r)
ellers
mens det er sant
pause (.5)
PhoneData = m. Oriasjon;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Side = PhoneData (3);
hvis side> 130 || Side <-130 %hvis telefonen vendes med forsiden ned, stopp roomba og avslutt sløyfen
r. stopp
r. pip ('C, C, C, C')
gå i stykker
elseif Side> 25 && Side <40 %hvis telefonen er snudd sidelengs mellom 25 og 40 grader, sving til venstre 5 grader
r.turnAngle (-5);
elseif Side> 40 %hvis telefonen er snudd sidelengs over 40 grader, sving 45 grader til venstre
r.turnAngle (-45)
elseif Side -40 %hvis telefonen er snudd sidelengs mellom -25 og -40 grader ta til høyre 5 grader
r.turnAngle (5);
elseif Side <-40 %hvis telefonen er snudd mindre enn -40 grader til venstre, sving 45 grader til venstre
r.turnAngle (45)
slutt
%Hvis telefonen holdes nær vertikalen, ta et bilde og plott det
hvis Pitch <-60 && image <= 9
r. pip
img = r.getImage;
delplot (3, 3, bilde)
imshow (img)
slutt
%gå fremover og bakover basert på for- og bakretningen
hvis Pitch> 15 && Pitch <35 %hvis pitch mellom 15 og 35 grader beveger seg fremover kort avstand
%får lys støtfangerdata før du flytter
litBump = r.getLightBumpers;
hvis litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %hvis noe er foran rombaen og vil treffe hvis det beveger seg fremover, lage støy og vise melding
r.beep ('C ^^, F#^, C ^^, F#^')
annet %flytte
r.moveDistance (.03);
Få støtfangerdata etter å ha flyttet
Bump = r.getBumpers;
hvis Bump.right == 1 || Bump. venstre == 1 || Bump.front == 1
r. pip ('A, C, E')
r.moveDistance (-. 01)
slutt
%få cliff sensor data
Cliff = r.getCliffSensors;
hvis Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %hvis noe utløser cliff -sensoren, behandler det som lava og sikkerhetskopierer
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
slutt
slutt
ellers hvis Stigning> 35 %hvis stigning større 35 grader beveger seg fremover lengre avstand
%får lys støtfangerdata før du flytter
litBump = r.getLightBumpers;
hvis litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %hvis noe er foran rombaen og vil treffe hvis det beveger seg frem, lage støy og vise melding
r.beep ('C ^^, F#^, C ^^, F#^')
annet %flytte
r.moveDistance (.3)
Få støtfangerdata etter å ha flyttet
Bump = r.getBumpers;
hvis Bump.right == 1 || Bump. venstre == 1 || Bump.front == 1 %hvis du treffer noe, brå, vise melding og sikkerhetskopiere
r. pip ('A, C, E')
r.moveDistance (-. 01)
slutt
%får cliff sensor data etter flytting
Cliff = r.getCliffSensors;
hvis Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %hvis noe utløser cliff -sensoren, behandler det som lava og sikkerhetskopierer
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
slutt
slutt
elseif Pitch -35 %hvis tonehøyde mellom -15 og -35 grader flytter bakover kort avstand
r.moveDistance (-. 03);
%får cliff sensor data etter flytting
Cliff = r.getCliffSensors;
hvis Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %hvis noe utløser cliff -sensoren, behandler det som lava og sikkerhetskopierer
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
slutt
elseif Pitch -60 %hvis tonehøyde mellom -35 og -60 grader flytter bakover lengre avstand
r.moveDistance (-. 3)
%får cliff sensor data etter flytting
Cliff = r.getCliffSensors;
hvis Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %hvis noe utløser cliff -sensoren, behandler det som lava og sikkerhetskopierer
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
slutt
slutt
slutt
slutt