Cuprins:
- Pasul 1: Strângeți-vă materialele
- Pasul 2: Descărcați casetele de instrumente Roomba pentru MATLAB
- Pasul 3: Conectați-vă la Roomba dvs
- Pasul 4: Alegeți cum doriți să vă controlați Roomba
- Pasul 5: Conduceți Roomba
Video: Transformarea camerei tale într-un Mars Rover: 5 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:41
Pasul 1: Strângeți-vă materialele
Pentru a finaliza acest proiect, va trebui să adunați următoarele materiale:
1 robot Roomba
1 kit Raspberry Pi
1 cameră video
Acces la MATLAB
Pasul 2: Descărcați casetele de instrumente Roomba pentru MATLAB
Rulați următorul cod pentru a instala casetele de instrumente necesare pentru a finaliza acest proiect.
function roombaInstall
clc;
% listă de fișiere de instalat
files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% locație din care să instalați
options = weboptions ('CertificateFilename', ''); % spune-i să ignore cerințele certificatului
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Instalare / actualizare Roomba';
% afișează scopul și primește confirmarea
prompt = {
„Acest program va descărca aceste fișiere EF 230 Roomba:”
''
strjoin (fișiere, '')
''
'în acest dosar:'
''
CD
''
'Doriți să continuați? '
};
bip;
yn = questdlg (prompt, …
dlgTitle, …
„Da”, „Nu”, „Da”);
if ~ strcmp (yn, 'Da'), returnează; Sfârșit
% obține lista de fișiere care există
fisiere_existente = fisiere (cellfun (@exist, fisiere)> 0);
dacă ~ este gol (fișiere_existente)
% asigurați-vă că este foarte bine să le înlocuiți
prompt = {'Înlocuiți aceste fișiere:'
''
strjoin (existente_files, '')
''
"OK pentru a înlocui?"
};
bip;
yn = questdlg (prompt, …
dlgTitle, …
„Da”, „Nu”, „Da”);
if ~ strcmp (yn, 'Da'), returnează; Sfârșit
Sfârșit
% descărcați fișierele
cnt = 0;
pentru i = 1: lungime (fișiere)
f = fișiere {i};
disp ([„Descărcare” f]);
încerca
url = [server f];
websave (f, url, opțiuni); % opțiuni adăugate pentru a evita erorile de securitate
cnt = cnt + 1;
captură
disp (['Eroare la descărcarea' f]);
manechin = [f '.html'];
dacă există (fictiv, „fișier”) == 2
șterge (fictiv)
Sfârșit
Sfârșit
Sfârșit
dacă cnt == lungime (fișiere)
msg = 'Instalare reușită';
waitfor (msgbox (msg, dlgTitle));
altceva
msg = 'Eroare de instalare - vezi fereastra de comandă pentru detalii';
waitfor (errordlg (msg, dlgTitle));
Sfârșit
end% roombaInstall
Pasul 3: Conectați-vă la Roomba dvs
Acum este timpul să vă conectați la Roomba folosind WiFi. Folosind 2 degete, apăsați simultan butoanele Dock și Spot pentru a porni sau a reseta Roomba. Apoi, rulați codul r = roomba (# din Roomba) în fereastra de comandă a MATLAB pentru a vă conecta la robot. Odată ce ați executat această comandă, Roomba dvs. ar trebui să fie gata de plecare.
Pasul 4: Alegeți cum doriți să vă controlați Roomba
Există două moduri prin care vă puteți controla Roomba: autonom sau folosind un smartphone ca controler.
Dacă alegeți să conduceți Roomba în mod autonom, va trebui să utilizați cei trei senzori încorporați: senzori de stâncă, senzori de lovire și senzori de lumină.
Pentru a utiliza un smartphone, trebuie mai întâi să vă conectați smartphone-ul la computer urmând pașii de mai jos.
NOTĂ: Calculatorul și smartphone-ul dvs. trebuie să se afle în aceeași rețea WiFi pentru a vă conecta corect!
1. Descărcați aplicația MATLAB din magazinul de aplicații de pe dispozitiv.
2. Tastați „conector activat” în fereastra de comandă și setați o parolă care va trebui introdusă în ambele dispozitive.
3. După ce faceți acest lucru, MATLAB vă va oferi adresa IP a computerelor. Trebuie să accesați pagina de setări din aplicația MATLAB de pe telefonul smartphone și să adăugați un computer folosind adresa IP dată și parola pe care ați introdus-o mai devreme.
4. În fereastra de comandă de pe computer, tastați codul m = mobiledev și acest lucru ar trebui să vă inițializeze smartphone-ul ca controler pentru Roomba.
5. Computerul și smartphone-ul dvs. ar trebui să fie gata să funcționeze acum.
Pasul 5: Conduceți Roomba
Acum, că aveți toate instrumentele necesare pentru a vă crea Mars Rover, sunteți gata să vă creați propriul cod. Am atașat un exemplu de cod mai jos atât pentru conducerea autonomă, cât și pentru conducerea controlată de smartphone.
Conducere autonomă
funcție Explore_modified (r)
% argumente de intrare: 1 obiect roomba, r
% argumente de ieșire: niciunul
%Descriere:
Funcția% folosește o buclă infinită while pentru a permite autonomia
% explorare a împrejurimilor robotului.
%
% funciton oferă, de asemenea, instrucțiuni roomba pentru ce să facă
% următoarele situații: Roata (roțile) își pierd contactul cu solul, an
% obiect este detectat în fața sau în ambele părți ale botului și a
% scădere bruscă este detectată în fața sau în ambele părți ale botului.
%
% instrucțiuni tipice includ comenzi de mișcare destinate maximizării
% explorarea sau evitarea unui pericol detectat și comenzi de comunicare
% informații privind descoperirile roboților (imagini), poziția (grafic), % și stare (avertisment blocat) cu utilizatorul prin matlab și / sau e-mail. Mai multe
% comenzi sonore sunt adăugate pentru plăcere.
% configurați capacitățile de e-mail
mail = '[email protected]';
parola = 'EF230Roomba';
setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Internet', 'E-mail', mail);
setpref ('Internet', 'SMTP_Username', mail);
setpref ('Internet', 'SMTP_Password', parolă);
props = 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;
reflect_datum = 2700; % setează valoarea de referință a senzorilor de stâncă
lightBumper_datum = 200; % setează valoarea de referință a senzorului barei de iluminare
pos = [0, 0]; % variabilă pentru stocarea poziției cu date inițializate
unghi = 0; % set unghiul de referință
netangle = 0; % deplasare unghi net
i = 2; % iterator pentru adăugarea de rânduri la variabila de stocare a poziției
dist = 0;
r.setDriveVelocity (v, v); % începe roomba înaintând
în timp ce este adevărat
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Light = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); % generează un unghi aleatoriu între 20 și 60 de grade. Folosit pentru a preveni blocarea botului într-o buclă
% Ce trebuie făcut dacă una sau mai multe roți pierd contactul cu solul:
% opriți mișcarea, trimiteți un e-mail de avertizare cu imaginea împrejurimilor, % și întrebați utilizatorul dacă continuă sau așteptați ajutor
dacă Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
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';
poziție = savepos (pos);
%---------------------------
sendmail (mail, „AJUTĂ!”, „Sunt blocat pe o stâncă!”, {imfile, position})
list = {'Continuare', 'Stop'};
idx = menu ('Ce ar trebui să fac?', listă);
dacă idx == 2
pauză
Sfârșit
% Ce trebuie făcut dacă un obiect este detectat în fața botului:
% opriți, treceți înapoi, faceți fotografii, avertizați utilizatorul în legătură cu descoperirea
% prin e-mail, rotiți 90 de grade și continuați să explorați
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); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
i = i + 1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
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';
poziție = savepos (pos);
%---------------------------
sendmail (mail, 'Alertă!', 'Am găsit ceva!', {imfile, position})
unghi = 90;
netangle = netangle + unghi;
r.turnAngle (unghi);
r.setDriveVelocity (v, v);
% Ce trebuie făcut dacă obiectul este detectat în stânga botului:
% opriți, întoarceți-vă spre obiect, faceți o copie de rezervă, faceți poză, alertați
% utilizator al descoperirii prin e-mail, întoarceți 90 de grade și continuați să explorați
elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
i = i + 1;
unghi = 30;
netangle = netangle + unghi;
r.turnAngle (unghi);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
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';
poziție = savepos (pos);
%---------------------------
sendmail (mail, 'Alertă!', 'Am găsit ceva!', {imfile, position})
unghi = -90;
netangle = netangle + unghi;
r.turnAngle (unghi);
r.setDriveVelocity (v, v);
% Ce trebuie făcut dacă obiectul este detectat în dreapta botului:
% opriți, întoarceți-vă spre obiect, faceți o copie de rezervă, faceți poză, alertați
% utilizator al descoperirii prin e-mail, întoarceți 90 de grade și continuați să explorați
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
i = i + 1;
unghi = -30;
netangle = netangle + unghi;
r.turnAngle (unghi);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
i = i + 1;
pauză (1,5);
r.beep ('C1 ^, C1 ^, C2 ^, D2 ^, D2 ^, C8 ^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
poziție = savepos (pos);
%---------------------------
sendmail (mail, 'Alertă!', 'Am găsit ceva!', {imfile, position});
unghi = 90;
netangle = netangle + unghi;
r.turnAngle (unghi);
r.setDriveVelocity (v, v);
% Ce trebuie făcut dacă stânca este detectată în stânga botului:
% opriți-vă, deplasați-vă înapoi, faceți dreapta, continuați explorarea
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
i = i + 1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % obține coordonata x
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % obține coordonata y
i = i + 1;
unghi = -RandAngle;
netangle = netangle + unghi;
r.turnAngle (unghi);
r.setDriveVelocity (v, v);
% Ce trebuie făcut dacă stânca este detectată în dreapta botului:
% opriți-vă, deplasați-vă înapoi, faceți stânga, continuați explorarea
elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (angle); % obține coordonata x
pos (i, 2) = dist * cosd (angle); % obține coordonata y
i = i + 1;
r.moveDistance (-. 125);
angle = RandAngle;
netangle = netangle + unghi;
r.turnAngle (unghi);
r.setDriveVelocity (v, v);
Sfârșit
Sfârșit
Controler pentru smartphone
Opțiuni = {'Autonom', 'Control manual'}
Prompt = menu („Cum ați dori să controlați rover-ul?”, Opțiuni)
m = mobiledev
r = roomba (19)
dacă Prompt == 1
Explorator)
altceva
în timp ce este adevărat
pauză (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Side = PhoneData (3);
dacă Side> 130 || Partea <-130% dacă telefonul este răsturnat cu fața în jos, opriți camera și ieșiți din buclă
r.stop
r.beep („C, C, C, C”)
pauză
elseif Side> 25 && Side <40% dacă telefonul este rotit lateral între 25 și 40 °, întoarceți-l la 5 ° la stânga
r.turnAngle (-5);
elseif Side> 40% dacă telefonul este rotit lateral peste 40 de grade, întoarceți la stânga 45 de grade
r.turnAngle (-45)
elseif Side-40% dacă telefonul este rotit lateral între -25 și -40 grade virează la dreapta cu 5 grade
r.turnAngle (5);
elseif Partea <-40% dacă telefonul este rotit lateral mai puțin de -40 grade întoarceți la stânga 45 grade
r.turnAngle (45)
Sfârșit
% Dacă telefonul este ținut aproape de verticală, faceți o imagine și trageți-o
dacă Pitch <-60 && image <= 9
r. beep
img = r.getImage;
subtrama (3, 3, imagine)
imshow (img)
Sfârșit
% se deplasează înainte și înapoi în funcție de orientarea din față și din spate
dacă Pitch> 15 && Pitch <35% dacă pitch între 15 și 35 ° se deplasează înainte pe distanță scurtă
% obțineți date de protecție ușoare înainte de a vă deplasa
litBump = r.getLightBumpers;
dacă litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500% dacă ceva este în fața camerei și va lovi dacă se deplasează înainte faceți zgomot și afișați mesajul
r.beep ('C ^^, F # ^, C ^^, F # ^')
altceva% mutați
r.moveDistance (.03);
% Obțineți date despre bara de protecție după mutare
Bump = r.getBumpers;
dacă Bump.right == 1 || Bump.left == 1 || Bump.front == 1
r.beep („A, C, E”)
r.moveDistance (-. 01)
Sfârșit
% obțineți date despre senzorii de stâncă
Cliff = r.getCliffSensors;
dacă Cliff.stânga> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% dacă ceva declanșează senzorul de stâncă, tratați-l ca lava și faceți backup
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
Sfârșit
Sfârșit
altfel dacă Pitch> 35% dacă pitch-ul este mai mare de 35 ° înaintează pe o distanță mai mare
% obțineți date de protecție ușoare înainte de a vă deplasa
litBump = r.getLightBumpers;
dacă litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15% dacă ceva este în fața camerei și va lovi dacă se deplasează înainte faceți zgomot și afișați mesajul
r.beep ('C ^^, F # ^, C ^^, F # ^')
altceva% mutați
r.moveDistance (.3)
% Obțineți date despre bara de protecție după mutare
Bump = r.getBumpers;
dacă Bump.right == 1 || Bump.left == 1 || Bump.front == 1% dacă atingeți ceva faceți zgomot, afișați mesajul și faceți backup
r.beep („A, C, E”)
r.moveDistance (-. 01)
Sfârșit
% obțineți datele senzorului de stâncă după mutare
Cliff = r.getCliffSensors;
dacă Cliff.stânga> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% dacă ceva declanșează senzorul de stâncă, tratați-l ca lava și faceți backup
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
Sfârșit
Sfârșit
elseif Pitch-35% dacă pasul între -15 și -35 grade se mișcă înapoi la distanță scurtă
r.moveDistance (-. 03);
% obțineți datele senzorului de stâncă după mutare
Cliff = r.getCliffSensors;
dacă Cliff.stânga> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% dacă ceva declanșează senzorul de stâncă, tratați-l ca lava și faceți backup
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
Sfârșit
elseif Pitch-60% dacă pasul între -35 și -60 grade se deplasează înapoi pe o distanță mai mare
r.moveDistance (-. 3)
% obțineți datele senzorului de stâncă după mutare
Cliff = r.getCliffSensors;
dacă Cliff.stânga> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500% dacă ceva declanșează senzorul de stâncă, tratați-l ca lava și faceți backup
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
Sfârșit
Sfârșit
Sfârșit
Sfârșit
Recomandat:
Arduino: Transformarea frecvenței (DFT): 6 pași
Arduino: Transformarea frecvenței (DFT): acest program este de a calcula transformarea frecvenței pe arduino cu controlul bateriei asupra parametrilor. aceasta nu este FFT. FFT este algoritmul folosit pentru a rezolva DFT cu timp mai mic. Codul pentru FFT poate fi găsit aici
Transformarea oricărei mașini R / C într-o mașină R / C pentru controlul aplicației Bluetooth: 9 pași
Transformarea oricărei mașini R / C într-o mașină de control Bluetooth a aplicației R / C: Acest proiect prezintă pașii pentru a schimba o mașină obișnuită de telecomandă într-o mașină de control Bluetooth (BLE) cu placa robotică Wombatics SAM01, aplicația Blynk și inventatorul de aplicații MIT. sunt multe mașini RC cu preț redus, cu multe funcții, cum ar fi farurile LED și
Mai multe hard disk-uri sau unități optice într-un computer care într-adevăr nu poate: 8 pași
Mai multe hardrives sau unități optice într-un computer care cu adevărat nu poate: PRIMUL EVAR Așa că am făcut acest lucru instructiv după ani de trolling și citit în jurul meu, am avut în sfârșit curajul să-mi fac al meu. Pe scurt, vă arăt cum să instalați hardware (în acest caz două hard disk-uri IDE și două unități optice IDE) într-un IDE m
Transformarea Windows XP sau Vista într-un Mac și Linux: 10 pași
Transformarea Windows XP sau Vista într-un Mac și Linux: acest instructable vă va arăta cum să transformați PC-ul Windows într-un Mac și PC, precum și să rulați Linux. Vă recomandăm să aveți cel puțin 2 GB RAM-și peste 10 GB de spațiu pe hard disk (dacă doriți linux) este recomandat Vista sau XP - fac asta pe
Transformarea camerei dvs. în „Nightvision militară”, adăugarea efectului Nightvision sau crearea modului NightVision „pe orice cameră foto !!!: 3 pași
Transformarea camerei dvs. în „Nightvision militară”, adăugarea efectului Nightvision sau crearea modului NightVision „pe orice cameră !!!: *** Acest lucru a fost introdus în CONCURSUL DIGITAL DAYS PHOTO Vă rog să mă votați ** * Dacă aveți nevoie de ajutor, vă rugăm să ne trimiteți un e-mail: [email protected] Vorbesc engleză, franceză, japoneză, spaniolă și știu alte limbi dacă