Мазмуну:

Roomba -ны Mars Roverге айландыруу: 5 кадам
Roomba -ны Mars Roverге айландыруу: 5 кадам

Video: Roomba -ны Mars Roverге айландыруу: 5 кадам

Video: Roomba -ны Mars Roverге айландыруу: 5 кадам
Video: Что с ними случилось? ~ Невероятный заброшенный особняк знатной семьи 2024, Ноябрь
Anonim
Roombaңызды Mars Roverге айлантуу
Roombaңызды Mars Roverге айлантуу

1 -кадам: Сиздин материалдарды чогултуу

Бул долбоорду аяктоо үчүн төмөнкү материалдарды чогултуу керек болот:

1 Roomba робот

1 Raspberry Pi комплект

1 видео камера

MATLABка кирүү

2 -кадам: MATLAB үчүн Roomba Toolboxes жүктөп алыңыз

MATLAB үчүн Roomba Toolboxes жүктөп алыңыз
MATLAB үчүн Roomba Toolboxes жүктөп алыңыз
MATLAB үчүн Roomba Toolboxes жүктөп алыңыз
MATLAB үчүн Roomba Toolboxes жүктөп алыңыз

Бул долбоорду аяктоо үчүн керектүү курал кутучаларын орнотуу үчүн төмөнкү кодду иштетиңиз.

roombaInstall функциясы

clc;

орнотулуучу файлдардын % тизмеси

файлдар = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% орнотуу үчүн жайгашкан жер

параметрлери = weboptions ('CertificateFilename', ''); % сертификаттын талаптарын этибарга албоону айтат

сервер = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Roomba орнотуу/жаңыртуу';

% көрсөтүү максаты жана ырастоо алуу

чакыруу = {

'Бул программа бул EF 230 Roomba файлдарын жүктөйт:'

''

strjoin (файлдар, '')

''

'бул папкага:'

''

cd

''

'Уланткыңыз келеби? '

};

бип;

yn = questdlg (ыкчам,…

dlgTitle,…

'Ооба', 'Жок', 'Ооба');

if ~ strcmp (yn, 'Yes'), return; аяктоо

% бар файлдардын тизмесин алышат

mavjud_files = файлдар (cellfun (@exist, files)> 0);

if ~ isempty (бар_файлдар)

% аларды алмаштыруу чындыгында туура экенин текшериңиз

prompt = {'Сиз бул файлдарды алмаштырып жатасыз:'

''

strjoin (mavjud_files, '')

''

'Алмаштыруу туурабы?'

};

бип

yn = questdlg (ыкчам,…

dlgTitle,…

'Ооба', 'Жок', 'Ооба');

if ~ strcmp (yn, 'Yes'), return; аяктоо

аяктоо

% файлдарды жүктөө

cnt = 0;

i = 1 үчүн: узундугу (файлдар)

f = файлдар {i};

disp (['Жүктөө' f]);

аракет кыл

url = [сервер f];

websave (f, url, варианттар); % коопсуздук каталарын болтурбоо үчүн опцияларды кошту

cnt = cnt + 1;

кармоо

disp (['Жүктөө катасы' f]);

муляж = [f '.html'];

эгер бар болсо (муляж, 'файл') == 2

жок кылуу (муляж)

аяктоо

аяктоо

аяктоо

эгер cnt == узундугу (файлдар)

msg = 'Орнотуу ийгиликтүү';

күтүү (msgbox (msg, dlgTitle));

башка

msg = 'Орнотуу катасы - чоо -жайын билүү үчүн буйрук терезесин караңыз';

күтүү (errordlg (msg, dlgTitle));

аяктоо

end %roombaInstall

3 -кадам: Сиздин Roomba туташуу

Эми WiFi аркылуу Roombaга туташуу мезгили келди. 2 манжаңызды колдонуп, Roomba түзмөгүңүздү күйгүзүү же баштапкы абалга келтирүү үчүн Dock жана Spot баскычтарын бир убакта басыңыз. Андан кийин, роботко туташуу үчүн MATLABтын буйрук терезесинде r = roomba (Roombaңыздын#) кодун иштетиңиз. Бул буйрукту аткаргандан кийин, Roomba барууга даяр болушу керек.

4 -кадам: Roombaңызды кантип башкаргыңыз келерин тандаңыз

Roombaңызды кантип башкаргыңыз келгенин тандаңыз
Roombaңызды кантип башкаргыңыз келгенин тандаңыз
Roombaңызды кантип башкаргыңыз келерин тандаңыз
Roombaңызды кантип башкаргыңыз келерин тандаңыз

Roomba башкаруунун эки жолу бар: автономдуу түрдө же смартфонду контролер катары колдонуу.

Эгер сиз Roomba автономдуу түрдө айдоону чечсеңиз, анда үч орнотулган сенсорду колдонууга туура келет: жардын, сенсордун жана жарыктын сенсорлору.

Смартфонду колдонуу үчүн адегенде төмөнкү кадамдарды аткаруу менен смартфонуңузду компьютериңизге туташтырышыңыз керек.

ЭСКЕРТҮҮ: Туура туташуу үчүн сиздин компьютериңиз менен смартфонуңуз бир WiFi тармагында болушу керек!

1. MATLAB тиркемесин түзмөгүңүздөгү колдонмо дүкөнүнөн жүктөп алыңыз.

2. Команда терезесине "туташтыргычты" териңиз жана эки түзмөккө тең киргизиле турган сырсөздү коюңуз.

3. Ушундай кылгандан кийин, MATLAB сизге компьютериңиздин IP дарегин берет. Сиз смартфонуңуздагы MATLAB тиркемесиндеги жөндөөлөр барагына кирип, берилген IP дарегин жана мурун киргизилген сырсөздү колдонуп компьютерди кошушуңуз керек.

4. Компьютериңиздеги буйрук терезесине m = mobiledev кодун териңиз жана бул смартфонуңузду Roomba үчүн контролер катары башташы керек.

5. Сиздин компьютериңиз жана смартфонуңуз азыр иштөөгө даяр болушу керек.

5 -кадам: Сиздин Roomba кууп

Эми сизде Mars Roverди түзүү үчүн керектүү бардык шаймандар бар, сиз өзүңүздүн кодуңузду түзүүгө даярсыз. Биз автономдуу айдоо үчүн да, смартфон башкарган айдоо үчүн да мисал кодун тиркеп койдук.

Автономдуу айдоо

Explore_modified функциясы (r)

%киргизүү аргументтери: 1 roomba объектиси, r

%чыгаруу аргументтери: жок

%сүрөттөмөсү:

%функциясы автономдуу болуу үчүн чексиз циклди колдонот

%боттун айланасын изилдөө.

%

%funciton ошондой эле Roombaга эмне кылуу керектиги боюнча көрсөтмөлөрдү берет

%төмөнкү жагдайлар: Дөңгөлөктөр жер менен байланышты жоготот, а

%объекти боттун алдында же эки тарабында аныкталат жана а

%күтүлбөгөн жерден түшүү боттун алдында же эки тарабында аныкталат.

%

%типтүү көрсөтмөлөргө максимумга багытталган кыймыл командалары кирет

%чалгындоо же табылган коркунучту болтурбоо жана байланышууга буйрук берүү

боттордун ачылыштары тууралуу %маалымат (сүрөттөр), позиция (график), %жана мамлекет (тыгыз эскертүү) колдонуучу менен matlab жана/же электрондук почта аркылуу. Бир нече

ырахат алуу үчүн %үн буйруктары кошулат.

%электрондук почта мүмкүнчүлүктөрүн орнотуу

почта = '[email protected]';

пароль = 'EF230Roomba';

setpref ('Интернет', 'SMTP_Server', 'smtp.gmail.com');

setpref ('Интернет', 'E_mail', почта);

setpref ('Интернет', 'SMTP_Username', почта);

setpref ('Интернет', 'SMTP_Password', пароль);

реквизиттер = 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;

reflect_datum = 2700; %жарт сенсорлорунун шилтеме маанисин койду

lightBumper_datum = 200; %коюлган жарык Бампер сенсорлорунун маалымдама мааниси

pos = [0, 0]; Берилиш инициализацияланган позицияны сактоо үчүн %өзгөрмөлүү

бурч = 0; %шилтеме бурчун койду

netangle = 0; %таза бурчтун жылышы

i = 2; Позицияны сактоо өзгөрмөсүнө катарларды кошуу үчүн %итератор

dist = 0;

r.setDriveVelocity (v, v); %Roomba алдыга жылат

чын болсо

Cliff = r.getCliffSensors;

Bump = r.getBampers;

Light = r.getLightBampers;

RandAngle = randi ([20, 60], 1); %20дан 60 градуска чейинки 1 туш келди бурчту жаратат. Боттун укурукка тыгылып калуусун алдын алуу үчүн колдонулат

%Бир же бир нече дөңгөлөк жерге тийбей калса эмне кылуу керек:

%кыймылды токтотуу, айлананын сүрөтү менен эскертүүчү электрондук кат жөнөтүү, %жана колдонуучудан улантууну же жардам күтүүнү сураңыз

if Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %у координаты

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

позиция = savepos (pos);

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

sendmail (почта, 'ЖАРДАМ!', 'Мен аскада калдым!', {imfile, position})

list = {'Улантуу', 'Токтоо'};

idx = меню ('Эмне кылышым керек?', тизме);

эгер idx == 2

тыныгуу

аяктоо

%Боттун алдында объект табылса эмне кылуу керек:

%токтотуу, артка жылуу, сүрөткө тартуу, колдонуучуга ачылыш жөнүндө эскертүү

%электрондук почта аркылуу, 90 градуска бурулуп, изилдөөнү улантыңыз

elseif Light.leftCenter> lightBumper_datum || Light.rightCenter> lightBumper_datum || Bump.front == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %у координаты

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координатын ал

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

позиция = savepos (pos);

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

sendmail (почта, 'Alert!', 'Мен бир нерсе таптым!', {imfile, position})

бурч = 90;

торго = торго+бурч;

r.turnAngle (бурч);

r.setDriveVelocity (v, v);

%Боттун сол тарабында объект табылса эмне кылуу керек:

%токто, объектти карай бур, артка, сүрөткө тартуу, эскертүү

Электрондук почта аркылуу ачылыштын %колдонуучусу, 90 градуска бурулуп, изилдөөнү улантыңыз

elseif Light.leftFront> lightBumper_datum || Light.left> lightBumper_datum || Bump.left == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %у координаты

i = i+1;

бурч = 30;

торго = торго+бурч;

r.turnAngle (бурч);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %координатын ал

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

позиция = savepos (pos);

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

sendmail (почта, 'Alert!', 'Мен бир нерсе таптым!', {imfile, position})

бурч = -90;

торго = торго+бурч;

r.turnAngle (бурч);

r.setDriveVelocity (v, v);

%Объект боттун оң жагында аныкталса эмне кылуу керек:

%токто, объектти карай бур, артка, сүрөткө тартуу, эскертүү

Электрондук почта аркылуу ачылуунун %колдонуучусу, 90 градуска бурулуп, изилдөөнү улантыңыз

elseif Light.rightFront> lightBamper_datum || Light.right> lightBumper_datum || Bump.right == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %у координаты

i = i+1;

бурч = -30;

торго = торго+бурч;

r.turnAngle (бурч);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %у координаты

i = i+1;

тыным (1,5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

позиция = savepos (pos);

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

sendmail (почта, 'Alert!', 'Мен бир нерсе таптым!', {imfile, position});

бурч = 90;

торго = торго+бурч;

r.turnAngle (бурч);

r.setDriveVelocity (v, v);

%Боттун сол жагында жардан табылса эмне кылуу керек:

%токто, артка жыл, оңго бур, изилдөөнү улант

elseif Cliff.left <reflect_datum || Cliff.leftFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %у координаты

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %x координатын алышат

pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %у координаты

i = i+1;

бурч = -RandAngle;

торго = торго+бурч;

r.turnAngle (бурч);

r.setDriveVelocity (v, v);

%Боттун оң жагында жар бар экени аныкталса эмне кылуу керек:

%токто, артка жыл, солго бур, изилдөөнү улант

elseif Cliff.right <reflect_datum || Cliff.rightFront <reflect_datum

r.stop;

dist = r.getDistance;

pos (i, 1) = dist * sind (бурч); %x координатын алышат

pos (i, 2) = dist * cosd (бурч); %у координаты

i = i+1;

r.moveDistance (-. 125);

бурч = RandAngle;

торго = торго+бурч;

r.turnAngle (бурч);

r.setDriveVelocity (v, v);

аяктоо

аяктоо

Smartphone Controller

Параметрлер = {'Автономдуу', 'Кол менен башкаруу'}

Prompt = меню ('Роверди кантип башкаргыңыз келет?', Жолдор)

m = мобилдик

r = Roomba (19)

if Prompt == 1

Изилдөө (r)

башка

чын болсо

тындыруу (.5)

PhoneData = m. Orientation;

Azi = PhoneData (1);

Pitch = PhoneData (2);

Side = PhoneData (3);

if Side> 130 || Каптал <-130 %, эгерде телефон жүзүн ылдый каратып караса, бөлмөнү токтотуп, айлануудан чыгыңыз

r.stop

r.bip ('C, C, C, C')

тыныгуу

elseif Side> 25 && Side <40 %, эгерде телефон 25тен 40 градуска чейин капталга бурулса, солго 5 градуска бурулат

r.turnAngle (-5);

elseif Side> 40 %, эгерде телефон 40 градустан өйдө бурулса, солго 45 градуска бурулат

r.turn (-45)

elseif Side -40 %, эгер телефон -25 менен -40 градуска чейин капталга бурулса, оңго 5 градуска бурулат

r.turnAngle (5);

elseif Side <-40 %, эгер телефон -40 градустан төмөн бурулса, солго 45 градуска бурулат

r.turnAngle (45)

аяктоо

%Эгерде телефон вертикалдын жанында кармалып турса, анда сүрөткө тартып, план түзүңүз

эгер Pitch <-60 && image <= 9

r.bip

img = r.getImage;

кошумча план (3, 3, сүрөт)

imshow (img)

аяктоо

%алдыңкы жана арткы багыттын негизинде алдыга жана артка жылат

эгер Pitch> 15 && Pitch <35 %болсо, 15 менен 35 градустун ортосундагы кадам кыска аралыкка алдыга жылат

%жылдырардан мурун жеңил бампер маалыматын алышат

litBump = r.getLightBumpers;

эгер litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, эгерде бир нерсе бөлмө алдында болсо жана ал алдыга жылса, урунат жана ызы -чуу чыгарат

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

башка %жылат

r.moveDistance (.03);

%Кыймылдан кийин бампер маалыматын алыңыз

Bump = r.getBampers;

if Bump.right == 1 || Bump.left == 1 || Bump.front == 1

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

r.moveDistance (-. 01)

аяктоо

%жардын сенсорунун маалыматын алышат

Cliff = r.getCliffSensors;

эгер Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, эгерде бир нерсе жардын сенсорун иштетсе, аны лава жана резерв катары караңыз

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

r.moveDistance (-. 031)

аяктоо

аяктоо

elseif Pitch> 35 %, эгер чоңураак 35 градустан алысыраак аралыкка жылса

%жылдырардан мурун жеңил бампер маалыматын алышат

litBump = r.getLightBumpers;

эгер litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, эгерде бир нерсе бөлмө алдында болсо жана ал алдыга жылса, сокку урат жана билдирүү көрсөтөт

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

башка %жылат

r.moveDistance (.3)

%Кыймылдан кийин бампер маалыматын алыңыз

Bump = r.getBampers;

if Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, эгер сиз бир нерсеге тийсеңиз, ызы -чуу, билдирүүнү көрсөтүү жана резервдик көчүрүү

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

r.moveDistance (-. 01)

аяктоо

%жылгандан кийин жардын сенсорунун маалыматын алышат

Cliff = r.getCliffSensors;

эгер Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, эгерде бир нерсе жардын сенсорун иштетсе, аны лава жана резерв катары караңыз

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

r.moveDistance (-. 31)

аяктоо

аяктоо

elseif Pitch -35 %, эгер -15 менен -35 градуска чейинки аралык кыска аралыкка артка жылса

r.moveDistance (-. 03);

%жылгандан кийин жардын сенсорунун маалыматын алышат

Cliff = r.getCliffSensors;

эгер Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, эгерде бир нерсе жардын сенсорун иштетсе, аны лава жана резерв катары караңыз

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

r.moveDistance (.04)

аяктоо

elseif Pitch -60 %, эгер -35 менен -60 градустун ортосундагы аралык бир топ артка жылса

r.moveDistance (-. 3)

%жылгандан кийин жардын сенсорунун маалыматын алышат

Cliff = r.getCliffSensors;

эгер Cliff.left> 1500 || Cliff.leftFront> 1500 || Cliff.rightFront> 1500 || Cliff.right> 1500 %, эгерде бир нерсе жардын сенсорун иштетсе, аны лава жана резерв катары караңыз

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

r.moveDistance (.31)

аяктоо

аяктоо

аяктоо

аяктоо

Сунушталууда: