Оглавление:

Превращение Roomba в марсоход: 5 шагов
Превращение Roomba в марсоход: 5 шагов

Видео: Превращение Roomba в марсоход: 5 шагов

Видео: Превращение Roomba в марсоход: 5 шагов
Видео: Вся правда о роботах-пылесосах! irobot, Smart Cleaner, Deebot, Karcher.avi 2024, Ноябрь
Anonim
Превратите ваш Roomba в марсоход
Превратите ваш Roomba в марсоход

Шаг 1. Соберите материалы

Для выполнения этого проекта вам потребуется собрать следующие материалы:

1 робот Roomba

1 комплект Raspberry Pi

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

Доступ к MATLAB

Шаг 2: Загрузите Toolboxes Roomba для MATLAB

Загрузите Toolboxes Roomba для MATLAB
Загрузите Toolboxes Roomba для MATLAB
Загрузите Toolboxes Roomba для MATLAB
Загрузите Toolboxes Roomba для MATLAB

Запустите следующий код, чтобы установить необходимые наборы инструментов для завершения этого проекта.

функция roombaInstall

clc;

% список файлов для установки

files = {'roomba.m', 'roombaSim.m', 'roombaSimGUI.m', 'roombaSimGUI.fig'};

% место для установки

options = weboptions ('CertificateFilename', ''); % скажите ему игнорировать требования сертификата

server = 'https://ef.engr.utk.edu/ef230/projects/roomba-f2016/install/';

dlgTitle = 'Установить / обновить Roomba';

% отобразить цель и получить подтверждение

prompt = {

«Эта программа загрузит следующие файлы EF 230 Roomba:»

''

strjoin (файлы, '')

''

'в эту папку:'

''

CD

''

'Вы хотите продолжить? '

};

гудок;

yn = questdlg (подсказка,…

dlgTitle,…

«Да», «Нет», «Да»);

если ~ strcmp (yn, 'Да'), возврат; конец

% получить список существующих файлов

существующие_файлы = файлы (cellfun (@exist, files)> 0);

если ~ пусто (существующие_файлы)

% убедитесь, что их действительно можно заменить

prompt = {'Вы заменяете эти файлы:'

''

strjoin (существующие_файлы, '')

''

"Можно заменить?"

};

гудок;

yn = questdlg (подсказка,…

dlgTitle,…

«Да», «Нет», «Да»);

если ~ strcmp (yn, 'Да'), возврат; конец

конец

% скачать файлы

cnt = 0;

для i = 1: длина (файлы)

f = файлы {i};

disp (['Загрузка' f]);

пытаться

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

websave (f, url, варианты); % добавлены параметры, чтобы избежать ошибок безопасности

cnt = cnt + 1;

ловить

disp (['Ошибка загрузки' f]);

фиктивный = [f '.html'];

если существует (пустышка, 'файл') == 2

удалить (пустышка)

конец

конец

конец

если cnt == length (файлы)

msg = 'Установка прошла успешно';

waitfor (msgbox (msg, dlgTitle));

еще

msg = 'Ошибка установки - подробности см. в окне команд';

waitfor (errordlg (msg, dlgTitle));

конец

конец% roombaInstall

Шаг 3. Подключитесь к Roomba

Пришло время подключиться к Roomba через Wi-Fi. Двумя пальцами одновременно нажмите кнопки Dock и Spot, чтобы включить или перезагрузить Roomba. Затем запустите код r = roomba (# вашего Roomba) в командном окне MATLAB, чтобы подключиться к вашему роботу. После того, как вы выполнили эту команду, ваш Roomba должен быть готов к работе.

Шаг 4. Выберите способ управления Roomba

Выберите способ управления Roomba
Выберите способ управления Roomba
Выберите способ управления Roomba
Выберите способ управления Roomba

Вы можете управлять Roomba двумя способами: автономно или используя смартфон в качестве контроллера.

Если вы решите управлять роботом Roomba автономно, вам нужно будет использовать три встроенных датчика: датчики обрыва, датчики ударов и датчики освещенности.

Чтобы использовать смартфон, вам сначала необходимо подключить смартфон к компьютеру, выполнив следующие действия.

ПРИМЕЧАНИЕ. Для правильного подключения ваш компьютер и смартфон должны быть в одной сети Wi-Fi!

1. Загрузите приложение MATLAB из магазина приложений на свое устройство.

2. Введите «connector on» в командное окно и установите пароль, который необходимо будет ввести в оба устройства.

3. После этого MATLAB предоставит вам IP-адрес вашего компьютера. Вам нужно перейти на страницу настроек в приложении MATLAB на вашем смартфоне и добавить компьютер, используя данный IP-адрес и пароль, который вы ввели ранее.

4. В командном окне на вашем компьютере введите код m = mobiledev, и это должно инициализировать ваш смартфон как контроллер для вашего Roomba.

5. Ваш компьютер и смартфон должны быть готовы к работе.

Шаг 5. Управляйте роботом Roomba

Теперь, когда у вас есть все необходимые инструменты для создания марсохода, вы готовы создать свой собственный код. Ниже мы приложили пример кода как для автономного вождения, так и для управления автомобилем со смартфона.

Автономное вождение

функция Explore_modified (r)

% входных аргументов: 1 объект roomba, r

% выходных аргументов: нет

%описание:

% функция использует бесконечный цикл while, чтобы обеспечить автономный

% исследования окружения бота.

%

% funciton также содержит инструкции для Roomba о том, что делать в

% следующие ситуации: Колесо (-а) теряют (-а) контакт с землей, % объект обнаружен перед или по обе стороны от бота, а

% внезапного падения обнаружено перед или по обе стороны от бота.

%

% типичных инструкций включают команды движения, предназначенные для максимизации

% исследования или избегания обнаруженной опасности и команд для связи

% информация об открытиях ботов (картинки), положение (график), % и состояние (предупреждение о застревании) с пользователем через Matlab и / или по электронной почте. Несколько

% звуковые команды добавлены для удовольствия.

% настроить возможности электронной почты

mail = '[email protected]';

пароль = 'EF230Roomba';

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

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

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

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

props = 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 = 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;

отражать_датум = 2700; % установленного эталонного значения датчиков обрыва

lightBumper_datum = 200; % установленный свет Опорное значение датчиков бампера

pos = [0, 0]; Переменная% для хранения позиции с инициализированной датумом

угол = 0; % установленный опорный угол

netangle = 0; % чистое угловое смещение

я = 2; % итератор для добавления строк в переменную хранения позиции

dist = 0;

r.setDriveVelocity (v, v); % начать движение Roomba вперед

пока правда

Клифф = r.getCliffSensors;

Bump = r.getBumpers;

Light = r.getLightBumpers;

RandAngle = ранди ([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 (чистый угол); % получить координату x

pos (i, 2) = pos (i-1, 2) + dist * cosd (чистый угол); % получить координату y

я = я + 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 (mail, 'ПОМОЩЬ!', 'Я застрял на скале!', {imfile, position})

list = {'Продолжить', 'Стоп'};

idx = menu ('Что мне делать?', список);

если 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 (чистый угол); % получить координату x

pos (i, 2) = pos (i-1, 2) + dist * cosd (чистый угол); % получить координату y

я = я + 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 (чистый угол); % получить координату y

я = я + 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 (mail, '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 (чистый угол); % получить координату x

pos (i, 2) = pos (i-1, 2) + dist * cosd (чистый угол); % получить координату y

я = я + 1;

угол = 30;

чистый угол = чистый угол + угол;

r.turnAngle (угол);

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 (чистый угол); % получить координату y

я = я + 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 (mail, 'Alert!', 'Я кое-что нашел!', {imfile, position})

угол = -90;

чистый угол = чистый угол + угол;

r.turnAngle (угол);

r.setDriveVelocity (v, v);

% Что делать, если справа от бота обнаружен объект:

% стоп, повернуться к объекту, вернуться назад, сделать снимок, предупредить

% пользователей открывают по электронной почте, поверните на 90 градусов и продолжайте исследовать

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

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (чистый угол); % получить координату x

pos (i, 2) = pos (i-1, 2) + dist * cosd (чистый угол); % получить координату y

я = я + 1;

угол = -30;

чистый угол = чистый угол + угол;

r.turnAngle (угол);

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 (чистый угол); % получить координату y

я = я + 1;

пауза (1.5);

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

img = r.getImage;

imwrite (img, 'RightBump.png')

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

imfile = 'RightBump.png';

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

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

sendmail (mail, 'Предупреждение!', 'Я кое-что нашел!', {imfile, position});

угол = 90;

чистый угол = чистый угол + угол;

r.turnAngle (угол);

r.setDriveVelocity (v, v);

% Что делать, если слева от бота обнаружен обрыв:

% стоп, двигаться назад, повернуть направо, продолжить исследование

elseif Cliff.left <reflection_datum || Cliff.leftFront <отражать_датум

r.stop;

dist = r.getDistance;

pos (i, 1) = pos (i-1, 1) + dist * sind (чистый угол); % получить координату x

pos (i, 2) = pos (i-1, 2) + dist * cosd (чистый угол); % получить координату y

я = я + 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 (чистый угол); % получить координату y

я = я + 1;

angle = -RandAngle;

чистый угол = чистый угол + угол;

r.turnAngle (угол);

r.setDriveVelocity (v, v);

% Что делать, если справа от бота обнаружен обрыв:

% стоп, двигаться назад, повернуть налево, продолжить исследование

elseif Cliff.right <reflection_datum || Cliff.rightFront <Reflection_datum

r.stop;

dist = r.getDistance;

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

pos (i, 2) = dist * cosd (угол); % получить координату y

я = я + 1;

r.moveDistance (-. 125);

угол = RandAngle;

чистый угол = чистый угол + угол;

r.turnAngle (угол);

r.setDriveVelocity (v, v);

конец

конец

Контроллер смартфона

Параметры = {'Автономный', 'Ручное управление'}

Prompt = menu ('Как вы хотите управлять марсоходом?', Параметры)

m = mobiledev

r = roomba (19)

если Подсказка == 1

Исследовать (r)

еще

пока правда

пауза (.5)

PhoneData = m. Orientation;

Ази = PhoneData (1);

Шаг = PhoneData (2);

Сторона = Данные телефона (3);

если Side> 130 || Сторона <-130%, если телефон перевернут лицевой стороной вниз, остановите Roomba и выйдите из цикла

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)

конец

% перемещение вперед и назад в зависимости от передней и задней ориентации

если тангаж> 15 && тангаж <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 # ^')

иначе% движение

r.moveDistance (.03);

% Получить данные заставки после переезда

Bump = r.getBumpers;

если Bump.right == 1 || Bump.left == 1 || Bump.front == 1

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

r.moveDistance (-. 01)

конец

% получить данные датчика обрыва

Клифф = 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 Шаг> 35%, если тангаж больше 35 градусов, продвинуться вперед на большее расстояние

% получить данные о световых заставках перед переездом

litBump = r.getLightBumpers;

если litBump.leftFront> 15 || litBump.leftCenter> 15 || litBump.rightCenter> 15 || litBump.rightFront> 15%, если что-то находится перед Roomba, и ударится, если движется вперед, издает шум и отображает сообщение

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

иначе% движение

r.moveDistance (.3)

% Получить данные заставки после переезда

Bump = r.getBumpers;

если Bump.right == 1 || Bump.left == 1 || Bump.front == 1%, если вы что-то ударили, сделайте шум, отобразите сообщение и сделайте резервную копию

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

r.moveDistance (-. 01)

конец

% получить данные датчика обрыва после перемещения

Клифф = 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);

% получить данные датчика обрыва после перемещения

Клифф = 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)

% получить данные датчика обрыва после перемещения

Клифф = 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)

конец

конец

конец

конец

Рекомендуемые: