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, Studeni
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 kako biste instalirali potrebne alate za dovršetak ovog projekta.

funkcija roombaInstall

clc;

% popis 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

upit = {

'Ovaj će program 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, 'Da'), return; kraj

% get popis datoteka koje postoje

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

ako je ~ prazan (postojeći_datoteke)

% provjerite je li 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, 'Da'), return; kraj

kraj

% preuzimanja datoteka

cnt = 0;

za i = 1: duljina (datoteke)

f = datoteke {i};

disp (['Preuzimanje' f]);

probati

url = [poslužitelj f];

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

cnt = cnt + 1;

ulov

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

lutka = [f '.html'];

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

izbrisati (lažna)

kraj

kraj

kraj

ako je cnt == dužina (datoteke)

msg = 'Instalacija uspješna';

waitfor (msgbox (msg, dlgTitle));

drugo

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

waitfor (errordlg (msg, dlgTitle));

kraj

kraj %roombaInstaliraj

Korak 3: Povežite se sa svojom Roombom

Sada je vrijeme da se povežete s Roombom putem WiFi -a. Pomoću dva prsta istodobno pritisnite tipke Dock i Spot za uključivanje ili resetiranje Roombe. Zatim pokrenite kôd r = roomba (# vaše Roombe) u naredbenom prozoru programa MATLAB da biste se povezali sa svojim robotom. Nakon što izvršite ovu naredbu, vaš Roomba bi trebao biti spreman 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

Roombom možete upravljati na dva načina: 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 senzore svjetla.

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

NAPOMENA: Da biste se pravilno povezali, vaše računalo 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 naredbeni prozor i postavite lozinku koju ćete morati unijeti na oba uređaja.

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

4. U naredbeni prozor na svom računalu upišite kôd m = mobiledev i to bi trebalo pokrenuti vaš pametni telefon kao kontroler za vašu Roombu.

5. Vaše računalo i pametni telefon trebali bi biti spremni za rad.

Korak 5: Vozite svoju Roombu

Sada kada imate sve potrebne alate za izradu svog Mars Rovera, spremni ste za izradu vlastitog koda. Dolje smo priložili primjer koda za autonomnu vožnju i vožnju kontroliranu pametnim telefonom.

Autonomna vožnja

funkcija Explore_modified (r)

%ulaznih argumenata: 1 roomba objekt, r

%izlazni argumenti: nema

%opis:

%funkcija koristi beskonačnu while petlju za dopuštanje autonomne

%istraživanja okoline bota.

%

%funciton također daje upute roombi o tome što učiniti

%sljedećih situacija: Kotači (i) izgube kontakt (e) sa tlom, an

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

%nagli pad je otkriven ispred ili s jedne i druge strane bota.

%

%tipičnih uputa uključuje naredbe kretanja namijenjene maksimiziranju

%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 dodano je za uživanje.

%mogućnosti postavljanja e -pošte

mail = '[email protected]';

lozinka = 'EF230Roomba';

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

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

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

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

rekviziti = java.lang. System.getProperties;

props.setProperty ('mail.smtp.starttls.enable', 'true');

props.setProperty ('mail.smtp.auth', 'istina');

props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');

props.setProperty ('mail.smtp.socketFactory.port', '465');

% r = roomba (19)

r.bip ('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žavati_datum = 2700; %postavljena referentna vrijednost senzora litice

lightBumper_datum = 200; %postavljeno svjetlo Referentna vrijednost senzora branika

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

kut = 0; %zadanog referentnog kuta

netangle = 0; %neto pomak kuta

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

dist = 0;

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

dok je istina

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Svjetlo = r.getLightBumpers;

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

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

%zaustaviti kretanje, poslati e -poruku upozorenja sa slikom okoline, %i pitati korisnika treba li nastaviti ili pričekati pomoć

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

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %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, 'zaglavljen.png');

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

imfile = 'zaglavljeno.png';

position = savepos (pos);

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

sendmail (pošta, 'HELP!', 'Nasukan sam na litici!', {imfile, position})

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

idx = menu ('Što da radim?', popis);

ako je idx == 2

pauza

kraj

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

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

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

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); %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;

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

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

i = i+1;

r.bip ('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, "Upozorenje!", "Našao sam nešto!", {imfile, položaj})

kut = 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 se za 90 stupnjeva i nastavite istraživati

elseif Light.leftFront> lightBumper_datum || Svjetlo.lijevo> lightBumper_datum || Neravnina.lijevo == 1

r.stop;

dist = r.getDistance;

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

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

i = i+1;

kut = 30;

netangle = netangle+kut;

r.turnAngle (kut);

r.moveDistance (-. 125);

dist = r.getDistance;

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

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

i = i+1;

r.bip ('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, "Upozorenje!", "Našao sam nešto!", {imfile, položaj})

kut = -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 se za 90 stupnjeva i nastavite istraživati

elseif Svjetlo.desno sprijeda> lightBumper_datum || Svjetlo.desno> lightBumper_datum || Neravnina.desno == 1

r.stop;

dist = r.getDistance;

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

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

i = i+1;

kut = -30;

netangle = netangle+kut;

r.turnAngle (kut);

r.moveDistance (-. 125);

dist = r.getDistance;

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

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

i = i+1;

stanka (1,5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

position = savepos (pos);

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

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

kut = 90;

netangle = netangle+kut;

r.turnAngle (kut);

r.setDriveVelocity (v, v);

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

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

elseif Cliff.lijevo <odraz_datum || Cliff.leftFront <odražava_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %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;

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

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

i = i+1;

kut = -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 ulijevo, nastavite s istraživanjem

elseif Cliff.desno <odražavati_datum || Cliff.rightFront <odražava_datum

r.stop;

dist = r.getDistance;

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

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

i = i+1;

r.moveDistance (-. 125);

kut = RandAngle;

netangle = netangle+kut;

r.turnAngle (kut);

r.setDriveVelocity (v, v);

kraj

kraj

Kontroler za pametni telefon

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

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

m = mobiledev

r = roomba (19)

ako je upit == 1

Istraživač)

drugo

dok je istina

stanka (0,5)

PhoneData = m. Orijentacija;

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.bip ('C, C, C, C')

pauza

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

r.turnAngle (-5);

inače sa strane> 40 %ako telefon okrenete bočno za 40 stupnjeva, skrenite ulijevo za 45 stupnjeva

r.turnAngle (-45)

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

r.turnAngle (5);

inače bočno <-40 %ako je telefon bočno okrenut za manje od -40 stupnjeva, skrenite ulijevo 45 stupnjeva

r.turnAngle (45)

kraj

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

ako je Pitch <-60 && image <= 9

r.bip

img = r.getImage;

podcrt (3, 3, slika)

imshow (img)

kraj

%kretanje naprijed i natrag na temelju prednje i stražnje orijentacije

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

%dobiti podatke o svjetlosnom odbojniku prije kretanja

litBump = r.getLightBumpers;

ako je litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %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 (.03);

%Dobijte podatke o braniku nakon premještanja

Bump = r.getBumpers;

ako je Bump.right == 1 || Neravnina.lijevo == 1 || Bump.front == 1

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

r.moveDistance (-. 01)

kraj

%dobiti podatke senzora litice

Cliff = r.getCliffSensors;

ako Cliff.lijevo> 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.bip ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

kraj

kraj

elseif Nagib> 35 %ako se korak veći od 35 stupnjeva pomakne naprijed za veću udaljenost

%dobiti podatke o svjetlosnom odbojniku 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 || Neravnina.lijevo == 1 || Bump.front == 1 %ako nešto udarite, napravite buku, prikažite poruku i napravite sigurnosnu kopiju

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

r.moveDistance (-. 01)

kraj

%dobiti podatke senzora litice nakon premještanja

Cliff = r.getCliffSensors;

ako Cliff.lijevo> 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.bip ('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 stupnjeva pomakne unatrag na kratku udaljenost

r.moveDistance (-. 03);

%dobiti podatke senzora litice nakon premještanja

Cliff = r.getCliffSensors;

ako Cliff.lijevo> 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.bip ('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 stupnjeva pomakne za veću udaljenost

r.moveDistance (-. 3)

%dobiti podatke senzora litice nakon premještanja

Cliff = r.getCliffSensors;

ako Cliff.lijevo> 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.bip ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

kraj

kraj

kraj

kraj

Preporučeni: