Inhoudsopgave:
- Stap 1: Verzamel uw materialen
- Stap 2: Download de Roomba Toolboxes voor MATLAB
- Stap 3: Maak verbinding met uw Roomba
- Stap 4: Kies hoe u uw Roomba. wilt bedienen
- Stap 5: Rijd met uw Roomba
Video: Uw Roomba in een Mars Rover veranderen: 5 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:14
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
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
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:
Een oude/beschadigde pc of laptop in een mediabox veranderen: 9 stappen
Een oude/beschadigde pc of laptop in een mediabox veranderen: in een wereld waar de technologie het snelst vordert dan wij, wordt onze geliefde elektronica maar al te snel verouderd. Misschien hebben je altijd liefhebbende katten je laptop van de tafel geslagen en is het scherm kapot gegaan. Of misschien wil je wel een mediabox voor een smart tv
Een lineaire actuator in een bewegende transformator veranderen: 6 stappen
Een lineaire actuator in een bewegende transformator veranderen?: Als u een bewegende transformator wilt bezitten, moet u dit artikel lezen. We zouden de ledematen van de transformator willen laten bewegen, eenvoudige taken uitvoeren en een paar dingen zeggen, of zelfs weten hoe te staan, zitten en met de hand te zwaaien. De kracht van
Een gitaarbuizenversterker in een voorversterker/distortion-eenheid veranderen (met Load Box) - Ajarnpa
Hoe maak je een gitaar buizenversterker in een voorversterker/distortion unit (met Load Box): Hallo allemaal!!! Dit is mijn eerste Instructables, ik zal je uitleggen hoe je een kleine buizen gitaarversterker in een voorversterker/pedaal verandert, met laadbox; Ik ben Frans en mijn Engels is beperkt, dus als ik wat fouten heb gemaakt, vergeef me dan alsjeblieft
Hoe u elke audio in een beltoon op een Apple Phone kunt veranderen: 5 stappen
Hoe u elke audio in een beltoon op een Apple-telefoon kunt veranderen: als u het beu bent de enige te zijn die de generieke beltoon heeft, of er niet voor wilt betalen, is dit eenvoudige project geweldig voor u
Een LAPTOP-CPU (en andere coole dingen!) Upgraden om een LANGZAME/DEAD-laptop in een SNELLE laptop te veranderen: 4 stappen
Een LAPTOP-CPU upgraden (en andere coole dingen!) om een LANGZAME/DEAD-laptop in een SNELLE laptop te veranderen! erg verouderd … Het LCD-scherm was kapot en de belangrijkste harde schijf was vastgelopen, dus de laptop was in wezen dood … Zie foto's en