Satura rādītājs:

Jūsu Roomba pārvēršana Mars Rover: 5 soļi
Jūsu Roomba pārvēršana Mars Rover: 5 soļi

Video: Jūsu Roomba pārvēršana Mars Rover: 5 soļi

Video: Jūsu Roomba pārvēršana Mars Rover: 5 soļi
Video: Why we have an emotional connection to robots | Kate Darling 2024, Jūlijs
Anonim
Pārvēršot savu Roomba par Mars Rover
Pārvēršot savu Roomba par Mars Rover

1. darbība: apkopojiet savus materiālus

Lai pabeigtu šo projektu, jums būs jāapkopo šādi materiāli:

1 Roomba robots

1 Raspberry Pi komplekts

1 Video kamera

Piekļuve MATLAB

2. darbība: lejupielādējiet Roomba rīkkopas MATLAB

Lejupielādējiet Roomba rīkkopas MATLAB
Lejupielādējiet Roomba rīkkopas MATLAB
Lejupielādējiet Roomba rīkkopas MATLAB
Lejupielādējiet Roomba rīkkopas MATLAB

Izpildiet šo kodu, lai instalētu nepieciešamos rīku komplektus, lai pabeigtu šo projektu.

funkcija roombaInstall

clc;

% instalējamo failu saraksts

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

% atrašanās vieta, no kuras instalēt

options = weboptions ('CertificateFilename', ''); % liek tai ignorēt sertifikātu prasības

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

dlgTitle = 'Roomba instalēšana/atjaunināšana';

% displeja mērķis un saņemt apstiprinājumu

uzvedne = {

"Šī programma lejupielādēs šos EF 230 Roomba failus:"

''

strjoin (faili, "")

''

"uz šo mapi:"

''

cd

''

'Vai vēlaties turpināt? '

};

pīkstiens;

yn = questdlg (uzvedne,…

dlgTitle,…

“Jā”, “Nē”, “Jā”);

ja ~ strcmp (yn, 'Jā'), atgriezties; beigas

% get esošo failu saraksts

esošie_faili = faili (cellfun (@exist, files)> 0);

ja ~ ir tukšs (esošie_faili)

% pārliecinieties, ka ir patiešām labi tos nomainīt

prompt = {'Jūs aizstājat šos failus:'

''

strjoin (esošie_faili, "")

''

'Labi, lai nomainītu?'

};

pīkstiens;

yn = questdlg (uzvedne,…

dlgTitle,…

“Jā”, “Nē”, “Jā”);

ja ~ strcmp (yn, 'Jā'), atgriezties; beigas

beigas

% lejupielādēt failus

cnt = 0;

i = 1: garums (faili)

f = faili {i};

disp (['Lejupielāde' f]);

pamēģini

url = [serveris f];

tīmekļa saglabāšana (f, url, opcijas); % pievienotas iespējas, lai izvairītos no drošības kļūdām

cnt = cnt + 1;

noķert

disp (['Kļūda lejupielādējot' f]);

fiktīvs = [f '.html'];

ja pastāv (fiktīvs, 'fails') == 2

dzēst (fiktīvs)

beigas

beigas

beigas

ja cnt == garums (faili)

msg = 'Instalēšana veiksmīga';

gaidīt (msgbox (msg, dlgTitle));

citādi

msg = 'Instalācijas kļūda - sīkāku informāciju skatīt komandu logā';

waitfor (errordlg (msg, dlgTitle));

beigas

end %roombaInstall

3. darbība: izveidojiet savienojumu ar savu Roomba

Tagad ir pienācis laiks izveidot savienojumu ar savu Roomba, izmantojot WiFi. Izmantojot divus pirkstus, vienlaikus nospiediet dokstacijas un vietas pogas, lai ieslēgtu vai atiestatītu Roomba. Pēc tam MATLAB komandu logā palaidiet kodu r = roomba (# no jūsu Roomba), lai izveidotu savienojumu ar savu robotu. Kad esat izpildījis šo komandu, jūsu Roomba jābūt gatavam darbam.

4. solis: izvēlieties, kā vēlaties kontrolēt savu Roomba

Izvēlieties, kā vēlaties kontrolēt savu Roomba
Izvēlieties, kā vēlaties kontrolēt savu Roomba
Izvēlieties, kā vēlaties kontrolēt savu Roomba
Izvēlieties, kā vēlaties kontrolēt savu Roomba

Ir divi veidi, kā kontrolēt savu Roomba: autonomi vai izmantojot viedtālruni kā kontrolieri.

Ja izvēlaties vadīt Roomba autonomi, jums būs jāizmanto trīs iebūvētie sensori: klints sensori, trieciena sensori un gaismas sensori.

Lai izmantotu viedtālruni, vispirms viedtālrunis jāpievieno datoram, veicot tālāk norādītās darbības.

PIEZĪME. Lai pareizi izveidotu savienojumu, jūsu datoram un viedtālrunim jābūt vienā WiFi tīklā!

1. Lejupielādējiet lietotni MATLAB no lietotņu veikala savā ierīcē.

2. Komandu logā ierakstiet "Savienotājs ieslēgts" un iestatiet paroli, kas būs jāievada abās ierīcēs.

3. Pēc tam MATLAB jums piešķirs jūsu datora IP adresi. Viedtālruņa lietotnē MATLAB jāiet uz iestatījumu lapu un jāpievieno dators, izmantojot norādīto IP adresi un iepriekš ievadīto paroli.

4. Datora komandu logā ierakstiet kodu m = mobiledev, un tam vajadzētu inicializēt viedtālruni kā jūsu Roomba kontrolieri.

5. Jūsu datoram un viedtālrunim vajadzētu būt gatavam tūlītējai lietošanai.

5. darbība: brauciet ar savu Roomba

Tagad, kad jums ir visi nepieciešamie rīki, lai izveidotu savu Mars Rover, jūs esat gatavs izveidot savu kodu. Tālāk ir pievienots koda paraugs gan autonomai braukšanai, gan braukšanai ar viedtālruni.

Autonomā braukšana

funkcija Explore_modified (r)

%ievades argumenti: 1 roomba objekts, r

%izejas argumenti: nav

%apraksts:

Funkcija %izmanto bezgalīgu cilpu, lai nodrošinātu autonomu

%robota apkārtnes izpēte.

%

%funciton sniedz arī norādījumus roomba, kā rīkoties

%šādās situācijās: ritenis (-i) zaudē kontaktu ar zemi, an

%objekts tiek atklāts robota priekšā vai uz abām pusēm, un a

%pēkšņs kritums tiek atklāts robota priekšā vai uz abām pusēm.

%

Tipiski norādījumi %ietver kustības komandas, kuru mērķis ir maksimizēt

%izpēti vai izvairīšanos no atklātām briesmām un komandas sazināties

%informācija par robotprogrammatūras atklājumiem (attēli), atrašanās vieta (grafiks), %un norādiet (balasta brīdinājums) ar lietotāju, izmantojot matlab un/vai e -pastu. Vairāki

Baudām tiek pievienotas %skaņas komandas.

%iestatīšanas e -pasta iespējas

pasts = '[email protected]';

parole = 'EF230Roomba';

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

setpref ('Internets', 'E -pasts', pasts);

setpref ('Internets', 'SMTP_Lietotājvārds', pasts);

setpref ('Internets', 'SMTP_Password', parole);

rekvizīti = 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.pīkstiens ('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;

atspoguļot_datums = 2700; %iestatīta klints sensoru atsauces vērtība

lightBumper_datum = 200; %iestatīta gaisma Bufera sensoru atsauces vērtība

poz = [0, 0]; %mainīgais pozīcijas saglabāšanai ar inicializētu nulles punktu

leņķis = 0; %iestatītais atskaites leņķis

netangle = 0; %neto leņķa pārvietojums

i = 2; %iterators rindu pievienošanai pozīcijas krātuves mainīgajam

dist = 0;

r.setDriveVelocity (v, v); %start roomba virzās uz priekšu

kamēr taisnība

Klints = r.getCliffSensors;

Bump = r.getBamperi;

Gaisma = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); %rada 1 nejaušu leņķi starp 20 un 60 grādiem. Izmanto, lai novērstu robota iestrēgšanu cilpā

%Ko darīt, ja viens vai vairāki riteņi zaudē kontaktu ar zemi:

%apturēt kustību, nosūtīt brīdinājuma e -pastu ar apkārtnes attēlu, %un jautājiet lietotājam, vai turpināt vai gaidīt palīdzību

ja Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r. apstāties

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

r.pīkstiens ('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, 'iestrēdzis.png');

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

imfile = 'iestrēdzis.png';

pozīcija = savepos (pos);

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

sendmail (pasts, 'PALĪDZIET!', 'Es esmu iesprostots klintī!', {imfile, position})

list = {'Turpināt', 'Apturēt'};

idx = menu ('Ko man darīt?', saraksts);

ja idx == 2

pārtraukums

beigas

%Ko darīt, ja robota priekšā tiek atklāts objekts:

%apstāties, pārvietoties atpakaļ, nofotografēt, brīdināt lietotāju par atklājumu

%pa e -pastu, pagriezieties par 90 grādiem un turpiniet pētīt

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); %iegūst x koordinātu

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

r.pīkstiens ('A1^, A1^, A4^, A2^, G2^, G2^, G4^, Bb2^, Bb2^, Bb3.5^, G1^, A8^')

img = r.getImage;

imwrite (img, 'FrontBump.png')

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

imfile = 'FrontBump.png';

pozīcija = savepos (pos);

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

sendmail (pasts, “Brīdinājums!”, “Es kaut ko atradu!”, {imfile, position})

leņķis = 90;

netangle = netangle+leņķis;

r.pagrieziena leņķis (leņķis);

r.setDriveVelocity (v, v);

%Ko darīt, ja pa kreisi no robota tiek atklāts objekts:

%apstāties, pagriezties pret objektu, dublēties, fotografēt, brīdināt

%atklāšanas lietotāju, izmantojot e -pastu, pagrieziet par 90 grādiem un turpiniet pētīt

elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Sasist.pa kreisi == 1

r.stop;

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

leņķis = 30;

netangle = netangle+leņķis;

r.pagrieziena leņķis (leņķis);

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

r.pīkstiens ('A4^, A4^, G1^, E1^, C3.5^, C2 ^^, C1^, C1^, C2^, D2^, D2^, E8^')

img = r.getImage;

imwrite (img, 'LeftBump.png')

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

imfile = 'LeftBump.png';

pozīcija = savepos (pos);

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

sendmail (pasts, “Brīdinājums!”, “Es kaut ko atradu!”, {imfile, position})

leņķis = -90;

netangle = netangle+leņķis;

r.pagrieziena leņķis (leņķis);

r.setDriveVelocity (v, v);

%Ko darīt, ja pa labi no robota tiek atklāts objekts:

%apstāties, pagriezties pret objektu, dublēties, fotografēt, brīdināt

%atklāšanas lietotāju, izmantojot e -pastu, pagrieziet par 90 grādiem un turpiniet pētīt

elseif Light.rightFront> lightBumper_datum || Light.right> lightBumper_datum || Sasist.pareizi == 1

r.stop;

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

leņķis = -30;

netangle = netangle+leņķis;

r.pagrieziena leņķis (leņķis);

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

pauze (1,5);

r.pīkstiens ('C1^, C1^, C2^, D2^, D2^, C8^')

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

pozīcija = savepos (pos);

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

sendmail (pasts, 'Brīdinājums!', 'Es kaut ko atradu!', {imfile, position});

leņķis = 90;

netangle = netangle+leņķis;

r.pagrieziena leņķis (leņķis);

r.setDriveVelocity (v, v);

%Ko darīt, ja pa kreisi no robota tiek konstatēta klints:

%apstāties, pārvietoties atpakaļ, pagriezties pa labi, turpināt izpētīt

elseif Klints.pa kreisi <atspoguļot_datums || Cliff.leftFront <atspoguļot_datums

r.stop;

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

poz (i, 1) = pos (i-1, 1) + dist * sind (netangle); %iegūst x koordinātu

poz (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %iegūst y koordinātu

i = i+1;

leņķis = -RandAngle;

netangle = netangle+leņķis;

r.pagrieziena leņķis (leņķis);

r.setDriveVelocity (v, v);

%Ko darīt, ja pa labi no robota tiek konstatēta klints:

%apstāties, pārvietoties atpakaļ, pagriezties pa kreisi, turpināt izpēti

elseif Cliff.right <atspoguļot_datums || Cliff.rightFront <atspoguļot_datums

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (leņķis); %iegūst x koordinātu

pos (i, 2) = dist * cosd (leņķis); %iegūst y koordinātu

i = i+1;

r.moveDistance (-. 125);

leņķis = RandAngle;

netangle = netangle+leņķis;

r.pagrieziena leņķis (leņķis);

r.setDriveVelocity (v, v);

beigas

beigas

Viedtālruņa kontrolieris

Opcijas = {'Autonoma', 'Manuāla vadība'}

Prompt = menu ('Kā jūs vēlaties vadīt roveri?', Opcijas)

m = mobiledev

r = roomba (19)

ja uzvedne == 1

Izpētīt (r)

citādi

kamēr taisnība

pauze (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Pitch = PhoneData (2);

Side = PhoneData (3);

ja sāns> 130 || Sānos <-130 %, ja tālrunis ir pagriezts ar seju uz leju, pārtrauciet Roomba un izejas cilpu

r. apstāties

r. pīkstiens ('C, C, C, C')

pārtraukums

elseif Side> 25 && Side <40 %, ja tālrunis ir pagriezts uz sāniem no 25 līdz 40 grādiem, pagriezieties pa kreisi par 5 grādiem

r.pagrieziena leņķis (-5);

elseif sāns> 40 %, ja tālrunis ir pagriezts uz sāniem vairāk par 40 grādiem, pagriezieties pa kreisi par 45 grādiem

r.turnAngle (-45)

elseif Side -40 %, ja tālrunis ir pagriezts uz sāniem starp -25 un -40 grādiem, pagriezieties pa labi par 5 grādiem

r.pagrieziena leņķis (5);

elseif sāns <-40 %, ja tālrunis ir pagriezts uz sāniem mazāk par -40 grādiem, pagriezieties pa kreisi par 45 grādiem

r.turnAngle (45)

beigas

%Ja tālrunis tiek turēts netālu no vertikāles, uzņemiet attēlu un uzzīmējiet to

ja piķis <-60 && attēls <= 9

r.pīkstiens

img = r.getImage;

apakšplāksne (3, 3, attēls)

parādīt (img)

beigas

%virzās uz priekšu un atpakaļ, pamatojoties uz priekšējo un aizmugurējo orientāciju

ja solis> 15 && solis <35 %, ja solis starp 15 un 35 grādiem virzās uz priekšu nelielu attālumu

%pirms pārvietošanas iegūst vieglus bufera datus

litBump = r.getLightBumpers;

ja litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, ja kaut kas atrodas istabas priekšā un trāpīs, ja tas virzās uz priekšu, rada troksni un parāda ziņojumu

r.pīkstiens ('C ^^, F#^, C ^^, F#^')

cits %kustēties

r.moveDistance (.03);

%Iegūstiet bufera datus pēc pārvietošanas

Bump = r.getBamperi;

ja Bump.pareizais == 1 || Sasist.pa kreisi == 1 || Bump.front == 1

r. pīkstiens ('A, C, E')

r.moveDistance (-. 01)

beigas

%iegūst klints sensora datus

Klints = r.getCliffSensors;

ja klints pa kreisi> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ja kaut kas iedarbina klints sensoru, uzskata to par lavu un dublē

r.pīkstiens ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

beigas

beigas

elseif Pitch> 35 %, ja piķis ir lielāks par 35 grādiem, virzieties uz priekšu garāku attālumu

%pirms pārvietošanas iegūst vieglus bufera datus

litBump = r.getLightBumpers;

ja litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, ja kaut kas atrodas istabas priekšā un trāpīs, ja tas virzās uz priekšu, rada troksni un parāda ziņojumu

r.pīkstiens ('C ^^, F#^, C ^^, F#^')

cits %kustēties

r.moveDistance (.3)

%Iegūstiet bufera datus pēc pārvietošanas

Bump = r.getBamperi;

ja Bump.pareizais == 1 || Sasist.pa kreisi == 1 || Bump.front == 1 %, ja kaut ko uzsit, rada troksni, parāda ziņojumu un dublē

r. pīkstiens ('A, C, E')

r.moveDistance (-. 01)

beigas

%iegūst kraujas sensora datus pēc pārvietošanās

Klints = r.getCliffSensors;

ja klints.pa kreisi> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ja kaut kas iedarbina klints sensoru, uzskata to par lavu un dublē

r.pīkstiens ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

beigas

beigas

elseif Pitch -35 %, ja piķis starp -15 un -35 grādiem pārvietojas atpakaļ nelielā attālumā

r.moveDistance (-. 03);

%iegūst kraujas sensora datus pēc pārvietošanās

Klints = r.getCliffSensors;

ja klints pa kreisi> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ja kaut kas iedarbina klints sensoru, uzskata to par lavu un dublē

r.pīkstiens ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

beigas

elseif Pitch -60 %, ja piķis starp -35 un -60 grādiem pārvietojas atpakaļ garāku attālumu

r.moveDistance (-. 3)

%iegūst kraujas sensora datus pēc pārvietošanās

Klints = r.getCliffSensors;

ja klints pa kreisi> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, ja kaut kas iedarbina klints sensoru, uzskata to par lavu un dublē

r.pīkstiens ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

beigas

beigas

beigas

beigas

Ieteicams: