Innehållsförteckning:

Förvandla din Roomba till en Mars Rover: 5 steg
Förvandla din Roomba till en Mars Rover: 5 steg

Video: Förvandla din Roomba till en Mars Rover: 5 steg

Video: Förvandla din Roomba till en Mars Rover: 5 steg
Video: SpaceX Orbital Starship Mystery Pop and Tile Fall, NASA Humans to Mars Plan, Transporter 5, and more 2024, November
Anonim
Förvandla din Roomba till en Mars Rover
Förvandla din Roomba till en Mars Rover

Steg 1: Samla dina material

För att slutföra detta projekt måste du samla in följande material:

1 Roomba -robot

1 Raspberry Pi -kit

1 Videokamera

Tillgång till MATLAB

Steg 2: Ladda ner Roomba verktygslådor för MATLAB

Ladda ner Roomba verktygslådor för MATLAB
Ladda ner Roomba verktygslådor för MATLAB
Ladda ner Roomba verktygslådor för MATLAB
Ladda ner Roomba verktygslådor för MATLAB

Kör följande kod för att installera nödvändiga verktygslådor för att slutföra projektet.

funktionsrumbaInstall

clc;

% lista över filer som ska installeras

filer = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% plats att installera från

options = weboptions ('CertificateFilename', ''); % berätta att den ignorerar certifikatkrav

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Roomba -installation/uppdatering';

% visningsändamål och få bekräftelse

prompt = {

'Detta program hämtar dessa EF 230 Roomba -filer:'

''

strjoin (filer, '')

''

'till den här mappen:'

''

CD

''

'Vill du fortsätta? '

};

pip;

yn = questdlg (prompt, …

dlgTitle, …

'Ja', 'Nej', 'Ja');

om ~ strcmp (yn, 'Ja'), returnera; slutet

% få lista över filer som finns

befintliga_filer = filer (cellfun (@exist, filer)> 0);

om ~ isempty (befintliga_filer)

% se till att det verkligen är ok att byta ut dem

prompt = {'Du ersätter dessa filer:'

''

strjoin (befintliga_filer, '')

''

'OK att byta ut?'

};

pip;

yn = questdlg (prompt, …

dlgTitle, …

'Ja', 'Nej', 'Ja');

om ~ strcmp (yn, 'Ja'), returnera; slutet

slutet

% ladda ner filerna

cnt = 0;

för i = 1: längd (filer)

f = filer {i};

disp (['Hämtar' f]);

Prova

url = [server f];

webbspara (f, url, alternativ); % tillagda alternativ för att undvika säkerhetsfel

cnt = cnt + 1;

fånga

disp (['Fel vid nedladdning' f]);

dummy = [f '.html'];

if exist (dummy, 'file') == 2

ta bort (dummy)

slutet

slutet

slutet

om cnt == längd (filer)

msg = 'Installationen lyckades';

waitfor (msgbox (msg, dlgTitle));

annan

msg = 'Installationsfel - se kommandofönstret för mer information';

waitfor (errordlg (msg, dlgTitle));

slutet

slutet %roombaInstall

Steg 3: Anslut till din Roomba

Nu är det dags att ansluta till din Roomba med WiFi. Använd två fingrar och tryck på Dock- och Spot -knapparna samtidigt för att slå på eller återställa din Roomba. Kör sedan koden r = roomba (# av din Roomba) i kommandofönstret i MATLAB för att ansluta till din robot. När du har kört det här kommandot bör din Roomba vara redo att gå.

Steg 4: Välj hur du vill styra din Roomba

Välj hur du vill styra din Roomba
Välj hur du vill styra din Roomba
Välj hur du vill styra din Roomba
Välj hur du vill styra din Roomba

Det finns två sätt att styra din Roomba: autonomt eller att använda en smartphone som styrenhet.

Om du väljer att köra Roomba självständigt måste du använda de tre inbyggda sensorerna: klippsensorer, stötsensorer och ljussensorer.

För att använda en smartphone måste du först ansluta din smartphone till din dator genom att följa stegen nedan.

OBS: Din dator och smartphone måste vara på samma WiFi -nätverk för att kunna ansluta korrekt!

1. Ladda ner MATLAB -appen från appbutiken på din enhet.

2. Skriv "connector on" i ditt kommandofönster och ange ett lösenord som måste matas in i båda enheterna.

3. Efter att ha gjort det kommer MATLAB att ge dig din dators IP -adress. Du måste gå in på inställningssidan i MATLAB -appen på din smartphone och lägga till en dator med den angivna IP -adressen och lösenordet du angav tidigare.

4. I kommandofönstret på din dator skriver du koden m = mobiledev och detta bör initialisera din smartphone som en kontroller för din Roomba.

5. Din dator och smartphone ska vara redo att gå nu.

Steg 5: Kör din Roomba

Nu när du har alla nödvändiga verktyg för att skapa din Mars Rover, är du redo att skapa din egen kod. Vi har bifogat en exempelkod nedan för både autonom körning och smarttelefonstyrd körning.

Autonom körning

funktion Explore_modified (r)

%inmatningsargument: 1 roomba -objekt, r

%output -argument: ingen

%beskrivning:

%-funktionen använder en oändlig medan loop för att tillåta autonom

%utforskning av botens omgivning.

%

%funciton ger också instruktioner till roomba om vad de ska göra i

%följande situationer: Hjul förlorar kontakt med marken, an

%objekt detekteras framför eller på endera sidan av boten, och a

%plötslig nedgång detekteras framför eller till endera sidan av boten.

%

%typiska instruktioner inkluderar rörelsekommandon avsedda att maximera

%utforskning eller undvik en upptäckt fara och kommandon att kommunicera

%information om botarnas upptäckter (bilder), position (graf), %och ange (strandad varning) med användaren via matlab och/eller e -post. Flera

%ljudkommandon läggs till för njutning.

%konfigurera e -postfunktioner

mail = '[email protected]';

password = 'EF230Roomba';

setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');

setpref ('Internet', 'E_mail', e -post);

setpref ('Internet', 'SMTP_Username', mail);

setpref ('Internet', 'SMTP_Password', lösenord);

rekvisita = 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; %ställ in referensvärde för klippsensorer

lightBumper_datum = 200; %inställt ljus Stötfångarsensorer referensvärde

pos = [0, 0]; %variabel för positionslagring med datum initialiserat

vinkel = 0; %ställ in referensvinkel

netangle = 0; %nettovinkelförskjutning

i = 2; %iterator för att lägga till rader för lagringsvariabel

dist = 0;

r.setDriveVelocity (v, v); %starta roomba framåt

medan det är sant

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %genererar 1 slumpmässig vinkel mellan 20 och 60 grader. Används för att förhindra att bot fastnar i en loop

%Vad ska jag göra om ett eller flera hjul tappar kontakten med marken:

%stoppa rörelsen, skicka ett varningsmejl med bild av omgivningen, %och fråga användaren om den ska fortsätta eller vänta på hjälp

om Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r. stopp

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

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';

position = savepos (pos);

%---------------------------

sendmail (mail, "HJÄLP!", "Jag är strandad på en klippa!", {imfile, position})

list = {'Fortsätt', 'Stopp'};

idx = menu ('Vad ska jag göra?', lista);

om idx == 2

ha sönder

slutet

%Vad ska jag göra om ett objekt detekteras framför bot:

%stopp, gå tillbaka, ta bild, varna användaren om upptäckten

%via e -post, vrid 90 grader och fortsätt utforska

elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r. stopp;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

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 (pos);

%---------------------------

sendmail (mail, 'Alert!', 'I found something!', {imfile, position})

vinkel = 90;

netangle = netangle+vinkel;

r.turnAngle (vinkel);

r.setDriveVelocity (v, v);

%Vad ska jag göra om objektet upptäcks till vänster om botten:

%stopp, vänd mot objektet, säkerhetskopiera, ta bild, varna

%upptäcktsanvändare via e -post, vrid 90 grader och fortsätt utforska

elseif Light.leftFront> lightBumper_datum || Ljus.vänster> lightBumper_datum || Bump.vänster == 1

r. stopp;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

i = i+1;

vinkel = 30;

netangle = netangle+vinkel;

r.turnAngle (vinkel);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

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 (pos);

%---------------------------

sendmail (mail, 'Alert!', 'I found something!', {imfile, position})

vinkel = -90;

netangle = netangle+vinkel;

r.turnAngle (vinkel);

r.setDriveVelocity (v, v);

%Vad ska jag göra om objektet upptäcks till höger om bot:

%stopp, vänd mot objektet, säkerhetskopiera, ta bild, varna

%upptäcktsanvändare via e -post, vrid 90 grader och fortsätt utforska

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1

r. stopp;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

i = i+1;

vinkel = -30;

netangle = netangle+vinkel;

r.turnAngle (vinkel);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

i = i+1;

paus (1,5);

r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getImage;

imwrite (img, 'RightBump.png')

%--------------------------

imfile = 'RightBump.png';

position = savepos (pos);

%---------------------------

sendmail (mail, 'Alert!', 'I found something!', {imfile, position});

vinkel = 90;

netangle = netangle+vinkel;

r.turnAngle (vinkel);

r.setDriveVelocity (v, v);

%Vad ska jag göra om klippan detekteras till vänster om botten:

%stopp, gå bakåt, sväng höger, fortsätt utforska

elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum

r. stopp;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %få x koordinat

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %få y koordinat

i = i+1;

vinkel = -RandAngle;

netangle = netangle+vinkel;

r.turnAngle (vinkel);

r.setDriveVelocity (v, v);

%Vad ska jag göra om klippan detekteras till höger om bot:

%stopp, gå bakåt, sväng vänster, fortsätt utforska

elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum

r. stopp;

dist = r.getDistance;

pos (i, 1) = dist * sind (vinkel); %få x koordinat

pos (i, 2) = dist * cosd (vinkel); %få y koordinat

i = i+1;

r.moveDistance (-. 125);

vinkel = RandAngle;

netangle = netangle+vinkel;

r.turnAngle (vinkel);

r.setDriveVelocity (v, v);

slutet

slutet

Smartphone Controller

Options = {'Autonomous', 'Manual Control'}

Prompt = meny ('Hur skulle du vilja styra rovern?', Alternativ)

m = mobiledev

r = roomba (19)

om Prompt == 1

Utforska (r)

annan

medan det är sant

paus (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Pitch = PhoneData (2);

Sida = PhoneData (3);

om sidan> 130 || Sida <-130 %om telefonen vänds med framsidan nedåt stoppa roomba och avsluta slingan

r. stopp

r. pip ('C, C, C, C')

ha sönder

elseif Sida> 25 && Sida <40 %om telefonen vrids i sidled mellan 25 och 40 grader sväng vänster 5 grader

r.turnAngle (-5);

elseif Sida> 40 %om telefonen vrids åt sidan över 40 grader sväng vänster 45 grader

r.turnAngle (-45)

annarsif Sida -40 %om telefonen vrids åt sidan mellan -25 och -40 grader sväng höger 5 grader

r.turnAngle (5);

elseif Sida <-40 %om telefonen vrids åt sidan mindre än -40 grader sväng vänster 45 grader

r.turnAngle (45)

slutet

%Om telefonen hålls nära vertikalen tar du en bild och plottar den

om Pitch <-60 && image <= 9

r. pip

img = r.getImage;

delplan (3, 3, bild)

imshow (img)

slutet

%gå framåt och bakåt baserat på fram- och bakriktningen

om Pitch> 15 && Pitch <35 %om pitch mellan 15 och 35 grader går framåt kort sträcka

%får lätt stötfångardata innan du flyttar

litBump = r.getLightBumpers;

om litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %om något är framför roomba och kommer att slå om det rör sig framåt gör buller och visar meddelande

r.beep ('C ^^, F#^, C ^^, F#^')

annars %flytta

r.moveDistance (.03);

Få hämtningsdata efter att ha flyttat

Bump = r.getBumpers;

om Bump.right == 1 || Bump.vänster == 1 || Bump.front == 1

r. pip ('A, C, E')

r.moveDistance (-. 01)

slutet

%få data från klippsensorn

Cliff = r.getCliffSensors;

om Cliff.vänster> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %om något utlöser klippsensorn behandla det som lava och backa upp

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

slutet

slutet

annars om tonhöjd> 35 %om tonhöjden är högre än 35 grader, gå längre sträckor framåt

%får lätt stötfångardata innan du flyttar

litBump = r.getLightBumpers;

om litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %om något är framför roomba och kommer att slå om det rör sig framåt, ljud och visa meddelande

r.beep ('C ^^, F#^, C ^^, F#^')

annars %flytta

r.moveDistance (.3)

Få hämtningsdata efter att ha flyttat

Bump = r.getBumpers;

om Bump.right == 1 || Bump.vänster == 1 || Bump.front == 1 %om du träffar något gör ett ljud, visar meddelande och säkerhetskopierar

r. pip ('A, C, E')

r.moveDistance (-. 01)

slutet

%får kliffsensordata efter att ha flyttat

Cliff = r.getCliffSensors;

om Cliff.vänster> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %om något utlöser klippsensorn behandla det som lava och backa upp

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

slutet

slutet

elseif Pitch -35 %om tonhöjd mellan -15 och -35 grader flyttar tillbaka kort distans

r.moveDistance (-. 03);

%får kliffsensordata efter att ha flyttat

Cliff = r.getCliffSensors;

om Cliff.vänster> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %om något utlöser klippsensorn behandla det som lava och backa upp

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

slutet

elseif Pitch -60 %om tonhöjd mellan -35 och -60 grader flyttas bakåt längre avstånd

r.moveDistance (-. 3)

%får kliffsensordata efter att ha flyttat

Cliff = r.getCliffSensors;

om Cliff.vänster> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %om något utlöser klippsensorn behandla det som lava och backa upp

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

slutet

slutet

slutet

slutet

Rekommenderad: