Оглавление:

Робо-техник: 8 шагов
Робо-техник: 8 шагов

Видео: Робо-техник: 8 шагов

Видео: Робо-техник: 8 шагов
Видео: Первый шаг в робототехнику. Как создать робота своими руками. Виды роботов и их задачи. 2024, Июль
Anonim
Робо-техник
Робо-техник

Представьте на секунду, что вы один из космонавтов, приземляющихся на Марсе. У вас есть миллион дел, образцы, которые нужно взять, эксперименты, которые нужно провести, данные, которые нужно собрать, но один или два раза в день вам нужно бегать по жилью и / или исследовательским модулям, в которых вы живете, и работать, чтобы их проверить. Это необходимо, чтобы кто-то должен был убедиться, что вещь в хорошем состоянии, что все тысячи деталей и деталей работают и находятся на своих местах. Но что, если бы был автоматизированный помощник, который избавил бы вас от некоторых из этих обязанностей. Что, если бы там был маленький робот, который мог перемещаться внутри модулей, чтобы убедиться, что все на месте, работает и безопасно.

Робо-техник спешит на помощь.

По сути, этот код управляет робототехником, когда он следует по светлой дорожке на земле. Он будет следовать по этому пути, пока не найдет перекресток на пути или повороте, после чего будет предложено сделать снимок для обработки изображения, чтобы робот-техник мог принять решение о том, куда идти дальше. Датчики света и неровностей работают, чтобы защитить роботехника от повреждений, а датчики неровностей контролируют, когда будет сделана диагностическая фотография. В целом Робо-техник предназначен для масштабирования модулей Марса, освобождая время астронавтов при выполнении основной задачи проверки, вызывая вмешательство человека только тогда, когда он обнаруживает что-то не так.

Опять же, как предупреждение, эта работа еще не завершена. Код в том виде, в котором он существует, работает, но с ошибками, особенно из-за того, что задействовано несколько перекрывающихся программ. Кроме того, для того, чтобы этот проект работал в реальной миссии на Марс, для этой конкретной цели должен быть построен робот, так что, опять же, я предполагаю, что это «доказательство концепции».

Есть несколько вещей, которые вам понадобятся, чтобы запустить его. Вам понадобится дорогая программа, пакеты поддержки для этой программы и небольшой опыт программирования. Поскольку я студент, и часть кода первого этажа была предоставлена (для raspberry pi), я не буду специально говорить о настройке. Вы можете найти все ссылки для этого базового кода ниже. Переходим к списку материалов.

Аппаратное обеспечение

  • Raspberry Pi (мы использовали версию 3)
  • iRobot ®
  • какое-то устройство для удержания Raspberry Pi, прикрепленного к Робо-технику
  • Камера Raspberry Pi (неважно какая, если у нее хороший автофокус и разрешение изображения)
  • какая-то подставка или кобура, чтобы камера была обращена вперед на Роботехнике.
  • материал для использования в качестве полосы, белого (или очень светлого цвета), который надежно удерживается на полу. Он должен быть немного шире, чем пространство между двумя передними датчиками обрыва.
  • 4 знака с очень крупным текстом (с напечатанными на них словами ИЗОБРАЖЕНИЕ, ПРАВО, НАЗАД и СЛЕВА)
  • Листы цветной бумаги (минимум три, желательно красный, зеленый и синий)

Программное обеспечение

  • Matlab (использовались и 2018a, и 2017b, и, похоже, разница невелика)
  • Пакет поддержки Raspberry Pi для Matlab
  • Код Raspberry Pi для подключения к Matlab (ссылка на исходный код приведена ниже)
  • Панель инструментов обработки изображений для Matlab (вы почти не сможете выполнить этот проект без панели инструментов)
  • ДОПОЛНИТЕЛЬНО: на вашем телефоне установлен Matlab Mobile, о чем я расскажу позже.

Шаг 1: Настройка оборудования

ef.engr.utk.edu/ef230-2018-08/projects/roo…

Это ссылка на базовый код, гарантирующий, что iRobot® может взаимодействовать с Matlab, а также базовое руководство. Как я уже сказал, я не буду рассматривать эту конкретную часть, поскольку руководство уже очень хорошо продумано. Я отмечу, что после того, как вы выполнили шаги по ссылке, вы можете использовать команду Matlab «doc» для просмотра включенной информации. Конкретно:

Док Roomba

И еще один очень важный момент.

Когда вы загружаете файлы по ссылке выше, РАЗМЕЩАЙТЕ ИХ В ПАПКУ, ОПИСАННУЮ Я ВЫШЕ, поскольку Matlab требует, чтобы файлы, созданные пользователем, находились в текущей рабочей папке.

Разобравшись с этим, давайте перейдем к коду.

Шаг 2: поиск всех этих датчиков

Поиск всех этих датчиков
Поиск всех этих датчиков
Поиск всех этих датчиков
Поиск всех этих датчиков

Уделите секунду и осмотрите iRobot®. Хорошо знать, где они находятся, чтобы иметь представление о входных данных, которые получает Робо-техник, и вы сможете понять, почему вещь вращается по кругу вместо того, чтобы следовать по пути, который вы настроите (это может а могло и не случиться). Вы, очевидно, увидите большой датчик физического удара спереди. Датчики обрыва немного труднее увидеть, вам нужно перевернуть его и поискать четыре прозрачных пластиковых окна рядом с передним краем. Датчики световых ударов еще более скрыты, но пока будет достаточно сказать живое изображение в блестящей черной полосе, бегущей вокруг передней части iRobot®, которая находится на передней панели датчика физического столкновения.

Есть датчики опускания колес, но они не используются в этом проекте, поэтому мы перейдем к тестированию датчиков.

Шаг 3: Тестирование для установки параметров

Тестирование для установки параметров
Тестирование для установки параметров

Прежде чем мы сможем отправить роботехника для выполнения своей работы, нам нужно выяснить его специфические особенности и диапазоны датчиков. Поскольку каждый iRobot® немного отличается и меняется в течение всего срока службы робота, нам необходимо выяснить, как датчики считывают данные в тех областях, в которых он будет работать. Самый простой способ сделать это - настроить путь светлого цвета (Я использовал полоски белой бумаги для принтера, но подойдет любая светлая поверхность, на которой будет работать робототехник.

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

Убедитесь, что Raspberry Pi подключен к iRobot® и ваш компьютер подключен к тому же Интернет-соединению. Вы будете тратить меньше времени на выдергивание волос, пытаясь понять, почему Matlab не подключается

r = roomba (номер, который вы настроили)

Переменная «r» в этом случае не нужна, вы можете называть ее как хотите, но использование однобуквенной переменной облегчает жизнь.

После того, как путь настроен и Roomba будет успешно подключен, поместите будущего Робо-Техника так, чтобы один или два датчика высоты возвышались над дорожкой. Очевидно, это означает, что остальные два или три находятся над выбранной вами поверхностью.

Теперь запустите тестовые датчики командой:

r.testSensors

Имейте в виду, что «r.» - это переменная, которую вы определили ранее, поэтому, если это не «r», измените «r». к чему бы вы ни решили. Это вызовет экран тестового датчика с большим количеством информации.

В этом проекте основное внимание уделяется светлым бамперам, бамперам и участкам утеса. Перемещайте робототехника, следя за тем, как датчики меняются на разных поверхностях, или насколько близко должен быть объект, чтобы значения ligthBumper изменились и т. Д. Помните эти числа (или запишите их), потому что вы нужно, чтобы они установили ваши параметры за секунду.

Шаг 4: запуск кода

Сначала вы создадите функцию. Я назвал его «путь», но, опять же, имя не обязательно, но с этого момента я буду называть его «путем».

В верхней части кода настраиваются некоторые параметры пользовательского ввода. Он создает некоторые списки, которые будут использоваться в listdlg, а затем вызывает диалоговое окно списка. Это позволяет пользователю выбирать, по какому цвету пути они хотят следовать, что позже вступит в игру.

list = {'Красный', 'Синий', 'Зеленый'}

problist = {'Несчастный случай, Сохранить изображение', 'Компонент не на месте, Сохранить изображение', 'Ожидается, продолжить'} pathcolor = listdlg ('PromptString', 'Выбрать цвет пути', … 'SelectionMode', 'single', 'ListString', список) prob = 0; driv = ;

Переменные "prob" и "driv" должны быть объявлены здесь, поскольку они будут использоваться внутри основного цикла while функции, но опять же, если вы хотите переименовать любую из этих переменных или изменить выбор в списке, это нормально, если вы последовательны в остальной части кода.

Шаг 5. Начало цикла "Пока": датчики физического удара

В верхней части цикла while содержится логика физического датчика удара. Обычно, когда робот-техник сталкивается с чем-либо, он останавливается (или для переднего датчика удара он отступает на 0,1 метра), а затем позиционирует себя, чтобы сделать снимок. Давайте сначала рассмотрим часть управления скоростью и положением.

Если вы проверили все датчики робота-техника на предыдущих этапах, вы узнаете, что датчики ударов имеют логическое значение (0 или 1), где ноль соответствует нормальному положению датчика без нажатия. Имейте это в виду для кода.

while true% main while loop% получить информацию о заставке S = r.getBumpers if S.left ~ = 0 r.stop elseif S.right ~ = 0 r.stop elseif S.front ~ = 0 r.stop end

Это основная часть «если что-то задевало, остановись». Если датчики обнаруживают столкновение, он переходит к следующей части кода, который корректирует положение Роботехника для получения фотографии.

if S.left ~ = 0%, если цикл берет информацию о бампере и выравнивает камеру для фотографии r.turnAngle (5) pause (0.5) img = r.getImage% делает фотографию и отображает диалоговое окно image (img)% prob = listdlg (' PromptString ',' Обнаружено неожиданное препятствие, укажите '…,' SelectionMode ',' single ',' ListString ', problist) elseif S.right ~ = 0 r.turnAngle (-5) pause (0.5) img = r. getImage image (img) prob = listdlg ('PromptString', 'Найдено неожиданное препятствие, укажите'…, 'SelectionMode', 'single', 'ListString', problist) elseif S.front ~ = 0 r.moveDistance (- 0.1) pause (0.5) img = r.getImage image (img) prob = listdlg ('PromptString', 'Найдено неожиданное препятствие, укажите'…, 'SelectionMode', 'single', 'ListString', problist) end

Как правило, после того, как изображение будет снято, появится другое диалоговое окно с тремя вариантами. Первые два варианта сохраняют фотографию в указанной папке, о которой я расскажу позже, а третий вариант просто закрывает диалоговое окно и продолжает цикл. Если вы не можете вспомнить варианты, взгляните на предыдущий шаг.

Теперь я вставил участок кода между участком датчика неровностей и участком для сохранения фотографий. Это принимает значения lightBumper и устанавливает скорость движения на 0,025 м / с (очень медленно), что на самом деле не обязательно, но это сокращает столкновение робототехника с предметами и, в конечном итоге, изнашивание физических датчиков ударов.

L = r.getLightBumpers, если L.left> 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 driv = 0,025 r.setDriveVelocity (0,025) иначе driv = 0,1 end

Это будет та часть, где в игру вступят те ценности, которые вы наблюдали (и, надеюсь, записали) ранее

«L. (сторона и направление датчика)> 100» было основано на значениях, которые я наблюдал, поэтому, если ваши наблюдения отличаются, измените эти числа. Идея состоит в том, что если робототехник уловит что-то в нескольких сантиметрах перед собой, он замедлится, но в этом нет необходимости.

В следующей части фотографии сохраняются на будущее.

%, если в диалоговом окне проблемы была выбрана первая или вторая опция, сохраняет изображение, если проблема == 1%, если цикл создает информацию о файле для фотографии, записывает с отметкой времени t = часы; basename = sprintf ('\ img_% d_% d_% d_% d_% d.png', t (1), t (2), t (3), t (4), t (5)); папка = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (папка, базовое имя); imwrite (img, fullFileName) close Рисунок 1 пауза (2) elseif prob == 2 t = clock; basename = sprintf ('\ img_% d_% d_% d_% d_% d.png', t (1), t (2), t (3), t (4), t (5)); папка = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (папка, базовое имя); imwrite (img, fullFileName) закрыть Рисунок 1 пауза (2) конец

Все имена файлов и места, где хранятся фотографии, указывать необязательно. Я выбрал папку, вложенную в папку roomba, которую я создал на вводном этапе, но она может быть где угодно. Кроме того, фотографии сохраняются с отметкой времени, но в этом нет особой необходимости (хотя это было бы гипотетически полезно для миссии на Марс).

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

Шаг 6: следуя по пути

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

Однако, прежде чем мы перейдем к коду датчика обрыва, я вставил короткий сегмент кода, чтобы удалить некоторые ненужные данные из Matlab. Эта часть не нужна, но я использовал ее, чтобы сократить объем памяти, необходимый для запуска программы.

clear img clear t clear basename clear fullFileName очистить папку

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

C = r.getCliffSensors% if цикл следует за цветной полосой (белый), если C.leftFront> 2000 && C.rightFront> 2000% ведение по прямому пути r.setDriveVelocity (driv) elseif C.leftFront 2000% поворачивает направо, если робот уходит слишком далеко left r.turnAngle (-2,5) elseif C.leftFront> 2000 && C.rightFront <2000% поворачивает налево, если робот уходит слишком далеко вправо r.turnAngle (2,5) elseif C.leftFront <2000 && C.rightFront 100 || L.leftFront> 100 || L.rightFront> 100 || L.right> 100 img = r.getImage end% проверяет наличие изгиба пути, если C.left> 2800 && C.right <2800 r.turnAngle (2.5) elseif C.left 2800 r.turnAngle (- 2.5) конец% заполнитель для пути распознавания изображения disp ('ПОЛУЧЕНИЕ ИЗОБРАЖЕНИЯ') конец конец конец

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

Чтобы объяснить среднюю часть кода, когда два передних датчика убегают от края пути (когда дело доходит до перекрестка или когда он достигает конца пути), он смотрит, есть ли что-то перед ним.. Вам нужно будет разместить объект на земле в конце пути или на любом перекрестке, чтобы это сработало.

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

% заполнитель для пути распознавания изображенийdisp ('ПОЛУЧЕНИЕ ИЗОБРАЖЕНИЯ')

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

Шаг 7: Обработка изображения

Обработка изображений состоит из двух частей. Во-первых, это распознавание цвета, которое вычисляет интенсивность цвета изображения, чтобы решить, продолжать ли распознавание текста. Расчеты цвета основаны на том, какой выбор был сделан в том самом первом диалоговом окне в начале (я использовал красный, синий, зеленый, но вы можете выбрать любые цвета, которые хотите, если средние значения интенсивности цвета могут быть распознаны Камера Raspberry Pi).

img = r.getImage img = imcrop (img, [0 30 512 354]) imgb = imcrop (img, [0 30 512 354]) imgt = imcrop (img, [0 30 512 354]) красный = среднее (среднее (imgb (:,:, 1))); g = среднее (среднее (imgb (:,:, 2))); b = среднее (среднее (imgb (:,:, 3)));

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

если красный> g && красный> b, если pathcolor == 1 imgc = imcrop (img, [0 30 512 354]) R = ocr (img), если R. Words {1} == IMAGE || R. Words {2} == ИЗОБРАЖЕНИЕ || R. Words {3} == ИЗОБРАЖЕНИЕ t = часы; basename = sprintf ('\ img_% d_% d_% d_% d_% d.png', t (1), t (2), t (3), t (4), t (5)); папка = 'E: / UTK / Classes / fall 18 / ef230 / irobot / images'; fullFileName = fullfile (папка, базовое имя); imwrite (img, fullFileName) pause (2) elseif R. Words {1} == RIGHT || R. Words {2} == RIGHT || R. Words {3} == RIGHT r.turnAngle (-75) elseif R. Words {1} == LEFT || R. Words {2} == LEFT || R. Words {3} == LEFT r.turnAngle (75) elseif R. Words {1} == BACK || R. Words {2} == НАЗАД || R. Words {3} == BACK r.turnAngle (110) end else r.turnAngle (110) end end

Этот сегмент определяет, соответствует ли цвет, выбранный в первом диалоговом окне, цвету, который видит камера. Если это так, запускается распознавание текста. Он смотрит, какое слово (ИЗОБРАЖЕНИЕ, НАЗАД, ВПРАВО или ВЛЕВО) появляется, а затем либо поворачивается (для вправо и влево), либо вращается (для возврата), либо делает снимок и сохраняет его таким же образом, как и раньше.

Я предоставил только один раздел кода для разных цветов

Чтобы код мог распознавать синий и зеленый, просто скопируйте код и измените логическую проверку в верхней части сегмента и установите «pathcolor == (number)» в соответствии с выбором цвета из верхнего диалогового окна (для код, как он отображается, синий будет 2, а зеленый будет 3).

Шаг 8: Готовый продукт

Готовый продукт
Готовый продукт

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

Помните, что все значения датчика обрыва и lightBumper необходимо изменить на те, которые вы наблюдаете. Кроме того, по опыту я обнаружил, что лучше протестировать этот проект на полу темного цвета, а еще лучше, если этот пол не будет отражать. Это увеличивает контраст между дорожкой и полом, что повышает вероятность того, что Роботехник будет следовать по нему правильно.

Надеюсь, вам понравилось настраивать маленького помощника для миссии на Марс, и вам понравилось строить.

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