INHOUDSOPGAWE:

Verander jou Roomba in 'n Mars Rover: 5 stappe
Verander jou Roomba in 'n Mars Rover: 5 stappe

Video: Verander jou Roomba in 'n Mars Rover: 5 stappe

Video: Verander jou Roomba in 'n Mars Rover: 5 stappe
Video: Дэниел Шмахтенбергер: Уничтожат ли нас технологии? 2024, November
Anonim
Omskep jou Roomba in 'n Mars Rover
Omskep jou Roomba in 'n Mars Rover

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

Laai die Roomba Toolboxes vir MATLAB af
Laai die Roomba Toolboxes vir MATLAB af
Laai die Roomba Toolboxes vir MATLAB af
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

Kies hoe u u Roomba wil beheer
Kies hoe u u Roomba wil beheer
Kies hoe u u Roomba wil beheer
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

Aanbeveel: