Cuprins:

Transformarea camerei tale într-un Mars Rover: 5 pași
Transformarea camerei tale într-un Mars Rover: 5 pași

Video: Transformarea camerei tale într-un Mars Rover: 5 pași

Video: Transformarea camerei tale într-un Mars Rover: 5 pași
Video: Valeriu Coadă te învață cum să scapi într-o SITUAȚIE EXTREMĂ!! 😱😅 #tiktokromania #valeriucoada 2024, Decembrie
Anonim
Transformându-ți Roomba într-un Mars Rover
Transformându-ți Roomba într-un Mars Rover

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

Descărcați casetele de instrumente Roomba pentru MATLAB
Descărcați casetele de instrumente Roomba pentru MATLAB
Descărcați casetele de instrumente Roomba pentru MATLAB
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

Alegeți cum doriți să vă controlați camera
Alegeți cum doriți să vă controlați camera
Alegeți cum doriți să vă controlați camera
Alegeți cum doriți să vă controlați camera

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: