Sadržaj:
- Korak 1: Prikupite materijale
- Korak 2: Preuzmite Roomba alate za MATLAB
- Korak 3: Povežite se sa svojom Roombom
- Korak 4: Odaberite kako želite kontrolirati svoju Roombu
- Korak 5: Vozite svoju Roombu
Video: Pretvaranje vaše Roombe u Mars Rover: 5 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:32
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
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
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:
Mars Rover koji koristi Raspberry Pi: 5 koraka
Mars Rover koji koristi Raspberry Pi: Dragi svi, veliki učeniče, uvijek me zanima znati o mars roveru, koji ima 6 kotača koji mogu prijeći svu površinu Marsa i istraživati stvari sa Zemlje. Također želim istražiti stvar sjedeći na laptopu. Pa sad mislim da je pravo vrijeme da to napravim i
Pretvaranje koraka u pokrete igre: 4 koraka
Pretvaranje koraka u pokrete igre: UvodOvaj uređaj pretvara kretanje iz domaćeg stepera (step stroj) u kretanje igre. Radit će za svaku igru koja primi (" w ") kao kretanje prema naprijed. Može raditi i za VR igre ako prihvaćaju unos s tipkovnice. Vjerojatno je pobijedio
Od Roombe do Rovera u samo 5 koraka !: 5 koraka
Od Roombe do Rovera u samo 5 koraka !: Roomba roboti zabavan su i jednostavan način uranjanja nožnih prstiju u svijet robotike. U ovom Instructableu detaljno ćemo objasniti kako pretvoriti jednostavnu Roombu u rover koji se može kontrolirati i istodobno analizira okolinu. Popis dijelova1.) MATLAB2.) Roomb
Čišćenje Roombe prve ili druge generacije: 8 koraka
Čišćenje Roombe prve ili druge generacije: Čist robot je sretan robot
Pretvaranje vaše kamere u "vojnu noćnu vidljivost", dodavanje efekta noćne vizije ili stvaranje načina rada "NightVision" na bilo kojoj kameri !!!: 3 koraka
Pretvaranje vaše kamere u "vojnu noćnu vidljivost", dodavanje učinka noćne vizije ili stvaranje načina rada "NightVision" na bilo kojoj kameri !!!: *** Ovo je već bilo na DIGITALNOM DANU FOTO NATJEČAJ, Molimo glasajte za mene ** *Ako vam je potrebna pomoć, pošaljite e -poštu na [email protected] Govorim engleski, francuski, japanski, španjolski i znam neke druge jezike ako