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 izmjena: 2024-01-30 08:04
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 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
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:
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 preći svu površinu Marsa i istraživati stvari sa Zemlje. Takođe želim da istražim stvar sedeći na laptopu. Pa sad mislim da je pravo vrijeme da to napravim i
Raspberry Pi - Autonomni Mars Rover sa OpenCV praćenjem objekata: 7 koraka (sa slikama)
Raspberry Pi - Autonomni Mars Rover sa OpenCV praćenjem objekata: Pokreće ga Raspberry Pi 3, Open CV prepoznavanje objekata, ultrazvučni senzori i motori sa istosmjernim pogonom. Ovaj rover može pratiti bilo koji objekt za koji je obučen i kretati se po bilo kojem terenu
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 Instructable -u ćemo detaljno objasniti kako pretvoriti jednostavnu Roombu u rover kojim se može upravljati i koji istovremeno analizira okolinu. Lista 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 efekta noćne vizije ili stvaranje načina rada "NightVision" na bilo kojoj kameri !!!: *** Ovo je već bilo na DIGITALNIM DANIMA FOTO NATJEČAJ, Molimo glasajte za mene ** *Ako vam je potrebna pomoć, pošaljite e -poštu na: [email protected] Govorim engleski, francuski, japanski, španski i znam još neke jezike ako