Kazalo:

Pretvarjanje vaše Roombe v Mars Rover: 5 korakov
Pretvarjanje vaše Roombe v Mars Rover: 5 korakov

Video: Pretvarjanje vaše Roombe v Mars Rover: 5 korakov

Video: Pretvarjanje vaše Roombe v Mars Rover: 5 korakov
Video: Дэниел Шмахтенбергер: Уничтожат ли нас технологии? 2024, November
Anonim
Pretvorite svojo Roombo v Mars Rover
Pretvorite svojo Roombo v Mars Rover

1. korak: Zberite svoje materiale

Za dokončanje tega projekta boste morali zbrati naslednje materiale:

1 Roomba Robot

1 Raspberry Pi komplet

1 videokamera

Dostop do MATLAB -a

2. korak: Prenesite orodjarne Roomba za MATLAB

Prenesite orodjarne Roomba za MATLAB
Prenesite orodjarne Roomba za MATLAB
Prenesite orodjarne Roomba za MATLAB
Prenesite orodjarne Roomba za MATLAB

Zaženite naslednjo kodo, če želite namestiti potrebna orodjarna za dokončanje tega projekta.

funkcija roombaInstall

clc;

% seznam datotek za namestitev

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

% lokacije za namestitev

options = weboptions ('CertificateFilename', ''); % mu povejte, naj prezre zahteve za potrdila

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

dlgTitle = 'Namestitev/posodobitev Roombe';

% prikaz namena in prejem potrditve

poziv = {

'Ta program bo prenesel te datoteke EF 230 Roomba:'

''

strjoin (datoteke, '')

''

'v to mapo:'

''

cd

''

'Ali želite nadaljevati? '

};

pisk;

yn = questdlg (poziv, …

dlgTitle,…

„Da“, „Ne“, „Da“);

če ~ strcmp (yn, 'Da'), vrni; konec

% dobite seznam obstoječih datotek

obstoječe datoteke = datoteke (cellfun (@exist, files)> 0);

če je ~ isempty (obstoječi_datoteke)

% se prepričajte, da jih je res v redu zamenjati

prompt = {'Zamenjate te datoteke:'

''

strjoin (obstoječi_datoteka, '')

''

'V redu za zamenjavo?'

};

pisk;

yn = questdlg (poziv, …

dlgTitle,…

„Da“, „Ne“, „Da“);

če ~ strcmp (yn, 'Da'), vrni; konec

konec

% prenesite datoteke

cnt = 0;

za i = 1: dolžina (datoteke)

f = datoteke {i};

disp (['Prenos' f]);

poskusite

url = [strežnik f];

websave (f, url, možnosti); % dodanih možnosti za preprečitev varnostnih napak

cnt = cnt + 1;

ulov

disp (['Napaka pri nalaganju' f]);

lutka = [f '.html'];

če obstaja (lažna, 'datoteka') == 2

izbriši (lutka)

konec

konec

konec

če je cnt == dolžina (datoteke)

msg = 'Namestitev je uspela';

waitfor (msgbox (msg, dlgTitle));

drugače

msg = 'Napaka pri namestitvi - za podrobnosti glej ukazno okno';

waitfor (errordlg (msg, dlgTitle));

konec

end %roombaInstall

3. korak: Povežite se s svojo Roombo

Zdaj je čas, da se povežete z Roombo prek WiFi. Z dvema prstoma hkrati pritisnite gumb Dock in Spot, da vklopite ali ponastavite napravo Roomba. Nato zaženite kodo r = roomba (# vaše Roombe) v ukaznem oknu programa MATLAB, da se povežete z vašim robotom. Ko izvedete ta ukaz, mora biti vaša naprava Roomba pripravljena za uporabo.

4. korak: Izberite, kako želite upravljati svojo Roombo

Izberite, kako želite upravljati svojo Roombo
Izberite, kako želite upravljati svojo Roombo
Izberite, kako želite upravljati svojo Roombo
Izberite, kako želite upravljati svojo Roombo

Roombo lahko upravljate na dva načina: samostojno ali s pomočjo pametnega telefona kot krmilnika.

Če se odločite za avtonomno vožnjo z Roombo, boste morali uporabiti tri vgrajene senzorje: senzorje pečine, senzorje udarcev in senzorje svetlobe.

Če želite uporabljati pametni telefon, morate najprej povezati pametni telefon z računalnikom, tako da sledite spodnjim korakom.

OPOMBA: Za pravilno povezavo morata biti računalnik in pametni telefon v istem omrežju WiFi!

1. Prenesite aplikacijo MATLAB iz trgovine z aplikacijami v svoji napravi.

2. V ukazno okno vnesite "konektor vklopljen" in nastavite geslo, ki ga boste morali vnesti v obe napravi.

3. Po tem vam MATLAB posreduje IP naslov vaših računalnikov. V aplikaciji MATLAB na pametnem telefonu morate odpreti stran z nastavitvami in dodati računalnik z danim naslovom IP in geslom, ki ste ga vnesli prej.

4. V ukazno okno v računalniku vnesite kodo m = mobiledev in to bi moralo inicializirati vaš pametni telefon kot krmilnik za vašo Roombo.

5. Računalnik in pametni telefon morata biti pripravljena.

5. korak: Vozite svojo Roombo

Zdaj, ko imate vsa potrebna orodja za izdelavo vašega Mars Roverja, ste pripravljeni ustvariti svojo kodo. Spodaj smo priložili primer kode za avtonomno vožnjo in vožnjo s pametnim telefonom.

Avtonomna vožnja

funkcija Explore_modified (r)

%vhodnih argumentov: 1 predmet roomba, r

%izhodnih argumentov: nič

%opis:

%funkcija uporablja neskončno zanko while za avtonomijo

%raziskovanja okolice bota.

%

%funciton daje roombi tudi navodila, kaj naj naredi

%naslednjih situacij: kolesa izgubijo stik s tlemi, an

%objekta je zaznan pred ali na strani bota in a

%nenaden padec je zaznan pred ali na strani bota.

%

%tipičnih navodil vključuje ukaze za premik, namenjene povečanju

%raziskovanja ali izogibanja zaznani nevarnosti in ukazi za komunikacijo

%informacij o odkritjih botov (slike), položaju (graf), %in stanje (nasedlo opozorilo) z uporabnikom prek matlaba in/ali e -pošte. Več

%zvočnih ukazov je dodanih za uživanje.

%nastavitev e -poštnih zmogljivosti

mail = '[email protected]';

geslo = 'EF230Roomba';

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

setpref ('Internet', 'E_mail', pošta);

setpref ('Internet', 'SMTP_Uporabniško ime', pošta);

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

rekviziti = 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 = 0,1;

odraža_datum = 2700; %nastavljena referenčna vrednost senzorjev pečine

lightBumper_datum = 200; %nastavljena referenčna vrednost senzorjev odbijača

pos = [0, 0]; %spremenljivka za shranjevanje položaja z inicializirano referenčno točko

kot = 0; %nastavljen referenčni kot

neopredeljeno = 0; %neto premik kota

i = 2; %iterator za dodajanje vrstic spremenljivki shranjevanja položaja

dist = 0;

r.setDriveVelocity (v, v); %zagon roombe naprej

medtem ko je res

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %ustvari 1 naključni kot med 20 in 60 stopinjami. Uporablja se za preprečevanje zagozditve bota v zanki

%Kaj storiti, če eno ali več koles izgubi stik s podlago:

%ustavite gibanje, pošljite opozorilno e -poštno sporočilo s sliko okolice, %in vprašajte uporabnika, ali naj nadaljuje ali počaka na pomoč

če je Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

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 (pošta, 'POMOČ!', 'Naseden sem na pečini!', {imfile, položaj})

list = {'Nadaljuj', 'Ustavi'};

idx = menu ('Kaj naj storim?', seznam);

če je idx == 2

prekiniti

konec

%Kaj storiti, če je pred botom zaznan predmet:

%stop, premaknite se nazaj, fotografirajte in opozorite uporabnika na odkritje

%po e -pošti, obrnite se za 90 stopinj in nadaljujte z raziskovanjem

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

r.stop;

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

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 (pošta, 'Opozorilo!', 'Našel sem nekaj!', {imfile, položaj})

kot = 90;

netangle = netangle+kot;

r.turnAngle (kot);

r.setDriveVelocity (v, v);

%Kaj storiti, če je objekt odkrit levo od bota:

%stop, obrnite se proti predmetu, naredite varnostno kopijo, fotografirajte, opozorilo

%uporabnikov odkritja po e -pošti, obrnite se za 90 stopinj in nadaljujte z raziskovanjem

elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1

r.stop;

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

i = i+1;

kot = 30;

netangle = netangle+kot;

r.turnAngle (kot);

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

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 (pošta, 'Opozorilo!', 'Našel sem nekaj!', {imfile, položaj})

kot = -90;

netangle = netangle+kot;

r.turnAngle (kot);

r.setDriveVelocity (v, v);

%Kaj storiti, če je objekt odkrit desno od bota:

%stop, obrnite se proti predmetu, naredite varnostno kopijo, fotografirajte, opozorilo

%uporabnikov odkritja po e -pošti, obrnite se za 90 stopinj in nadaljujte z raziskovanjem

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1

r.stop;

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

i = i+1;

kot = -30;

netangle = netangle+kot;

r.turnAngle (kot);

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

i = i+1;

premor (1,5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

position = savepos (pos);

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

sendmail (pošta, 'Opozorilo!', 'Našel sem nekaj!', {imfile, položaj});

kot = 90;

netangle = netangle+kot;

r.turnAngle (kot);

r.setDriveVelocity (v, v);

%Kaj storiti, če je levo od bota zaznana pečina:

%stop, premaknite se nazaj, zavijte desno, nadaljujte z raziskovanjem

elseif Cliff.left <odraz_datum || Cliff.leftFront <refleks_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate

i = i+1;

kot = -RandAngle;

netangle = netangle+kot;

r.turnAngle (kot);

r.setDriveVelocity (v, v);

%Kaj storiti, če je na desni strani bota zaznana pečina:

%stop, premaknite se nazaj, zavijte levo, nadaljujte z raziskovanjem

elseif Cliff.right <odraz_datum || Cliff.rightFront <refleks_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (kot); %get x koordinata

poz (i, 2) = dist * cosd (kot); %get y koordinate

i = i+1;

r.moveDistance (-. 125);

kot = RandAngle;

netangle = netangle+kot;

r.turnAngle (kot);

r.setDriveVelocity (v, v);

konec

konec

Krmilnik za pametne telefone

Options = {'Autonomous', 'Manual Control'}

Poziv = meni ('Kako želite upravljati rover?', Možnosti)

m = mobiledev

r = roomba (19)

če je poziv == 1

Raziskovalec)

drugače

medtem ko je res

premor (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Nagib = PhoneData (2);

Stranska stran = PhoneData (3);

če je stran> 130 || Stran <-130 %, če je telefon obrnjen z licem navzdol, ustavite roombo in izhodno zanko

r.stop

r.beep ('C, C, C, C')

prekiniti

elseif Side> 25 && Side <40 %, če je telefon obrnjen vstran med 25 in 40 stopinjami, zavijte levo za 5 stopinj

r.turnAngle (-5);

sicer če je stran> 40 %, če je telefon obrnjen vstran za 40 stopinj, zavijte levo za 45 stopinj

r.turnAngle (-45)

Če pa telefon obrnete na stran med -25 in -40 stopinj, zavijte desno za 5 stopinj

r.turnAngle (5);

Če pa je telefon obrnjen vstran za manj kot -40 stopinj, zavijte levo za 45 stopinj

r.turnAngle (45)

konec

%Če telefon držite v bližini vertikale, posnemite sliko in jo narišite

če je Pitch <-60 && image <= 9

r.bip

img = r.getImage;

podplat (3, 3, slika)

imshow (img)

konec

%se premakne naprej in nazaj glede na orientacijo spredaj in zadaj

če je Pitch> 15 && Pitch <35 %, če se nagib med 15 in 35 stopinj premakne na kratko razdaljo naprej

%dobite podatke o odbijaču pred premikanjem

litBump = r.getLightBumpers;

če litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, če je nekaj pred roombo in bo udarilo, če se premakne naprej, naredite hrup in prikaže se sporočilo

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

else %premakni

r.moveDistance (.03);

%Pridobite podatke o odbijaču po premikanju

Bump = r.getBumpers;

če je Bump.right == 1 || Bump.left == 1 || Bump.front == 1

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

r.moveDistance (-. 01)

konec

%pridobi podatke senzorja pečine

Cliff = r.getCliffSensors;

če Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, če kaj sproži senzor pečine, ga obravnavajte kot lavo in varnostno kopirajte

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

r.moveDistance (-. 031)

konec

konec

elseif Nagib> 35 %, če se višina višine 35 stopinj premakne na daljšo razdaljo

%dobite podatke o odbijaču pred premikanjem

litBump = r.getLightBumpers;

če litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, če je nekaj pred roombo in bo udaril, če se premakne naprej, naredi hrup in prikaže sporočilo

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

else %premakni

r.moveDistance (.3)

%Pridobite podatke o odbijaču po premikanju

Bump = r.getBumpers;

če je Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, če nekaj pritisnete, naredite hrup, prikažete sporočilo in varnostno kopirate

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

r.moveDistance (-. 01)

konec

%po selitvi pridobi podatke senzorja pečine

Cliff = r.getCliffSensors;

če Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, če kaj sproži senzor pečine, ga obravnavajte kot lavo in varnostno kopirajte

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

r.moveDistance (-. 31)

konec

konec

elseif Nagib -35 %, če se korak med -15 in -35 stopinjami premakne nazaj na kratko razdaljo

r.moveDistance (-. 03);

%po selitvi pridobi podatke senzorja pečine

Cliff = r.getCliffSensors;

če Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, če kaj sproži senzor pečine, ga obravnavajte kot lavo in varnostno kopirajte

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

r.moveDistance (.04)

konec

elseif Nagib -60 %, če se korak med -35 in -60 stopinjami premakne na daljšo razdaljo

r.moveDistance (-. 3)

%po selitvi pridobi podatke senzorja pečine

Cliff = r.getCliffSensors;

če Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, če kaj sproži senzor pečine, ga obravnavajte kot lavo in varnostno kopirajte

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

r.moveDistance (.31)

konec

konec

konec

konec

Priporočena: