Sisukord:

Roomba muutmine Mars Roveriks: 5 sammu
Roomba muutmine Mars Roveriks: 5 sammu

Video: Roomba muutmine Mars Roveriks: 5 sammu

Video: Roomba muutmine Mars Roveriks: 5 sammu
Video: Быстрая укладка плитки на стены в санузле. ПЕРЕДЕЛКА ХРУЩЕВКИ от А до Я #27 2024, November
Anonim
Muutke oma Roomba Mars Roveriks
Muutke oma Roomba Mars Roveriks

Samm: koguge oma materjalid kokku

Selle projekti lõpuleviimiseks peate koguma järgmised materjalid:

1 Roomba robot

1 Vaarika Pi komplekt

1 videokaamera

Juurdepääs MATLABile

Samm: laadige alla Roomba tööriistakastid MATLAB -i jaoks

Laadige alla Roomba tööriistakastid MATLAB -i jaoks
Laadige alla Roomba tööriistakastid MATLAB -i jaoks
Laadige alla Roomba tööriistakastid MATLAB -i jaoks
Laadige alla Roomba tööriistakastid MATLAB -i jaoks

Selle projekti lõpuleviimiseks vajalike tööriistakastide installimiseks käivitage järgmine kood.

funktsioon roombaPaigaldamine

clc;

% installitavate failide loendist

failid = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% asukoht, kust installida

options = veebivalikud ('CertificateFilename', ''); % käsib tal sertifikaadi nõudeid eirata

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Roomba installimine/värskendamine';

% kuvamise eesmärk ja saada kinnitust

viip = {

"See programm laadib alla need EF 230 Roomba failid:"

''

strjoin (failid, "")

''

"sellesse kausta:"

''

cd

''

'Kas sa tahad jätkata? '

};

piiks;

yn = questdlg (kiire,…

dlgTitle,…

"Jah", "Ei", "Jah");

kui ~ strcmp (yn, 'Jah'), tagasta; lõpp

% get olemasolevate failide loend

olemasolevad_failid = failid (cellfun (@exist, files)> 0);

kui ~ tühi (olemasolevad_failid)

% veenduge, et nende asendamine on tõesti ok

prompt = {'Asendate need failid:'

''

strjoin (olemasolevad_failid, "")

''

"Kas vahetada?"

};

piiks;

yn = questdlg (kiire,…

dlgTitle,…

"Jah", "Ei", "Jah");

kui ~ strcmp (yn, 'Jah'), tagasta; lõpp

lõpp

% failide allalaadimine

cnt = 0;

i = 1: pikkus (failid)

f = failid {i};

disp (['Allalaadimine' f]);

proovige

url = [server f];

veebisalvestus (f, url, valikud); % lisatud võimalusi, et vältida turvavigu

cnt = cnt + 1;

saak

disp (['Viga allalaadimisel' f]);

näiv = [f '.html'];

kui on olemas (näiv, 'fail') == 2

kustuta (näiv)

lõpp

lõpp

lõpp

kui cnt == pikkus (failid)

msg = 'Installimine õnnestus';

waitfor (msgbox (msg, dlgTitle));

muidu

msg = 'Paigaldusviga - üksikasju vaata käsuaknast';

waitfor (errordlg (msg, dlgTitle));

lõpp

end %roombaInstall

Samm: ühendage oma Roomba

Nüüd on aeg ühendada oma Roomba WiFi -ga. Roomba sisselülitamiseks või lähtestamiseks vajutage kahe sõrmega korraga Dock ja Spot nuppe. Seejärel käivitage oma robotiga ühenduse loomiseks MATLAB -i käsuaknas kood r = roomba (teie Roomba#). Kui olete selle käsu täitnud, peaks teie Roomba olema kasutamiseks valmis.

Samm: valige, kuidas soovite oma Roomba juhtida

Valige, kuidas soovite oma Roomba juhtida
Valige, kuidas soovite oma Roomba juhtida
Valige, kuidas soovite oma Roomba juhtida
Valige, kuidas soovite oma Roomba juhtida

Roomba juhtimiseks on kaks võimalust: autonoomne või nutitelefoni kasutamine kontrollerina.

Kui otsustate Roombaga autonoomselt sõita, peate kasutama kolme sisseehitatud andurit: kaljuandurid, põrkumisandurid ja valgusandurid.

Nutitelefoni kasutamiseks peate esmalt oma nutitelefoni arvutiga ühendama, järgides alltoodud samme.

MÄRKUS. Teie arvuti ja nutitelefon peavad korralikult ühendamiseks olema samas WiFi -võrgus!

1. Laadige MATLAB rakendus oma seadme rakendustepoest alla.

2. Tippige käsuaknasse „konnektor sisse” ja määrake parool, mis tuleb sisestada mõlemasse seadmesse.

3. Pärast seda annab MATLAB teile teie arvutite IP -aadressi. Peate minema nutitelefoni rakenduse MATLAB seadete lehele ja lisama arvuti, kasutades antud IP -aadressi ja varem sisestatud parooli.

4. Sisestage oma arvuti käsuaknasse kood m = mobiledev ja see peaks teie nutitelefoni lähtestama Roomba kontrolleriks.

5. Teie arvuti ja nutitelefon peaksid olema kohe kasutamiseks valmis.

Samm: sõitke oma Roombaga

Nüüd, kui teil on kõik Mars Roveri loomiseks vajalikud tööriistad, olete valmis oma koodi loomiseks. Oleme lisanud allpool näidiskoodi nii autonoomse sõidu kui ka nutitelefoniga juhitava sõidu jaoks.

Autonoomne sõit

funktsioon Explore_modified (r)

%sisendargumente: 1 roomba objekt, r

%väljundargumente: pole

%kirjeldus:

Funktsioon %kasutab autonoomse funktsiooni määramiseks lõpmatut tsüklit

Boti ümbruse uurimine.

%

%funciton annab roombale ka juhiseid, mida teha

%järgmistes olukordades: Ratas (id) kaotavad kontakti maapinnaga, an

%objekti tuvastatakse roboti ees või mõlemal küljel ja a

%äkiline langus tuvastatakse robotti ees või mõlemal küljel.

%

Tüüpilised juhised sisaldavad liikumiskäske, mille eesmärk on maksimeerida

%uurimine või avastatud ohu vältimine ja suhtlemiskäsud

%teavet robotite avastuste kohta (pildid), asukoht (graafik), %ja olek (luhtunud hoiatus) koos kasutajaga matlabi ja/või e -posti teel. Mitmed

Nautimiseks lisatakse %helikäsklusi.

%seadistamise meilivõimalused

mail = '[email protected]';

parool = 'EF230Roomba';

setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');

setpref ('Internet', 'E_mail', post);

setpref ('Internet', 'SMTP_kasutajanimi', post);

setpref ('Internet', 'SMTP_Password', parool);

rekvisiidid = 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.piiks ('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;

peegeldama_andmed = 2700; %määratud kaljuandurite võrdlusväärtus

lightBumper_datum = 200; %seatud valgus Põrkeraua andurite võrdlusväärtus

pos = [0, 0]; Muutuja %positsiooni salvestamiseks lähteseisundiga

nurk = 0; %määratud võrdlusnurk

võrgustik = 0; %netonurga nihe

i = 2; %iteraator ridade lisamiseks salvestusmuutujale

dist = 0;

r.setDriveVelocity (v, v); %start roomba liigub edasi

kuigi tõsi

Kalju = r.getCliffSensors;

Bump = r.getBumpers;

Valgus = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %genereerib 1 juhusliku nurga vahemikus 20 kuni 60 kraadi. Kasutatakse selleks, et bot ei jääks silmusesse kinni

%Mida teha, kui üks või mitu ratast kaotavad kontakti maapinnaga:

%peatage liikumine, saatke hoiatusmeil koos ümbruskonna pildiga, %ja küsige kasutajalt, kas jätkata või oodata abi

kui Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.peatus

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

r.piiks ('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, 'kinni.png');

%--------------------------

imfile = 'kinni.png';

positsioon = savepos (pos);

%---------------------------

sendmail (post, 'ABI!', 'Olen kaljul!', {imfile, position})

list = {'Jätka', 'Peata'};

idx = menu ('Mida ma peaksin tegema?', nimekiri);

kui idx == 2

murda

lõpp

%Mida teha, kui robot tuvastatakse objekti ees:

%peatus, tagasiliikumine, pildistamine, kasutaja avastamise eest hoiatamine

%e -posti teel, pöörake 90 kraadi ja jätkake uurimist

elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r.peatus;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

r.piiks ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')

img = r.getImage;

imwrite (img, 'FrontBump.png')

%--------------------------

imfile = 'FrontBump.png';

positsioon = savepos (pos);

%---------------------------

sendmail (post, „Hoiatus!”, „Ma leidsin midagi!”, {imfile, position})

nurk = 90;

netangle = netangle+nurk;

r.turnAngle (nurk);

r.setDriveVelocity (v, v);

%Mida teha, kui objekt tuvastatakse robotist vasakul:

%peatu, pööra objekti poole, varunda, pildista, hoiata

%e -posti teel avastamise kasutaja, pöörake 90 kraadi ja jätkake uurimist

elseif Light.leftFront> lightBumper_datum || Valgus.vasak> lightBumper_datum || Löök.vasak == 1

r.peatus;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

nurk = 30;

netangle = netangle+nurk;

r.turnAngle (nurk);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

r.piiks ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')

img = r.getImage;

imwrite (img, 'LeftBump.png')

%--------------------------

imfile = 'LeftBump.png';

positsioon = savepos (pos);

%---------------------------

sendmail (post, „Hoiatus!”, „Ma leidsin midagi!”, {imfile, position})

nurk = -90;

netangle = netangle+nurk;

r.turnAngle (nurk);

r.setDriveVelocity (v, v);

%Mida teha, kui objekt tuvastatakse robotist paremal:

%peatu, pööra objekti poole, varunda, pildista, hoiata

%e -posti teel avastamise kasutaja, pöörake 90 kraadi ja jätkake uurimist

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Muhk.parem == 1

r.peatus;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

nurk = -30;

netangle = netangle+nurk;

r.turnAngle (nurk);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

paus (1,5);

r.piiks ('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getImage;

imwrite (img, 'RightBump.png')

%--------------------------

imfile = 'RightBump.png';

positsioon = savepos (pos);

%---------------------------

sendmail (mail, 'Alert!', 'Leidsin midagi!', {imfile, position});

nurk = 90;

netangle = netangle+nurk;

r.turnAngle (nurk);

r.setDriveVelocity (v, v);

%Mida teha, kui bot tuvastatakse vasakul botast:

%peatu, liigu tahapoole, pööra paremale, jätka uurimist

elseif Cliff.left <peegeldama_andmed || Cliff.leftFront <peegeldama_datum

r.peatus;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saada x koordinaat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saab y koordinaadi

i = i+1;

nurk = -RandNurk;

netangle = netangle+nurk;

r.turnAngle (nurk);

r.setDriveVelocity (v, v);

%Mida teha, kui botti paremal pool tuvastatakse kalju:

%peatu, liigu tahapoole, pööra vasakule, jätka uurimist

elseif Cliff.right <peegeldama_andmed || Cliff.rightFront <peegeldama_datum

r.peatus;

dist = r.getDistance;

pos (i, 1) = dist * sind (nurk); %saada x koordinaat

pos (i, 2) = dist * cosd (nurk); %saab y koordinaadi

i = i+1;

r.moveDistance (-. 125);

nurk = RandAngle;

netangle = netangle+nurk;

r.turnAngle (nurk);

r.setDriveVelocity (v, v);

lõpp

lõpp

Nutitelefoni kontroller

Valikud = {'Autonoomne', 'Käsijuhtimine'}

Prompt = menu ('Kuidas soovite roverit juhtida?', Valikud)

m = mobiilseade

r = roomba (19)

kui viip == 1

Avasta (r)

muidu

kuigi tõsi

paus (.5)

Telefoniandmed = m. Orientatsioon;

Azi = Telefoniandmed (1);

Pigi = Telefoniandmed (2);

Külg = Telefoniandmed (3);

kui külg> 130 || Külg <-130 %, kui telefon on allapoole pööratud, peatage roomba ja väljuge

r.peatus

r. piiks ("C, C, C, C")

murda

elseif külg> 25 && külg <40 %, kui telefon on 25–40 kraadi külgsuunas pööratud, pöörake vasakule 5 kraadi

r.pöördenurk (-5);

elseif Külg> 40 %, kui telefon on üle 40 ° külgsuunas pööratud, pöörake vasakule 45 °

r.turnAngle (-45)

elseif Külg -40 %, kui telefon on külili keeratud vahemikus -25 kuni -40 kraadi, pöörake paremale 5 kraadi

r.pöördenurk (5);

elseif Külg <-40 %, kui telefon on keeratud küljele alla -40 kraadi, pöörake vasakule 45 kraadi

r.turnNurk (45)

lõpp

%Kui telefoni hoitakse vertikaali lähedal, tehke pilt ja joonistage see

kui Pigi <-60 && pilt <= 9

r.piiks

img = r.getImage;

alamjoon (3, 3, pilt)

imshow (img)

lõpp

%liigub edasi ja tagasi, tuginedes esi- ja tahapoole

kui Pitch> 15 && Pitch <35 %, kui samm vahemikus 15 kuni 35 ° liigub edasi lühikest vahemaad

%saavad enne liikumist kerged kaitseraua andmed

litBump = r.getLightBumpers;

kui litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, kui midagi on toa ees ja lööb edasi liikudes müra ja kuvab sõnumi

r.piiks ('C ^^, F#^, C ^^, F#^')

muidu %liigub

r.moveDistance (.03);

%Hankige kaitseraua andmed pärast kolimist

Bump = r.getBumpers;

kui Bump.right == 1 || Muhk.vasak == 1 || Bump.front == 1

r. piiks ('A, C, E')

r.moveDistance (-. 01)

lõpp

%saavad kaljuanduri andmeid

Kalju = r.getCliffSensors;

kui kalju vasakul> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, kui midagi käivitab kaljuandurit, käsitlege seda kui laavat ja varundage

r.piiks ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

lõpp

lõpp

elseif Kõrgus> 35 %, kui tõus on suurem kui 35 kraadi, liigub pikemat vahemaad edasi

%saavad enne liikumist kerged kaitseraua andmed

litBump = r.getLightBumpers;

kui litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, kui midagi on toa ees ja lööb edasi liikudes müra ja kuvab sõnumi

r.piiks ('C ^^, F#^, C ^^, F#^')

muidu %liigub

r.moveDistance (.3)

%Hangi kaitseraua andmed pärast kolimist

Bump = r.getBumpers;

kui Bump.right == 1 || Muhk.vasak == 1 || Bump.front == 1 %, kui midagi tabate, teeb häält, kuvab sõnumi ja varundab

r. piiks ("A, C, E")

r.moveDistance (-. 01)

lõpp

%saavad pärast liikumist kaljuanduri andmeid

Kalju = r.getCliffSensors;

kui kalju vasakul> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, kui midagi käivitab kaljuandurit, käsitlege seda kui laavat ja varundage

r.piiks ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

lõpp

lõpp

elseif Pitch -35 %, kui samm vahemikus -15 kuni -35 kraadi liigub lühikese vahemaa taha

r.moveDistance (-. 03);

%saavad pärast kolimist kaljuanduri andmeid

Kalju = r.getCliffSensors;

kui kalju vasakul> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, kui midagi käivitab kaljuandurit, käsitlege seda kui laavat ja varundage

r.piiks ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

lõpp

elseif Pitch -60 %, kui samm -35 ja -60 kraadi vahel liigub pikemat vahemaad tagasi

r.moveDistance (-. 3)

%saavad pärast kolimist kaljuanduri andmeid

Kalju = r.getCliffSensors;

kui kalju vasakul> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, kui midagi käivitab kaljuandurit, käsitlege seda kui laavat ja varundage

r.piiks ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

lõpp

lõpp

lõpp

lõpp

Soovitan: