Innholdsfortegnelse:
- Trinn 1: Samle materialet ditt
- Trinn 2: Last ned Roomba verktøykasser for MATLAB
- Trinn 3: Koble til Roomba
- Trinn 4: Velg hvordan du vil kontrollere Roomba
- Trinn 5: Kjør Roomba
Video: Gjør Roomba til en Mars Rover: 5 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:21
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
Anbefalt:
Mars Roomba Project UTK: 4 trinn
Mars Roomba Project UTK: ANSVARSFRASKRIVELSE: DETTE KUNNE VIRKE HVIS ROOMBA ER SET OPP I AVERY SPECIFIC WAY, DENNE INSTRUKTABLE VAR SKAPT FOR OG HENSIKT TIL BRUK AV UNIVERSITETET I TENNESSEE STUDENTER OG FAKULTYT Denne koden brukes til å sette opp en lokal skrevet og s
Fra Roomba til Rover på bare 5 trinn !: 5 trinn
Fra Roomba til Rover på bare 5 trinn !: Roomba -roboter er en morsom og enkel måte å dyppe tærne i robotikkens verden. I denne instruksen vil vi detaljere hvordan du konverterer en enkel Roomba til en kontrollerbar rover som samtidig analyserer omgivelsene. Deleliste1.) MATLAB2.) Roomb
Slik gjør du datamaskinen raskere og gjør den raskere !: 5 trinn
Slik gjør du datamaskinen raskere og gjør den raskere !: Enkel å følge instruksjonene for hvordan du enkelt kan øke hastigheten på datamaskinen
Glassmontert videovisning til ett øye - Gjør deg selv til en Borg: 12 trinn
Glassmontert videodisplay til ett øye-Gjør deg selv til en Borg: OPPDATERING 15. mars 2013: Jeg har en nyere bedre versjon av dette nå i en annen Instructable: https: //www.instructables.com/id/DIY-Google-Glasses .. Tro det eller ikke, det virkelige formålet med dette prosjektet var ikke å spille på å være en Borg. Jeg trengte å lage noen
Gjør kameraet ditt til "militær Nightvision", legg til Nightvision -effekt eller lag NightVision -modus på alle kameraer !!!: 3 trinn
Gjør kameraet ditt til "militær Nightvision", Legg til Nightvision -effekt eller opprett NightVision "-modus på et hvilket som helst kamera !!! *Hvis du trenger hjelp, vennligst send en e -post til: [email protected] Jeg snakker engelsk, fransk, japansk, spansk, og jeg kan noen andre språk hvis du