INHOUDSOPGAWE:
Video: Verander jou Roomba in 'n Mars Rover: 5 stappe
2025 Outeur: John Day | [email protected]. Laas verander: 2025-01-13 06:56
Stap 1: Versamel u materiaal
Om hierdie projek te voltooi, moet u die volgende materiaal versamel:
1 Roomba -robot
1 Framboos Pi -kit
1 videokamera
Toegang tot MATLAB
Stap 2: Laai die Roomba Toolboxes vir MATLAB af
Voer die volgende kode uit om die nodige gereedskapskaste te installeer om hierdie projek te voltooi.
funksie roombaInstall
clc;
% lys lêers wat geïnstalleer moet word
lêers = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% plek om van te installeer
opsies = webopsies ('CertificateFilename', ''); % vertel dit om die sertifikaatvereistes te ignoreer
bediener = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Roomba installering/opdatering';
% vertoondoel en kry bevestiging
prompt = {
'Hierdie program sal hierdie EF 230 Roomba -lêers aflaai:'
''
strjoin (lêers, '')
''
'na hierdie vouer:'
''
cd
''
'Wil jy voortgaan? '
};
biep;
yn = questdlg (prompt, …
dlgTitle, …
'Ja', 'Nee', 'Ja');
as ~ strcmp (yn, 'Ja'), gee terug; einde
% kry 'n lys met bestaande lêers
bestaande_ lêers = lêers (cellfun (@exist, lêers)> 0);
as ~ isempty (bestaande_ lêers)
seker dat dit regtig goed is om dit te vervang
prompt = {'U vervang hierdie lêer (s):'
''
strjoin (bestaande_lêers, '')
''
'OK om te vervang?'
};
biep;
yn = questdlg (prompt, …
dlgTitle, …
'Ja', 'Nee', 'Ja');
as ~ strcmp (yn, 'Ja'), gee terug; einde
einde
laai die lêers af
cnt = 0;
vir i = 1: lengte (lêers)
f = lêers {i};
disp (['Aflaai' f]);
probeer
url = [bediener f];
websave (f, url, opsies); % bygevoeg opsies om veiligheidsfoute te vermy
cnt = cnt + 1;
vang
disp (['Fout tydens aflaai' f]);
dummy = [f '.html'];
as daar bestaan (dummy, 'file') == 2
verwyder (dummy)
einde
einde
einde
as cnt == lengte (lêers)
msg = 'Installasie suksesvol';
wag vir (msgbox (msg, dlgTitle));
anders
msg = 'Installasie fout - sien opdrag venster vir meer inligting';
wag vir (errordlg (msg, dlgTitle));
einde
eind %roombaInstall
Stap 3: Koppel aan u Roomba
Dit is nou tyd om via WiFi aan te sluit op u Roomba. Druk met twee vingers gelyktydig op die Dock- en Spot -knoppies om u Roomba aan te skakel of terug te stel. Voer vervolgens die kode r = roomba (# van u Roomba) uit in die opdragvenster van MATLAB om aan te sluit op u robot. Nadat u hierdie opdrag uitgevoer het, behoort u Roomba gereed te wees.
Stap 4: Kies hoe u u Roomba wil beheer
Daar is twee maniere waarop u u Roomba kan beheer: outonoom of deur 'n slimfoon as 'n beheerder te gebruik.
As u kies om die Roomba outonoom te bestuur, moet u die drie ingeboude sensors gebruik: kransensors, stampsensors en ligsensors.
Om 'n slimfoon te gebruik, moet u eers u slimfoon aan u rekenaar koppel deur die onderstaande stappe te volg.
OPMERKING: u rekenaar en slimfoon moet op dieselfde WiFi -netwerk wees om behoorlik aan te sluit!
1. Laai die MATLAB -app af vanaf die app store op u toestel.
2. Tik "connector on" in u opdragvenster en stel 'n wagwoord in wat op beide toestelle ingevoer moet word.
3. Nadat u dit gedoen het, gee MATLAB u IP -adres van u rekenaars. U moet na die instellingsbladsy in die MATLAB -app op u slimfoon gaan en 'n rekenaar byvoeg met die gegewe IP -adres en die wagwoord wat u vroeër ingevoer het.
4. Tik in die opdragvenster op u rekenaar die kode m = mobiledev en dit moet u slimfoon as 'n beheerder vir u Roomba inisialiseer.
5. Jou rekenaar en slimfoon behoort nou gereed te wees.
Stap 5: ry met u Roomba
Noudat u al die nodige gereedskap het om u Mars Rover te skep, is u gereed om u eie kode te skep. Ons het 'n voorbeeldkode hieronder aangeheg vir beide outonome bestuur en bestuur deur slimfone.
Outonome bestuur
funksie Explore_modified (r)
%insetargumente: 1 roomba -voorwerp, r
%uitsetargumente: geen
%beskrywing:
%-funksie gebruik 'n oneindige terwyl -lus om outonoom toe te laat
%verkenning van die bot se omgewing.
%
%funciton verskaf ook instruksies aan die roomba oor wat om te doen
%die volgende situasies: Wiel (e) verloor kontak met die grond, an
%voorwerp word voor of aan weerskante van die bot opgespoor, en a
%skielike daling word voor of aan weerskante van die bot bespeur.
%
%tipiese instruksies bevat bewegingsopdragte wat bedoel is om te maksimeer
%ondersoek of vermy 'n gedetecteerde gevaar en beveel om te kommunikeer
%inligting oor die ontdekkings van die bots (foto's), posisie (grafiek), %en meld (gestrande waarskuwing) met die gebruiker via matlab en/of e -pos. Verskeie
%klankopdragte word bygevoeg vir genot.
%e -pos vermoëns opstel
mail = '[email protected]';
password = 'EF230Roomba';
setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Internet', 'E_mail', pos);
setpref ('Internet', 'SMTP_Username', pos);
setpref ('Internet', 'SMTP_Password', wagwoord);
rekwisiete = 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; %stel kransensors se verwysingswaarde in
lightBumper_datum = 200; %stel lig Bumper sensors se verwysingswaarde
pos = [0, 0]; %veranderlike vir posisionering met datum geïnisialiseer
hoek = 0; %stel verwysingshoek in
netangle = 0; %netto hoek verplasing
ek = 2; %iterator vir die toevoeging van rye om die stoorveranderlike in die posisie te plaas
dist = 0;
r.setDriveVelocity (v, v); %begin roomba vorentoe
terwyl dit waar is
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Lig = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %genereer 1 ewekansige hoek tussen 20 en 60 grade. Word gebruik om te voorkom dat bot in 'n lus vasloop
%Wat om te doen as een of meer wiele kontak met die grond verloor:
%stop beweging, stuur 'n waarskuwings -e -pos met 'n prentjie van die omgewing, %en vra die gebruiker of hy wil voortgaan of om hulp te wag
as Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
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;
skryf (img, 'stuck.png');
%--------------------------
imfile = 'stuck.png';
posisie = savepos (pos);
%---------------------------
sendmail (pos, 'HELP!', 'Ek is gestrand op 'n krans!', {imfile, position})
list = {'Gaan voort', 'Stop'};
idx = menu ('Wat moet ek doen?', lys);
as idx == 2
breek
einde
%Wat om te doen as 'n voorwerp voor die bot opgespoor word:
%stop, beweeg terug, neem foto, waarsku gebruiker van ontdekking
%per e -pos, draai 90 grade en bly verken
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); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
i = i+1;
r.beep ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')
img = r.getImage;
skryf (img, 'FrontBump.png')
%--------------------------
imfile = 'FrontBump.png';
posisie = savepos (pos);
%---------------------------
sendmail (pos, 'Alert!', 'Ek het iets gevind!', {imfile, position})
hoek = 90;
netangle = netangle+hoek;
r.turnAngle (hoek);
r.setDriveVelocity (v, v);
%Wat om te doen as 'n voorwerp links van die bot opgespoor word:
%stop, draai na die voorwerp, maak 'n rugsteun, neem 'n foto, waarsku
%gebruiker van ontdekking via e -pos, draai 90 grade en bly verken
elseif Light.leftFront> lightBumper_datum || Lig.links> lightBumper_datum || Bult.links == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
i = i+1;
hoek = 30;
netangle = netangle+hoek;
r.turnAngle (hoek);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
i = i+1;
r.beep ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')
img = r.getImage;
skryf (img, 'LeftBump.png')
%--------------------------
imfile = 'LeftBump.png';
posisie = savepos (pos);
%---------------------------
sendmail (pos, 'Alert!', 'Ek het iets gevind!', {imfile, position})
hoek = -90;
netangle = netangle+hoek;
r.turnAngle (hoek);
r.setDriveVelocity (v, v);
%Wat om te doen as 'n voorwerp regs van die bot opgespoor word:
%stop, draai na die voorwerp, maak 'n rugsteun, neem 'n foto, waarsku
%gebruiker van ontdekking via e -pos, draai 90 grade en bly verken
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); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
i = i+1;
hoek = -30;
netangle = netangle+hoek;
r.turnAngle (hoek);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
i = i+1;
pouse (1.5);
r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
skryf (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
posisie = savepos (pos);
%---------------------------
sendmail (pos, 'Alert!', 'I found something!', {imfile, position});
hoek = 90;
netangle = netangle+hoek;
r.turnAngle (hoek);
r.setDriveVelocity (v, v);
%Wat om te doen as 'n krans links van die bot bespeur word:
%stop, beweeg agteruit, draai regs, gaan verken verder
elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %kry x koördineer
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %kry y koördineer
i = i+1;
hoek = -RandAngle;
netangle = netangle+hoek;
r.turnAngle (hoek);
r.setDriveVelocity (v, v);
%Wat om te doen as 'n krans regs van die bot bespeur word:
%stop, beweeg agteruit, draai links, gaan verken verder
elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = dist * sin (hoek); %kry x koördineer
pos (i, 2) = dist * cosd (hoek); %kry y koördineer
i = i+1;
r.moveDistance (-. 125);
hoek = RandAngle;
netangle = netangle+hoek;
r.turnAngle (hoek);
r.setDriveVelocity (v, v);
einde
einde
Slimfoonbeheerder
Opsies = {'Outonoom', 'Handmatige beheer'}
Prompt = menu ('Hoe wil u die rover beheer?', Opsies)
m = mobiledev
r = roomba (19)
as Prompt == 1
Verken (r)
anders
terwyl dit waar is
pouse (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Kant = PhoneData (3);
as kant> 130 || Sy <130
r.stop
r.biep ('C, C, C, C')
breek
andersif Kant> 25 && Kant <40 %as die telefoon sywaarts draai tussen 25 en 40 grade, draai 5 grade links
r.turnAngle (-5);
andersif Kant> 40 %as die telefoon sywaarts gedraai is, meer as 40 grade draai links na 45 grade
r.turnAngle (-45)
andersif Kant -40 %as die telefoon sywaarts draai tussen -25 en -40 grade, draai 5 grade regs
r.turnAngle (5);
andersif Kant <-40 %as die telefoon sywaarts gedraai word, minder as -40 grade, draai 45 grade links
r.turnAngle (45)
einde
%As die telefoon naby die vertikaal gehou word, neem 'n prentjie en teken dit
as Pitch <-60 && image <= 9
r.biep
img = r.getImage;
subplot (3, 3, beeld)
wys (img)
einde
%beweeg vorentoe en agtertoe, gebaseer op die voor- en agteroriëntasie
as Pitch> 15 && Pitch <35 %as pitch tussen 15 en 35 grade kort afstand vorentoe beweeg
%kry ligte bumperdata voordat u beweeg
litBump = r.getLightBumpers;
as litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %as iets voor die roomba is en dit sal tref as dit vorentoe beweeg, maak geraas en vertoon boodskap
r.beep ('C ^^, F#^, C ^^, F#^')
anders %beweeg
r.moveDistance (.03);
Kry bumperdata nadat u beweeg het
Bump = r.getBumpers;
as Bump.right == 1 || Bult.links == 1 || Bump.front == 1
r.biep ('A, C, E')
r.moveDistance (-. 01)
einde
%kry kransensordata
Cliff = r.getCliffSensors;
as Cliff.links> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %as iets veroorsaak dat die kransensor dit as lawa beskou en 'n rugsteun maak
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
einde
einde
anders as Pitch> 35 %as toonhoogte groter as 35 grade vorentoe beweeg
%kry ligte bumperdata voordat u beweeg
litBump = r.getLightBumpers;
as litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %as iets voor die roomba is en sal tref as dit vorentoe beweeg, maak geraas en vertoon boodskap
r.beep ('C ^^, F#^, C ^^, F#^')
anders %beweeg
r.moveDistance (.3)
Kry bumperdata nadat u beweeg het
Bump = r.getBumpers;
as Bump.right == 1 || Bult.links == 1 || Bump.front == 1 %as u iets tref, maak 'n geraas, vertoon boodskap en maak 'n rugsteun
r.biep ('A, C, E')
r.moveDistance (-. 01)
einde
%kry kranssensordata nadat hulle beweeg het
Cliff = r.getCliffSensors;
as Cliff.links> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %as iets veroorsaak dat die kransensor dit as lawa beskou en 'n rugsteun maak
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
einde
einde
anders as Pitch -35 %as die afstand tussen -15 en -35 grade kort afstand terug beweeg
r.moveDistance (-. 03);
%kry kranssensordata nadat hulle beweeg het
Cliff = r.getCliffSensors;
as Cliff.links> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %as iets veroorsaak dat die kransensor dit as lawa beskou en 'n rugsteun maak
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
einde
anders as Pitch -60 %as die toonhoogte tussen -35 en -60 grade langer afstand terug beweeg
r.moveDistance (-. 3)
%kry kranssensordata nadat hulle beweeg het
Cliff = r.getCliffSensors;
as Cliff.links> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %as iets veroorsaak dat die kransensor dit as lawa beskou en 'n rugsteun maak
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
einde
einde
einde
einde