Съдържание:
- Стъпка 1: Съберете вашите материали
- Стъпка 2: Изтеглете Roomba Toolboxes за MATLAB
- Стъпка 3: Свържете се с вашата Roomba
- Стъпка 4: Изберете как искате да контролирате Roomba
- Стъпка 5: Карайте Roomba
Видео: Превръщане на вашата Roomba в марсоход: 5 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:50
Стъпка 1: Съберете вашите материали
За да завършите този проект, ще трябва да съберете следните материали:
1 Roomba Robot
1 комплект от Raspberry Pi
1 видеокамера
Достъп до MATLAB
Стъпка 2: Изтеглете Roomba Toolboxes за MATLAB
Изпълнете следния код, за да инсталирате необходимите кутии с инструменти, за да завършите този проект.
функция roombaInstall
clc;
% списък с файлове за инсталиране
files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};
% местоположение за инсталиране
options = weboptions ('Име на файла на сертификата', ''); % му казват да игнорира изискванията за сертификат
server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';
dlgTitle = 'Инсталиране/актуализиране на Roomba';
% показване на целта и получаване на потвърждение
подкана = {
„Тази програма ще изтегли тези файлове EF 230 Roomba:“
''
strjoin (файлове, '')
''
"към тази папка:"
''
cd
''
'Искаш ли да продължиш? '
};
звуков сигнал;
yn = questdlg (подкана, …
dlgTitle,…
„Да“, „Не“, „Да“);
ако ~ strcmp (yn, 'Да'), връщане; край
% получават списък с съществуващи файлове
съществуващи_файлове = файлове (cellfun (@exist, файлове)> 0);
ако ~ е празен (съществуващи_файлове)
% се уверете, че наистина е добре да ги замените
prompt = {'Заменяте тези файлове (и):'
''
strjoin (съществуващи_файлове, '')
''
"Добре за замяна?"
};
звуков сигнал;
yn = questdlg (подкана, …
dlgTitle,…
„Да“, „Не“, „Да“);
ако ~ strcmp (yn, 'Да'), връщане; край
край
% изтегляне на файловете
cnt = 0;
за i = 1: дължина (файлове)
f = файлове {i};
disp (['Изтегляне' f]);
опитвам
url = [сървър f];
websave (f, url, options); % добавени опции за избягване на грешки в сигурността
cnt = cnt + 1;
улов
disp (['Грешка при изтеглянето' f]);
манекен = [f '.html'];
ако съществува (манекен, „файл“) == 2
изтриване (манекен)
край
край
край
ако cnt == дължина (файлове)
msg = 'Инсталацията е успешна';
waitfor (msgbox (msg, dlgTitle));
иначе
msg = 'Грешка при инсталиране - вижте командния прозорец за подробности';
waitfor (errordlg (msg, dlgTitle));
край
край %roomba Инсталиране
Стъпка 3: Свържете се с вашата Roomba
Сега е време да се свържете с вашата Roomba чрез WiFi. С 2 пръста натиснете едновременно бутоните Dock и Spot, за да включите или нулирате вашата Roomba. След това стартирайте кода r = roomba (# от вашата Roomba) в командния прозорец на MATLAB, за да се свържете с вашия робот. След като изпълните тази команда, вашата Roomba трябва да е готова за работа.
Стъпка 4: Изберете как искате да контролирате Roomba
Има два начина, по които можете да управлявате вашата Roomba: автономно или като използвате смартфон като контролер.
Ако решите да управлявате Roomba самостоятелно, ще трябва да използвате трите вградени сензора: сензори за скали, сензори за удари и сензори за светлина.
За да използвате смартфон, първо трябва да свържете смартфона си към компютъра, като следвате стъпките по -долу.
ЗАБЕЛЕЖКА: Вашият компютър и смартфон трябва да са в една и съща WiFi мрежа, за да се свържат правилно!
1. Изтеглете приложението MATLAB от магазина за приложения на вашето устройство.
2. Въведете „конектор включен“в командния прозорец и задайте парола, която ще трябва да бъде въведена и на двете устройства.
3. След като направите това, MATLAB ще ви даде IP адреса на компютрите ви. Трябва да отидете на страницата с настройки в приложението MATLAB на вашия смартфон и да добавите компютър, като използвате дадения IP адрес и паролата, която сте въвели по -рано.
4. В командния прозорец на вашия компютър въведете кода m = mobiledev и това трябва да инициализира вашия смартфон като контролер за вашата Roomba.
5. Вашият компютър и смартфон трябва да са готови за работа сега.
Стъпка 5: Карайте Roomba
Сега, когато имате всички необходими инструменти за създаване на вашия Марс Ровър, вие сте готови да създадете свой собствен код. По-долу сме приложили примерен код както за автономно шофиране, така и за шофиране със смартфон.
Автономно шофиране
функция Explore_modified (r)
%входни аргументи: 1 roomba обект, r
%изходни аргументи: няма
%описание:
Функцията %използва безкраен цикъл while, за да позволи автономност
%проучване на околността на бота.
%
%funciton също предоставя инструкции на roomba какво да прави
%следните ситуации: Колелото (колелата) губят (и) контакт със земята, an
%обект е открит пред или от двете страни на бота, и a
%се забелязва внезапен спад пред или от двете страни на бота.
%
%типичните инструкции включват команди за движение, предназначени да увеличат максимално
%проучване или избягване на открита опасност и команди за комуникация
%информация относно откритията на ботовете (снимки), позиция (графика), %и състояние (блокирано предупреждение) с потребителя чрез matlab и/или имейл. Няколко
Добавени са %звукови команди за удоволствие.
%настройка на имейл възможности
mail = '[email protected]';
парола = 'EF230Roomba';
setpref ('Интернет', 'SMTP_Server', 'smtp.gmail.com');
setpref ('Интернет', 'E_mail', поща);
setpref ('Интернет', 'SMTP_Потребителско име', поща);
setpref ('Интернет', 'SMTP_Password', парола);
реквизит = java.lang. System.getProperties;
props.setProperty ('mail.smtp.starttls.enable', 'true');
props.setProperty ('mail.smtp.auth', 'вярно');
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 ^^, C2 ^^, C2 ^^, C2 ^^, E1 ^^, E1 ^^, E1 ^^, D1 ^^, C4 ^^ ');
v = 0,1;
отражаем_датум = 2700; %зададена референтна стойност на сензорите за скали
lightBumper_datum = 200; %зададена светлина Референтната стойност на сензорите на бронята
pos = [0, 0]; %променлива за съхранение на позиция с инициализирана дата
ъгъл = 0; %зададен референтен ъгъл
неъгълник = 0; %нетно изместване на ъгъла
i = 2; %итератор за добавяне на редове към променлива за съхранение на позиция
dist = 0;
r.setDriveVelocity (v, v); %стартиране на roomba напред
докато е вярно
Cliff = r.getCliffSensors;
Bump = r.getBumpers;
Light = r.getLightBumpers;
RandAngle = randi ([20, 60], 1); %генерира 1 случаен ъгъл между 20 и 60 градуса. Използва се за предотвратяване на забиване на бот в цикъл
%Какво да направите, ако едно или повече колела загубят контакт със земята:
%спиране на движението, изпращане на предупредителен имейл със снимка на околността, %и попитайте потребителя дали да продължи или да изчака помощ
ако Bump.rightWheelDrop == 1 || Bump.leftWheelDrop == 1
r.stop
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
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); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
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, позиция})
ъгъл = 90;
netangle = ъгъл+ъгъл;
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); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
i = i+1;
ъгъл = 30;
netangle = ъгъл+ъгъл;
r.turnAngle (ъгъл);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
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, позиция})
ъгъл = -90;
netangle = ъгъл+ъгъл;
r.turnAngle (ъгъл);
r.setDriveVelocity (v, v);
%Какво да направите, ако обект е открит вдясно от бота:
%стоп, обърнете се към обекта, направете резервно копие, направете снимка, предупреждение
%потребител на откриване по имейл, завъртете на 90 градуса и продължете да изследвате
elseif Light.rightFront> lightBumper_datum || Light.право> lightBumper_datum || Bump.right == 1
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
i = i+1;
ъгъл = -30;
netangle = ъгъл+ъгъл;
r.turnAngle (ъгъл);
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
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, позиция});
ъгъл = 90;
netangle = ъгъл+ъгъл;
r.turnAngle (ъгъл);
r.setDriveVelocity (v, v);
%Какво да направите, ако се открие скала вляво от бота:
%стоп, движете се назад, завийте надясно, продължете да изследвате
elseif Cliff.left <отражение_датум || Cliff.leftFront <reflex_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
i = i+1;
r.moveDistance (-. 125);
dist = r.getDistance;
pos (i, 1) = pos (i-1, 1) + dist * sind (netangle); %get x координата
pos (i, 2) = pos (i-1, 2) + dist * cosd (netangle); %get y координата
i = i+1;
ъгъл = -RandAngle;
netangle = ъгъл+ъгъл;
r.turnAngle (ъгъл);
r.setDriveVelocity (v, v);
%Какво да направите, ако се открие скала вдясно от бота:
%стоп, движете се назад, завийте наляво, продължете да изследвате
elseif Cliff.right <отражение_датум || Cliff.rightFront <reflex_datum
r.stop;
dist = r.getDistance;
pos (i, 1) = dist * sind (ъгъл); %get x координата
pos (i, 2) = dist * cosd (ъгъл); %get y координата
i = i+1;
r.moveDistance (-. 125);
ъгъл = RandAngle;
netangle = ъгъл+ъгъл;
r.turnAngle (ъгъл);
r.setDriveVelocity (v, v);
край
край
Контролер за смартфон
Options = {'Autonomous', 'Manual Control'}
Prompt = меню ('Как бихте искали да управлявате ровъра?', Опции)
m = mobiledev
r = roomba (19)
ако подкана == 1
Изследовател)
иначе
докато е вярно
пауза (.5)
PhoneData = m. Orientation;
Azi = PhoneData (1);
Pitch = PhoneData (2);
Страна = PhoneData (3);
ако Страна> 130 || Страна <-130 %, ако телефонът е обърнат с лицето надолу, спрете роумбата и изходния контур
r.stop
r.beep ('C, C, C, C')
прекъсване
elseif Side> 25 && Side <40 %, ако телефонът е обърнат настрани между 25 и 40 градуса, завийте наляво 5 градуса
r.turnAngle (-5);
иначе Страна> 40 %, ако телефонът е обърнат настрани над 40 градуса, завийте наляво 45 градуса
r.turnAngle (-45)
иначе Страна -40 %, ако телефонът е обърнат настрани между -25 и -40 градуса, завийте надясно 5 градуса
r.turnAngle (5);
иначе Страна <-40 %, ако телефонът е обърнат настрани по -малко от -40 градуса, завийте наляво 45 градуса
r.turnAngle (45)
край
%Ако телефонът се държи близо до върха, направете изображение и го начертайте
ако Pitch <-60 && image <= 9
r.бип
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 %, ако нещо е пред roomba и ще удари, ако се движи напред, направете шум и покажете съобщение
r.beep ('C ^^, F#^, C ^^, F#^')
else %ход
r.moveDistance (.03);
%Вземете данни за бронята след преместване
Bump = r.getBumpers;
ако 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)
край
край
в противен случай стъпка> 35 %, ако височината над 35 градуса се придвижи напред на по -голямо разстояние
%получете данни за лека броня, преди да се преместите
litBump = r.getLightBumpers;
ако litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15 %, ако нещо е пред roomba и ще удари, ако се движи напред, направете шум и покажете съобщение
r.beep ('C ^^, F#^, C ^^, F#^')
else %ход
r.moveDistance (.3)
%Вземете данни за бронята след преместване
Bump = r.getBumpers;
ако 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)
край
край
край
край
Препоръчано:
Превръщане на всяка R/C кола в Bluetooth приложение за управление на R/C кола: 9 стъпки
Превръщане на всяка R/C кола в Bluetooth App Control R/C Car: Този проект показва стъпките за промяна на обикновена кола с дистанционно управление на Bluetooth (BLE) управляваща кола с роботизирана платка Wombatics SAM01, Blynk App и MIT App Inventor. има много евтини RC автомобили с много функции като LED фаровете и
Превръщане на USB платки на базата на SAMD21 в хардуерен сериен порт!: 3 стъпки
Превръщането на USB платки на базата на SAMD21 в хардуерен сериен порт !: В днешно време е стандартно да се използва USB порт на Arduino (или всеки друг съвместим) борд като емулиран сериен порт. Това е много полезно за отстраняване на грешки, изпращане и получаване на данни от любимите ни дъски. Работих върху uChipкогато, преглеждайки данните
Превръщане на компресор на хладилник във вакуумна помпа: 5 стъпки
Превръщане на компресор за хладилник във вакуумна помпа: Исках вакуумна помпа от известно време, но отказвам да платя цената за нова, която изглежда с достатъчна здравина и издръжливост, която си представям, че се нуждая. Четох в различни форуми за направата на вакуумна помпа от компресор за хладилник, но
Превръщане на вашия Windows XP или Vista в Mac и Linux: 10 стъпки
Превръщане на вашия Windows XP или Vista в Mac и Linux: Тази инструкция ще ви покаже как да превърнете вашия компютър с Windows в Mac и компютър, както и да работите с Linux. - Препоръчвам ви да имате поне 2 GB RAM -и над 10GB място на твърдия диск (ако искате Linux) се препоръчва vista или XP - правя това на
Превръщане на вашата камера във „военна нощна визия“, добавяне на ефект на нощно виждане или създаване на режим NightVision „на всяка камера !!!: 3 стъпки
Превръщане на камерата ви във „военна нощна визия“, добавяне на ефект на нощна видимост или създаване на режим „NightVision“на всяка камера !!!: *** *Ако имате нужда от помощ, моля, изпратете имейл: [email protected] Говоря английски, френски, японски, испански и знам & други езици, ако