Sisukord:
- Samm: koguge oma materjalid kokku
- Samm: laadige alla Roomba tööriistakastid MATLAB -i jaoks
- Samm: ühendage oma Roomba
- Samm: valige, kuidas soovite oma Roomba juhtida
- Samm: sõitke oma Roombaga
Video: Roomba muutmine Mars Roveriks: 5 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:46
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
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
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:
Muunduri jahedamaks muutmine: 6 sammu
Convert Counler En Anemómetro: Construir un anemómetro que nos permite medir la velocidad del viento de forma casera es posible ingeniando el uso de algunos artefactos de los que disponemos en casa, y los cuales se les pueda dar un nuevo uso (como el cooler de unjobin gabinete d
230 V vahelduvvoolupirni muutmine USB -toiteallikaks!: 6 sammu (piltidega)
230 V vahelduvvoolupirni teisendamine USB-toiteallikaks !: leidsin eBayst need korralikud leegiefektiga pirnid, mis vilguvad ja on sisseehitatud peene animatsiooniga. Neid toidab tavaliselt 85–265 V vahelduvvooluvõrgu sisend, kuid kaasaskantavate rakenduste jaoks, näiteks võlts leekiv taskulamp või latern pole ideaalne. Ma muudan
L-tek tantsupadja muutmine küsitluseks 1000 Hz juures Windowsis ja Linuxis: 9 sammu
L-tek tantsupadja muutmine küsitluseks 1000 hz-is Windowsis ja Linuxis: miks seda modi teha? Kui olete kunagi 125 BPM-i loo graafikule kerinud, võite küsida, mis on selle terava boi-ga? Miks langeb ajastus diskreetsetesse "piludesse"? ITG -l ja DDR -il on uskumatult kitsad ajastusaknad ja seetõttu
Mars Roomba projekt UTK: 4 sammu
Mars Roomba Project UTK: LAHTIÜTLUS: See toimib ainult siis, kui ROOMBA seadistatakse väga konkreetsel viisil, see juhend loodi ja kavatseti kasutada TENNESSEE ÜLIKOOLI JA FACULTY poolt kirjutatud ja s
Mars Roomba: 6 sammu
Mars Roomba: see juhend juhendab teid Raspberry Pi juhitava Roomba vaakumpotti käitamise suunas. Kasutatav operatsioonisüsteem on MATLABi kaudu