Sadržaj:

Pretvaranje vaše Roombe u Mars Rover: 5 koraka
Pretvaranje vaše Roombe u Mars Rover: 5 koraka

Video: Pretvaranje vaše Roombe u Mars Rover: 5 koraka

Video: Pretvaranje vaše Roombe u Mars Rover: 5 koraka
Video: Elon Musk: The future we're building -- and boring | TED 2024, Novembar
Anonim
Pretvorite svoju Roombu u Mars Rover
Pretvorite svoju Roombu u Mars Rover

Korak 1: Prikupite materijale

Da biste dovršili ovaj projekt, morate prikupiti sljedeće materijale:

1 Roomba Robot

1 Raspberry Pi Kit

1 video kamera

Pristup MATLAB -u

Korak 2: Preuzmite Roomba alate za MATLAB

Preuzmite Roomba alate za MATLAB
Preuzmite Roomba alate za MATLAB
Preuzmite Roomba alate za MATLAB
Preuzmite Roomba alate za MATLAB

Pokrenite sljedeći kôd da biste instalirali potrebne alate za dovršetak ovog projekta.

funkcija roombaInstall

clc;

% lista datoteka za instaliranje

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

% lokacija za instaliranje

options = weboptions ('Naziv datoteke certifikata', ''); % mu kaže da zanemari zahtjeve certifikata

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

dlgTitle = 'Instaliranje/ažuriranje Roombe';

% prikazati svrhu i dobiti potvrdu

prompt = {

'Ovaj program će preuzeti ove datoteke EF 230 Roomba:'

''

strjoin (datoteke, '')

''

'u ovu mapu:'

''

cd

''

'Želite li nastaviti? '

};

bip;

yn = questdlg (upit,…

dlgTitle,…

'Da', 'Ne', 'Da');

if ~ strcmp (yn, 'Yes'), return; kraj

% get popis datoteka koje postoje

postojeći_datoteke = datoteke (cellfun (@exist, files)> 0);

ako je ~ prazan (postojeći_datoteke)

% provjerite je li zaista u redu zamijeniti ih

prompt = {'Zamjenjujete ove datoteke (datoteke):'

''

strjoin (postojeći_datoteke, '')

''

'U redu za zamjenu?'

};

bip;

yn = questdlg (upit,…

dlgTitle,…

'Da', 'Ne', 'Da');

if ~ strcmp (yn, 'Yes'), return; kraj

kraj

% preuzimanja datoteka

cnt = 0;

za i = 1: dužina (datoteke)

f = datoteke {i};

disp (['Preuzimanje' f]);

probaj

url = [server f];

websave (f, url, opcije); % dodanih opcija za izbjegavanje sigurnosnih grešaka

cnt = cnt + 1;

uloviti

disp (['Greška pri preuzimanju' f]);

lutka = [f '.html'];

ako postoji (lažna, 'datoteka') == 2

izbrisati (lažno)

kraj

kraj

kraj

ako je cnt == dužina (datoteke)

msg = 'Instalacija je uspjela';

waitfor (msgbox (msg, dlgTitle));

else

msg = 'Greška pri instalaciji - pogledajte naredbeni prozor za detalje';

waitfor (errordlg (msg, dlgTitle));

kraj

end %roombaInstall

Korak 3: Povežite se sa svojom Roombom

Sada je vrijeme da se povežete na svoju Roombu putem WiFi -a. Pomoću dva prsta istovremeno pritisnite tipke Dock i Spot za uključivanje ili resetiranje Roombe. Zatim pokrenite kôd r = roomba (# vaše Roombe) u komandnom prozoru MATLAB -a da se povežete sa svojim robotom. Nakon što izvršite ovu naredbu, vaša Roomba bi trebala biti spremna za rad.

Korak 4: Odaberite kako želite kontrolirati svoju Roombu

Odaberite kako želite kontrolirati svoju Roombu
Odaberite kako želite kontrolirati svoju Roombu
Odaberite kako želite kontrolirati svoju Roombu
Odaberite kako želite kontrolirati svoju Roombu

Postoje dva načina na koja možete kontrolirati svoju Roombu: autonomno ili pomoću pametnog telefona kao kontrolera.

Ako se odlučite za autonomnu vožnju Roombom, morat ćete koristiti tri ugrađena senzora: senzore litice, senzore udara i svjetlosne senzore.

Da biste koristili pametni telefon, prvo morate povezati pametni telefon sa računarom slijedeći donje korake.

NAPOMENA: Da biste se pravilno povezali, vaš računar i pametni telefon moraju biti na istoj WiFi mreži!

1. Preuzmite aplikaciju MATLAB iz trgovine aplikacija na svom uređaju.

2. Upišite "konektor uključen" u vaš komandni prozor i postavite lozinku koju ćete morati unijeti na oba uređaja.

3. Nakon toga, MATLAB će vam dati IP adresu računara. Morate otići na stranicu s postavkama u aplikaciji MATLAB na svom pametnom telefonu i dodati računar koristeći zadanu IP adresu i lozinku koju ste ranije unijeli.

4. U komandni prozor na svom računaru otkucajte kôd m = mobiledev i to bi trebalo da pokrene vaš pametni telefon kao kontroler za vašu Roombu.

5. Vaš računar i pametni telefon bi sada trebali biti spremni za rad.

Korak 5: Vozite svoju Roombu

Sada kada imate sve potrebne alate za kreiranje vašeg Mars Rovera, spremni ste za kreiranje vlastitog koda. U nastavku smo priložili primjer koda i za autonomnu vožnju i za vožnju upravljanu pametnim telefonom.

Autonomna vožnja

funkcija Explore_modified (r)

%ulazni argumenti: 1 roomba objekt, r

%izlazni argumenti: nema

%opis:

%funkcija koristi beskonačnu while petlju za omogućavanje autonomije

%istraživanja botove okoline.

%

%funciton takođe daje instrukcije roombi šta da radi

%sljedećih situacija: Točkovi (i) gube kontakt (e) sa tlom, an

%objekt je otkriven ispred ili sa strane bota, i a

%nagli pad je otkriven ispred ili sa strane bota.

%

%tipičnih instrukcija uključuje komande kretanja koje imaju za cilj povećanje

%istraživanja ili izbjegavanje otkrivene opasnosti i naredbe za komunikaciju

%informacija o otkrićima botova (slike), položaju (grafikon), %i stanje (upozorenje nasukano) s korisnikom putem matlaba i/ili e -pošte. Nekoliko

%zvučnih naredbi je dodano za uživanje.

%postavljanje mogućnosti e -pošte

mail = '[email protected]';

lozinka = 'EF230Roomba';

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

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

setpref ('Internet', 'SMTP_Username', mail);

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

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 =.1;

reflektirati_datum = 2700; %postavljena referentna vrijednost senzora litice

lightBumper_datum = 200; %podešeno svetlo Referentna vrednost senzora branika

poz = [0, 0]; %varijabla za pohranu položaja s inicijaliziranim datumom

ugao = 0; %podešeni referentni ugao

netangle = 0; %neto pomak ugla

i = 2; %iterator za dodavanje redova u varijablu pohrane položaja

dist = 0;

r.setDriveVelocity (v, v); %pokretanje roombe naprijed

dok je istina

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %generira 1 slučajni kut između 20 i 60 stupnjeva. Koristi se za sprečavanje zaglavljivanja bota u petlji

%Šta učiniti ako jedan ili više kotača izgubi kontakt sa tlom:

%zaustaviti kretanje, poslati poruku upozorenja sa slikom okoline, %i pitati korisnika da li da nastavi ili da sačeka pomoć

ako je Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopterećeno); %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 = 'zaglavljeno.png';

position = savepos (poz);

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

sendmail (pošta, 'POMOĆ!', 'Nasukan sam na litici!', {imfile, položaj})

list = {'Nastavi', 'Zaustavi'};

idx = menu ('Šta da radim?', lista);

ako je idx == 2

break

kraj

%Što učiniti ako se objekt otkrije ispred bota:

%zaustavi, pomakni se natrag, slikaj, upozori korisnika na otkriće

%putem e -pošte, okrenite se za 90 stepeni i nastavite istraživati

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

r.stop;

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

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

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopterećeno); %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 (poz);

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

sendmail (pošta, 'Upozorenje!', 'Našao sam nešto!', {imfile, položaj})

ugao = 90;

netangle = netangle+kut;

r.turnAngle (kut);

r.setDriveVelocity (v, v);

%Što učiniti ako se objekt otkrije lijevo od bota:

%stop, okrenite se prema objektu, napravite sigurnosnu kopiju, snimite sliku, upozorenje

%korisnika otkrića putem e -pošte, okrenite 90 stepeni i nastavite istraživati

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

r.stop;

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

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

i = i+1;

ugao = 30;

netangle = netangle+kut;

r.turnAngle (kut);

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

poz (i, 2) = poz (i-1, 2) + dist * cosd (neopterećeno); %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 (poz);

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

sendmail (pošta, 'Upozorenje!', 'Našao sam nešto!', {imfile, položaj})

ugao = -90;

netangle = netangle+kut;

r.turnAngle (kut);

r.setDriveVelocity (v, v);

%Što učiniti ako se objekt otkrije desno od bota:

%stop, okrenite se prema objektu, napravite sigurnosnu kopiju, snimite sliku, upozorenje

%korisnika otkrića putem e -pošte, okrenite 90 stepeni i nastavite istraživati

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

r.stop;

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

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

i = i+1;

ugao = -30;

netangle = netangle+kut;

r.turnAngle (kut);

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

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

i = i+1;

pauza (1,5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

position = savepos (poz);

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

sendmail (pošta, 'Upozorenje!', 'Našao sam nešto!', {imfile, položaj});

ugao = 90;

netangle = netangle+kut;

r.turnAngle (kut);

r.setDriveVelocity (v, v);

%Što učiniti ako se otkrije litica lijevo od bota:

%stop, pomaknite se unatrag, skrenite desno, nastavite istraživanje

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

r.stop;

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

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

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = poz (i-1, 1) + dist * sind (neopterećeno); %get x koordinata

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

i = i+1;

angle = -RandAngle;

netangle = netangle+kut;

r.turnAngle (kut);

r.setDriveVelocity (v, v);

%Što učiniti ako se otkrije litica desno od bota:

%stop, pomaknite se unatrag, skrenite lijevo, nastavite istraživanje

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

r.stop;

dist = r.getDistance;

poz (i, 1) = dist * sind (ugao); %get x koordinata

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

i = i+1;

r.moveDistance (-. 125);

ugao = RandAngle;

netangle = netangle+kut;

r.turnAngle (kut);

r.setDriveVelocity (v, v);

kraj

kraj

Kontroler za pametni telefon

Opcije = {'Autonomna', 'Ručna kontrola'}

Odziv = izbornik ('Kako želite kontrolirati rover?', Opcije)

m = mobiledev

r = roomba (19)

ako je upit == 1

Istražite (r)

else

dok je istina

pauza (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Nagib = PhoneData (2);

Side = PhoneData (3);

ako je stranica> 130 || Sa strane <-130 %ako je telefon okrenut licem prema dolje, zaustavite roombu i izlaznu petlju

r.stop

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

break

elseif Side> 25 && Side <40 %ako je telefon okrenut bočno između 25 i 40 stepeni, skrenite lijevo 5 stepeni

r.turnAngle (-5);

inače sa strane> 40 %ako je telefon okrenut bočno za 40 stepeni, skrenite lijevo za 45 stepeni

r.turnAngle (-45)

inače bočno -40 %ako je telefon okrenut bočno između -25 i -40 stepeni, skrenite desno za 5 stepeni

r.turnAngle (5);

inače sa strane <-40 %ako je telefon okrenut na stranu za manje od -40 stepeni, skrenite lijevo za 45 stepeni

r.turnAngle (45)

kraj

%Ako telefon držite u blizini vertikale, snimite sliku i iscrtajte je

if Pitch <-60 && image <= 9

r.beep

img = r.getImage;

podcrt (3, 3, slika)

imshow (img)

kraj

%kretanje naprijed i nazad na osnovu prednje i zadnje orijentacije

ako je Pitch> 15 && Pitch <35 %ako se korak između 15 i 35 stepeni pomakne naprijed za kratku udaljenost

%dobiti podatke o lakom braniku prije kretanja

litBump = r.getLightBumpers;

ako je litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %ako se nešto nalazi ispred roombe i udarit će ako se pomakne naprijed napravi buku i prikaže poruku

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

else %seli

r.moveDistance (.03);

%Dobijte podatke o braniku nakon premještanja

Bump = r.getBumpers;

ako je Bump.right == 1 || Bump.left == 1 || Bump.front == 1

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

r.moveDistance (-. 01)

kraj

%dobije podatke senzora litice

Cliff = r.getCliffSensors;

ako Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %ako nešto pokrene senzor litice tretirajte ga kao lavu i napravite sigurnosnu kopiju

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

r.moveDistance (-. 031)

kraj

kraj

inače, ako je visina> 35 %ako je visina koraka veća od 35 stepeni, pomaknite se na daljinu na daljinu

%dobiti podatke o lakom braniku prije kretanja

litBump = r.getLightBumpers;

ako je litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %ako je nešto ispred roombe i udarit će ako se pomakne naprijed napravi buku i prikaže poruku

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

else %seli

r.moveDistance (.3)

%Dobijte podatke o braniku nakon premještanja

Bump = r.getBumpers;

ako je Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %ako pritisnete nešto napravi buku, prikaže poruku i napravi sigurnosnu kopiju

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

r.moveDistance (-. 01)

kraj

%dobiti podatke senzora litice nakon premještanja

Cliff = r.getCliffSensors;

ako Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %ako nešto pokrene senzor litice tretirajte ga kao lavu i napravite sigurnosnu kopiju

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

r.moveDistance (-. 31)

kraj

kraj

elseif Nagib -35 %ako se korak između -15 i -35 stepeni pomakne za kratku udaljenost

r.moveDistance (-. 03);

%dobiti podatke senzora litice nakon premještanja

Cliff = r.getCliffSensors;

ako Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %ako nešto pokrene senzor litice tretirajte ga kao lavu i napravite sigurnosnu kopiju

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

r.moveDistance (.04)

kraj

elseif Nagib -60 %ako se korak između -35 i -60 stepeni pomakne za veću udaljenost

r.moveDistance (-. 3)

%dobiti podatke senzora litice nakon premještanja

Cliff = r.getCliffSensors;

ako Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %ako nešto pokrene senzor litice tretirajte ga kao lavu i napravite sigurnosnu kopiju

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

r.moveDistance (.31)

kraj

kraj

kraj

kraj

Preporučuje se: