Indholdsfortegnelse:

Gør din Roomba til en Mars Rover: 5 trin
Gør din Roomba til en Mars Rover: 5 trin

Video: Gør din Roomba til en Mars Rover: 5 trin

Video: Gør din Roomba til en Mars Rover: 5 trin
Video: Йога для начинающих дома с Алиной Anandee #2. Здоровое гибкое тело за 40 минут. Универсальная йога. 2024, November
Anonim
Gør din Roomba til en Mars Rover
Gør din Roomba til en Mars Rover

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

Download Roomba Toolboxes til MATLAB
Download Roomba Toolboxes til MATLAB
Download Roomba Toolboxes til MATLAB
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

Vælg, hvordan du vil styre din Roomba
Vælg, hvordan du vil styre din Roomba
Vælg, hvordan du vil styre din Roomba
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: