Turinys:
- 1 žingsnis: surinkite savo medžiagas
- 2 veiksmas: atsisiųskite „Roomba“įrankių rinkinius, skirtus MATLAB
- 3 žingsnis: prisijunkite prie „Roomba“
- 4 žingsnis: pasirinkite, kaip norite valdyti savo „Roomba“
- 5 žingsnis: vairuokite „Roomba“
Video: „Roomba“pavertimas „Mars Rover“: 5 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:44
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
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“
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:
Steperio pavertimas žaidimo judesiais: 4 žingsniai
„Stepper“pavertimas žaidimo judesiais: „Intro“Šis prietaisas paverčia judesį iš naminio žingsnelio (žingsnio mašinos) į žaidimo judesį. Jis veiks bet kokiam žaidimui, kuris gauna („w“) kaip judėjimą į priekį. Jis gali veikti ir VR žaidimuose, jei jie priima klaviatūros įvestį. Turbūt laimėjo
Bet kurio R/C automobilio pavertimas „Bluetooth“programos valdymo R/C automobiliu: 9 žingsniai
Bet kurio R/C automobilio pavertimas „Bluetooth“programos valdymo R/C automobiliu: Šiame projekte parodyti veiksmai, kaip pakeisti įprastą nuotolinio valdymo automobilį į „Bluetooth“(BLE) valdymo automobilį su „Wombatics SAM01“robotikos lenta, „Blynk App“ir „MIT App Inventor“. yra daug pigių RC automobilių su daugybe funkcijų, tokių kaip LED žibintai ir
Žibinto pavertimas mirgančia liepsna: 4 žingsniai (su nuotraukomis)
Žibinto konversija į mirgančią liepsną: visos dalys sėdėjo, todėl sukūriau šį įdomų projektą
Nešiojamojo kompiuterio ekrano pavertimas veidrodžiu: 9 žingsniai (su nuotraukomis)
Pasukite nešiojamojo kompiuterio ekraną į veidrodį: Sveiki, tai yra mano pirmasis pamokomas dalykas, todėl visi kritikai ir komentarai yra laukiami! Ir atsiprašau už mano anglų kalbą, aš esu šiek tiek prancūziškas vaikinas =) Kai kurios nuotraukos nėra labai geros kokybės, atsiprašau už tai., Bet man jos atrodo pakankamai aiškios. Taigi, pirma, W
„Windows XP“ar „Vista“pavertimas „Mac“ir „Linux“: 10 žingsnių
„Windows XP“ar „Vista“pavertimas „Mac“ir „Linux“: ši instrukcija parodys, kaip „Windows“kompiuterį paversti „Mac“ir „PC“, taip pat paleisti „Linux“. - Rekomenduoju turėti bent 2 GB RAM ir daugiau nei 10 GB vietos kietajame diske (jei norite „Linux“) rekomenduojama naudoti „Vista“arba „XP“- tai darau