Мазмұны:

Бөлмеңізді Марсқа айналдырыңыз: 5 қадам
Бөлмеңізді Марсқа айналдырыңыз: 5 қадам
Anonim
Сіздің бөлмеңізді Mars Rover -ге айналдыру
Сіздің бөлмеңізді Mars Rover -ге айналдыру

1 -қадам: материалдарыңызды жинаңыз

Бұл жобаны аяқтау үшін сізге келесі материалдарды жинау қажет:

1 Roomba роботы

1 Raspberry Pi жиынтығы

1 Бейне камера

MATLAB -қа кіру

2 -қадам: MATLAB үшін Roomba құралдар тақтасын жүктеңіз

MATLAB үшін Roomba құралдар тақтасын жүктеңіз
MATLAB үшін Roomba құралдар тақтасын жүктеңіз
MATLAB үшін Roomba құралдар тақтасын жүктеңіз
MATLAB үшін Roomba құралдар тақтасын жүктеңіз

Бұл жобаны аяқтау үшін қажетті құралдар жәшіктерін орнату үшін келесі кодты іске қосыңыз.

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'), қайтару; Соңы

% бар файлдардың тізімін алады

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

if ~ isempty (бұрыннан бар файлдар)

% оларды ауыстырудың дұрыс екеніне көз жеткізіңіз

prompt = {'Сіз бұл файлдарды ауыстырасыз:'

''

strjoin (бұрыннан бар файлдар, '')

''

'Ауыстыру керек пе?'

};

дыбыстық сигнал;

yn = questdlg (шақыру,…

dlgTitle,…

'Иә', 'Жоқ', 'Иә');

if ~ strcmp (yn, 'Yes'), қайтару; Соңы

Соңы

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

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 -ға қосылыңыз

Енді Wi -Fi арқылы Roomba -ға қосылудың уақыты келді. 2 саусағыңызбен Dock және Spot түймелерін басып, Roomba құрылғысын қосыңыз немесе қалпына келтіріңіз. Содан кейін, роботқа қосылу үшін MATLAB пәрмен терезесінде r = roomba (Roomba нөмірі) кодын іске қосыңыз. Сіз бұл команданы орындағаннан кейін, сіздің Roomba баруға дайын болуы керек.

4 -қадам: Roomba -ны қалай басқарғыңыз келетінін таңдаңыз

Roomba -ны қалай басқарғыңыз келетінін таңдаңыз
Roomba -ны қалай басқарғыңыз келетінін таңдаңыз
Roomba -ны қалай басқарғыңыз келетінін таңдаңыз
Roomba -ны қалай басқарғыңыз келетінін таңдаңыз

Roomba -ны басқарудың екі әдісі бар: автономды немесе смартфонды контроллер ретінде пайдалану.

Егер сіз Румбаны автономды түрде басқаруды таңдасаңыз, сізге үш кіріктірілген сенсорды қолдану қажет болады: жартасты сенсорлар, соққы сенсорлары және жарық сенсорлары.

Смартфонды пайдалану үшін алдымен төмендегі әрекеттерді орындау арқылы смартфонды компьютерге қосу керек.

ЕСКЕРТПЕ: Дұрыс қосылу үшін компьютер мен смартфон бір Wi -Fi желісінде болуы керек!

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 = бөлмеба (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 ^^, С2 ^^, С2 ^^, С2 ^^, Е1 ^^, Е1 ^^, Е1 ^^, Д1 ^^, С4 ^^ ');

v =.1;

ref_datum = 2700; %қия датчиктерінің анықтамалық мәнін орнатыңыз

lightBamper_datum = 200; %орнатылған жарық Бампер сенсорларының анықтамалық мәні

pos = [0, 0]; Деректер инициализацияланған позицияны сақтауға арналған %айнымалы

бұрыш = 0; сілтеме бұрышы %орнатылған

торсық = 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 кездейсоқ бұрыш жасайды. Боттың ілмекте қалуын болдырмау үшін қолданылады

%Бір немесе бірнеше доңғалақ жерге тиіп кетсе не істеу керек:

%қозғалысты тоқтату, қоршаған суреті бар ескерту электрондық поштасын жіберу, %және пайдаланушыдан жалғастыруды немесе көмек күтуді сұраңыз

егер Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1

r.stop

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + дист * синд (торсық); %x координатын алады

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

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> lightBamper_datum || Light.rightCenter> lightBamper_datum || Bump.front == 1

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + дист * синд (торсық); %x координатын алады

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

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + дист * синд (торсық); %x координатын алады

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

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 (пошта, 'Ескерту!', 'Мен бірдеңе таптым!', {imfile, position})

бұрыш = 90;

торсық = торсық+бұрыш;

r.turnAngle (бұрыш);

r.setDriveVelocity (v, v);

%Егер боттың сол жағында объект анықталса не істеу керек:

%тоқтау, объектіге қарай бұрылу, артқа шегіну, суретке түсіру, ескерту

Пайдаланушы электрондық пошта арқылы жаңалық ашады, 90 градусқа бұрылады және зерттеуді жалғастырады

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

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + дист * синд (торсық); %x координатын алады

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

i = i+1;

бұрыш = 30;

торсық = торсық+бұрыш;

r.turnAngle (бұрыш);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + дист * синд (торсық); %x координатын алады

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

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 (пошта, 'Ескерту!', 'Мен бірдеңе таптым!', {imfile, position})

бұрыш = -90;

торсық = торсық+бұрыш;

r.turnAngle (бұрыш);

r.setDriveVelocity (v, v);

%Егер объект боттың оң жағында анықталса не істеу керек:

%тоқтау, объектіге қарай бұрылу, артқа шегіну, суретке түсіру, ескерту

Пайдаланушы электрондық пошта арқылы жаңалық ашады, 90 градусқа бұрылады және зерттеуді жалғастырады

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

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + дист * синд (торсық); %x координатын алады

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

i = i+1;

бұрыш = -30;

торсық = торсық+бұрыш;

r.turnAngle (бұрыш);

r.moveDistance (-. 125);

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + дист * синд (торсық); %x координатын алады

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

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 (пошта, 'Ескерту!', 'Мен бірдеңе таптым!', {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 (торсық); %x координатын алады

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

i = i+1;

r.moveDistance (-. 125);

dist = r.getDistance;

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

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

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

Соңы

Соңы

Смартфон контроллері

Опциялар = {'Автономды', 'Қолмен басқару'}

Prompt = мәзір ('Роверді қалай басқарғыңыз келеді?', Параметрлер)

m = мобильді

r = бөлмеба (19)

егер шақыру == 1

Зерттеу (r)

басқа

рас болса

кідірту (.5)

PhoneData = м. Бағдар;

Ази = PhoneData (1);

Қадам = PhoneData (2);

Side = PhoneData (3);

егер Side> 130 || Егер телефон төмен қаратылған болса, бүйірі <-130 %, бөлме жабындысын тоқтатып, ілмектен шығыңыз

r.stop

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

үзіліс

elseif Side> 25 && Side <40 %, егер телефон 25 пен 40 градус аралығында бүйірге бұрылса, солға 5 градусқа бұрылады

r.turnAngle (-5);

elseif Side> 40 %, егер телефон 40 градустан жоғары қарай бұрылған болса, солға 45 градусқа бұрылады

r.turnAngle (-45)

elseif Side -40 %, егер телефон -25 пен -40 градус аралығында бүйірге бұрылса, оңға 5 градусқа бұрылады

r.turnAngle (5);

elseif Side <-40 %, егер телефон -40 градустан төмен қарай бұрылса, солға 45 градусқа бұрылады

r.turnAngle (45)

Соңы

%Егер телефон вертикальдың жанында болса, суретке түсіріп, оны салыңыз

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

r. beep

img = r.getImage;

қосымша жоспар (3, 3, сурет)

imshow (img)

Соңы

%алдыңғы және артқы бағдар негізінде алға және артқа жылжиды

егер Pitch> 15 && Pitch <35 %, егер 15 пен 35 градус арасындағы қадам қысқа қашықтыққа алға жылжиды

%жылжымас бұрын жеңіл бампер деректерін алады

litBump = r.getLightBampers;

егер litBump.leftFront> 500 || litBump.leftCenter> 500 || litBump.rightCenter> 500 || litBump.rightFront> 500 %, егер бөлмеде бірдеңе болса және ол алға жылжыса, соққы береді, шу шығарады және хабарды көрсетеді

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

басқа %қозғалады

r.moveDistance (.03);

Жылжытқаннан кейін бампер деректерін алыңыз

Bump = r.getBampers;

егер Bump.right == 1 || Bump.left == 1 || Bump.front == 1

r. beep ('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.getLightBampers;

егер litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, егер бөлмеде бірдеңе болса және ол алға жылжыса, соққы береді, дыбыс шығарады және хабарды көрсетеді

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

басқа %қозғалады

r.moveDistance (.3)

Жылжытқаннан кейін бампер деректерін алыңыз

Bump = r.getBampers;

егер Bump.right == 1 || Bump.left == 1 || Bump.front == 1 %, егер сіз бірдеңеге соқсаңыз, шу шығарыңыз, хабарды көрсетіңіз және сақтық көшірмесін жасаңыз

r. beep ('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)

Соңы

Соңы

Соңы

Соңы

Ұсынылған: