Съдържание:

Превръщане на вашата Roomba в марсоход: 5 стъпки
Превръщане на вашата Roomba в марсоход: 5 стъпки

Видео: Превръщане на вашата Roomba в марсоход: 5 стъпки

Видео: Превръщане на вашата Roomba в марсоход: 5 стъпки
Видео: How to Replace a Roomba Battery 2024, Ноември
Anonim
Превръщане на вашата Roomba в марсоход
Превръщане на вашата Roomba в марсоход

Стъпка 1: Съберете вашите материали

За да завършите този проект, ще трябва да съберете следните материали:

1 Roomba Robot

1 комплект от Raspberry Pi

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

Достъп до MATLAB

Стъпка 2: Изтеглете Roomba Toolboxes за MATLAB

Изтеглете Roomba Toolboxes за MATLAB
Изтеглете Roomba Toolboxes за MATLAB
Изтеглете Roomba Toolboxes за MATLAB
Изтеглете 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
Изберете как искате да управлявате вашата Roomba
Изберете как искате да управлявате вашата 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)

край

край

край

край

Препоръчано: