Inhoudsopgave:

Uw Roomba in een Mars Rover veranderen: 5 stappen
Uw Roomba in een Mars Rover veranderen: 5 stappen

Video: Uw Roomba in een Mars Rover veranderen: 5 stappen

Video: Uw Roomba in een Mars Rover veranderen: 5 stappen
Video: Wanneer een douche nemen te duur is... 2024, November
Anonim
Uw Roomba in een Mars Rover veranderen
Uw Roomba in een Mars Rover veranderen

Stap 1: Verzamel uw materialen

Om dit project te voltooien, moet u de volgende materialen verzamelen:

1 Roomba-robot

1 Raspberry Pi-kit

1 videocamera

Toegang tot MATLAB

Stap 2: Download de Roomba Toolboxes voor MATLAB

Download de Roomba Toolboxen voor MATLAB
Download de Roomba Toolboxen voor MATLAB
Download de Roomba Toolboxen voor MATLAB
Download de Roomba Toolboxen voor MATLAB

Voer de volgende code uit om de benodigde toolboxen te installeren om dit project te voltooien.

functie kamerbaInstalleren

clc;

% lijst met te installeren bestanden

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

% locatie om vanaf te installeren

options = weboptions('CertificaatBestandsnaam', ''); % vertel het de certificaatvereisten te negeren

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

dlgTitle = 'Roomba installeren/bijwerken';

% weergavedoel en ontvang bevestiging

prompt = {

'Dit programma zal deze EF 230 Roomba-bestanden downloaden:'

''

strjoin(bestanden, ' ')

''

'naar deze map:'

''

CD

''

'Wil je doorgaan? '

};

piep;

yn = questdlg(prompt, …

dlgTitel, …

'Ja', 'Nee', 'Ja');

if ~strcmp(yn, 'Ja'), return; einde

% lijst met bestaande bestanden op

bestaande_bestanden = bestanden(cellfun(@bestaan, bestanden)> 0);

if ~isempty(existing_files)

% zorg ervoor dat het echt in orde is om ze te vervangen

prompt = {'U vervangt deze bestand(en): '

''

strjoin(bestaande_bestanden, ' ')

''

'OK om te vervangen?'

};

piep;

yn = questdlg(prompt, …

dlgTitel, …

'Ja', 'Nee', 'Ja');

if ~strcmp(yn, 'Ja'), return; einde

einde

% download de bestanden

cnt = 0;

voor i=1:lengte(bestanden)

f=bestanden{i};

disp(['Bezig met downloaden' f]);

proberen

url = [server f];

websave (f, url, opties); % toegevoegde opties om beveiligingsfouten te voorkomen

cnt = cnt + 1;

vangst

disp(['Fout bij downloaden' f]);

dummy = [f '.html'];

indien aanwezig(dummy, 'bestand')==2

verwijderen (dummy)

einde

einde

einde

if cnt == lengte (bestanden)

msg = 'Installatie geslaagd';

waitfor(msgbox(msg, dlgTitle));

anders

msg = 'Installatiefout - zie opdrachtvenster voor details';

waitfor(errordlg(bericht, dlgTitel));

einde

einde %roombaInstall

Stap 3: Maak verbinding met uw Roomba

Nu is het tijd om verbinding te maken met uw Roomba via WiFi. Druk met 2 vingers tegelijkertijd op de Dock- en Spot-knoppen om uw Roomba in te schakelen of te resetten. Voer vervolgens de code r=roomba(# van uw Roomba) uit in het opdrachtvenster van MATLAB om verbinding te maken met uw robot. Nadat u deze opdracht hebt uitgevoerd, zou uw Roomba klaar moeten zijn voor gebruik.

Stap 4: Kies hoe u uw Roomba. wilt bedienen

Kies hoe u uw Roomba. wilt bedienen
Kies hoe u uw Roomba. wilt bedienen
Kies hoe u uw Roomba. wilt bedienen
Kies hoe u uw Roomba. wilt bedienen

Er zijn twee manieren waarop u uw Roomba kunt bedienen: autonoom of met een smartphone als controller.

Als u ervoor kiest om de Roomba autonoom te besturen, moet u de drie ingebouwde sensoren gebruiken: klifsensoren, stootsensoren en lichtsensoren.

Om een smartphone te kunnen gebruiken, moet u eerst uw smartphone op uw computer aansluiten door de onderstaande stappen te volgen.

LET OP: Je computer en smartphone moeten op hetzelfde wifi-netwerk zijn aangesloten om een goede verbinding te maken!

1. Download de MATLAB-app uit de app store op uw apparaat.

2. Typ "connector aan" in uw opdrachtvenster en stel een wachtwoord in dat op beide apparaten moet worden ingevoerd.

3. Hierna geeft MATLAB u het IP-adres van uw computer. U moet naar de instellingenpagina in de MATLAB-app op uw smartphone gaan en een computer toevoegen met het opgegeven IP-adres en het eerder ingevoerde wachtwoord.

4. Typ in het opdrachtvenster op uw computer de code m=mobiledev en dit zou uw smartphone moeten initialiseren als een controller voor uw Roomba.

5. Uw computer en smartphone zouden nu klaar moeten zijn voor gebruik.

Stap 5: Rijd met uw Roomba

Nu je alle benodigde tools hebt om je Mars Rover te maken, ben je klaar om je eigen code te maken. We hebben hieronder een voorbeeldcode bijgevoegd voor zowel het autonoom rijden als het smartphone-gestuurd rijden.

Autonoom rijden

functie Explore_modified(r)

%invoerargumenten: 1 roomba-object, r

%outputargumenten: geen

%Omschrijving:

%function gebruikt een oneindige while-lus om autonoom te zijn

%verkenning van de omgeving van de bot.

%

%fucciton geeft ook instructies aan de roomba over wat te doen in

%de volgende situaties: wiel(en) verliezen contact met de grond, en

%object wordt gedetecteerd voor of aan weerszijden van de bot, en a

%plotselinge daling wordt gedetecteerd voor of aan weerszijden van de bot.

%

%typische instructies bevatten bewegingscommando's die bedoeld zijn om te maximaliseren

%verkenning of vermijd een gedetecteerd gevaar en commando's om te communiceren

% informatie over de ontdekkingen van de bots (foto's), positie (grafiek), %en staat (gestrande waarschuwing) met de gebruiker via matlab en/of e-mail. Meerdere

%sound-commando's zijn toegevoegd om van te genieten.

%setup e-mailmogelijkheden

mail = '[email protected]';

wachtwoord = 'EF230Roomba';

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

setpref('Internet', 'E-mail', mail);

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

setpref('Internet', 'SMTP_Password', wachtwoord);

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 = 0,1;

reflect_datum=2700; %set cliff-sensoren referentiewaarde

lightBumper_datum = 200; %set light Bumpersensoren referentiewaarde

pos=[0, 0]; %variabele voor positieopslag met datum geïnitialiseerd

hoek=0; %set referentiehoek

nethoek=0; % netto hoekverplaatsing

ik=2; %iterator voor het toevoegen van rijen om de opslagvariabele te positioneren

afstand = 0;

r.setDriveVelocity(v, v); %start roomba vooruit

terwijl het waar is

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Licht = r.getLightBumpers;

RandAngle = randi([20, 60], 1); %genereert 1 willekeurige hoek tussen 20 en 60 graden. Wordt gebruikt om te voorkomen dat bots vast komen te zitten in een lus

%Wat te doen als een of meer wielen het contact met de grond verliezen:

%stop beweging, stuur een waarschuwingsmail met foto van de omgeving, %en vraag de gebruiker of hij verder wil gaan of op hulp moet wachten

if Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

ik=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, 'vastgelopen.png');

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

imfile='vastgelopen.png';

positie=savepos(pos);

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

sendmail(mail, 'HELP!', 'Ik ben gestrand op een klif!', {imfile, position})

lijst = {'Doorgaan', 'Stop'};

idx = menu('Wat moet ik doen?', lijst);

als idx == 2

pauze

einde

%Wat te doen als een object wordt gedetecteerd voor de bot:

%stop, ga terug, maak een foto, waarschuw gebruiker voor ontdekking

%via e-mail, draai 90 graden en blijf ontdekken

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); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

ik=i+1;

r.moveDistance(-.125);

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

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

positie=savepos(pos);

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

sendmail(mail, 'Alert!', 'Ik heb iets gevonden!', {imfile, position})

hoek = 90;

nettangle=netangle+hoek;

r.turnAngle(hoek);

r.setDriveVelocity(v, v);

%Wat te doen als object links van bot wordt gedetecteerd:

%stop, draai naar object, achteruit, maak een foto, alarm

%gebruiker van ontdekking via e-mail, draai 90 graden en blijf ontdekken

elseif Light.leftFront > lightBumper_datum || Light.left > lightBumper_datum || Bump.links == 1

r.stop;

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

ik=i+1;

hoek=30;

nettangle=netangle+hoek;

r.turnAngle(hoek);

r.moveDistance(-.125);

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

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

positie=savepos(pos);

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

sendmail(mail, 'Alert!', 'Ik heb iets gevonden!', {imfile, position})

hoek=-90;

nettangle=netangle+hoek;

r.turnAngle(hoek);

r.setDriveVelocity(v, v);

%Wat te doen als object rechts van bot wordt gedetecteerd:

%stop, draai naar object, achteruit, maak een foto, alarm

%gebruiker van ontdekking via e-mail, draai 90 graden en blijf ontdekken

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

r.stop;

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

ik=i+1;

hoek=-30;

nettangle=netangle+hoek;

r.turnAngle(hoek);

r.moveDistance(-.125);

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

ik=i+1;

pauze (1.5);

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

img = r.getImage;

imwrite(img, 'RightBump.png')

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

imfile='RightBump.png';

positie=savepos(pos);

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

sendmail(mail, 'Alert!', 'Ik heb iets gevonden!', {imfile, position});

hoek=90;

nettangle=netangle+hoek;

r.turnAngle(hoek);

r.setDriveVelocity(v, v);

%Wat te doen als er een klif wordt gedetecteerd aan de linkerkant van de bot:

%stop, ga achteruit, draai naar rechts, ga verder met verkennen

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

r.stop;

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

ik=i+1;

r.moveDistance(-.125);

dist = r.getDistance;

pos(i, 1)= pos(i-1, 1) + dist * sind(netangle); %haal x-coördinaat

pos(i, 2)= pos(i-1, 2) + dist * cosd(netangle); %haal y-coördinaat

ik=i+1;

hoek=-RandAngle;

nettangle=netangle+hoek;

r.turnAngle(hoek);

r.setDriveVelocity(v, v);

%Wat te doen als er een klif wordt gedetecteerd rechts van de bot:

%stop, ga achteruit, draai naar links, ga verder met verkennen

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

r.stop;

dist = r.getDistance;

pos(i, 1)= dist * sind(hoek); %haal x-coördinaat

pos(i, 2)= dist * cosd(hoek); %haal y-coördinaat

ik=i+1;

r.moveDistance(-.125);

hoek=RandHoek;

nettangle=netangle+hoek;

r.turnAngle(hoek);

r.setDriveVelocity(v, v);

einde

einde

Smartphone-controller

Opties = {'Autonoom', 'Handmatige bediening'}

Prompt = menu('Hoe wil je de rover besturen?', Opties)

m = mobieldev

r = roomba(19)

als prompt == 1

Ontdekkingsreiziger)

anders

terwijl het waar is

pauze (.5)

PhoneData=m. Oriëntatie;

Azi=Telefoongegevens(1);

Pitch=Telefoongegevens(2);

Side=Telefoongegevens(3);

als zijde>130 || Zijkant<-130 %als de telefoon met de voorkant naar beneden is omgedraaid, stop dan de roomba en verlaat de lus

r.stop

r.piep('C, C, C, C')

pauze

elseif Side>25 && Side<40 %als de telefoon zijwaarts is gedraaid tussen 25 en 40 graden draai links 5 deg

r.turnAngle(-5);

elseif Side>40 %als de telefoon meer dan 40 graden zijwaarts is gedraaid, links 45 graden draaien

r.turnAngle(-45)

elseif Side-40 %als de telefoon zijwaarts is gedraaid tussen -25 en -40 graden draai rechts 5 deg

r.turnAngle(5);

elseif Side<-40 %als de telefoon minder dan -40 graden opzij is gedraaid, 45 graden naar links draaien

r.turnAngle(45)

einde

%Als de telefoon in de buurt van een verticaal wordt gehouden, maak dan een afbeelding en plot deze

if Pitch<-60 && afbeelding<=9

r.piep

img=r.getImage;

subplot(3, 3, afbeelding)

imshow(img)

einde

%vooruit en achteruit bewegen op basis van de voor- en achteroriëntatie

als Pitch>15 && Pitch<35% als Pitch tussen 15 en 35 graden een korte afstand naar voren beweegt

%verkrijg lichte bumpergegevens voordat u verhuist

litBump=r.getLightBumpers;

indien verlichtBump.leftFront>500 || litBump.leftCenter>500 || litBump.rightCenter>500 || litBump.rightFront>500 %als er iets voor de roomba staat en zal raken als het naar voren beweegt maak geluid en geef een bericht weer

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

anders %verplaats

r.moveDistance(.03);

%Bumpergegevens ophalen na verhuizing

Bump=r.getBumpers;

if Bump.right==1 || Bump.left==1 || Bump.front==1

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

r.moveDistance(-.01)

einde

%klip sensorgegevens ophalen

Cliff=r.getCliffSensoren;

als Cliff.links>1500 || Cliff.leftFront>1500 || Cliff.rechtsVoor>1500 || Cliff.right>1500 %als iets de klifsensor activeert, behandel het dan als lava en maak een back-up

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

r.moveDistance(-.031)

einde

einde

elseif Pitch>35 %if pitch groter 35 graden verplaats grotere afstand naar voren

%verkrijg lichte bumpergegevens voordat u verhuist

litBump=r.getLightBumpers;

indien verlichtBump.leftFront>15 || litBump.leftCenter>15 || litBump.rightCenter>15 || litBump.rightFront>15% als er iets voor de roomba staat en zal raken als het naar voren beweegt maak geluid en geef een bericht weer

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

anders %verplaats

r.moveDistance(.3)

%Bumpergegevens ophalen na verhuizing

Bump=r.getBumpers;

if Bump.right==1 || Bump.left==1 || Bump.front==1 %als je iets raakt, maak dan een geluid, geef een bericht weer en maak een back-up

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

r.moveDistance(-.01)

einde

%klip sensorgegevens ophalen na het verplaatsen

Cliff=r.getCliffSensoren;

als Cliff.links>1500 || Cliff.leftFront>1500 || Cliff.rechtsVoor>1500 || Cliff.right>1500 %als iets de klifsensor activeert, behandel het dan als lava en maak een back-up

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

r.moveDistance(-.31)

einde

einde

elseif Pitch-35% als pitch tussen -15 en -35 deg korte afstand terug bewegen

r.moveDistance(-.03);

%klip sensorgegevens ophalen na het verplaatsen

Cliff=r.getCliffSensoren;

als Cliff.links>1500 || Cliff.leftFront>1500 || Cliff.rechtsVoor>1500 || Cliff.right>1500 %als iets de klifsensor activeert, behandel het dan als lava en maak een back-up

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

r.moveDistance(.04)

einde

elseif Pitch-60 %if pitch tussen -35 en -60 deg grotere afstand terug bewegen

r.moveDistance(-.3)

%klip sensorgegevens ophalen na het verplaatsen

Cliff=r.getCliffSensoren;

als Cliff.links>1500 || Cliff.leftFront>1500 || Cliff.rechtsVoor>1500 || Cliff.right>1500 %als iets de klifsensor activeert, behandel het dan als lava en maak een back-up

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

r.moveDistance(.31)

einde

einde

einde

einde

Aanbevolen: