Sisällysluettelo:
- Vaihe 1: Kerää materiaalit
- Vaihe 2: Lataa Roomban työkalupakit MATLABille
- Vaihe 3: Yhdistä Roombaasi
- Vaihe 4: Valitse, miten haluat hallita Roombaasi
- Vaihe 5: Aja Roombaasi
Video: Roomban muuttaminen Mars Roveriksi: 5 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 08:59
Vaihe 1: Kerää materiaalit
Tämän projektin loppuun saattamiseksi sinun on kerättävä seuraavat materiaalit:
1 Roomba -robotti
1 Vadelma Pi -sarja
1 Videokamera
Pääsy MATLABiin
Vaihe 2: Lataa Roomban työkalupakit MATLABille
Suorita seuraava koodi asentaaksesi tarvittavat työkalupakit tämän projektin loppuun saattamiseksi.
toiminto roombaAsenna
clc;
% luettelo asennettavista tiedostoista
tiedostot = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% sijainti asennettavaksi
options = weboptions ('CertificateFilename', ''); % käskee sitä ohittamaan varmennevaatimukset
palvelin = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Roomban asennus/päivitys';
% näytön tarkoitus ja saat vahvistuksen
kehote = {
'Tämä ohjelma lataa nämä EF 230 Roomba -tiedostot:'
''
strjoin (tiedostot, '')
''
"tähän kansioon:"
''
CD
''
'Haluatko jatkaa? ''
};
piippaus;
yn = questdlg (kehote,…
dlgTitle,…
'Kyllä', 'Ei', 'Kyllä');
jos ~ strcmp (yn, 'Kyllä'), palaa; loppuun
% get luettelo olemassa olevista tiedostoista
olemassa olevat_tiedostot = tiedostot (cellfun (@olemassa, tiedostot)> 0);
jos ~ isempty (olemassa olevat_tiedostot)
% varmista, että niiden vaihtaminen on todella ok
prompt = {'Olet korvaamassa näitä tiedostoja:'
''
strjoin (olemassa olevat_tiedostot, '')
''
"OK vaihtaa?"
};
piippaus;
yn = questdlg (kehote,…
dlgTitle,…
'Kyllä', 'Ei', 'Kyllä');
jos ~ strcmp (yn, 'Kyllä'), palaa; loppuun
loppuun
% lataa tiedostot
cnt = 0;
i = 1: pituus (tiedostot)
f = tiedostot {i};
disp (['Ladataan' f]);
yrittää
url = [palvelin f];
web -tallennus (f, url, vaihtoehdot); % lisävaihtoehtoja suojausvirheiden välttämiseksi
cnt = cnt + 1;
saada kiinni
disp (['Virhe ladattaessa' f]);
nukke = [f '.html'];
jos olemassa (nukke, 'tiedosto') == 2
poista (nukke)
loppuun
loppuun
loppuun
jos cnt == pituus (tiedostot)
msg = 'Asennus onnistui';
odota (msgbox (msg, dlgTitle));
muu
msg = 'Asennusvirhe - katso lisätietoja komentoikkunasta';
waitfor (errordlg (msg, dlgTitle));
loppuun
end %roombaInstall
Vaihe 3: Yhdistä Roombaasi
Nyt on aika muodostaa yhteys Roombaasi WiFi -yhteyden kautta. Käynnistä tai nollaa Roomba painamalla kaksi sormea samanaikaisesti Dock- ja Spot -painikkeita. Suorita seuraavaksi MATLABin komentoikkunassa koodi r = roomba (Roomban numero) muodostaaksesi yhteyden robottiisi. Kun olet suorittanut tämän komennon, Roomban pitäisi olla käyttövalmis.
Vaihe 4: Valitse, miten haluat hallita Roombaasi
Voit hallita Roombaasi kahdella tavalla: itsenäisesti tai käyttämällä älypuhelinta ohjaimena.
Jos päätät ajaa Roombaa itsenäisesti, sinun on käytettävä kolmea sisäänrakennettua anturia: kallioanturit, törmäysanturit ja valoanturit.
Jotta voit käyttää älypuhelinta, sinun on ensin liitettävä älypuhelin tietokoneeseen noudattamalla alla olevia ohjeita.
HUOMAUTUS: Tietokoneesi ja älypuhelimesi on oltava samassa WiFi -verkossa, jotta ne muodostavat yhteyden oikein!
1. Lataa MATLAB -sovellus laitteesi sovelluskaupasta.
2. Kirjoita komentoikkunaan "connector on" ja aseta salasana, joka on syötettävä molempiin laitteisiin.
3. Tämän jälkeen MATLAB antaa tietokoneesi IP -osoitteen. Sinun on siirryttävä älypuhelimesi MATLAB -sovelluksen asetussivulle ja lisättävä tietokone käyttämällä annettua IP -osoitetta ja aiemmin antamaasi salasanaa.
4. Kirjoita tietokoneen komentoikkunaan koodi m = mobiledev, jolloin älypuhelimesi alustetaan Roomban ohjaimeksi.
5. Tietokoneesi ja älypuhelimesi pitäisi olla käyttövalmiina nyt.
Vaihe 5: Aja Roombaasi
Nyt kun sinulla on kaikki tarvittavat työkalut Mars Roverin luomiseen, olet valmis luomaan oman koodisi. Olemme liittäneet alla esimerkkikoodin sekä itsenäiselle ajamiselle että älypuhelimella ohjattavalle ajamiselle.
Itsenäinen ajo
toiminto Explore_modified (r)
%syöttöargumentteja: 1 roomba -objekti, r
%lähtöargumentteja: ei mitään
%kuvaus:
%-funktio käyttää ääretöntä while -silmukkaa, jotta se olisi itsenäinen
%tutkia botin ympäristöä.
%
%funciton antaa myös roomballe ohjeita siitä, mitä tehdä
%seuraavissa tilanteissa: Pyörät menettävät kosketuksen maahan, an
%objekti havaitaan botin edessä tai kummallakin puolella, ja a
%äkillinen pudotus havaitaan botin edessä tai kummallakin puolella.
%
%tyypillisistä ohjeista sisältää maksimoitavia liikekomentoja
%tutkia tai välttää havaittu vaara ja kommunikoida
%tietoa botien löydöistä (kuvat), sijainti (kaavio), %ja tila (lukittu varoitus) käyttäjän kanssa matlabin ja/tai sähköpostin kautta. Useita
%äänikomentoja lisätään nautinnon vuoksi.
%sähköpostiasetukset
mail = '[email protected]';
password = 'EF230Roomba';
setpref ('Internet', 'SMTP_palvelin', 'smtp.gmail.com');
setpref ('Internet', 'Sähköposti', posti);
setpref ('Internet', 'SMTP_Käyttäjänimi', posti);
setpref ('Internet', 'SMTP_Password', salasana);
rekvisiitta = 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.piip ('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;
heijastuspiste = 2700; %asetettu kallioanturien ohjearvo
lightBumper_datum = 200; %asetettu valo Puskurianturien viitearvo
pos = [0, 0]; %muuttuja sijainnin tallennukseen nollapisteen ollessa alustettu
kulma = 0; %asetettu vertailukulma
netangle = 0; %nettokulman siirtymä
i = 2; %iteraattori rivien lisäämiseksi sijaintimuuttujaan
dist = 0;
r.setDriveVelocity (v, v); %aloita roomba eteenpäin
vaikka totta
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Valo = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %luo yhden satunnaisen kulman välillä 20 ja 60 astetta. Käytetään estämään botti juuttumasta silmukkaan
%Mitä tehdä, jos yksi tai useampi pyörä menettää kosketuksen maahan:
%pysäytä liike, lähetä varoitusviesti, jossa on kuva ympäristöstä, %ja kysy käyttäjältä, haluatko jatkaa vai odottaa apua
jos Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r. stop
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
r.piip ('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, 'kiinni.png');
%--------------------------
imfile = 'jumissa.png';
sijainti = savepos (pos);
%---------------------------
sendmail (posti, 'APU!', 'Olen jäillä kalliolla!', {imfile, position})
list = {'Jatka', 'Pysäytä'};
idx = menu ('Mitä minun pitäisi tehdä?', luettelo);
jos idx == 2
tauko
loppuun
%Mitä tehdä, jos botti havaitsee kohteen:
%pysähtyä, siirtyä taaksepäin, ottaa kuva, varoittaa käyttäjää löydöistä
%sähköpostitse, käännä 90 astetta ja jatka tutkimista
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); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
r.piip ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')
img = r.getImage;
imwrite (img, 'FrontBump.png')
%--------------------------
imfile = 'FrontBump.png';
sijainti = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'Löysin jotain!', {imfile, position})
kulma = 90;
netangle = netangle+kulma;
r.turnAngle (kulma);
r.setDriveVelocity (v, v);
%Mitä tehdä, jos objekti havaitaan botin vasemmalla puolella:
%pysähdy, käänny kohti esinettä, varmuuskopioi, ota kuva, hälytys
%löydettyjen sähköpostin käyttäjä, käännä 90 astetta ja jatka tutkimista
elseif Light.leftFront> lightBumper_datum || Valo.vasen> lightBumper_datum || Koho.vasen == 1
r. stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
kulma = 30;
netangle = netangle+kulma;
r.turnAngle (kulma);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
r. piippaus ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')
img = r.getImage;
imwrite (img, 'LeftBump.png')
%--------------------------
imfile = 'LeftBump.png';
sijainti = savepos (pos);
%---------------------------
sendmail (posti, 'Hälytys!', 'Löysin jotain!', {imfile, position})
kulma = -90;
netangle = netangle+kulma;
r.turnAngle (kulma);
r.setDriveVelocity (v, v);
%Mitä tehdä, jos objekti havaitaan botin oikealla puolella:
%pysähdy, käänny kohti esinettä, varmuuskopioi, ota kuva, hälytys
%löydettyjen sähköpostin käyttäjä, käännä 90 astetta ja jatka tutkimista
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Kolahtaa.oikea == 1
r. stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
kulma = -30;
netangle = netangle+kulma;
r.turnAngle (kulma);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
tauko (1,5);
r.piip ('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
sijainti = savepos (pos);
%---------------------------
sendmail (mail, 'Alert!', 'Löysin jotain!', {imfile, position});
kulma = 90;
netangle = netangle+kulma;
r.turnAngle (kulma);
r.setDriveVelocity (v, v);
%Mitä tehdä, jos kallio havaitaan botin vasemmalla puolella:
%stop, siirry taaksepäin, käänny oikealle, jatka tutkimista
elseif Cliff.left <ref_datum || Cliff.leftFront <heijastu_datum
r. stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %saa x -koordinaatin
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %saa y -koordinaatin
i = i+1;
kulma = -RandAngle;
netangle = netangle+kulma;
r.turnAngle (kulma);
r.setDriveVelocity (v, v);
%Mitä tehdä, jos kallio havaitaan botin oikealla puolella:
%stop, siirry taaksepäin, käänny vasemmalle, jatka tutkimista
elseif Cliff.right <heijastu_datum || Cliff.rightFront <heijastu_datum
r. stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (kulma); %saa x -koordinaatin
pos (i, 2) = dist * cosd (kulma); %saa y -koordinaatin
i = i+1;
r.moveDistance (-. 125);
kulma = RandAngle;
netangle = netangle+kulma;
r.turnAngle (kulma);
r.setDriveVelocity (v, v);
loppuun
loppuun
Älypuhelimen ohjain
Asetukset = {'Autonomous', 'Manual control'}
Prompt = menu ('Kuinka haluat ohjata roveria?', Asetukset)
m = mobiililaite
r = roomba (19)
jos kehote == 1
Tutkimusmatkailija)
muu
vaikka totta
tauko (.5)
PhoneData = m. Orientation;
Azi = Puhelintiedot (1);
Pitch = Puhelintiedot (2);
Sivu = Puhelintiedot (3);
jos sivu> 130 || Sivu <-130 %, jos puhelin käännetään kuvapuoli alaspäin, pysäytä roomba ja poistu silmukka
r. stop
r. piippaus ('C, C, C, C')
tauko
elseif Sivu> 25 && Sivu <40 %, jos puhelinta käännetään sivuttain 25-40 astetta, käänny vasemmalle 5 astetta
r.kierroskulma (-5);
elseif Sivu> 40 %, jos puhelinta käännetään sivulle yli 40 astetta, käänny vasemmalle 45 astetta
r.turnAngle (-45)
elseif Sivu -40 %, jos puhelinta käännetään sivuttain -25 ja -40 asteen välillä, käänny oikealle 5 astetta
r. kääntökulma (5);
elseif Sivu <-40 %, jos puhelinta käännetään sivuttain alle -40 astetta, käänny vasemmalle 45 astetta
r.turnAngle (45)
loppuun
%Jos puhelinta pidetään pystysuoran lähellä, ota kuva ja piirrä se
jos Pitch <-60 && image <= 9
r. piippaus
img = r.getImage;
osajuoni (3, 3, kuva)
imshow (img)
loppuun
%siirtyy eteen- ja taaksepäin etu- ja taka -asennon perusteella
jos Pitch> 15 && Pitch <35 %, jos nousu 15 ja 35 ° välillä siirtyy eteenpäin lyhyen matkan
%saa kevyitä puskuritietoja ennen siirtämistä
litBump = r.getLightBumpers;
jos palaaBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, jos jotain on roomban edessä ja osuu, jos se liikkuu eteenpäin, aiheuttaa melua ja näyttää viestin
r.piip ('C ^^, F#^, C ^^, F#^')
muut %liikkua
r.moveDistance (.03);
%Hae puskuritiedot siirron jälkeen
Bump = r.getBumpers;
jos Bump.right == 1 || Bump.left == 1 || Bump.front == 1
r. piippaus ('A, C, E')
r.moveDistance (-. 01)
loppuun
%saa kalliotunnistintietoja
Cliff = r.getCliffSensors;
jos kallio vasemmalle> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, jos jokin laukaisee kallioanturin, käsittele sitä laavana ja varmuuskopioi
r. piippaus ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
loppuun
loppuun
elseif Pitch> 35 %, jos nousu on suurempi kuin 35 astetta, siirry eteenpäin pidemmälle matkalle
%saa kevyitä puskuritietoja ennen siirtämistä
litBump = r.getLightBumpers;
jos palaaBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, jos jotain on roomban edessä ja osuu, jos se liikkuu eteenpäin, aiheuttaa melua ja näyttää viestin
r.piip ('C ^^, F#^, C ^^, F#^')
muut %liikkua
r.moveDistance (.3)
%Hae puskuritiedot siirron jälkeen
Bump = r.getBumpers;
jos Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, jos osut johonkin, josta kuuluu ääni, näytetään viesti ja varmuuskopioidaan
r. piippaus ('A, C, E')
r.moveDistance (-. 01)
loppuun
%saa kalliotunnistetietoja siirron jälkeen
Cliff = r.getCliffSensors;
jos kallio vasemmalle> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, jos jokin laukaisee kallioanturin, käsittele sitä laavana ja varmuuskopioi
r. piippaus ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-.31)
loppuun
loppuun
elseif Pitch -35 %, jos nousu -15 ja -35 asteen välillä siirtyy lyhyen matkan taaksepäin
r.moveDistance (-. 03);
%saa kalliotunnistetietoja siirron jälkeen
Cliff = r.getCliffSensors;
jos kallio vasemmalle> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, jos jokin laukaisee kallioanturin, käsittele sitä laavana ja varmuuskopioi
r. piippaus ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
loppuun
elseif Pitch -60 %, jos nousu -35 ja -60 asteen välillä siirtyy taaksepäin pidemmän matkan
r.moveDistance (-. 3)
%saa kalliotunnistetietoja siirron jälkeen
Cliff = r.getCliffSensors;
jos kallio vasemmalle> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, jos jokin laukaisee kallioanturin, käsittele sitä laavana ja varmuuskopioi
r. piippaus ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
loppuun
loppuun
loppuun
loppuun
Suositeltava:
Raspberry Pi: n muuttaminen etäkäyttöyhdyskäytäväksi: 6 vaihetta
Raspberry Pi: n muuttaminen etäkäyttöyhdyskäytäväksi: Hei kaverit! Viimeaikaisten tapahtumien valossa Remote.it-tiimimme on ollut ahkera aivoriihi ideoiden tekemiseksi etätyöstä kivuttomaksi ja helppokäyttöiseksi. Olemme keksineet remote.itPi SD -kortin kuvan, joka on SD -kortti, jonka voit laittaa uuteen
Servon muuttaminen 360 ° kierto- ja vaihdemoottoriksi: 4 vaihetta
Servon muuttaminen 360 °: n kiertoon ja vaihdemoottoriin: tässä ohjeessa näytän sinulle, miten voit muuttaa 9 g: n servoa 360: n kiertoon. Tämä on erittäin hyödyllistä, jos aiot tehdä pienen roverin minimaalisesti käyttämällä gpio -mikrokontrolleria. myös jos sinulla on vaurioitunut servo, voit muuntaa ne
Stepperin muuttaminen peliliikkeiksi: 4 vaihetta
Stepperin muuntaminen peliliikkeiksi: IntroTämä laite muuntaa liikkeen kotitekoisesta stepperistä (step machine) peliliikkeeksi. Se toimii kaikissa peleissä, jotka saavat ("w") eteenpäin. Se voi toimia myös VR -peleissä, jos ne hyväksyvät näppäimistön. Luultavasti voitti
Roomblock: ROS -navigoinnin oppimisalusta Roomban, Raspberry Pi: n ja RPLIDARin kanssa: 9 vaihetta (kuvilla)
Roomblock: ROS -navigoinnin oppimisalusta Roomban, Raspberry Pi: n ja RPLIDAR: Mikä tämä on? &Quot; Roomblock " on robottialusta, joka koostuu Roombasta, Raspberry Pi 2: sta, lasersensorista (RPLIDAR) ja mobiiliparistosta. Asennuskehys voidaan valmistaa 3D -tulostimilla. ROS -navigointijärjestelmän avulla voit tehdä huoneiden kartan ja käyttää
1. tai 2. sukupolven Roomban puhdistus: 8 vaihetta
1. tai 2. sukupolven Roomban puhdistaminen: Puhdas robotti on onnellinen robotti