Оглавление:

IRobot Create-Mars Expedition Rover Mark I: 4 шага
IRobot Create-Mars Expedition Rover Mark I: 4 шага

Видео: IRobot Create-Mars Expedition Rover Mark I: 4 шага

Видео: IRobot Create-Mars Expedition Rover Mark I: 4 шага
Видео: Домино Робот с Мировым Рекордом (100k домино за 24 часа) 2024, Июль
Anonim
IRobot Create-Mars Expedition Rover Mark I
IRobot Create-Mars Expedition Rover Mark I

В этом руководстве вы узнаете, как настроить iRobot Create с использованием кода MatLab. Ваш робот будет иметь возможность искать полезные ископаемые, различая формы, маневрировать на пересеченной местности с помощью датчиков обрыва, а также может управляться вручную с помощью прямой трансляции.

Шаг 1. Расходные материалы

Запасы
Запасы

Для этого проекта вам понадобится iRobot Create, который представляет собой программируемую версию робота-пылесоса Roomba. Робот оснащен всеми датчиками, необходимыми для этого проекта, в частности датчиками ударов, датчиками обрыва и датчиками светового удара. Вам также понадобится Raspberry Pi и видеокамера, используемая для беспроводной связи, живого программирования и прямой видеотрансляции. Наконец, вам понадобится напечатанное на 3D-принтере крепление для Raspberry Pi и камеры.

Шаг 2. Разработайте код для достижения желаемого результата

Разработка кода для достижения желаемого результата
Разработка кода для достижения желаемого результата

После того, как вы подключили Roomba, вам нужно будет создать код Matlab, который даст вам желаемые результаты после желаемых входов.

Код можно увидеть здесь:

% Roomba Project% Брентен Арнольд (barnol15); Джулианна Корн (qdp218); Майк Хил (mheal)% 4/11/19% Описание проблемы: Создайте вездеход, чтобы помочь людям во время% исследования / заселения Марса. Метод% решения: поиск органических (зеленых) веществ с помощью световых бамперов, датчиков обрыва и камеры для проверки на наличие органических веществ. Разрешите марсоходу перемещаться по пересеченной местности с помощью бамперов, датчиков обрыва% и датчиков высоты колес. Позвольте людям управлять марсоходом с безопасного расстояния и вручную искать полезные ископаемые. choices = {'ЖИЗНЬ', 'БЕЗОПАСНАЯ ЗЕМЛЯ', 'КОНТРОЛЬ ПОЛЬЗОВАТЕЛЯ'}; % Три параметра в диалоговом меню Setting = menu ('', choices), если Setting> 0% Если выбран вариант, запросить подтверждение пользователя choices2 = {'Yes', 'No'}% Создать массив ячеек для "да" или "нет" "choice Confirm = menu (['Вы выбрали"' choices {Setting} '"mode.'], choices2)% Подтвердите выбор пользовательской настройки, если Confirm == 1, если Setting == 1% Проверьте, была ли выбрана настройка" LIFE "i = 0 при i == 0 r.setLEDDigits (num2str ('LIFE'))% Отображение 'LIFE' на светодиодном индикаторе для i = 1: 100 r.setDriveVelocity (0,05)% Перемещение roomba вперед на 0,05 м / sy = r.getCliffSensors % Получить и сохранить значения датчика обрыва в структуре ячеек "y" l = r.getLightBumpers% Получить и сохранить значения световых выступов в структуре "f", если l.left> 100% Проверить, закрыт ли левый световой бампер r.moveDistance (-0.05)% Переместить комнатку назад на 0,05 метра r.turnAngle (20)% Повернуть комнатку на 20 градусов против часовой стрелки img = r.getImage% Получить изображение с камеры Rasberry Pie на камере rect = [100 0 150 150]; img = imcrop (img, rect)% кадрирование изображения для фокусировки в центре красный = среднее (среднее (img (:,:, 1)))% среднее значение интенсивности красного зеленого = среднее (среднее (img (:,:, 2)))% средней интенсивности зеленого синего = среднее (среднее (img (:,:, 3)))% средней интенсивности синего, если зеленый> красный && зеленый> синий% Проверить, присутствует ли растение на картинке d = msgbox (['Life found! ']); % Показать окно сообщения с надписью "Жизнь найдена!" waitfor (d); end elseif l.leftFront> 100% Проверьте левый / передний световой бампер закрыт r.moveDistance (-0.05)% Переместите roomba назад на 0,05 метра img = r.getImage% Получите изображение с камеры rasberry pie на roomba и сохраните в переменной 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% кадрирование изображения для фокусировки в центре красный = среднее (среднее (img (:,:, 1)))% среднее значение интенсивности красного зеленого = среднее (среднее (img (:,:, 2)))% средней интенсивности зеленого синего = среднее (среднее (img (:,:, 3)))% средней интенсивности синего, если зеленый> красный && зеленый> синий% Проверить, присутствует ли растение на картинке d = msgbox (['Life found! ']); % Показать окно сообщения с надписью "Жизнь найдена!" waitfor (d); end elseif l.leftCenter> 100% Проверить, закрыт ли левый / центральный световой бампер r.moveDistance (-0.05)% Переместить Roomba назад на 0,05 метра img = r.getImage% Получить изображение с камеры rasberry pie на roomba и сохранить в переменной 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% кадрирование изображения для фокусировки в центре красный = среднее (среднее (img (:,:, 1)))% среднее значение интенсивности красного зеленого = среднее (среднее (img (:,:, 2)))% средней интенсивности зеленого синего = среднее (среднее (img (:,:, 3)))% средней интенсивности синего, если зеленый> красный && зеленый> синий% Проверить, присутствует ли растение на картинке d = msgbox (['Life found! ']); % Показать окно сообщения с надписью "Жизнь найдена!" waitfor (d); end elseif l.rightCenter> 100% Проверить, закрыт ли правый / центральный световой бампер r.moveDistance (-0.05)% Переместить Roomba назад на 0,05 метра img = r.getImage% Получить изображение с камеры Rasberry Pie на Roomba и сохранить в переменной 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% кадрирование изображения для фокусировки в центре красный = среднее (среднее (img (:,:, 1)))% среднее значение интенсивности красного зеленого = среднее (среднее (img (:,:, 2)))% средней интенсивности зеленого синего = среднее (среднее (img (:,:, 3)))% средней интенсивности синего, если зеленый> красный && зеленый> синий% Проверить, присутствует ли растение на картинке d = msgbox (['Life found! ']); % Показать окно сообщения с надписью "Жизнь найдена!" waitfor (d); end elseif l.rightFront> 100% Проверить, закрыт ли правый / передний световой бампер r.moveDistance (-0.05)% Переместить Roomba назад на 0,05 метра img = r.getImage% Получить изображение с камеры rasberry pie на roomba и сохранить в переменной 'img 'rect = [100 0 150 150]; img = imcrop (img, rect)% кадрирование изображения для фокусировки в центре красный = среднее (среднее (img (:,:, 1)))% среднее значение интенсивности красного зеленого = среднее (среднее (img (:,:, 2)))% средней интенсивности зеленого синего = среднее (среднее (img (:,:, 3)))% средней интенсивности синего, если зеленый> красный && зеленый> синий% Проверить, присутствует ли растение на картинке d = msgbox (['Life found! ']); % Показать окно сообщения с надписью "Жизнь найдена!" waitfor (d); end elseif l.right> 100% Проверьте, закрыт ли правый световой бампер. r.moveDistance (-0.05)% Переместите комнатку назад на 0,05 метра r.turnAngle (-20)% Поверните roomba на 20 градусов по часовой стрелке img = r.getImage% Получить изображение из камеру rasberry pie на roomba и сохранить в переменной 'img' rect = [100 0 150 150]; img = imcrop (img, rect)% кадрирование изображения для фокусировки в центре красный = среднее (среднее (img (:,:, 1)))% среднее значение интенсивности красного зеленого = среднее (среднее (img (:,:, 2)))% средней интенсивности зеленого синего = среднее (среднее (img (:,:, 3)))% средней интенсивности синего, если зеленый> красный && зеленый> синий% Проверить, присутствует ли растение на картинке d = msgbox (['Life found! ']); % Показать окно сообщения с надписью "Жизнь найдена!" waitfor (d); end elseif y.leftFront <1500% Проверить, не находится ли левая / передняя часть Roomba за обрывом r.moveDistance (-0,1, 0,05)% Переместить Roomba назад на 0,1 метра со скоростью 0,05 м / с r.turnAngle (-5)% Повернуть roomba 5 градусов по часовой стрелке в противном случае, если y. rightFront <1500% Проверьте, находится ли правая / передняя часть Roomba за обрывом r.moveDistance (-0,1, 0,05)% Переместите Roomba назад на 0,1 м со скоростью 0,05 м / с r.turnAngle (5)% Поверните roomba 5 градусов CCW elseif y.left <1000% Проверить, не находится ли левая сторона комнаты за обрывом r.moveDistance (-0,05, 0,05)% Переместить комнатбу на 0,05 метра назад со скоростью 0,05 м / с r.turnAngle (-10)% Повернуть roomba на 10 градусов CW elseif y.right0% Запуск, если нажата кнопка if Continue == 1 i = 0% Продолжить поиск жизни else i = 1% Конец режима LIFE конец конец конец elseif Настройка == 2% Проверить, была ли выбрана настройка "ROUGH TERRAIN" i = 0, в то время как i == 0 r.setLEDDigits (num2str ('RGH'))% Отображение «Rough» на светодиодном дисплее для i = 1: 1000 r.setDriveVelocity (0,05)% Установите скорость движения Roomba на 0,05 м / сx = r.getBumpers% Получить и сохранить значения датчика бампера в структуре "x" y = r.get CliffSensors% Получить и сохранить значения датчика обрыва в структуре "y", если x.right == 1% Проверить, нажат ли правый бампер r.turnAngle (10)% Повернуть roomba на 10 градусов против часовой стрелки elseif x.left == 1% Проверить, если левый бампер нажат r.turnAngle (-10)% Повернуть roomba на 10 градусов по часовой стрелке elseif x.front == 1% Проверить, нажат ли передний бампер r.turnAngle (20)% Повернуть roomba на 20 градусов против часовой стрелки elseif x.rightWheelDrop == 1% Проверьте, упало ли правое колесо r.turnAngle (-20)% Поверните roomba на 20 градусов по часовой стрелке elseif x.leftWheelDrop == 1% Проверьте, упало ли левое колесо r.turnAngle (20)% Поверните roomba на 20 градусов против часовой стрелки elseif y.leftFront < 1500% Проверьте, не находится ли передняя левая часть Roomba за обрывом r.moveDistance (-0,05, 0,05)% Переместите Roomba назад на 0,05 метра со скоростью 0,05 м / с r.turnAngle (-5)% Поверните roomba на 5 градусов по часовой стрелке в противном случае, если y. rightFront < 1500% Проверить, находится ли правая передняя часть Roomba за обрывом r.moveDistance (-0,05, 0,05)% Переместить комнатку назад на 0,05 метра со скоростью 0,05 м / с r.turnAngle (5)% Повернуть roomba на 5 градусов против часовой стрелки в противном случае, если y.left <1000 % Проверить, если левая часть o f roomba оторвана от обрыва r.moveDistance (-0,05, 0,05)% Переместить комнатбу назад на 0,05 метра со скоростью 0,05 м / с r.turnAngle (-10)% Повернуть комнатку на 10 градусов по часовой стрелке, иначе y.right0, если Continue == 1 i = 0 % Продолжить пересеченную местность else i = 1% Конец пересеченной местности конец конец конец else% Ручной режим i = 0 r.setLEDDigits (num2str ('USER'))% Отображение 'USER' на светодиодном дисплее d = msgbox (['Клавиши со стрелками - Двигаться; S - Stop Rover; ESC - контроль конечного пользователя; A - Найдите ресурс »]); waitfor (d); while i == 0 r.showCamera% Открыть прямую трансляцию с камеры rasberry pie в отдельном окне D = getkey (1)% Получить клавишу, нажатую пользователем, сохранить значение ASCII как переменную D, если D == 30% Проверить, есть ли стрелка «вверх» была нажата r.setDriveVelocity (0.1)% Отправить комнатку вперед со скоростью 0,2 м / с elseif D == 28% Проверить, была ли нажата стрелка «влево» r.setDriveVelocity (0)% Остановить комнатбу от движения вперед или назад r.turnAngle (15, 0,05)% Повернуть комнатку на 45 градусов против часовой стрелки со скоростью 0,05 м / с elseif D == 31% Проверить, была ли нажата стрелка «вниз» r.setDriveVelocity (-0,1)% Переместить комнатбу назад со скоростью 0,2 м / с elseif D == 29% Проверьте, нажата ли стрелка «вправо». R.setDriveVelocity (0)% Остановить румбу от движения вперед или назад r.turnAngle (-15, 0,05)% Повернуть румбу на 45 градусов по часовой стрелке со скоростью 0,05 м / с elseif D == 27% Проверить, если была нажата клавиша "esc" (escape) i = 1% Измените значение переменной "i" для выхода из цикла d = msgbox ('Exiting "User Control"')% Сообщите пользователю о выходе из ручного режима elseif D == 115% Проверить, была ли нажата клавиша "s" r.setDriveVelocity (0)% Остановить roomba из движение вперед или назад elseif D == 97% Проверить, была ли нажата "a" image = r.getImage; imwrite (image, 'image.png') W = Classify (image) K = mode (W) if K == 3 d = msgbox ('Resource found')% Отображать, если обнаружен прямоугольный ресурс waitfor (d); % Подождите, пока пользователь закроет окно сообщения "d" elseif K == 0 d = msgbox ('Not Resource:(')% Показать, если прямоугольный ресурс не обнаружен waitfor (d);% Подождите, пока пользователь закроет окно сообщения "d" end else d = msgbox ('Недопустимый ввод ключа.')% Отображается, если пользователь закрывает меню «выбрать настройку» waitfor (d);% Подождать, пока пользователь закроет окно сообщения «d» end waitfor (d);% Wait for пользователь закрывает окно сообщения "d" конец конец конец еще d = msgbox ('Goodbye')% Прощается, если параметры закрыты end waitfor (d);

Шаг 3. Тестирование

Тестирование
Тестирование

После того, как ваш код будет написан, вам нужно будет протестировать свой Roomba. Хотя ваш код может показаться правильным, многие из ваших значений, особенно цвета или формы, необходимо будет изменить, чтобы правильно распознать объекты, которые вы хотите, чтобы ваш Roomba идентифицировал.

Шаг 4: наблюдайте за визуальными выходами

Наблюдайте за визуальными выходами
Наблюдайте за визуальными выходами
Наблюдайте за визуальными выходами
Наблюдайте за визуальными выходами

Будет очень очевидно, успешно ли вы запрограммировали свой Roomba на основе его визуальных результатов.

Выходы включают:

  • Обнаружение формы: способность Roomba правильно различать формы, чтобы находить нужные минералы.
  • Маневры на пересеченной местности: избегайте обрывов или темных участков.
  • Ручной режим: прямая трансляция и возможность управления Roomba
  • Рисунки: Рисунки минералов
  • Life Found !: текстовое поле MatLab, означающее, что ваше растение обнаружило органическую жизнь.

Это конец нашего урока, наслаждайтесь своим новым марсоходом!

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