Turinys:

„Roomba“pavertimas „Mars Rover“: 5 žingsniai
„Roomba“pavertimas „Mars Rover“: 5 žingsniai

Video: „Roomba“pavertimas „Mars Rover“: 5 žingsniai

Video: „Roomba“pavertimas „Mars Rover“: 5 žingsniai
Video: Jak mówić w różnych językach świata! 2024, Liepa
Anonim
„Roomba“pavertimas „Mars Rover“
„Roomba“pavertimas „Mars Rover“

1 žingsnis: surinkite savo medžiagas

Norėdami užbaigti šį projektą, turėsite surinkti šią medžiagą:

1 „Roomba“robotas

1 „Raspberry Pi“rinkinys

1 Vaizdo kamera

Prieiga prie MATLAB

2 veiksmas: atsisiųskite „Roomba“įrankių rinkinius, skirtus MATLAB

Atsisiųskite „Roomba Toolboxes“, skirtą MATLAB
Atsisiųskite „Roomba Toolboxes“, skirtą MATLAB
Atsisiųskite „Roomba Toolboxes“, skirtą MATLAB
Atsisiųskite „Roomba Toolboxes“, skirtą MATLAB

Vykdykite šį kodą, kad įdiegtumėte įrankių dėžes, būtinas šiam projektui užbaigti.

funkcija roombaInstall

clc;

% failų, kuriuos reikia įdiegti, sąrašas

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

% vieta, iš kurios reikia įdiegti

options = weboptions ('CertificateFilename', ''); % liepia ignoruoti sertifikatų reikalavimus

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

dlgTitle = '„Roomba“diegimas/atnaujinimas “;

% rodymo tikslas ir gaukite patvirtinimą

raginimas = {

"Ši programa atsisiųs šiuos EF 230 Roomba failus:"

''

strjoin (failai, "")

''

"į šį aplanką:"

''

cd

''

'Ar norite tęsti? '

};

pyptelėjimas;

yn = questdlg (raginimas,…

dlgPavadinimas,…

„Taip“, „Ne“, „Taip“);

jei ~ strcmp (yn, 'Taip'), grįžti; galas

% gauti esamų failų sąrašą

esami_failai = failai („cellfun“(@egzistuoja, failai)> 0);

jei ~ tuščias (esami_failai)

% įsitikinkite, kad tikrai gerai juos pakeisti

prompt = {'Jūs keičiate šiuos failus:'

''

strjoin (esami_failai, "")

''

"Gerai pakeisti?"

};

pyptelėjimas;

yn = questdlg (raginimas,…

dlgPavadinimas,…

„Taip“, „Ne“, „Taip“);

jei ~ strcmp (yn, 'Taip'), grįžti; galas

galas

% atsisiųsti failus

cnt = 0;

i = 1: ilgis (failai)

f = failai {i};

disp (['Atsisiunčiama' f]);

bandyti

url = [serveris f];

žiniatinklio išsaugojimas (f, url, parinktys); % pridėta parinkčių, kad būtų išvengta saugumo klaidų

cnt = cnt + 1;

pagauti

disp (['Klaida atsisiunčiant' f]);

manekenas = [f '.html'];

jei yra (fiktyvus, „failas“) == 2

ištrinti (fiktyvus)

galas

galas

galas

jei cnt == ilgis (failai)

msg = 'Sėkmingas diegimas';

laukti (msgbox (msg, dlgTitle));

Kitas

msg = 'Diegimo klaida - daugiau informacijos rasite komandų lange';

waitfor (errordlg (msg, dlgTitle));

galas

pabaiga %roombaInstall

3 žingsnis: prisijunkite prie „Roomba“

Dabar atėjo laikas prisijungti prie „Roomba“naudojant „WiFi“. Naudodami 2 pirštus, vienu metu paspauskite „Dock“ir „Spot“mygtukus, kad įjungtumėte arba iš naujo nustatytumėte „Roomba“. Tada paleiskite kodą r = roomba („Roomba“#) MATLAB komandų lange, kad prisijungtumėte prie savo roboto. Kai įvykdysite šią komandą, jūsų „Roomba“turėtų būti paruošta naudoti.

4 žingsnis: pasirinkite, kaip norite valdyti savo „Roomba“

Pasirinkite, kaip norite valdyti „Roomba“
Pasirinkite, kaip norite valdyti „Roomba“
Pasirinkite, kaip norite valdyti „Roomba“
Pasirinkite, kaip norite valdyti „Roomba“

Yra du būdai, kaip valdyti „Roomba“: autonomiškai arba naudojant išmanųjį telefoną kaip valdiklį.

Jei pasirinksite vairuoti „Roomba“savarankiškai, turėsite naudoti tris įmontuotus jutiklius: uolų jutiklius, smūgių jutiklius ir šviesos jutiklius.

Norėdami naudoti išmanųjį telefoną, pirmiausia turite prijungti išmanųjį telefoną prie kompiuterio, atlikdami toliau nurodytus veiksmus.

PASTABA: norint tinkamai prisijungti, jūsų kompiuteris ir išmanusis telefonas turi būti tame pačiame „WiFi“tinkle!

1. Atsisiųskite MATLAB programą iš savo įrenginio programų parduotuvės.

2. Į komandų langą įveskite „connector on“ir nustatykite slaptažodį, kurį reikės įvesti į abu įrenginius.

3. Po to MATLAB suteiks jūsų kompiuteriams IP adresą. Turite eiti į išmaniojo telefono MATLAB programos nustatymų puslapį ir pridėti kompiuterį naudodami nurodytą IP adresą ir anksčiau įvestą slaptažodį.

4. Komandos komandų lange įveskite kodą m = mobiledev ir tai turėtų inicijuoti jūsų išmanųjį telefoną kaip „Roomba“valdiklį.

5. Jūsų kompiuteris ir išmanusis telefonas turėtų būti paruošti naudoti dabar.

5 žingsnis: vairuokite „Roomba“

Dabar, kai turite visas reikalingas priemones „Mars Rover“sukūrimui, esate pasiruošę sukurti savo kodą. Žemiau pridėjome pavyzdinį kodą, skirtą autonominiam vairavimui ir vairavimui išmaniuoju telefonu.

Autonominis vairavimas

funkcija Explore_modified (r)

%įvesties argumentų: 1 roomba objektas, r

%išvesties argumentų: nėra

%apibūdinimas:

Funkcija %naudoja begalinę ciklo dalį, kad būtų galima savarankiškai veikti

%roboto aplinkos tyrinėjimas.

%

„ %funciton“taip pat pateikia „roomba“nurodymus, ką daryti

%šiose situacijose: Ratas (-ai) praranda kontaktą su žeme, an

%objektas aptinkamas prieš robotą arba į bet kurią jo pusę, ir a

%staigaus kritimo aptinkama priešais robotą arba į bet kurią jo pusę.

%

Į tipiškas instrukcijas įtrauktos judesio komandos, skirtos maksimaliai padidinti

%tyrinėti arba išvengti aptikto pavojaus ir komandų bendrauti

%informacijos apie robotų atradimus (nuotraukos), padėtis (grafikas), %ir būsena (įstrigęs įspėjimas) su vartotoju per „Matlab“ir (arba) el. Keletas

Pridedama %garso komandų, kad būtų malonu.

%sąrankos el. pašto galimybės

paštas = '[email protected]';

slaptažodis = 'EF230Roomba';

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

setpref („Internetas“, „El. paštas“, paštas);

setpref ('Internetas', 'SMTP_vartotojo vardas', paštas);

setpref („Internetas“, „SMTP_Password“, slaptažodis);

rekvizitai = 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;

atspindėti_data = 2700; %nustatyta uolos jutiklių pamatinė vertė

„LightBumper_datum“= 200; %nustatyta šviesa Buferio jutiklių pamatinė vertė

poz = [0, 0]; %kintamasis padėties saugojimui su inicializuotu atskaitos tašku

kampas = 0; %nustatytas atskaitos kampas

tinklinis kampas = 0; %grynojo kampo poslinkis

i = 2; %iteratorius, skirtas pridėti eilučių prie padėties saugojimo kintamojo

dist = 0;

r.setDriveVelocity (v, v); %pradėti roomba judėti į priekį

kol tiesa

Uola = r.getCliffSensors;

Bump = r.getBumpers;

Šviesa = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %sukuria 1 atsitiktinį kampą nuo 20 iki 60 laipsnių. Naudojama siekiant užkirsti kelią robotui įstrigti kilpoje

%Ką daryti, jei vienas ar keli ratai praranda kontaktą su žeme:

%sustabdyti judėjimą, išsiųsti įspėjamąjį el. laišką su aplinkos vaizdu, %ir paklauskite vartotojo, ar tęsti, ar laukti pagalbos

jei Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna 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, 'įstrigo.png');

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

imfile = 'įstrigo.png';

pozicija = savepos (pos);

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

sendmail (paštas, „PAGALBA!“, „Esu įstrigęs ant uolos!“, {imfile, position})

list = {'Tęsti', 'Sustabdyti'};

idx = menu ('Ką turėčiau daryti?', sąrašas);

jei idx == 2

pertrauka

galas

%Ką daryti, jei prieš robotą aptinkamas objektas:

%sustabdyti, judėti atgal, fotografuoti, įspėti vartotoją apie atradimą

%el. paštu, pasukite 90 laipsnių ir toliau tyrinėkite

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 (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna y koordinatę

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna y koordinatę

i = i+1;

r. pypsėjimas ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')

img = r.getImage;

imwrite (img, 'FrontBump.png')

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

imfile = 'FrontBump.png';

pozicija = savepos (pos);

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

sendmail (paštas, „Įspėjimas!“, „Kažką radau!“, {imfile, position})

kampas = 90;

netangle = netangle+kampas;

r.turnAngle (kampas);

r.setDriveVelocity (v, v);

%Ką daryti, jei objektas aptiktas kairėje nuo roboto:

%sustojimas, pasukimas link objekto, atsarginė kopija, fotografavimas, įspėjimas

%atradimų naudotojas el. paštu, pasukite 90 laipsnių ir toliau tyrinėkite

elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Sumušti.kairė == 1

r.stop;

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna y koordinatę

i = i+1;

kampas = 30;

netangle = netangle+kampas;

r.turnAngle (kampas);

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna y koordinatę

i = i+1;

r. pypsėjimas ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')

img = r.getImage;

imwrite (img, 'LeftBump.png')

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

imfile = 'LeftBump.png';

pozicija = savepos (pos);

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

sendmail (paštas, „Įspėjimas!“, „Kažką radau!“, {imfile, position})

kampas = -90;

netangle = netangle+kampas;

r.turnAngle (kampas);

r.setDriveVelocity (v, v);

%Ką daryti, jei roboto dešinėje aptiktas objektas:

%sustojimas, pasukimas link objekto, atsarginė kopija, fotografavimas, įspėjimas

%atradimų naudotojas el. paštu, pasukite 90 laipsnių ir toliau tyrinėkite

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 (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna y koordinatę

i = i+1;

kampas = -30;

netangle = netangle+kampas;

r.turnAngle (kampas);

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna y koordinatę

i = i+1;

pauzė (1.5);

r. pypsėjimas ('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

pozicija = savepos (pos);

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

sendmail (paštas, „Įspėjimas!“, „Kažką radau!“, {imfile, position});

kampas = 90;

netangle = netangle+kampas;

r.turnAngle (kampas);

r.setDriveVelocity (v, v);

%Ką daryti, jei aptikta skardis kairėje nuo roboto:

%sustokite, judėkite atgal, pasukite į dešinę, toliau tyrinėkite

elseif Cliff.left <atspindėti_datum || Cliff.leftFront <atspindėti_datumą

r.stop;

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna y koordinatę

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %gauti x koordinatę

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %gauna y koordinatę

i = i+1;

kampas = -Rando kampas;

netangle = netangle+kampas;

r.turnAngle (kampas);

r.setDriveVelocity (v, v);

%Ką daryti, jei skardis aptiktas bot dešinėje:

%sustokite, judėkite atgal, pasukite į kairę, toliau tyrinėkite

elseif Cliff.right <atspindėti_datum || Cliff.rightFront <atspindėti_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (kampas); %gauti x koordinatę

pos (i, 2) = dist * cosd (kampas); %gauna y koordinatę

i = i+1;

r.moveDistance (-. 125);

kampas = RandAngle;

netangle = netangle+kampas;

r.turnAngle (kampas);

r.setDriveVelocity (v, v);

galas

galas

Išmaniojo telefono valdiklis

Parinktys = {'Autonomous', 'Manual control'}

Prompt = meniu („Kaip norėtumėte valdyti roverį?“, Parinktys)

m = mobiledev

r = roomba (19)

jei raginimas == 1

Naršyti (r)

Kitas

kol tiesa

pauzė (.5)

Telefono duomenys = m. Orientacija;

Azi = Telefono duomenys (1);

Pitch = PhoneData (2);

Šonas = Telefono duomenys (3);

jei šonas> 130 || Šonas <-130 %, jei telefonas apverstas žemyn, sustabdykite „roomba“ir išeikite

r.stop

r. pyptelėjimas („C, C, C, C“)

pertrauka

elseif Side> 25 && Side <40 %, jei telefonas pasuktas į šoną nuo 25 iki 40 °, pasukite į kairę 5 °

r.pasukimo kampas (-5);

elseif Šonas> 40 %, jei telefonas pasuktas į šoną daugiau nei 40 °, pasukite į kairę 45 °

r.turnAngle (-45)

elseif Į šoną -40 %, jei telefonas pasuktas į šoną nuo -25 iki -40 laipsnių, pasukite į dešinę 5 laipsniais

r.pasukimo kampas (5);

elseif Šonas <-40 %, jei telefonas pasuktas į šoną mažiau nei -40 °, pasukite į kairę 45 °

r.turnAngle (45)

galas

%Jei telefonas laikomas netoli vertikalės, nufotografuokite ir nubraižykite

jei Pitch <-60 && image <= 9

r. pyptelėjimas

img = r.getImage;

papildomas sklypas (3, 3, vaizdas)

parodyti (img)

galas

%juda į priekį ir atgal, atsižvelgiant į priekinę ir galinę orientaciją

jei Pitch> 15 && Pitch <35 %, jei žingsnis nuo 15 iki 35 laipsnių juda į priekį trumpu atstumu

%prieš perkeldami gauna lengvus buferio duomenis

litBump = r.getLightBumpers;

jei apšviestaBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, jei kažkas yra priešais kambarį ir pataikys, jei jis judės į priekį, kelia triukšmą ir rodo pranešimą

r. pypsėjimas ('C ^^, F#^, C ^^, F#^')

kitaip %juda

r.moveDistance (.03);

%Gaukite buferio duomenis po perkėlimo

Bump = r.getBumpers;

jei Bump.dešinys == 1 || Bump.left == 1 || Bump.front == 1

r. pyptelėjimas („A, C, E“)

r.moveDistance (-. 01)

galas

%gauna uolos jutiklio duomenis

Uola = r.getCliffSensors;

jei skardis.kairė> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, jei kažkas sukelia uolos jutiklį, laikykite jį lava ir sukurkite atsarginę kopiją

r. pypsėjimas ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

galas

galas

elseif Žingsnis> 35 %, jei žingsnis didesnis nei 35 °, judėkite į priekį ilgesnį atstumą

%prieš perkeldami gauna lengvus buferio duomenis

litBump = r.getLightBumpers;

jei šviečiaBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, jei kažkas yra priešais kambarį ir pataikys į priekį, sukels triukšmą ir parodys pranešimą

r. pypsėjimas ('C ^^, F#^, C ^^, F#^')

kitaip %juda

r.moveDistance (.3)

%Gaukite buferio duomenis po perkėlimo

Bump = r.getBumpers;

jei Bump.dešinys == 1 || Bump.left == 1 || Bump.front == 1 %, jei kažką pataikote, triukšmaujate, rodote pranešimą ir sukuriate atsarginę kopiją

r. pyptelėjimas („A, C, E“)

r.moveDistance (-. 01)

galas

%persikėlę gauna uolos jutiklio duomenis

Uola = r.getCliffSensors;

jei skardis.kairė> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, jei kažkas sukelia uolos jutiklį, laikykite jį lava ir sukurkite atsarginę kopiją

r. pypsėjimas ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

galas

galas

elseif Žingsnis -35 %, jei žingsnis nuo -15 iki -35 laipsnių perkelia trumpą atstumą atgal

r.moveDistance (-. 03);

%persikėlę gauna uolos jutiklio duomenis

Uola = r.getCliffSensors;

jei skardis.kairė> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, jei kažkas sukelia uolos jutiklį, laikykite jį lava ir sukurkite atsarginę kopiją

r. pypsėjimas ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

galas

elseif Pitch -60 %, jei žingsnis nuo -35 iki -60 ° nukrypsta atgal

r.moveDistance (-. 3)

%persikėlę gauna uolos jutiklio duomenis

Uola = r.getCliffSensors;

jei skardis.kairė> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, jei kažkas sukelia uolos jutiklį, laikykite jį lava ir sukurkite atsarginę kopiją

r. pypsėjimas ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

galas

galas

galas

galas

Rekomenduojamas: