Kazalo:
- 1. korak: Zberite svoje materiale
- 2. korak: Prenesite orodjarne Roomba za MATLAB
- 3. korak: Povežite se s svojo Roombo
- 4. korak: Izberite, kako želite upravljati svojo Roombo
- 5. korak: Vozite svojo Roombo
Video: Pretvarjanje vaše Roombe v Mars Rover: 5 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:02
1. korak: Zberite svoje materiale
Za dokončanje tega projekta boste morali zbrati naslednje materiale:
1 Roomba Robot
1 Raspberry Pi komplet
1 videokamera
Dostop do MATLAB -a
2. korak: Prenesite orodjarne Roomba za MATLAB
Zaženite naslednjo kodo, če želite namestiti potrebna orodjarna za dokončanje tega projekta.
funkcija roombaInstall
clc;
% seznam datotek za namestitev
files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% lokacije za namestitev
options = weboptions ('CertificateFilename', ''); % mu povejte, naj prezre zahteve za potrdila
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Namestitev/posodobitev Roombe';
% prikaz namena in prejem potrditve
poziv = {
'Ta program bo prenesel te datoteke EF 230 Roomba:'
''
strjoin (datoteke, '')
''
'v to mapo:'
''
cd
''
'Ali želite nadaljevati? '
};
pisk;
yn = questdlg (poziv, …
dlgTitle,…
„Da“, „Ne“, „Da“);
če ~ strcmp (yn, 'Da'), vrni; konec
% dobite seznam obstoječih datotek
obstoječe datoteke = datoteke (cellfun (@exist, files)> 0);
če je ~ isempty (obstoječi_datoteke)
% se prepričajte, da jih je res v redu zamenjati
prompt = {'Zamenjate te datoteke:'
''
strjoin (obstoječi_datoteka, '')
''
'V redu za zamenjavo?'
};
pisk;
yn = questdlg (poziv, …
dlgTitle,…
„Da“, „Ne“, „Da“);
če ~ strcmp (yn, 'Da'), vrni; konec
konec
% prenesite datoteke
cnt = 0;
za i = 1: dolžina (datoteke)
f = datoteke {i};
disp (['Prenos' f]);
poskusite
url = [strežnik f];
websave (f, url, možnosti); % dodanih možnosti za preprečitev varnostnih napak
cnt = cnt + 1;
ulov
disp (['Napaka pri nalaganju' f]);
lutka = [f '.html'];
če obstaja (lažna, 'datoteka') == 2
izbriši (lutka)
konec
konec
konec
če je cnt == dolžina (datoteke)
msg = 'Namestitev je uspela';
waitfor (msgbox (msg, dlgTitle));
drugače
msg = 'Napaka pri namestitvi - za podrobnosti glej ukazno okno';
waitfor (errordlg (msg, dlgTitle));
konec
end %roombaInstall
3. korak: Povežite se s svojo Roombo
Zdaj je čas, da se povežete z Roombo prek WiFi. Z dvema prstoma hkrati pritisnite gumb Dock in Spot, da vklopite ali ponastavite napravo Roomba. Nato zaženite kodo r = roomba (# vaše Roombe) v ukaznem oknu programa MATLAB, da se povežete z vašim robotom. Ko izvedete ta ukaz, mora biti vaša naprava Roomba pripravljena za uporabo.
4. korak: Izberite, kako želite upravljati svojo Roombo
Roombo lahko upravljate na dva načina: samostojno ali s pomočjo pametnega telefona kot krmilnika.
Če se odločite za avtonomno vožnjo z Roombo, boste morali uporabiti tri vgrajene senzorje: senzorje pečine, senzorje udarcev in senzorje svetlobe.
Če želite uporabljati pametni telefon, morate najprej povezati pametni telefon z računalnikom, tako da sledite spodnjim korakom.
OPOMBA: Za pravilno povezavo morata biti računalnik in pametni telefon v istem omrežju WiFi!
1. Prenesite aplikacijo MATLAB iz trgovine z aplikacijami v svoji napravi.
2. V ukazno okno vnesite "konektor vklopljen" in nastavite geslo, ki ga boste morali vnesti v obe napravi.
3. Po tem vam MATLAB posreduje IP naslov vaših računalnikov. V aplikaciji MATLAB na pametnem telefonu morate odpreti stran z nastavitvami in dodati računalnik z danim naslovom IP in geslom, ki ste ga vnesli prej.
4. V ukazno okno v računalniku vnesite kodo m = mobiledev in to bi moralo inicializirati vaš pametni telefon kot krmilnik za vašo Roombo.
5. Računalnik in pametni telefon morata biti pripravljena.
5. korak: Vozite svojo Roombo
Zdaj, ko imate vsa potrebna orodja za izdelavo vašega Mars Roverja, ste pripravljeni ustvariti svojo kodo. Spodaj smo priložili primer kode za avtonomno vožnjo in vožnjo s pametnim telefonom.
Avtonomna vožnja
funkcija Explore_modified (r)
%vhodnih argumentov: 1 predmet roomba, r
%izhodnih argumentov: nič
%opis:
%funkcija uporablja neskončno zanko while za avtonomijo
%raziskovanja okolice bota.
%
%funciton daje roombi tudi navodila, kaj naj naredi
%naslednjih situacij: kolesa izgubijo stik s tlemi, an
%objekta je zaznan pred ali na strani bota in a
%nenaden padec je zaznan pred ali na strani bota.
%
%tipičnih navodil vključuje ukaze za premik, namenjene povečanju
%raziskovanja ali izogibanja zaznani nevarnosti in ukazi za komunikacijo
%informacij o odkritjih botov (slike), položaju (graf), %in stanje (nasedlo opozorilo) z uporabnikom prek matlaba in/ali e -pošte. Več
%zvočnih ukazov je dodanih za uživanje.
%nastavitev e -poštnih zmogljivosti
mail = '[email protected]';
geslo = 'EF230Roomba';
setpref ('Internet', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Internet', 'E_mail', pošta);
setpref ('Internet', 'SMTP_Uporabniško ime', pošta);
setpref ('Internet', 'SMTP_Password', geslo);
rekviziti = 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;
odraža_datum = 2700; %nastavljena referenčna vrednost senzorjev pečine
lightBumper_datum = 200; %nastavljena referenčna vrednost senzorjev odbijača
pos = [0, 0]; %spremenljivka za shranjevanje položaja z inicializirano referenčno točko
kot = 0; %nastavljen referenčni kot
neopredeljeno = 0; %neto premik kota
i = 2; %iterator za dodajanje vrstic spremenljivki shranjevanja položaja
dist = 0;
r.setDriveVelocity (v, v); %zagon roombe naprej
medtem ko je res
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Light = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %ustvari 1 naključni kot med 20 in 60 stopinjami. Uporablja se za preprečevanje zagozditve bota v zanki
%Kaj storiti, če eno ali več koles izgubi stik s podlago:
%ustavite gibanje, pošljite opozorilno e -poštno sporočilo s sliko okolice, %in vprašajte uporabnika, ali naj nadaljuje ali počaka na pomoč
če je Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
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 (pošta, 'POMOČ!', 'Naseden sem na pečini!', {imfile, položaj})
list = {'Nadaljuj', 'Ustavi'};
idx = menu ('Kaj naj storim?', seznam);
če je idx == 2
prekiniti
konec
%Kaj storiti, če je pred botom zaznan predmet:
%stop, premaknite se nazaj, fotografirajte in opozorite uporabnika na odkritje
%po e -pošti, obrnite se za 90 stopinj in nadaljujte z raziskovanjem
elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1
r.stop;
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
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 (pošta, 'Opozorilo!', 'Našel sem nekaj!', {imfile, položaj})
kot = 90;
netangle = netangle+kot;
r.turnAngle (kot);
r.setDriveVelocity (v, v);
%Kaj storiti, če je objekt odkrit levo od bota:
%stop, obrnite se proti predmetu, naredite varnostno kopijo, fotografirajte, opozorilo
%uporabnikov odkritja po e -pošti, obrnite se za 90 stopinj in nadaljujte z raziskovanjem
elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1
r.stop;
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
i = i+1;
kot = 30;
netangle = netangle+kot;
r.turnAngle (kot);
r.moveDistance (-. 125);
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
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 (pošta, 'Opozorilo!', 'Našel sem nekaj!', {imfile, položaj})
kot = -90;
netangle = netangle+kot;
r.turnAngle (kot);
r.setDriveVelocity (v, v);
%Kaj storiti, če je objekt odkrit desno od bota:
%stop, obrnite se proti predmetu, naredite varnostno kopijo, fotografirajte, opozorilo
%uporabnikov odkritja po e -pošti, obrnite se za 90 stopinj in nadaljujte z raziskovanjem
elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Bump.right == 1
r.stop;
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
i = i+1;
kot = -30;
netangle = netangle+kot;
r.turnAngle (kot);
r.moveDistance (-. 125);
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
i = i+1;
premor (1,5);
r.beep ('C1^, C1^, C2^, D2^, D2^, C8^')
img = r.getImage;
imwrite (img, 'RightBump.png')
%--------------------------
imfile = 'RightBump.png';
position = savepos (pos);
%---------------------------
sendmail (pošta, 'Opozorilo!', 'Našel sem nekaj!', {imfile, položaj});
kot = 90;
netangle = netangle+kot;
r.turnAngle (kot);
r.setDriveVelocity (v, v);
%Kaj storiti, če je levo od bota zaznana pečina:
%stop, premaknite se nazaj, zavijte desno, nadaljujte z raziskovanjem
elseif Cliff.left <odraz_datum || Cliff.leftFront <refleks_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
poz (i, 1) = pos (i-1, 1) + dist * sind (neopredeljeno); %get x koordinata
poz (i, 2) = poz (i-1, 2) + dist * cosd (neopredeljeno); %get y koordinate
i = i+1;
kot = -RandAngle;
netangle = netangle+kot;
r.turnAngle (kot);
r.setDriveVelocity (v, v);
%Kaj storiti, če je na desni strani bota zaznana pečina:
%stop, premaknite se nazaj, zavijte levo, nadaljujte z raziskovanjem
elseif Cliff.right <odraz_datum || Cliff.rightFront <refleks_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (kot); %get x koordinata
poz (i, 2) = dist * cosd (kot); %get y koordinate
i = i+1;
r.moveDistance (-. 125);
kot = RandAngle;
netangle = netangle+kot;
r.turnAngle (kot);
r.setDriveVelocity (v, v);
konec
konec
Krmilnik za pametne telefone
Options = {'Autonomous', 'Manual Control'}
Poziv = meni ('Kako želite upravljati rover?', Možnosti)
m = mobiledev
r = roomba (19)
če je poziv == 1
Raziskovalec)
drugače
medtem ko je res
premor (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Nagib = PhoneData (2);
Stranska stran = PhoneData (3);
če je stran> 130 || Stran <-130 %, če je telefon obrnjen z licem navzdol, ustavite roombo in izhodno zanko
r.stop
r.beep ('C, C, C, C')
prekiniti
elseif Side> 25 && Side <40 %, če je telefon obrnjen vstran med 25 in 40 stopinjami, zavijte levo za 5 stopinj
r.turnAngle (-5);
sicer če je stran> 40 %, če je telefon obrnjen vstran za 40 stopinj, zavijte levo za 45 stopinj
r.turnAngle (-45)
Če pa telefon obrnete na stran med -25 in -40 stopinj, zavijte desno za 5 stopinj
r.turnAngle (5);
Če pa je telefon obrnjen vstran za manj kot -40 stopinj, zavijte levo za 45 stopinj
r.turnAngle (45)
konec
%Če telefon držite v bližini vertikale, posnemite sliko in jo narišite
če je Pitch <-60 && image <= 9
r.bip
img = r.getImage;
podplat (3, 3, slika)
imshow (img)
konec
%se premakne naprej in nazaj glede na orientacijo spredaj in zadaj
če je Pitch> 15 && Pitch <35 %, če se nagib med 15 in 35 stopinj premakne na kratko razdaljo naprej
%dobite podatke o odbijaču pred premikanjem
litBump = r.getLightBumpers;
če litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, če je nekaj pred roombo in bo udarilo, če se premakne naprej, naredite hrup in prikaže se sporočilo
r.beep ('C ^^, F#^, C ^^, F#^')
else %premakni
r.moveDistance (.03);
%Pridobite podatke o odbijaču po premikanju
Bump = r.getBumpers;
če je Bump.right == 1 || Bump.left == 1 || Bump.front == 1
r.beep ('A, C, E')
r.moveDistance (-. 01)
konec
%pridobi podatke senzorja pečine
Cliff = r.getCliffSensors;
če Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, če kaj sproži senzor pečine, ga obravnavajte kot lavo in varnostno kopirajte
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 031)
konec
konec
elseif Nagib> 35 %, če se višina višine 35 stopinj premakne na daljšo razdaljo
%dobite podatke o odbijaču pred premikanjem
litBump = r.getLightBumpers;
če litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, če je nekaj pred roombo in bo udaril, če se premakne naprej, naredi hrup in prikaže sporočilo
r.beep ('C ^^, F#^, C ^^, F#^')
else %premakni
r.moveDistance (.3)
%Pridobite podatke o odbijaču po premikanju
Bump = r.getBumpers;
če je Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, če nekaj pritisnete, naredite hrup, prikažete sporočilo in varnostno kopirate
r.beep ('A, C, E')
r.moveDistance (-. 01)
konec
%po selitvi pridobi podatke senzorja pečine
Cliff = r.getCliffSensors;
če Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, če kaj sproži senzor pečine, ga obravnavajte kot lavo in varnostno kopirajte
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (-. 31)
konec
konec
elseif Nagib -35 %, če se korak med -15 in -35 stopinjami premakne nazaj na kratko razdaljo
r.moveDistance (-. 03);
%po selitvi pridobi podatke senzorja pečine
Cliff = r.getCliffSensors;
če Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, če kaj sproži senzor pečine, ga obravnavajte kot lavo in varnostno kopirajte
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.04)
konec
elseif Nagib -60 %, če se korak med -35 in -60 stopinjami premakne na daljšo razdaljo
r.moveDistance (-. 3)
%po selitvi pridobi podatke senzorja pečine
Cliff = r.getCliffSensors;
če Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, če kaj sproži senzor pečine, ga obravnavajte kot lavo in varnostno kopirajte
r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')
r.moveDistance (.31)
konec
konec
konec
konec
Priporočena:
Pretvarjanje slušalk Bluetooth v zvočnike Bluetooth: 5 korakov
Pretvarjanje slušalk Bluetooth v zvočnike Bluetooth: Slušalka se ne napaja več sama, napaja se le, ko priključim polnilnik priključka mikro-USB, baterija je že prazna in eden od zvočnikov ne deluje. Toda Bluetooth še vedno deluje brez težav. Danes bom pokazal
Rokavice za pretvarjanje govora/besedila: 5 korakov
Rokavice za pretvarjanje govora/besedila: Ideja/pobuda pri izvajanju tega projekta je bila pomagati ljudem, ki imajo težave pri komunikaciji z govorom in komuniciranju z ročnimi kretnjami ali bolj znano kot ameriški podpisani jezik (ASL). Ta projekt je lahko korak k zagotavljanju
Pretvarjanje katerega koli R/C avtomobila v Bluetooth Control Control R/C Car: 9 korakov
Pretvarjanje katerega koli R/C avtomobila v Bluetooth App Control R/C Car: Ta projekt prikazuje korake za spremembo običajnega avtomobila z daljinskim upravljalnikom v avtomobil Bluetooth (BLE) z robotsko ploščo Wombatics SAM01, aplikacijo Blynk in MIT App Inventor. je veliko poceni RC avtomobilov z veliko funkcijami, kot so LED žarometi in
Od Roombe do Roverja v samo 5 korakih!: 5 korakov
Od Roombe do Roverja v samo 5 korakih !: Roomba roboti so zabaven in enostaven način, da svoje prste potopite v svet robotike. V tem navodilu bomo podrobno opisali, kako preprosto Roombo pretvoriti v rover, ki ga je mogoče upravljati in hkrati analizirati okolico. Seznam delov1.) MATLAB2.) Roomb
Čiščenje Roombe prve ali druge generacije: 8 korakov
Čiščenje Roombe prve ali druge generacije: Čist robot je srečen robot