Оглавление:
- Шаг 1. Соберите материалы
- Шаг 2: Загрузите Toolboxes Roomba для MATLAB
- Шаг 3. Подключитесь к Roomba
- Шаг 4. Выберите способ управления Roomba
- Шаг 5. Управляйте роботом Roomba
Видео: Превращение Roomba в марсоход: 5 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
Шаг 1. Соберите материалы
Для выполнения этого проекта вам потребуется собрать следующие материалы:
1 робот Roomba
1 комплект Raspberry Pi
1 видеокамера
Доступ к MATLAB
Шаг 2: Загрузите 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 автономно, вам нужно будет использовать три встроенных датчика: датчики обрыва, датчики ударов и датчики освещенности.
Чтобы использовать смартфон, вам сначала необходимо подключить смартфон к компьютеру, выполнив следующие действия.
ПРИМЕЧАНИЕ. Для правильного подключения ваш компьютер и смартфон должны быть в одной сети 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)
конец
конец
конец
конец
Рекомендуемые:
Марсоход с использованием Raspberry Pi: 5 шагов
Марсоход с использованием Raspberry Pi: Дорогие все великие ученики, мне всегда любопытно узнать о марсоходе, имеющем 6 колес, который может перемещаться по всей поверхности Марса и исследовать объекты с Земли. Я также хочу исследовать это, сидя на своем ноутбуке. Итак, теперь я думаю, что пришло время сделать это и
Превращение любого радиоуправляемого автомобиля в приложение Bluetooth Управление радиоуправляемым автомобилем: 9 шагов
Превращение любого радиоуправляемого автомобиля в управляемое с помощью приложения Bluetooth Автомобиль с пультом дистанционного управления: в этом проекте показаны шаги по замене обычного автомобиля с дистанционным управлением на автомобиль с управлением по Bluetooth (BLE) с помощью робототехнической платы Wombatics SAM01, приложения Blynk и приложения MIT App Inventor. есть много недорогих радиоуправляемых машин с множеством функций, таких как светодиодные фары и
Превращение колпачков в тактовые частоты: 7 шагов (с изображениями)
Преобразование колпаков в часы: так зачем тратить время на переоборудование старых ржавых колпаков из винтажного грузовика Chevy 1960-х годов? Надеюсь, изображения в этом поучительном ответе на этот вопрос. Я очень доволен тем, как получились часы. Что меня вдохновило? Ну, в итоге я
Превращение компрессора холодильника в вакуумный насос: 5 шагов
Превращение компрессора холодильника в вакуумный насос: какое-то время я хотел вакуумный насос, но я отказываюсь платить цену за новый, который выглядит достаточно прочным и надежным, что, как мне кажется, мне нужно. Я читал на разных форумах о том, как сделать вакуумный насос из компрессора холодильника, но
Превращение Windows XP или Vista в Mac и Linux: 10 шагов
Превращение Windows XP или Vista в Mac и Linux: это руководство покажет вам, как превратить ваш компьютер с Windows в Mac и компьютер, а также работать под управлением Linux. - Я рекомендую вам иметь как минимум 2 ГБ ОЗУ и более 10 ГБ места на жестком диске (если вам нужен Linux) рекомендуется Vista или XP - я делаю это на