Orodha ya maudhui:

Kugeuza Roomba Yako Kuwa Rover ya Mars: Hatua 5
Kugeuza Roomba Yako Kuwa Rover ya Mars: Hatua 5

Video: Kugeuza Roomba Yako Kuwa Rover ya Mars: Hatua 5

Video: Kugeuza Roomba Yako Kuwa Rover ya Mars: Hatua 5
Video: Njia 5 Za Kumshawishi Bosi Wako(5 ways to to Influence Your Boss) 2024, Desemba
Anonim
Kugeuza Roomba Yako Kuwa Rover ya Mars
Kugeuza Roomba Yako Kuwa Rover ya Mars

Hatua ya 1: Kusanya vifaa vyako

Ili kukamilisha mradi huu, utahitaji kukusanya vifaa vifuatavyo:

1 Roomba Robot

1 Kitambaa cha Raspberry Pi

Kamera 1 ya Video

Upatikanaji wa MATLAB

Hatua ya 2: Pakua Sanduku la Vifaa vya Roomba kwa MATLAB

Pakua Sanduku la Vifaa vya Roomba kwa MATLAB
Pakua Sanduku la Vifaa vya Roomba kwa MATLAB
Pakua Sanduku la Vifaa vya Roomba kwa MATLAB
Pakua Sanduku la Vifaa vya Roomba kwa MATLAB

Endesha nambari ifuatayo ili uweke visanduku vya zana muhimu ili kukamilisha mradi huu.

kazi roombaInstall

clc;

Orodha ya faili za kusakinishwa

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

% eneo la kusakinisha kutoka

chaguzi = uchaguzi wa wavuti ('ChetiFilename', ); % iambie kupuuza mahitaji ya cheti

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

dlgTitle = 'Sakinisha / Sasisha Roomba';

Kusudi la kuonyesha na kupata uthibitisho

haraka = {

'Programu hii itapakua faili hizi za EF 230 Roomba:'

''

strjoin (faili, )

''

kwa folda hii: '

''

cd

''

Je! Unataka kuendelea? '

};

beep;

yn = questdlg (haraka,…

dlgTitle,…

'Ndio', 'Hapana', 'Ndio');

if ~ strcmp (yn, 'Yes'), rudi; mwisho

% pata orodha ya faili ambazo zipo

zilizopo_files = faili (cellfun (@exist, faili)> 0);

if ~ isempty (zilizopo_files)

hakikisha ni sawa kuzibadilisha

prompt = {'Unabadilisha faili hizi:'

''

strjoin (faili zilizopo, )

''

"Sawa kuchukua nafasi?"

};

beep;

yn = questdlg (haraka,…

dlgTitle,…

'Ndio', 'Hapana', 'Ndio');

if ~ strcmp (yn, 'Yes'), rudi; mwisho

mwisho

Pakua faili

cnt = 0;

kwa i = 1: urefu (faili)

f = faili {i};

disp (['Upakuaji' f]);

jaribu

url = [seva f];

hifadhi ya wavuti (f, url, chaguzi); % imeongeza chaguzi ili kuepuka makosa ya usalama

cnt = cnt + 1;

kukamata

disp (['Kosa kupakua' f]);

dummy = [f '.html'];

ikiwa zipo (dummy, 'file') == 2

futa (dummy)

mwisho

mwisho

mwisho

ikiwa cnt == urefu (faili)

msg = 'Ufanisi wa Usakinishaji';

subiri (msgbox (msg, dlgTitle));

mwingine

msg = 'Kosa la Usakinishaji - tazama dirisha la amri kwa maelezo';

subiri (errordlg (msg, dlgTitle));

mwisho

mwisho% roombaInstall

Hatua ya 3: Unganisha na Roomba yako

Sasa ni wakati wa kuungana na Roomba yako kwa kutumia WiFi. Kutumia vidole 2, bonyeza kitufe cha Dock na Spot wakati huo huo kuwasha au kuweka tena Roomba yako. Ifuatayo, Run code r = roomba (# ya Roomba yako) kwenye dirisha la amri la MATLAB kuungana na robot yako. Mara baada ya kutekeleza amri hii, Roomba yako inapaswa kuwa tayari kwenda.

Hatua ya 4: Chagua Jinsi Unavyotaka Kudhibiti Roomba Yako

Chagua Jinsi Unavyotaka Kudhibiti Roomba Yako
Chagua Jinsi Unavyotaka Kudhibiti Roomba Yako
Chagua Jinsi Unavyotaka Kudhibiti Roomba Yako
Chagua Jinsi Unavyotaka Kudhibiti Roomba Yako

Kuna njia mbili ambazo unaweza kudhibiti Roomba yako: kujiendesha au kutumia smartphone kama mtawala.

Ikiwa unachagua kuendesha Roomba kwa uhuru, utahitaji kutumia sensorer tatu zilizojengwa: sensorer za mwamba, sensorer mapema, na sensorer nyepesi.

Ili kutumia smartphone, kwanza unahitaji kuunganisha simu yako mahiri na kompyuta yako kwa kufuata hatua zifuatazo.

KUMBUKA: Kompyuta yako na smartphone inahitaji kuwa kwenye mtandao huo wa WiFi ili kuungana vizuri!

1. Pakua programu ya MATLAB kutoka duka la programu kwenye kifaa chako.

2. Chapa "kontakt juu" kwenye dirisha la amri yako na uweke nywila ambayo itahitaji kuingizwa kwenye vifaa vyote viwili.

3. Baada ya kufanya hivyo, MATLAB itakupa anwani yako ya IP ya kompyuta. Unahitaji kwenda kwenye ukurasa wa mipangilio kwenye programu ya MATLAB kwenye smartphone yako na uongeze kompyuta ukitumia anwani ya IP iliyopewa na nywila uliyoingiza hapo awali.

4. Katika dirisha la amri kwenye kompyuta yako, andika nambari m = mobiledev na hii inapaswa kutambulisha smartphone yako kama mtawala wa Roomba yako.

5. Kompyuta yako na smartphone inapaswa kuwa tayari kwenda sasa.

Hatua ya 5: Endesha Roomba yako

Sasa kwa kuwa una zana zote muhimu za kuunda Mars Rover yako, uko tayari kuunda nambari yako mwenyewe. Tumeambatanisha nambari ya mfano hapa chini kwa kuendesha gari kwa uhuru na kuendesha gari kudhibitiwa na smartphone.

Kuendesha kwa Kujitegemea

kazi Explore_modified (r)

Hoja za kuingiza% 1 kitu cha roomba, r

% hoja za pato: hakuna

% maelezo:

Kazi ya% hutumia kitanzi kisicho na kipimo ili kuruhusu uhuru

Utaftaji wa mazingira ya bot.

%

Funciton pia hutoa maagizo kwa roomba kwa nini cha kufanya katika

Hali zifuatazo: Magurudumu hayapigani na ardhi, an

% kitu hugunduliwa mbele au kwa upande wowote wa bot, na a

Kushuka kwa ghafla hugunduliwa mbele ya au upande wowote wa bot.

%

Maagizo ya kawaida ni pamoja na amri za harakati zinazokusudiwa kuongeza

Utafiti au epuka hatari inayogunduliwa na anaamuru kuwasiliana

habari juu ya uvumbuzi wa bots (picha), msimamo (grafu), % na hali (onyo lililokwama) na mtumiaji kupitia matlab na / au barua pepe. Kadhaa

Amri za sauti% zinaongezwa ili kufurahiya.

kuanzisha uwezo wa barua pepe

barua = '[email protected]';

nenosiri = 'EF230Roomba';

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

setpref ('Mtandao', 'E_mail', barua);

setpref ('Mtandao', 'SMTP_Username', barua);

setpref ('Mtandao', 'SMTP_Password', nywila);

props = java.lang. System.getProperties;

prop.setProperty ('mail.smtp.starttls.enable', 'kweli');

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

props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory');

prop.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;

tafakari_datum = 2700; % kuweka sensorer ya mwamba thamani ya kumbukumbu

mwangaBumper_datum = 200; % weka nuru rejeleo la sensorer Bumper

pos = [0, 0]; % variable kwa uhifadhi wa nafasi na datum imeanzishwa

pembe = 0; % kuweka pembe ya kumbukumbu

netangle = 0; Uhamaji wa pembe ya wavu

i = 2; iterator ya kuongeza safu kwenye nafasi ya kutofautisha kuhifadhi

dist = 0;

r.setDriveVelocity (v, v); kuanza roomba kusonga mbele

wakati ni kweli

Cliff = r.getCliffSensors;

Bump = r.getBumpers;

Mwanga = r.getLightBumpers;

RandAngle = randi ([20, 60], 1); % hutengeneza pembe 1 ya nasibu kati ya digrii 20 hadi 60. Inatumika kuzuia bot kukwama kwenye kitanzi

Nini cha kufanya ikiwa gurudumu moja au zaidi hupoteza mawasiliano na ardhi:

kuacha harakati, tuma barua pepe ya onyo na picha ya mazingira, na uliza mtumiaji ikiwa utaendelea au subiri msaada

ikiwa Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.acha

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % kupata x kuratibu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

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;

andika (img, 'stuck.png');

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

imfile = 'kukwama.png';

nafasi = savepos (pos);

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

sendmail (barua, 'HELP!', 'Nimekwama kwenye mwamba!', {imfile, position})

orodha = {'Endelea', 'Stop'};

idx = menyu ('Nifanye nini?', orodha);

ikiwa idx == 2

kuvunja

mwisho

Nini cha kufanya ikiwa kitu hugunduliwa mbele ya bot:

simama, rudi nyuma, piga picha, tahadhari mtumiaji wa ugunduzi

% kupitia barua pepe, geuza digrii 90, na uendelee kuchunguza

mwingineif Mwanga.kushotoCenter> lightBumper_datum || Mwanga.rightCenter> lightBumper_datum || Bump.mbele == 1

r.acha;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % kupata x kuratibu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

i = i + 1;

r.soveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % pata uratibu wa x

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

i = i + 1;

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

img = r.getImage;

andika (img, 'FrontBump.png')

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

imfile = 'FrontBump.png';

nafasi = savepos (pos);

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

sendmail (barua, 'Tahadhari!', 'Nimepata kitu!', {imfile, position})

pembe = 90;

netangle = pembetatu + pembe;

r. TurnAngle (pembe);

r.setDriveVelocity (v, v);

Nini cha kufanya ikiwa kitu hugunduliwa kushoto kwa bot:

simama, geukia kitu, rudisha nyuma, piga picha, tahadhari

Mtumiaji wa ugunduzi kupitia barua pepe, geuza digrii 90 na endelea kuchunguza

mwingineif Mwanga.kushoto Mbele> lightBumper_datum || Mwanga.kushoto> mwangaBumper_datum || Bump.left == 1

r.acha;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % kupata x kuratibu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

i = i + 1;

pembe = 30;

netangle = pembetatu + pembe;

r. zungusha (pembe);

r.soveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % pata uratibu wa x

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

i = i + 1;

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

img = r.getImage;

andika (img, 'LeftBump.png')

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

imfile = 'LeftBump.png';

nafasi = savepos (pos);

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

sendmail (barua, 'Tahadhari!', 'Nimepata kitu!', {imfile, position})

pembe = -90;

netangle = pembetatu + pembe;

r. zungusha (pembe);

r.setDriveVelocity (v, v);

Nini cha kufanya ikiwa kitu kinapatikana kwa haki ya bot:

simama, geukia kitu, rudisha nyuma, piga picha, tahadhari

Mtumiaji wa ugunduzi kupitia barua pepe, geuza digrii 90 na endelea kuchunguza

mwingineif Mwanga.kulia Mbele> lightBumper_datum || Mwanga.kulia> mwangaBumper_datum || Bump.kulia == 1

r.acha;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % pata uratibu wa x

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

i = i + 1;

pembe = -30;

netangle = pembetatu + pembe;

r. zungusha (pembe);

r.soveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % kupata x kuratibu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

i = i + 1;

pause (1.5);

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

img = r.getImage;

andika (img, 'RightBump.png')

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

imfile = 'RightBump.png';

nafasi = savepos (pos);

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

sendmail (barua, 'Alert!', 'Nimepata kitu!', {imfile, position});

pembe = 90;

netangle = pembetatu + pembe;

r. zungusha (pembe);

r.setDriveVelocity (v, v);

Nini cha kufanya ikiwa mwamba hugunduliwa kushoto kwa bot:

simama, rudi nyuma, pinduka kulia, endelea kuchunguza

mwingineif Cliff.kushoto <reflect_datum || Cliff. kushotoFront <reflect_datum

r.acha;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % kupata x kuratibu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

i = i + 1;

r.soveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (mwamba); % kupata x kuratibu

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); % kupata y kuratibu

i = i + 1;

pembe = -RangiAngle;

netangle = pembetatu + pembe;

r. zungusha (pembe);

r.setDriveVelocity (v, v);

Nini cha kufanya ikiwa mwamba hugunduliwa upande wa kulia wa bot:

Acha, songa nyuma, pinduka kushoto, endelea kuchunguza

mwingineif Cliff.kulia <reflect_datum || Cliff.rightFront <kuonyesha_datum

r.acha;

dist = r.getDistance;

pos (i, 1) = dist * sind (pembe); % kupata x kuratibu

pos (i, 2) = dist * cosd (pembe); % kupata y kuratibu

i = i + 1;

r.soveDistance (-. 125);

pembe = RandAngle;

netangle = pembetatu + pembe;

r. zungusha (pembe);

r.setDriveVelocity (v, v);

mwisho

mwisho

Mdhibiti wa Smartphone

Chaguzi = {'Autonomous', 'Manual Control'}

Prompt = menyu ('Je! Ungependa kudhibiti rover?', Chaguzi)

m = mobilesev

r = roomba (19)

ikiwa Haraka == 1

Gundua (r)

mwingine

wakati ni kweli

pumzika (.5)

SimuData = m. Oriering;

Azi = SimuData (1);

Lami = SimuData (2);

Upande = SimuData (3);

ikiwa Upande> 130 || Upande <-130% ikiwa simu imegeuzwa uso chini simama kitanzi na toka kitanzi

r.acha

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

kuvunja

upande mwingine> 25 && Side <40% ikiwa simu imegeuzwa kando kati ya digrii 25 hadi 40 geuka kushoto 5 deg

r. TurnAngle (-5);

upande mwingine> 40% ikiwa simu imegeuzwa kando juu ya digrii 40 pinduka kushoto digrii 45

r. TurnAngle (-45)

kamaif Side-40% ikiwa simu imegeuzwa kando kati -25 na -40 deg pinduka kulia 5 deg

r. TurnAngle (5);

upande mwingine <-40% ikiwa simu imegeuzwa pembeni chini ya -40 deg pinduka kushoto 45 deg

r.urnAngle (45)

mwisho

Ikiwa simu imeshikiliwa karibu na wima piga picha na kuipanga

ikiwa Pitch <-60 && picha <= 9

r.beep

img = r.getImage;

kiwanja (3, 3, picha)

imshow (img)

mwisho

% songa mbele na nyuma kulingana na mwelekeo wa mbele na nyuma

ikiwa lami> 15 && Pitch <35% ikiwa lami kati ya 15 na 35 deg songa mbele umbali mfupi

% hupata data nyepesi kabla ya kuhamia

litBump = r.getLightBumpers;

ikiwa litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500% ikiwa kuna kitu mbele ya roomba na kitapiga ikiwa kitasonga mbele piga kelele na kuonyesha ujumbe

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

mwingine% hoja

r.soveDistance (.03);

Kupata data bumper baada ya kusonga

Bump = r.getBumpers;

ikiwa Bump.kulia == 1 || Bump.left == 1 || Bump.mbele == 1

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

r.soveDistance (-. 01)

mwisho

% kupata data cliff sensor

Cliff = r.getCliffSensors;

ikiwa Cliff.kushoto> 1500 || Cliff kushoto mbele> 1500 || Cliff. Kulia Mbele> 1500 || Cliff.right> 1500% ikiwa kitu kinachosababisha sensor ya mwamba ichukue kama lava na uhifadhi tena

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

r.soveDistance (-. 031)

mwisho

mwisho

pengine> Pembe> 35% ikiwa lami zaidi 35 dig kusonga mbele umbali mrefu

% hupata data nyepesi kabla ya kuhamia

litBump = r.getLightBumpers;

ikiwa litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15% ikiwa kuna kitu mbele ya roomba na kitapiga ikiwa kitasonga mbele piga kelele na kuonyesha ujumbe

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

mwingine% hoja

r.soveDistance (.3)

Kupata data bumper baada ya kusonga

Bump = r.getBumpers;

ikiwa Bump.kulia == 1 || Bump.left == 1 || Bump.front == 1% ukigonga kitu fanya kelele, onyesha ujumbe, na uhifadhi nakala rudufu

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

r.soveDistance (-. 01)

mwisho

% kupata data cliff sensor baada ya kusonga

Cliff = r.getCliffSensors;

ikiwa Cliff.kushoto> 1500 || Cliff kushoto mbele> 1500 || Cliff. Kulia Mbele> 1500 || Cliff.right> 1500% ikiwa kitu kinachosababisha sensor ya mwamba ichukue kama lava na uhifadhi tena

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

r.sovesa Umbali (-. 31)

mwisho

mwisho

kingine ikiwa Pitch-35% ikiwa lami kati ya -15 na -35 deg inarudi nyuma umbali mfupi

r.soveDistance (-. 03);

% kupata data cliff sensor baada ya kusonga

Cliff = r.getCliffSensors;

ikiwa Cliff.kushoto> 1500 || Cliff kushoto mbele> 1500 || Cliff. Kulia Mbele> 1500 || Cliff.right> 1500% ikiwa kitu kinachosababisha sensor ya mwamba ichukue kama lava na uhifadhi tena

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

r.soveDistance (.04)

mwisho

kingine ikiwa Pitch-60% ikiwa lami kati ya -35 na -60 deg inarudi nyuma umbali mrefu

r.sovesa Umbali (-. 3)

% kupata data cliff sensor baada ya kusonga

Cliff = r.getCliffSensors;

ikiwa Cliff.kushoto> 1500 || Cliff kushoto mbele> 1500 || Cliff. Kulia Mbele> 1500 || Cliff.right> 1500% ikiwa kitu kinachosababisha sensor ya mwamba ichukue kama lava na uhifadhi tena

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

r.soveDistance (.31)

mwisho

mwisho

mwisho

mwisho

Ilipendekeza: