Talaan ng mga Nilalaman:

Ginagawang Ang iyong Roomba Sa isang Mars Rover: 5 Hakbang
Ginagawang Ang iyong Roomba Sa isang Mars Rover: 5 Hakbang

Video: Ginagawang Ang iyong Roomba Sa isang Mars Rover: 5 Hakbang

Video: Ginagawang Ang iyong Roomba Sa isang Mars Rover: 5 Hakbang
Video: ANG GANDA NG MISIS NI RIGOR!😍#johnestrada #prescillameirelles 2024, Nobyembre
Anonim
Ginagawang Ang iyong Roomba Sa isang Mars Rover
Ginagawang Ang iyong Roomba Sa isang Mars Rover

Hakbang 1: Ipunin ang Iyong Mga Materyal

Upang makumpleto ang proyektong ito, kakailanganin mong tipunin ang mga sumusunod na materyales:

1 Roomba Robot

1 Raspberry Pi Kit

1 Video Camera

Pag-access sa MATLAB

Hakbang 2: I-download ang Roomba Toolboxes para sa MATLAB

I-download ang Roomba Toolboxes para sa MATLAB
I-download ang Roomba Toolboxes para sa MATLAB
I-download ang Roomba Toolboxes para sa MATLAB
I-download ang Roomba Toolboxes para sa MATLAB

Patakbuhin ang sumusunod na code upang mai-install ang mga kinakailangang toolbox upang makumpleto ang proyektong ito.

function roombaInstall

clc;

% listahan ng mga file upang mai-install

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

% lokasyon upang mai-install

mga pagpipilian = weboptions ('CertificateFilename', ''); % ang nagsasabi dito na huwag pansinin ang mga kinakailangan sa sertipiko

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

dlgTitle = 'Roomba Install / Update';

% layunin ng pagpapakita at makakuha ng kumpirmasyon

prompt = {

'Ang program na ito ay mag-download ng mga EF 230 Roomba file:'

''

strjoin (mga file, )

''

'sa folder na ito:'

''

cd

''

'Gusto mo bang magpatuloy? '

};

beep;

yn = questdlg (prompt,…

dlgPamagat,…

'Oo', 'Hindi', 'Oo');

kung ~ strcmp (yn, 'Oo'), bumalik; magtapos

% makakuha ng listahan ng mga file na mayroon

existing_files = file (cellfun (@exist, files)> 0);

kung ~ isempty (mayroon nang mga_file)

% tiyakin na ok lang talaga na palitan ang mga ito

prompt = {'Pinapalitan mo ang (mga) file na ito:'

''

strjoin (mayroon nang mga_file, )

''

'OK na palitan?'

};

beep;

yn = questdlg (prompt,…

dlgPamagat,…

'Oo', 'Hindi', 'Oo');

kung ~ strcmp (yn, 'Oo'), bumalik; magtapos

magtapos

% i-download ang mga file

cnt = 0;

para sa i = 1: haba (mga file)

f = mga file {i};

disp (['Pagda-download' f]);

subukan mo

url = [server f];

websave (f, url, mga pagpipilian); % nagdagdag ng mga pagpipilian upang maiwasan ang mga error sa seguridad

cnt = cnt + 1;

mahuli

disp (['Error sa pag-download ng' f]);

dummy = [f '.html'];

kung mayroon (dummy, 'file') == 2

tanggalin (dummy)

magtapos

magtapos

magtapos

kung cnt == haba (mga file)

msg = 'Matagumpay na Pag-install';

waitfor (msgbox (msg, dlgTitle));

iba pa

msg = 'Error sa Pag-install - tingnan ang window ng utos para sa mga detalye';

waitfor (errordlg (msg, dlgTitle));

magtapos

magtapos% roombaInstall

Hakbang 3: Kumonekta sa Iyong Roomba

Ngayon ay oras na upang kumonekta sa iyong Roomba gamit ang WiFi. Gamit ang 2 daliri, pindutin nang sabay-sabay ang mga pindutan ng Dock at Spot upang i-on o i-reset ang iyong Roomba. Susunod, Patakbuhin ang code r = roomba (# ng iyong Roomba) sa window ng utos ng MATLAB upang kumonekta sa iyong robot. Kapag naisakatuparan mo ang utos na ito, dapat handa nang umalis ang iyong Roomba.

Hakbang 4: Piliin Kung Paano Mo Gustong Kontrolin ang Iyong Roomba

Piliin Kung Paano Mo Gustong Kontrolin ang Iyong Roomba
Piliin Kung Paano Mo Gustong Kontrolin ang Iyong Roomba
Piliin Kung Paano Mo Gustong Kontrolin ang Iyong Roomba
Piliin Kung Paano Mo Gustong Kontrolin ang Iyong Roomba

Mayroong dalawang mga paraan upang makontrol mo ang iyong Roomba: autonomous o paggamit ng isang smartphone bilang isang controller.

Kung pipiliin mong magmaneho ang Roomba nang may pagsasarili, kakailanganin mong gamitin ang tatlong mga built-in na sensor: mga sensor ng bangin, mga sensor ng paga, at mga ilaw na sensor.

Upang magamit ang isang smartphone, kailangan mo munang ikonekta ang iyong smartphone sa iyong computer sa pamamagitan ng pagsunod sa mga hakbang sa ibaba.

TANDAAN: Ang iyong computer at smartphone ay kailangang nasa parehong WiFi network upang makakonekta nang maayos!

1. I-download ang MATLAB app mula sa app store sa iyong aparato.

2. I-type ang "konektor sa" sa iyong window ng utos at magtakda ng isang password na kailangang maging input sa parehong mga aparato.

3. Pagkatapos gawin ito, bibigyan ka ng MATLAB ng iyong computer IP address. Kailangan mong pumunta sa pahina ng mga setting sa MATLAB app sa iyong smartphone at magdagdag ng isang computer gamit ang naibigay na IP address at ang password na ipinasok mo kanina.

4. Sa window ng utos sa iyong computer, i-type ang code m = mobiledev at dapat nitong gawing simula ang iyong smartphone bilang isang controller para sa iyong Roomba.

5. Ang iyong computer at smartphone ay dapat na handa na upang pumunta ngayon.

Hakbang 5: Magmaneho ng Iyong Roomba

Ngayon na mayroon ka ng lahat ng kinakailangang mga tool upang likhain ang iyong Mars Rover, handa ka nang lumikha ng iyong sariling code. Nag-attach kami ng isang halimbawa ng code sa ibaba para sa parehong autonomous na pagmamaneho at pagmamaneho na kinokontrol ng smartphone.

Awtomatikong Pagmamaneho

pagpapaandar Discover_modified (r)

% ang mga argument sa pag-input: 1 roomba object, r

% mga argumento sa output: wala

% paglalarawan:

% function na gumagamit ng isang walang hanggan habang loop upang payagan ang autonomous

% paggalugad ng paligid ng bot.

%

Nagbibigay din si% funciton ng mga tagubilin sa roomba kung ano ang gagawin

% ang mga sumusunod na sitwasyon: Ang (mga) gulong ay nawawalan ng (mga) contact sa lupa, an

% object ay nakita sa harap ng o sa magkabilang panig ng bot, at a

% biglang pagbagsak ay napansin sa harap ng o sa alinmang bahagi ng bot.

%

Kasama sa% tipikal na mga tagubilin ang mga utos ng paggalaw na inilaan upang ma-maximize

% ng paggalugad o pag-iwas sa isang napansin na panganib at utos na makipag-usap

% impormasyon tungkol sa mga natuklasan ng bot (larawan), posisyon (grap), % at islahad (maiiwan ang babala) kasama ang gumagamit sa pamamagitan ng matlab at / o email. Maraming

% mga tunog na utos ay idinagdag para sa kasiyahan.

% mga kakayahan sa pag-setup ng email

mail = '[email protected]';

password = 'EF230Roomba';

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

setpref ('Internet', 'E_mail', mail);

setpref ('Internet', 'SMTP_Username', mail);

setpref ('Internet', 'SMTP_Password', password);

props = java.lang. System.getProperties;

props.setProperty ('mail.smtp.starttls.enable', 'true');

props.setProperty ('mail.smtp.auth', 'totoo');

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;

mirror_datum = 2700; % itakda ang halaga ng sanggunian ng mga sensor ng cliff

lightBumper_datum = 200; Itakda ang halaga ng sangguniang light sensor ng Bumper sensors

pos = [0, 0]; % variable para sa pag-iimbak ng posisyon na may inisyal na datum

anggulo = 0; % itakda ang anggulo ng sanggunian

netangle = 0; % pag-aalis ng net anggulo

i = 2; % iterator para sa pagdaragdag ng mga hilera sa variable ng pag-iimbak ng posisyon

dist = 0;

r.setDriveVelocity (v, v); % simulan ang roomba na sumusulong

habang totoo

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Banayad = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); % ay bumubuo ng 1 random na anggulo sa pagitan ng 20 at 60 degree. Ginamit upang maiwasan ang pag-stuck ng bot sa isang loop

% Ano ang gagawin kung ang isa o higit pang gulong ay nawalan ng contact sa lupa:

% tumigil sa paggalaw, magpadala ng isang babalang email na may larawan ng paligid, % at tanungin ang gumagamit kung magpatuloy o maghintay para sa tulong

kung Bump. RightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

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';

posisyon = savepos (pos);

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

sendmail (mail, 'HELP!', 'Napadpad ako sa isang bangin!', {imfile, posisyon})

listahan = {'Magpatuloy', 'Itigil'};

idx = menu ('Ano ang dapat kong gawin?', listahan);

kung idx == 2

pahinga

magtapos

% Ano ang gagawin kung ang isang bagay ay napansin sa harap ng bot:

% ihinto, bumalik, kumuha ng larawan, alerto ang gumagamit ng pagtuklas

% sa pamamagitan ng email, i-90 degree, at patuloy na tuklasin

kung hindi man Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r.stop;

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

i = i + 1;

r.moveDistance (-. 125);

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

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';

posisyon = savepos (pos);

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

sendmail (mail, 'Alert!', 'May nahanap ako!', {imfile, posisyon})

anggulo = 90;

netangle = netangle + anggulo;

r.turnAngle (anggulo);

r.setDriveVelocity (v, v);

% Ano ang gagawin kung ang bagay ay napansin sa kaliwa ng bot:

% huminto, lumiko patungo sa object, i-back up, kumuha ng litrato, alerto

% ng gumagamit ng pagtuklas sa pamamagitan ng email, i-90 degree at patuloy na tuklasin

kung hindi man Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.kaliwa == 1

r.stop;

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

i = i + 1;

anggulo = 30;

netangle = netangle + anggulo;

r.turnAngle (anggulo);

r.moveDistance (-. 125);

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

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';

posisyon = savepos (pos);

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

sendmail (mail, 'Alert!', 'May nahanap ako!', {imfile, posisyon})

anggulo = -90;

netangle = netangle + anggulo;

r.turnAngle (anggulo);

r.setDriveVelocity (v, v);

% Ano ang gagawin kung ang bagay ay napansin sa kanan ng bot:

% huminto, lumiko patungo sa object, i-back up, kumuha ng litrato, alerto

% ng gumagamit ng pagtuklas sa pamamagitan ng email, i-90 degree at patuloy na tuklasin

kung hindi man Light. RightFront> lightBumper_datum || Light. Right> lightBumper_datum || Bump. tama == 1

r.stop;

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

i = i + 1;

anggulo = -30;

netangle = netangle + anggulo;

r.turnAngle (anggulo);

r.moveDistance (-. 125);

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

i = i + 1;

i-pause (1.5);

r.beep ('C1 ^, C1 ^, C2 ^, D2 ^, D2 ^, C8 ^')

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

posisyon = savepos (pos);

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

sendmail (mail, 'Alert!', 'May nahanap ako!', {imfile, posisyon});

anggulo = 90;

netangle = netangle + anggulo;

r.turnAngle (anggulo);

r.setDriveVelocity (v, v);

% Ano ang gagawin kung ang talampas ay napansin sa kaliwa ng bot:

% huminto, lumipat paatras, kumanan sa kanan, magpatuloy sa paggalugad

kung hindi man Cliff.kaliwa <sumasalamin_datum || Cliff.leftFront <mirror_datum

r.stop;

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

i = i + 1;

r.moveDistance (-. 125);

dist = r.getDistansya;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); % makakuha ng x coordinate

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % makakuha ng koordinasyon

i = i + 1;

anggulo = -RandAngle;

netangle = netangle + anggulo;

r.turnAngle (anggulo);

r.setDriveVelocity (v, v);

% Ano ang gagawin kung ang bangin ay napansin sa kanan ng bot:

% huminto, lumipat pabalik, kumaliwa, magpatuloy sa paggalugad

kung hindi man Cliff. Right <mirror_datum || Cliff. RightFront <mirror_datum

r.stop;

dist = r.getDistansya;

pos (i, 1) = dist * sind (anggulo); % makakuha ng x coordinate

pos (i, 2) = dist * cosd (anggulo); % makakuha ng koordinasyon

i = i + 1;

r.moveDistance (-. 125);

anggulo = RandAngle;

netangle = netangle + anggulo;

r.turnAngle (anggulo);

r.setDriveVelocity (v, v);

magtapos

magtapos

Controller ng Smartphone

Mga Pagpipilian = {'Autonomous', 'Manu-manong Kontrol'}

Prompt = menu ('Paano mo gustong makontrol ang rover?', Mga Pagpipilian)

m = mobiledev

r = roomba (19)

kung Prompt == 1

Galugarin (r)

iba pa

habang totoo

i-pause (.5)

TeleponoData = m. Orentasyon;

Azi = PhoneData (1);

Pitch = PhoneData (2);

Side = TeleponoData (3);

kung Side> 130 || Side <-130% kung ang telepono ay nakabaliktad ihinto ang roomba at exit loop

r.stop

r.beep ('C, C, C, C')

pahinga

kung hindi man Side> 25 && Side <40% kung ang telepono ay paikutin sa pagitan ng 25 at 40 deg lumiko pakaliwa 5 deg

r.turnAngle (-5);

kung hindi man> 40% kung ang telepono ay paikutin sa paglipas ng 40 deg liko sa kaliwa 45 deg

r.turnAngle (-45)

kung hindi man Side-40% kung ang telepono ay paikutin sa pagitan ng -25 at -40 deg lumiko pakanan 5 deg

r.turnAngle (5);

kung hindi man Side <-40% kung ang telepono ay paikutin mas mababa sa -40 deg lumiko sa kaliwa 45 deg

r.turnAngle (45)

magtapos

% Kung ang telepono ay gaganapin malapit sa verticle kumuha ng isang imahe at balangkas ito

kung ang Pitch <-60 && imahe <= 9

r.beep

img = r.getImage;

subplot (3, 3, imahe)

imshow (img)

magtapos

% sumulong at paatras batay sa orientation ng harap at likod

kung ang Pitch> 15 && Pitch <35% kung pitch sa pagitan ng 15 at 35 deg sumulong sa maikling distansya

% makakuha ng magaan na data ng bumper bago lumipat

litBump = r.getLightBumpers;

kung litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump. RightCenter> 500 || litBump. RightFront> 500% kung may isang bagay sa harap ng roomba at tatama kung sumulong ito gumawa ng ingay at ipakita ang mensahe

r.beep ('C ^^, F # ^, C ^^, F # ^')

iba% ilipat

r.moveDistance (.03);

% Kumuha ng data ng bumper pagkatapos lumipat

Bump = r.getBumpers;

kung Bump. tama == 1 || Bump.left == 1 || Bump.front == 1

r.beep ('A, C, E')

r.moveDistance (-. 01)

magtapos

% makakuha ng data ng cliff sensor

Cliff = r.getCliffSensors;

kung Cliff.kaliwa> 1500 || Cliff.leftFront> 1500 || Cliff. RightFront> 1500 || Cliff. Right> 1500% kung may isang bagay na nagpapalitaw sa cliff sensor na tinatrato ito bilang lava at back up

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 031)

magtapos

magtapos

kung hindi man Pitch> 35% kung mas mataas ang pitch ng 35 deg pasulong na mas matagal ang distansya

% makakuha ng magaan na data ng bumper bago lumipat

litBump = r.getLightBumpers;

kung litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump. RightCenter> 15 || litBump. RightFront> 15% kung may isang bagay sa harap ng roomba at tatama kung sumulong ito gumawa ng ingay at ipakita ang mensahe

r.beep ('C ^^, F # ^, C ^^, F # ^')

iba% ilipat

r.moveDistance (.3)

% Kumuha ng data ng bumper pagkatapos lumipat

Bump = r.getBumpers;

kung Bump. tama == 1 || Bump.left == 1 || Bump.front == 1% kung nag-hit ka ng isang bagay gumawa ng ingay, display message, at i-back up

r.beep ('A, C, E')

r.moveDistance (-. 01)

magtapos

% makakuha ng data ng cliff sensor pagkatapos lumipat

Cliff = r.getCliffSensors;

kung Cliff.kaliwa> 1500 || Cliff.leftFront> 1500 || Cliff. RightFront> 1500 || Cliff. Right> 1500% kung may isang bagay na nagpapalitaw sa cliff sensor na tinatrato ito bilang lava at back up

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (-. 31)

magtapos

magtapos

kung hindi man Pitch-35% kung pitch sa pagitan ng -15 at -35 deg ilipat pabalik maikling distansya

r.moveDistance (-. 03);

% makakuha ng data ng cliff sensor pagkatapos lumipat

Cliff = r.getCliffSensors;

kung Cliff.kaliwa> 1500 || Cliff.leftFront> 1500 || Cliff. RightFront> 1500 || Cliff. Right> 1500% kung may isang bagay na nagpapalitaw sa cliff sensor na tinatrato ito bilang lava at back up

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.04)

magtapos

kung hindi man Pitch-60% kung pitch sa pagitan ng -35 at -60 deg ilipat pabalik mas mahabang distansya

r.moveDistance (-. 3)

% makakuha ng data ng cliff sensor pagkatapos lumipat

Cliff = r.getCliffSensors;

kung Cliff.kaliwa> 1500 || Cliff.leftFront> 1500 || Cliff. RightFront> 1500 || Cliff. Right> 1500% kung may isang bagay na nagpapalitaw sa cliff sensor na tinatrato ito bilang lava at back up

r.beep ('C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C, C ^^, C')

r.moveDistance (.31)

magtapos

magtapos

magtapos

magtapos

Inirerekumendang: