Innholdsfortegnelse:

Gjør Roomba til en Mars Rover: 5 trinn
Gjør Roomba til en Mars Rover: 5 trinn

Video: Gjør Roomba til en Mars Rover: 5 trinn

Video: Gjør Roomba til en Mars Rover: 5 trinn
Video: METAUFO AIRDROP КРИПТОВАЛЮТЫ ОТ МЕТАВСЕЛЕННОЙ PLAY TO EARN 2024, November
Anonim
Gjør Roomba til en Mars Rover
Gjør Roomba til en Mars Rover

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

Last ned Roomba verktøykasser for MATLAB
Last ned Roomba verktøykasser for MATLAB
Last ned Roomba verktøykasser for MATLAB
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

Velg hvordan du vil kontrollere Roomba
Velg hvordan du vil kontrollere Roomba
Velg hvordan du vil kontrollere Roomba
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: