Показаны сообщения с ярлыком проект. Показать все сообщения
Показаны сообщения с ярлыком проект. Показать все сообщения

воскресенье, 7 июля 2019 г.

Sudoku Hunter

В последнее время наш блог молчит и может показаться, что «Карандаш и Самоделкин» все, сдулись. На самом деле работа кипела, а отсутствие публикуемых материалов было связано с тем, что проекты раз за разом становятся все сложнее и требуют все больше времени на реализацию. Последние наши разработки были так или иначе связаны с нейросетями, поэтому логично было за это время подтянуть скиллы по этой теме, что и было сделано – был пройден ряд онлайн курсов по и даже пара оффлайновых, из которых особенно понравилась «Зимняя школа машинного обучения» (Machine Learning Winter School).


Проект, работа над которым шла больше 4 месяцев, мы назвали Sudoku Hunter. Изначально была идея собрать робота по мотивам NXTSudokuSolver, однако постепенно она трансформировалось в нечто иное, на наш взгляд не менее интересное.
Итак, Sudoku Hunter – это пистолет с EV3, веб-камерой и Raspberry Pi на борту, из которого можно «стрелять» по математическим головоломкам судоку, получая на экране EV3-блока их решение. В алгоритмической части используются технологии машинного зрения и машинного обучения, веб-технологии для создания отладочной видеоконсоли.


Если кто не помнит, судоку - головоломка на бумаге, игровое поле которой представляет собой квадрат размером 9×9, разделённый на меньшие квадраты со стороной в 3 клетки. Таким образом всё игровое поле состоит из 81 клетки. В них уже в начале игры стоят некоторые числа (от 1 до 9), называемые подсказками. От игрока требуется заполнить свободные клетки цифрами от 1 до 9 так, чтобы в каждой строке, в каждом столбце и в каждом малом квадрате 3×3 каждая цифра встречалась бы только один раз.


Конструкция нашего робота не особенно замысловата, поэтому инструкцию по сборке мы решили не делать – вы легко соберете что-то подобное просто глядя на фото. Мы использовали следующие компоненты:
  • Блок Lego Mindstroms EV3 и строительные детали из этого набора
  • Raspberry Pi
  • Веб-камера Sony Playstation Eye
  • Wi-fi адаптер для связи EV3 с RPi
  • Powerbank для питания RPi

Программ, которые необходимы для работы робота - несколько, все они написаны на Python:
  • Программа для EV3 - отвечает за вывод информации на экран блока, связь с Raspberry Pi, передачу на RPi состояния датчика-кнопки
  • Программа для Raspberry Pi - отвечает за обработку кадров с камеры, распознаванием цифр с использованием обученной нейросети, последующим решением распознанного судоку, связь с EV3, вывод вспомогательной и отладочной информации на веб-консоль,
  • Программа для Raspberry Pi, предназначенная для создания дата сета для обучения нейронной сети.
  • Программа для ПК, используется для создания и обучения нейросети на основе подготовленного дата сета

Основная программа для Raspberry Pi работает по следующему алгоритму: 
  • Подключение библиотеки машинного зрения OpenCV
  • Подключение библиотек машинного обучения keras(tensorflow), sklearn
Процесс 1:
  • Взятие кадра с камеры
  • Преобразование изображения из BGR в HSV 
  • Наложение маски для фокусировки на значимых элементах изображения
  • Запись результирующего кадра в объект в памяти
  • Соединение с EV3 с помощью протокола socket 
  • Основной цикл:
  • Чтение кадра из объекта в памяти
  • Поиск в изображении с наложенной маской объектов, напоминающих квадрат 
  • Передача данных о предполагаемом расположении квадрата на EV3, для вывода на экран блока
  • Приём данных с EV3 о состоянии кнопки 
  • Если кнопка нажата:
Процесс 3:
  • Запуск веб-сервера (используется модуль Flask)
  • Соединение с Raspberry Pi с помощью протокола socket
  • Получение данных о предполагаемом расположении квадрата 
  • Подключение библиотеки машинного зрения OpenCV
  • Подключение библиотек машинного обучения keras(tensorflow), sklearn
Процесс 1:
  • Взятие кадра с камеры
  • Преобразование изображения из BGR в HSV 
  • Наложение маски для фокусировки на значимых элементах изображения
  • Запись результирующего кадра в объект в памяти
  • Соединение с EV3 с помощью протокола socket
  • Чтение кадра из объекта в памяти
  • Поиск в изображении с наложенной маской объектов, напоминающих квадрат 
  • Передача данных о предполагаемом расположении квадрата на EV3, для вывода на экран блока
  • Приём данных с EV3 о состоянии кнопки 
  • Если кнопка нажата:
  • Запуск веб-сервера (используется модуль Flask)
  • Вывод информации на веб-сервер - видеоконсоль для удобства отладки
  • Подключение библиотек машинного обучения 
  • Загрузка дата сета изображений 
  • Разбиение дата сета на учебные и тренировочные данные
  • Создание нейронной сети с заданными параметрами 
  • Обучение нейронной сети
  • Сохранение модели 

Процесс 2:
    • Изображение обрабатывается и судоку «нарезается» на 81 квадрат в каждом из которых одна клетка головоломки 
    • Каждый из фрагментов проверяется на наличие в нём цифры и если цифра обнаружена, то клетка подаётся на распознавание нейронной сети 
    • Распознанная цифра заноситься в массив. Когда массив заполнен всеми цифрами, он подаётся в алгоритм, решающий судоку 
    • Массив содержащий решённую головоломку передаётся на EV3 для вывода на экран блока 
  • Вывод информации на веб-сервер - видеоконсоль для удобства отладки

Программа на EV3 работает по следующему алгоритму:
  • Вывод контура квадрата на экран для визуального контроля (размер квадрата, угол разворота, степень его трапециевидности)
  • Передача состояния датчика-кнопки на Rpi
  • Если от RPi получен массив данных с решенной головоломкой - вывод решённого судоку на экран блока

Программа создания дата сета для обучения нейронной сети на Raspberry Pi имеет следующий алгоритм:
Процесс 2: 
    • Изображение обрабатывается и судоку «нарезается» на 81 квадрат в каждом из которых одна клетка головоломки 
    • Каждый квадрат сохраняется в папку, формируя дата сет
Процесс 3:

Программа на ПК, предназначенная для создания и обучения нейросети на основе подготовленного дата сета работает так: 
Стандартный алгоритм обучения нейронной сети мы усовершенствовали путём запуска функции обучения не на заданное количество эпох, а по одной эпохе, с проверкой результата на проверочной выборке после каждой. Если результат ухудшается несколько эпох подряд — прекращаем обучения с ошибкой. Если результаты на тестовой выборке выше 95% - прекращаем обучения, проверяем модель на отдельной выборке (которую она ещё не видела ни при обучении, ни при проверках после каждой эпохи).
Исходные коды всех программ проекта мы выложили здесь: https://github.com/darkavengersmr/Sudoku-Hunter
Демонстрация работы робота:

воскресенье, 10 июля 2016 г.

Большой железный робот. Часть 4. Добавим еще железа

Давненько не было вестей от нашего большого железного робота. Не смотря на плотный график подготовки к соревнованиям (ВРО) работы по проекту все же двигались, хотя и не так быстро, как нам хотелось бы. Вот так вот наш робот выглядит в данный момент:


Первым делом мы установили П-образный каркас, из того же алюминиевого профиля 25x25x2, из которого ранее собирали раму. Крепление каркаса выполнено Г-образными мебельными уголками и болтами М6. В высоту каркас от уровня пола в верхней точке - 65 см.



На каркас смонтировали сервоподвес с двумя степенями свободы, это будущая "шея" робота, этот механизм будет двигать головой. Голову планируем собирать в следующий раз, хотим смонтировать на ней камеру, микрофон, динамик-твиттер и антенны wi-fi.




Сервоприводы использовали с металлическими редукторами, MG995.


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

1) "Силовой отсек" содержит драйверы двигателей, усилитель мощности звука. Об этих штуковинах мы писали в предыдущих частях статьи.





Так как эти компоненты достаточно прилично греются при работе, в отсеке предусмотрели активное охлаждение, программно завязанное на цифровой датчик температуры DS18B20. Вентилятор, управляемый через мосфет IRF530N, включается, когда температура в отсеке превышает 40 градусов и его обороты пропорциональны превышению температуры над этим порогом. 


2) "Отсек питания" содержит разводку силового питания, кнопку включения робота, предохранитель.



3) "Мозговой центр" содержит Raspberry Pi 2 и Arduino Mega 2560, соединенные по USB. В Raspberry Pi 2 вставлен Wi-Fi адаптер. Кроме этого здесь мы разместили датчики напряжения и силы тока. 




Дял получения стабильных 5В используем преобразователь DC-DC на 5А
Датчик напряжения позволит контролировать заряд батареи, чтобы не допустить слишком сильного ее разряда. 
Датчик силы тока ACS712 ACS712ELC-30A позволит контролировать потребление энергии роботом, на основании этих данных можно прогнозировать время, которое он еще сможет проработать, программно снижать токи потребления (замедлять моторы в режим экономии при низком заряде аккумулятора).


4) "Отсек управления сервоприводами". Здесь будут сосредоточены компоненты для управления сервоприводами "шеи" и, возможно, "рук" робота (манипуляторов). Кроме этого здесь планируется разместить электронный компас. Питание сервоприводам будет обеспечивать отдельный DC-DC преобразователь.




Монтажные отсеки соединены гофрированными трубками для проводов (сливной шланг для стиральной машины).


Каркас собран с использованием металлопластиковых труб, болтов и шпилек М6.




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



суббота, 27 февраля 2016 г.

Большой железный робот. Часть 3. Энкодеры и звук

Энкодеры


Мы давно строим роботов из LEGO Mindstorms и привыкли к тому, что повернуть вал мотора на определенный угол или заставить вращаться мотор с заданной скоростью - задача простая, ведь каждый NXT/EV3-мотор имеет встроенные энкодеры (датчики угла поворота), позволяющие работать с точностью до 1 градуса. Во всех роботах, которых мы строили из Arduino таких полезных штук не было, соответственно эти роботы не могли перемещаться на строго заданное расстояние или поддерживать заданную скорость.
В проекте "большого железного робота" мы решили попробовать сделать энкодеры своими руками. Энкодеры нам нужны для следующих задач:

  • Перемещение на заданное расстояние
  • Поворот на заданный угол относительно текущего направления
  • Поддержание заданной скорости
  • Одометрия - использование данных с энкодеров для оценки перемещения
  • Компенсация разницы в скоростях вращения колес для сохранения заданного направления движения. Эту задачу можно решать разными способами, например используя компас, но наличие энкодеров как нам кажется облегчит решение
Наш робот - не станок с ЧПУ, а учебная модель, с которой работают дети, поэтому энкодеры будем делать простые в изготовлении и наглядные в работе. В качестве датчиков будем использовать популярные Arduino Line Sensor  (KY-033), выглядят они вот так:

Эти датчики работают на отраженный свет. Датчик важно смонтировать таким образом, чтобы была возможность плавной регулировки высоты и угла установик датчика к диску энкодера. Мы сделали вот такую конструкцию из U-образного профиля, крышки кабель канала и винтов М4:




На обратную сторону колесных дисков прикрепим "полосатые диски", на которые будут смотреть датчики. Такие симпатичные и полезные роботу диски мы сделали из ненужных CD/DVD-болванок с приклеенными сверху распечатками:

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



Звук


Молчаливый робот - это не интересно. В нашем роботе будет аудиосистема и мы надеемся что робот сможет применять ее с умом - озвучивать системные сообщения, сигнализировать о событиях, да и просто - болтать. 
Для сборки аудиоподсистемы робота нам потребуются следующие компоненты:
  • Динамик
  • Усилитель мощности
  • Акустического оформление для динамика
В качестве динамика мы используем автомобильный коаксиальный динамик Supra SSB-5 диаметром 13 см


Динамики продаются парой, нам же понадобится в роботе только один.
Динамик SSB-5 не слишком тяжел для мобильного робота, недорог и обладает приемлемыми характеристиками для наших задач (4 Ом, до 140 Вт).
Чтобы усилить звук Raspberry Pi мы воспользуемся усилителем НЧ на базе микросхемы TDA7297

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


Лист ДСП (мы использовали готовую мебельную полку из строительного магазина размерами 300x800x16) можно раскроить так:

Собраем раскроенное ДСП в ящик с помощью саморезов, заделываем швы с помощью герметика, шпатлюем при необходимости и красим. Отверстие под динамик можно высверлить по кругу дрелью и обработать затем напильником.


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



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



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

- Автодинамик 13 см с комплектным проводом (Supra SSB-5) - 1 шт.
- Усилитель НЧ на базе микросхемы TDA7297
- Лист ДСП ("полка мебельная") 300x800x16 мм
- Саморезы 3,5 x 30
- Шпатлевка по дереву, герметик
- Краска

Для энкодеров пригодились:

- Пара CD/DVD болванок (мы использовали прозрачные, такие встречаются на дне упаковки)
- Arduino Line Sensor  (KY-033) 2 шт.
- профиль аллюм. U-обр. 20x10x20x2
- заглушка кабель-канала 15 мм
- винты М3 и М4 с гайками

суббота, 23 января 2016 г.

Большой железный робот. Часть 1. Колесные узлы

Как же в LEGO все просто - воткнул в мотор ось, на нее - колесо и колесный узел готов. С готовыми китайскими шасси чуть посложнее - нужна отвертка, которой нужно закрутить пару-тройку винтов.




Покрутив в руках купленные мотор-редукторы стеклоподъемников ВАЗ 2110 и колеса "от тележки" PR1804 сразу пришло понимание того, что тут все просто и быстро не получится. В первой части статьи мы озвучили нашу концепцию сборки - не использовать эксклюзивных деталей и технологий, недоступных в домашних условиях, поэтому пришлось поломать голову как же просто и надежно прикрепить мотор-редуктор к колесу с использованием доступных материалов и инструментов.

Ниже на схеме показан принцип передачи вращения вала мотор-редуктора на колесо.

\


"Корпус" колесного узла собирается из стальной трубы профильной 40x20x2, он состоит из трех частей. На фото показаны размеры элементов и необходимые монтажные отверстия. В отверстие 20 мм вставлена неподвижная ось из трубы стальной 20x1.5.








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


Мотор-редуктор крепится к "корпусу" колесного узла болтами М6 (30 и 50 мм). На концы профилей можно установить пластиковые заглушки:

Внутри неподвижной оси располагаем подвижную из трубы 12x1.5. Вал мотор-редуктора квадратный, поэтому необходимо придумать - как крутить им ось-трубку. Мы предлагаем такой способ (см. фото). Его преимущество - возможность сборки-разборки, настройки усилия сопряжения и использование кусочка все той же трубы 20x1.5 в качестве внешнего упорного элемента.







Винты используем М4 длиной 10 мм (из детского железного конструктора подходят отлично), гайки немного стачиваем (либо можно использовать винты и гайки М3).

Для того, чтобы центрировать подвижную ось относительно неподвижной и придать бОльшую жесткость конструкции между осями поставим подшипник 941/12, его внутренний диаметр 12 мм, внешний - 17 мм. Другая его маркировка - HK121712.



Два из четырех противоположных колесных болта М8 следует удлинить и поставить на них "поводок", который будет передавать вращение от оси на колесо. Поводок делаем из U-образного алюминиевого профиля 20x10x20x2.





В качестве шайбы между колесом и профильной трубой использовали кусочек полипропиленовой трубы на 3/4.



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


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



Из инструментов для работы в итоге понадобится:

- ножовка по металлу
- напильники и/или надфили
- набор гаечных ключей
- дрель со сверлами по металлу на 4, 6 и 20 мм. При отсутствии сверла на 20 мм можно просверлить меньшим сверлом и расточить, например, "шарашкой":


Для колесных узлов понадобятся:
- мотор-редуктор стеклоподъемника ВАЗ 2110 (2 шт. левый+правый)
- колеса PR1804  2 шт.
- подшипники 941/12 12x17x12 мм 2 шт.
- труба стальная 12x1,5 1м
- труба стальная 20x1,5 1м
- труба профильная 40x20x2 1м
- профиль аллюм. U-обр. 20x10x20x2 1м
- винты М4
- гайки М4
- болты М6
- гайки М6
- болты М8
- гайки М8
- хомуты сантех. 2 шт.
- клей "Эпоксилин" 150 руб
- заглушки пластиковые для профильной трубы 40 x 20 12 шт.


Самое популярное