Sisällysluettelo:

Roomban muuttaminen Mars Roveriksi: 5 vaihetta
Roomban muuttaminen Mars Roveriksi: 5 vaihetta

Video: Roomban muuttaminen Mars Roveriksi: 5 vaihetta

Video: Roomban muuttaminen Mars Roveriksi: 5 vaihetta
Video: TANGERINE DREAM MARS POLARIS (DOUBLE CD) 2024, Marraskuu
Anonim
Roomban muuttaminen Mars Roveriksi
Roomban muuttaminen Mars Roveriksi

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

Lataa Roomban työkalupakit MATLABille
Lataa Roomban työkalupakit MATLABille
Lataa Roomban työkalupakit MATLABille
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

Valitse, miten haluat hallita Roombaasi
Valitse, miten haluat hallita Roombaasi
Valitse, miten haluat hallita Roombaasi
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: