Мазмұны:
- 1 -қадам: материалдарыңызды жинаңыз
- 2 -қадам: MATLAB үшін Roomba құралдар тақтасын жүктеңіз
- 3 -қадам: Roomba -ға қосылыңыз
- 4 -қадам: Roomba -ны қалай басқарғыңыз келетінін таңдаңыз
- 5 -қадам: Roomba жүргізіңіз
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:22
1 -қадам: материалдарыңызды жинаңыз
Бұл жобаны аяқтау үшін сізге келесі материалдарды жинау қажет:
1 Roomba роботы
1 Raspberry Pi жиынтығы
1 Бейне камера
MATLAB -қа кіру
2 -қадам: 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 -ны басқарудың екі әдісі бар: автономды немесе смартфонды контроллер ретінде пайдалану.
Егер сіз Румбаны автономды түрде басқаруды таңдасаңыз, сізге үш кіріктірілген сенсорды қолдану қажет болады: жартасты сенсорлар, соққы сенсорлары және жарық сенсорлары.
Смартфонды пайдалану үшін алдымен төмендегі әрекеттерді орындау арқылы смартфонды компьютерге қосу керек.
ЕСКЕРТПЕ: Дұрыс қосылу үшін компьютер мен смартфон бір 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)
Соңы
Соңы
Соңы
Соңы
Ұсынылған:
Құм сағатын әр минут сайын айналдырыңыз - Arduino: 8 қадам
Құм сағатын әр минут сайын айналдырыңыз Servo мотор - Arduino: Бұл оқулықта біз серво -қозғалтқыш пен Visuino көмегімен әр 60 -шы минуттарда кішкене (1 минуттық) құм сағатын айналдыруды үйренеміз, демонстрациялық бейнені қараңыз
Raspberry Pi -ді Bluetooth маякына айналдырыңыз: 4 қадам
Raspberry Pi -ді Bluetooth -маякқа айналдырыңыз: Bluetooth - бұл деректерді сымсыз тасымалдаудың, үй автоматтандыру жүйесін құрудың, басқа құрылғыларды басқарудың инновациялық технологияларының бірі. Бұл нұсқаулықта мен Raspberry Pi -ді Bluetooth маякына айналдыруға тырысамын. Raspberry PiBleuIO талаптары (A Bl
Пайдаланылмаған смартфонды ақылды дисплейге айналдырыңыз: 6 қадам (суреттермен)
Қолданылмаған смартфонды ақылды дисплейге айналдыру: Deze оқулығы Энгельс тілінде берілген, бірақ сізде ескі смартфон бар ма? Бұл қарапайым қадамдық нұсқаулықты қолдана отырып, Google Sheets пен қалам мен қағаздың көмегімен смарт дисплейге айналдырыңыз. Сіз аяқтаған кезде
Өзіңізді жеке, минималистік бастапқы бетке айналдырыңыз!: 10 қадам
Өзіңізді жеке, минималистік бастапқы бетке айналдырыңыз!: COVID-19-ға айналғаннан кейін сізге негізінен қашықтан жұмыс жасауға көшуге тура келді ме? Дәл солай! Үйде компьютерлермен және Интернетте жұмыс істеу - бұл көптеген веб -сайттарды жұмысқа, мектепке немесе тіпті … көңіл көтеру үшін бақылауға тура келетінін білдіреді! Бетбелгілер
Кіріспе - Raspberry Pi -ді GPS бақылау серверіне айналдырыңыз: 12 қадам
Кіріспе - Raspberry Pi -ді GPS қадағалау серверіне айналдырыңыз: Бұл нұсқаулықта мен Traccar GPS қадағалау бағдарламасын Raspberry Pi -ге қалай орнату керектігін көрсетемін, ол интернетте үйлесімді құрылғылардан деректерді қабылдайды, олардың орналасуын картаға нақты уақытта тіркейді. қадағалау, сонымен қатар ойнатуды қадағалау