Меню Рубрики

Зрение для робота на raspberry pi

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

В мае 2017 года Google объявила о запуске проекта AIY Projects, в рамках которого компания будет выпускать недорогие наборы-конструкторы для любительских проектов с применением технологий искусственного интеллекта. Первый набор из серии Voice Kit позволял собрать устройство для распознавания голоса.

Новый конструктор предназначен для работы с видео. Набор состоит из картонного корпуса, динамика, объективов для камеры, кабелей и некоторых других компонентов. Помимо этого пользователю необходимо отдельно купить одноплатный компьютер Raspberry Pi Zero W, специальную камеру для него, SD-карту и адаптер питания.

Главной особенностью набора стала включенная в комплект плата VisionBonnet с чипом Intel Movidius. Она позволяет использовать нейросетевые алгоритмы прямо на плате без необходимости в дополнительном компьютере или облачных сервисах. По умолчанию ее программное обеспечение содержит три натренированные нейросетевые модели, основанные на разработанном в Google фреймворке машинного обучения TensorFlow, предназначенные для распознавания объектов разных типов.

Одна из них распознает тысячи обычных объектов, другая распознает лица и эмоции, а третья позиционируется в качестве «детектора людей, котов и собак». При помощи программного обеспечения Google TensorFlow пользователи смогут обучить свои собственные модели компьютерного зрения.

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

Набор доступен для предзаказа по цене 45 долларов. Поставки должны начаться в декабре.

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

Популярный мини-компьютер Raspberry Pi отлично подходит для образовательных целей. На сайте проекта присутствует весомый образовательный раздел с подробными инструкциями и методиками. Читайте подробнее о плате Raspberry Pi в статье.

Самый дешевый способ купить Raspberry Pi в России – китайские интернет-магазины. Например, Raspberry Pi 3 на сайтах AliExpress и DX стоит около 38$. Также доступны к заказу более дешевые аналоги, например, Orange Pi. Доставка, как правило, бесплатная, цены могут меняться. Если нет времени ждать посылку из Китая — рекомендуем интернет-магазин Амперка.

Администратор

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

Программирование робототехники*,
Raspberry Pi*,
Программирование микроконтроллеров*,
Электроника для начинающих*,
Arduino*
Очень часто на хабре появляются статьи о том как использовать Raspberry Pi как медиацентр, передвижную видеокамеру, удаленную web камеру и… собственно все. Очень странно, что в такой большой IT тусовке — довольно мало информации о том — как его программировать и использовать одноплатный компьютер там, где он действительно довольно полезен — во всяких встраиваемых системах, где есть ограничения по размеру и стоимости, но также есть потребность в производительности. В нескольких статьях постараюсь описать на примере создания мобильного колесного робота с компьютерным зрением — как можно использовать малинку для создания роботов(штук с интеллектом на борту, а не управляемых с андроида машинок с веб камерой).

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

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

Изучение ее я начинал с чтения академических трудов по алгоритмам параллельно с освоением библиотеки компьютерного зрения OpenCV на C++(в случае с Raspberry — Python)- знание принципов работы алгоритмов поможет Вам оценить сложность и выполнимость задачи, еще до начала ее выполнения, а также оптимизировать алгоритмы в критичных местах. Даже если Вы будете пользоваться в основном библиотечными функциями — они хорошо оптимизированы, и вряд ли вы с нуля напишете лучше — Вы сможете оптимизировать какие то параметры, которые незначительно влияют в конкретном случае на решение вашей задачи, но значительно влияют на скорость ее решения — в общем возвращаясь к холивару — «нужна ли программисту математика» — В данном случае нужна, так что советую напрячь немного извилины и разбираться хотя бы поверхностно в работе алгоритмов.

Также нелишне будет хотя бы поверхностно изучить Теорию Автоматического Управления — вместо расписывания ее возможностей — предлагаю просто посмотреть следующее видео (BTW — половина его команды — русские)

Составные части робота

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

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

В качестве контроллера двигателей можно использовать любой микроконтроллер, у меня используется Arduino nano — потому что просто попалось под руку.

Возможно возникнет вопрос — почему бы не управлять напрямую с Raspberry? Дело в том, что у оперционной системы квант времени гораздо больше, чем у микроконтроллера, кроме того нет аппаратных ШИМов, плюс, если мы захотим улучшить управление двигателями при помощи обратной связи и Теории Управления — это потребует вычислительных затрат и более быстрой реакции — поэтому управляющая двигателями часть и мозг робота разделены — arduino просто получает по UART команду — с какими скоростями и направлениями мозг бы хотел, чтобы крутились двигатели — как это будет достигаться — просто включением ШИМа с нужной скважностью или хитрым управлением, когда вначале мы подаем напряжение больше уставки, раскручивая двигатель, а потом выравниваем — таким образом ускоряя раскрутку двигателя до нужной скорости — все это уже заботы контроллера двигателей, а не Raspberry — поскольку это вообще говоря задача гораздо более жесткого времени — на порядок — два меньшего, чем позволяет Raspberry, да и вообще подобные системы.

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

И такая схема необходима для каждого колеса. К счастью в наше время нет нужды ее собирать — она реализована в виде интегральных микросхем, коих великое множество — так что, подойдет любая, способная управлять током, нужным вашему двигателю. У меня используется вот такой двухканальный от pololu:

Также имеется великое множество всевозможных шилдов для ардуин — при помощи гугла вы их легко найдете по запросу «arduino motor driver». Схему подключения также обычно предоставляет производитель или пользователи всевозможных форумов — ищущий да обрящет. У микросхем 2 питания — одно — которое подается на двигатели от мощного источника тока — например Li-Pol батарейки 7.2В, другое — питание входного каскада логики — ардуиновские 5В, также имеется входы, контролирующие направление вращения каждого канала и вход Enable — подавая на который ШИМ сигнал мы можем регулировать скорость вращения двигателя. Могут быть различные конфигурации в зависимости от шилда, но основные выводы — такие.

В общем то соединив таким образом Arduino, драйвер двигателей, двигатели и батарейку(или просто какой нибудь источник тока на длинном проводе) можете уже начинать играться с управлением моторами. Для получения команд от Raspberry потребуется реализовать прием строчки по UART и ее парсинг — протокол можете тут придумать какой вашей душе угодно. вышеперечисленное — основные части практически любого колесного робота — далее уже начинаются варианты — можете вообще забить на компьютерное зрение и сделать робота чисто на Arduino, который, например, ездит по линии, объезжает препятствия при помощи датчиков расстояния и т.п.

Моя же задача — сделать несколько более интеллектуальную платформу для ислледования компьютерного зрения и теории управления — так что следующим элементом системы будет являться одноплатный компьютер Raspberry Pi B+ в виду его невысокой цены, распространенности и доступности информации. В сборку Raspbian включен Python интерпретатор — так что писал программу для робота я на нем

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

Для отладки я использую USB Wifi свисток, подключаясь к Raspberry через удаленный рабочий стол по SSH. Тоже в общем то можно использовать любой, для первоначальной настройки вообще можно использовать Ethernet кабель и SSH

Аккумулятор — литий полимерный от 2Ач на 7.2В номинального напряжения + зарядка.

Понижающий DC-DC преобразователь — батарея наша выдает от 8.4 до 6В — это напряжение мы можем напрямую подавать на двигатели через микросхему драйвера, но для питания Raspberry и Arduino требуется 5В источник питания — по документации Raspberry Pi требуется источник 5В, способный отдавать не менее 800мА — можно конечно понизить напряжение с батарейного до 5В при помощи линейного стабилизатора, но при таких токах он будет греться и неэффективно использовать заряд батареи, так что я рекомендую использовать импульсный понижающий DC-DC преобразователь — от него у меня питается и Raspberry и Arduino

Читайте также:  Что в природе с точки зрения толстого действует на человека

Собственно фото моего нанотехнологичного робота и пара видео его езды по различным соревновательным трекам в качестве демонстрации:

Тонкая линия с резкими поворотами(Евро)

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

2.Первоначальная настройка Raspberry Pi + отладка по Wifi

3.Начало работы с OpenCV, Raspicam на Python

4.Управление роботом, ПИД регулятор, примеры

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

Амперка / Блог

Некоторое время назад мы уже писали о роботе Eyeduino, участнике конкурса «Hack The Arduino Robot», а сегодня хотим разместить большую подробную статью, повествующую о процессе создания робота, возможных областях применения и великой цели, которую преследовали его создатели, когда решили участвовать в международном робоконкурсе.

О том, чтобы попытаться загружать в Ардуино картинки с низким разрешением, мы задумывались ещё некоторое время назад: не видно было принципиальных ограничений, не позволяющих загнать в контроллер Atmega линейки, используемой в Ардуино, картинки порядка 32х32 (назовём их RI — Rough Images, «грубые изображения»), даже если расточительно тратить байт на хранение пиксела. Более того! Мне попадалась статья, где коллега практически без периферии, на АЦП контроллера получал картинку 64х64, да ещё с уровнями серого! Правда, там картинка не сохранялась в память, а гналась в последовательный порт через второй контроллер, по-моему. Я для себя определил некоторое концептуальное ограничение, из-за которого тот способ не подходил нам, а именно: попытаться вписаться в платформу Arduino как в плане железа, так и использования стандартных функций среды разработки.

Есть потенциально ещё вариант — оптическая мышь. Некоторые микросхемы, по крайней мере, с PS/2 интерфейсом, вроде бы поддерживают передачу точек картинки, которую видит камера мыши, но по 1 пикселу и по крайне медленному интерфейсу.

Наконец, третий вариант (или третий и четвёртый, как считать). Это использование Raspberry Pi или чего-то на Android + IOIO или Arduino. Тут барьер оказался больше психологическим: не доводилось раньше работать с Линуксами, поэтому с ходу программировать оказалось проблематичным (в отличие от Arduino). Хотя, думаю, что этот опыт будет полезен и мне, и сыну Алексею, и в следующем сезоне мы постараемся что-нибудь выкатить на «Малине». Правда, трудно представить себе, что это будет столь же простая и безотказная вещь, как Arduino.

Работа с RI — довольно «вкусная» возможность в спортивной робототехнике, например, для классической задачи следования по линии. Правда, только в качестве вспомогательного средства — из-за низкого разрешения и редкого чтения (большинство камер дадут 25 fps, а, скажем, в нашем «Стремительном» цикл чтения с линейки и расчёта скорости происходит раз в 4мс, т.е. на порядок чаще). Зато сколько даст более раннее знание о предстоящих поворотах! В большинстве конструкций для этого используют вынесенную вперёд линейку, а это сразу ухудшает механику (увеличивает момент инерции робота).

Итак, идея была — обрабатывать аналоговый сигнал с камеры. Поскольку памяти картинка должна занимать мало и считываться быстро, наиболее очевидный подход — черно-белая картинка, снимаемая цифровым входом, сигнал на который подаётся с выхода компаратора.

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

Не помню уже, в каком чудесном поиске я нашёл класс микросхем «video sync separator». И недорогой представитель этого семейства LM1881 должен был прекрасно решать наши проблемы: получая на вход видеосигнал, он выдаёт цифровые сигналы и новой строки, и нового кадра, и чётного/нечётного кадра, и цветовой «вспышки» (color burst). Можно было собирать прототип и писать какую-то программу. Что мы и сделали. Прототип на breadbord, Arduino Uno — вперёд!

Суть программы следующая: есть переменная, которая отображает состояние чтения картинки (запрошено/в процессе/выполнено). Есть прерывания по новому кадру и по началу линии. По новому кадру (если считывание запрошено) сбрасываются счётчики текущей строки и линии и состояние переводится в «в процессе». По прерыванию линии проверяем номер линии (нам нужна каждая десятая) и, если подходит, считываем 32 раза выход компаратора. Набрав 32 строки, переводим состояние в «выполнено». В основном цикле программы периодически запрашиваем считывание, ждём «выполнено», потом выводим картинку в текстовом виде (белое — пробел, чёрное ‘#’) в последовательный порт. Экспериментировали с этим хозяйством мы в новогодние каникулы, да так ничего толком не добились: вместо картинки шла какая-то каша.

Второе дыхание тема получила в конкурсе RobotChallenge «Hack the Arduino Robot». Идея была оформлена в виде короткого сочинения и отправлена организаторам.
Дальше были выступления на Geek Picnic: по мини-сумо — провальное, по микро-сумо — победное. С этим результатом ехать на RobotChallenge особого смысла не было.

И вот пришло письмо от организаторов RobotChallenge, что наш проект был отобран среди десяти финалистов и нам готовы прислать робота, чтобы мы стартовали работы. Оказалось, что быстро прислать робота — проблема, пришлось его покупать уже в России. Ладно, это — не самая сложная проблема, которую пришлось решать, а продавец даже любезно сделал скидку ради такого случая!

Ввязавшись в проект, пришлось форсировать получение картинки. Ну не может же быть, что совсем ничего нельзя сделать! Чтобы иметь больше времени на обработку строчки и не прерываться следующей строчкой (я думал, что причина могла быть в этом), мы добавили ещё счётчик: теперь прерывание вызывалось не на каждой строчке, а на каждой десятой. Кроме того, счётчик (похоже, ещё советского дизайна схема К155ИЕ1) имел ещё полезную особенность: двойной вход, связанный логическим отношением «И». Т.е. сигнал с этой микросхемы можно было спокойно включать/отключать, подав на один из входов «1» или «0».

Кроме того, пришлось подумать над минимизацией времени считывания сигнала с компаратора. Приблизительно измерив время выполнения стандартной функции Ардуино digitalRead(), я понял, что она не годится: она выполняется порядка 6мкс, в то время. как нам нужно меньше 2мкс (стандартная строчка идёт чуть более 60мкс, за это время мы надеемся снять 32 точки). Пришлось лезть в реализацию и откидывать то, что можно вычислить и сделать один раз, зная номер PIN, на который заводится выход с компаратора. Отказался даже от цикла, чтобы не тратить время на вычитывание счётчика цикла в регистр, инкремент и снова сохранение в память (подозреваю, в такие команды должен был откомпилиро­ваться цикл for(pixelCount=0;pixelCount

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

Ардуино глазами робота

Как было получено

Поднастроив задержки при помощи NOP’ов и покрутив потенциометр, устанавливающий уровень второго входа компаратора (практически, яркость), я получил вполне приемлемую картинку.

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

Пришла пора портировать прототип на целевую платформу — робота. Для всяких проявлений народного творчества типа нашего на плате предусмотрены площадки для паяния. Внимание! Прежде, чем начать паять, разберитесь, что и куда там подходит, в смысле земли и питания (п’отом заработанный вывод Алексея). Оказалось также, что для того, чтобы подключить схему к прерываниям контроллера, придётся отказаться от чего-то важного: последовательного интерфейса или I²C. Поскольку последовательный интерфейс используется для связи с нижней (моторной) платой и, возможно, с компьютером, жертвой был выбран интерфейс I²C. Жалко, конечно, компас и другие интересные вещи, но проект важнее! Скольких трудов потом это нам стоило, но, возможно, по-другому это не делается вообще.

Итак, Алексей распаивет схему, слегка модифицируем программу под новые порты — работает! Причём стабильно, контакт надёжнее, чем на breadboard, а новый потенциометр — вообще красавчик: позволяет тонкую настройку и красиво смотрится на плате.

Ну, хватит только глазеть, пора начинать ходить, поуправляем моторной платой. И тут неожиданно начался кошмар, который вспоминаю с содроганием. Попытка вставить чтение изображения в программу, в которой отправляются команды на моторную плату, приводила к очень печальной вещи: робот уходил в себя, ничего не делал и, самое главное, терял способность взаимодействовать с компьютером! Загрузить что-нибудь даже безобидное уже было невозможно. Проект «Фобос» своими руками!

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

Ну, в общем, всё оказалось не так плохо, поиск по FAQ свёл интеллектуальную задачу к физическому упражнению: если Вы потеряли Arduino Robot (или другую Ардуину на 32u4) с экрана IDE Arduino и списка USB-устройств, но физически держите в руках, поможет кнопка Reset и многократные попытки загрузить программу. Примерно после 3-4 попыток плата снова возвращается под контроль.

Радость от победы над Фобосом омрачало одно обстоятельство: время шло (а его на проект вообще отпущено невероятно мало) а робот не ехал. Люди! Не позволяйте себе бездумно расточать время, «чтобы не было мучительно больно за бесцельно прожитые годы». Мучительно больно! Лучше сказать невозможно, наверное.

Итак, в первоначальных планах у меня было с ездой по прерывистой линии выступить на открытых соревнованиях Политехнического музея 16.02.2014. К вечеру 15.02.2014 я уверенно освоил Reset, но и только: одновременно считывать видео и ездить робот отказывался. Причина крылась где-то в классе RobotControl: как только я его включал в код, случался Фобос. Класс использовал внутри себя I²C устройства, и, видимо, при инициализации или при дальнейшей жизни пытался поговорить с ними по I²C; поскольку я вешал на соответствующие порты прерывания, похоже было что контроллер уходил в вечную обработку прерываний. Это гипотеза, возможно всё или сложней или, наоборот, банальней.

С этими печальными открытиями я попытался уснуть, утешая себя тем, что завтра всё равно будет с чем поехать на соревнования, но сон, как говорится, не шёл. Шли идеи, в конце концов я продолжил изыскания: решил попытаться написать класс NoI²CRobotControl или просто накопипастить функционал взаимодействия с моторной платой прямо в основной код. Начал с первого, но получилось только второе и к половине 6-го утра у меня был ездящий робот с обработкой видеоизображений. То есть езда и обработка были в одной программе, но обработка мало влияла на езду. Настройки я надеялся дотянуть на соревнованиях, тем более полигон у меня есть только приблизительно похожий на целевой.

Читайте также:  Природная гуттаперча с химической точки зрения

На соревнованиях — не пошло. Во-первых, пришлось очередной раз убедиться, что чисто пропорциональный регулятор (а именно такой я попытался использовать — вдруг пронесёт) плохо работает для инерционных систем, робот раскачивается и сходит. Во-вторых, к середине дня ушла картинка (как потом выяснили — из-за плохого контакта ушло напряжение на компараторе). Несколько утешили награды в других номинациях и лекция по ROS.

Понадобилось несколько дней (ну не совсем дней, глубоких вечеров) на то, чтобы доделать PD, разобраться с матчастью — и он поехал! И по сплошной линии, и по прерывистой. Причём алгоритм — примитивен, управляющий параметр — эксцентриситет, характеризующий смещение относительно центра — считается как усреднённый центр масс чёрных точек по линиям, с откинутыми краями. «Когда б вы знали, из какого сора растут стихи, не ведая стыда» (А.Ахматова) — цитирую по памяти, прошу простить, если неточно. В общем, робот поехал, поснимали видео для клипа (вспомнили и стали лихорадочно набирать материалы).
Пора было заняться вторым упражнением — охотой на таракана.

Собственно алгоритм оказался простым. Точнее, я понял, что сложный (с идентификацией отдельных пятен) сделать не успею, поэтому сделал сильное допущение, что снимать мы будем единственное пятно, и это — таракан. Дальше ищем центр масс пятна (точнее, чёрных точек, мы же сделали сильное допущение) и пытаемся следовать за ним (используя регуляторы в радиальном и тангенциальном направлениях), после чего сигнал на моторы представлял собой суперпозицию этих регуляторов.

Реализация оказалась вполне работоспособной, только камеру мы ещё приподняли: поле зрения оказалось узким, «таракан» быстро покидал его, регулятор зачастую не успевал отрабатывать, а при повышении коэффициентов обратной связи зачастую проскакивал целевое состояние. Дело в том, что мощность моторов весьма нелинейно зависит от задаваемого уровняя сигнала, и при малых уровнях моторы только напрягаются, но не крутят (печальное состояние, надеюсь, дорогой читатель, нам с Вами не придётся попадать в него, по крайней мере, надолго: можно перегореть!).

Итак, преследовать чёрное пятно мы более-менее научились. Точнее, чёрное пятно среднего размера. Был поставлен фильтр, позволяющий мелкие пятна игнорировать, а от крупных — уезжать. Мало ли какой таракан попадётся, если он занимает больше половины поля зрения. может лучше уехать

Следующая часть упражнения — активировать сервомашинку, которая будет хлопать «таракана» — оказалась совсем несложной и для меня, и для Алексея. Для Алексея — потому что у него в руках всё работает (когда не горит); для меня — ну, просто подключить серву к роботу реально просто. И выглядело весьма забавно!
В свободное время на Робофесте мы отсняли «охоту на таракана»: уже подходило время монтировать ролик про проект, а материалов было весьма негусто.

Вы никогда не монтировали ролик про свой проект, причём имея очень приблизительное представление и про то, как это делается технически, и про законы жанра, и про другие законы (имею в виду копирайт законодательство: на какую музыку положить ролик и не получить потом иски)? А я монтировал! Уже. И более того, с удовольствием пересматриваю результат. Ну, возможно, это новый вид графомании, для которого ещё предстоит придумать (или уже придумали) какое-то мудрёное название.

Музыкой со мной поделился коллега Николай Сырцев, который играет в группе Disen Gage. Поскольку материалов было немного (как мне казалось), выбрали одну из самых коротких и динамичных композиций и постарались нарастить на неё сюжет. Какой был креатив! И «Прибытие поезда» братьев Люмьер глазами робота! И прибытие робота его же глазами! Точнее, глазом с разрешением 32х32 точки, выводимых символами ‘#’ и ‘ ‘ (пробел) в Serial. И получилось! Впрочем, про графоманию я уже писал.

Дальше — мы выложили ролик организаторам, они выложили его для голосования, и тут начался драйв. То есть его и раньше было достаточно (внимательный читатель наверняка заметил), но тут драйв пошёл иного свойства, как у болельщика на стадионе: очень переживаешь и ничего почти сделать не можешь, разве что инфаркт нажить. Помогли друзья, коллеги, Ассоциация Спортивной Робототехники — было сделано всё, чтобы набрать likes. С помощью какой магии итальянской команде Robopet удалось нас обойти — не знаю, но в итоге в призёры они не попали.

Параллельно пришлось решать вопросы загранпаспорта, австрийской визы, билетов, гостиницы, готовить роботов к другим соревнованиям… Сейчас это всё позади, и это (то, что уже всё позади) для меня до сих пор — повод для радости.

Ну а в Вене снова пришлось поработать: презентовать проект посетителям RobotChallenge. Каким успехом пользовалась охота на таракана! Многих посетителей, правда, больше интересовал вибротаракан, чем робот, который за ним гонялся. А сколько радости детям! Да и нам приходилось общаться: конкуренты не дремали!

Британская команда активно агитировала, французская тоже. Техника в итоге не выдержала. Под конец первого дня (субботы) движения хлопушки стали вялыми, а робот стал вдруг срываться с места и пытаться уехать куда-то. Сейчас-то такое поведение кажется вполне объяснимым: стал заклинивать сервомоторчик, при этом он потреблял достаточно короткозамкнутый ток, напряжение в бортовой сети просаживалось. Видимо, падение было достаточно глубоким, чтобы переставал нормально работать компаратор в цепи захвата видеосигнала. Вместо чёткого пятна — таракана — на вход алгоритма шёл какой-то мрак. Неудивительно, что робот «пугался» большого пятна и панически пытался куда-то уехать, причём со стола.

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

Не знаю уж, поэтому ли нам досталось не первое место или ещё почему: критерии не объявлялись, а правила менялись по ходу, например, куда-то делась номинация community award, которая должна была присутствовать наравне с наградой по оценке жюри. Ну да ладно, первый блин комом, а второе место — тоже очень ничего, волнительно (и во время процедуры награждения, и потом — так и хочется, чтоб все, все знали…) Вот они, медные трубы. Ну а потом — немного погуляли по почти майской Вене — и домой.

Так закончился проект Eyeduino, давший кому что: роботу — примитивное зрение, нам — какие-то навыки и массу адреналина, иностранным коллегам — очередной повод поудивляться на русских.

А Вы, дорогой читатель, поверили, что закончился? Ха! Такие идеи так просто не заканчиваются! Вот что я скажу напоследок: такая область, как компьютерное зрение, нуждается в простой, дешёвой и доступной для понимания и обучения платформе. Eyeduino может стать для CV (computer vision) тем, чем стало Arduino для хобби-робототехники а Basic — для программирования. Да, для этого нужно сделать очень много: разработать shield (есть идеи на несколько вариантов), хорошо бы разработать plugin для Arduino IDE, который можно было бы запускать вместо Serial Monitor, куда получать картинку через Serial, нарабатывать, нарабатывать алгоритмы и методику обучения… Дорогу осилит идущий. Можете рассматривать это как Eyeduino+ manifesto! Но это — уже совсем другая история…

Установка OpenCV 3 на Raspberry Pi 3

Шаг 1. Свободное место

Шаг 2. Установка зависимостей

Шаг 3. Загрузка OpenCV из репозитория

Шаг 4. Виртуальное окружение

/.profile: Теперь нужно сделать следующие три шага:

  1. закрыть все окна терминалов
  2. разлогиниться
  3. снова залогиниться
  4. открыть терминал и ввести команду:

Примечание. Вообще, эту команду теперь рекомендуется вводить при каждом входе в систему. Далее создаем виртуальное окружение с именем «cv»: Чтобы проверить правильность установки виртуального окружения, перезагрузим Raspberry Pi: Откроем терминал и зайдем в окружение: Индикатором того, что мы находимся в виртуальном окружении будет префикс (cv) в начале командной строки.

Используемое программное обеспечение

1.Raspian OS:

Это рекомендуемая ОС для Raspberry Pi. Вы можете также установить другие ОС от третьей стороны. Raspbian OS – это ОС на основе debian. Мы можем установить его из установщика noobs. Вы можете получить ссылку отсюда

2.Putty:
PuTTY – клиент SSH и telnet, разработанный Simon Tatham для платформы Windows. PuTTY – это программное обеспечение с открытым исходным кодом, которое доступно с исходным кодом и разрабатывается и поддерживается группой добровольцев. Здесь мы используем PuTTY для удаленного доступа к малине.

Вы можете скачать PuTTY здесь

3.OpenCV:
OpenCV (Open Source Computer Vision Library) представляет собой библиотеку программного обеспечения для компьютерного зрения и машинного обучения с открытым исходным кодом. OpenCV была создана для обеспечения общей инфраструктуры приложений для компьютерного зрения и ускорения использования восприятия машины в коммерческих продуктах. Будучи лицензированным BSD продуктом, OpenCV упрощает для бизнеса использование и изменение кода. В библиотеке имеется более 2500 оптимизированных алгоритмов, которые включают в себя полный набор классических и современных алгоритмов компьютерного зрения и машинного обучения. Эти алгоритмы могут использоваться для обнаружения и распознавания лиц, идентификации объектов, классификации действий человека в видео, отслеживания движения камеры, отслеживания движущихся объектов и извлечения 3D-моделей объектов.

Используемое оборудование

Здесь вам понадобятся только два устройства:
1. Raspberry Pi:
Это последняя версия Raspberry Pi. В ней встроены Bluetooth и Wi-Fi, ранее приходилось использовать Wi-Fi свисток в одном из портов USB. Всего в RPI3 40 контактов. Из 40 контактов 26 являются контактами GPIO, а остальные – штырьками питания или заземления (плюс два вывода ID EEPROM.)

Имеется 4 порта USB и 1 слот Ethernet, один порт HDMI, 1 порт аудиовыхода и 1 порт micro usb, а также многое другое. Есть один слот для карт micro sd, в котором мы должны установить карту micro sd с рекомендованной операционной системой. Существует два способа взаимодействия с вашим Raspberry Pi. Вы можете напрямую взаимодействовать через порт HDMI, подключая кабель HDMI к VGA, а также клавиатуру и мышь, а также вы можете взаимодействовать с любой системой через SSH (Secure Shell). (Например, через putty ssh.)

2. Raspberry Pi Camera:
Модуль камеры Raspberry Pi можно использовать для съемки видео высокой четкости, а также фотографий неподвижных изображений. Его легко использовать новичкам, но также есть много возможностей модуль может предложить продвинутым пользователям. Существует множество примеров онлайн-пользователей, которые используют его для time-lapse, slow-motion видео и других проектов. Вы также можете использовать библиотеки, связанные с камерой, для создания эффектов.

Читайте также:  Моя точка зрения версия происхождения варягов

Установка OpenCV

Шаги установки OpenCV для Python на Raspberry Pi:

1) sudo apt-get update

2) sudo apt-get upgrade

3) sudo apt-get install build-essential

4) sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

5)sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

6) sudo apt-get install python-opencv

7) sudo apt-get install python-matplotlib

Настройка и включение камеры
Для обнаружения лиц вам необходимо настроить PiCamera. Шаги для включения камеры приведены ниже:

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

sudo raspistill -o filename.jpg

Если камера включена успешно, вы получите изображение в той же папке.

Камера компьютерного зрения PIXY2 работает с Arduino, Raspberry Pi и другими платами

Камеры могут быть использованы для обычного фотографирования, но при интеграции в проекты робототехники обычно их цель обнаружение объектов и/или окружающей обстановки. Ранее мы уже описывали специализированные камеры компьютерного зрения, такие как камера JeVois на базе процессора Allwinner A33, плата машинного зрения HICAT.Livera, или основанная на STMicro STM32F7 Arm Cortex M7 плата компьютерного зрения OpenMV Cam M7 с открытыми исходными данными.

Еще одна популярная камера PixyCam PIXY в первые была запущена через компанию на Kickstarter в 2013 году. Недавно компания представила обновленную версию, под названием PIXY2, которая также умеет обнаруживать объекты, но быстрее на 60 кадров в секунду, а также включает в себя новые алгоритмы обнаружения и отслеживания линий следования или штрих кодов.

Технические характеристики камеры PIXY2:

  • MCU – Двухядерный NXP LPC4330Arm Cortex M4/M0 @ до 204 МГц с 264KБ RAM, 2МБ flash
  • Датчик изображения – OnSemi (ранее Aptina) MT9M114 разрешение 1296×976 с интегрированным процессором потока изображений
  • Поле зрения объектива – 60 градусов по горизонтали, 40 градусов по вертикали
  • USB – 1x micro USB порт
  • Расширение
    • I/O порт с последовательным UART, SPI, I2C, цифровой, аналоговый I/O
    • RC серво разъем для подключения до 2 сервоприводов
  • Прочее – 2x белые светодиоды, 1x RGB светодиод, 1x кнопка
  • Электропитание – 5В через USB вход, или от 6 до 10В через нерегулируемый вход
  • Энергопотребление – 140 мА
  • Размеры – 42 x 38 x 15 мм
  • Вес – 10 грамм

Нажмите чтобы увеличить

Плату можно обучить обнаруживать заданные объекты, вы можете обучить ее через порт Arduino с помощью кабелей идущих в комплекте, а также Raspberry Pi, BeagleBone Black и прочие Linux платы. Библиотеки доступны в C/C++ и Python, программа настройки работает в Windows, Mac OS и Linux. Как программное обеспечение, так и аппаратная часть имеют открытые исходные данные, они предоставлены на Github.

Вы найдете множество проектов для PIXY / PIXY2 камеры на их веб-сайте, документацию можно найти в Wiki. Новые возможности PIXY2 включают в себя:

  • Обнаружение линий, пересечений и небольших штрих кодов, предназначено для роботов следующих по линиям
  • Добавлены алгоритмы обнаружения объектов на основе цвета
  • Улучшенные и упрощенные библиотеки для Arduino, Raspberry Pi и других контроллеров
  • Интегрированный источник света – Два белых светодиода обеспечивают около 20 люмен

PIXY2 можно купить в Seeed Studio, где она продается за $59.90 плюс доставка, также вы можете найти камеру в других интернет магазинах, таких как Amazon и eBay. Набор из подставки и серво-привода наклона для Pixy2 можно купить за $29.90. Более подробную информацию можно найти на странице продукта.

Робот для видеонаблюдения на Raspberry Pi

Содержание статьи

Все материалы сюжета:

Arduino, безусловно, популярная и интересная платформа, но и у нее есть свои ограничения. Что, если тебе нужно использовать на роботе дополнительный софт? Подключать периферию? На помощь приходит хорошо знакомый Raspberry Pi.

В этой статье я покажу, как сделать управляемого по Wi-Fi робота с веб-камерой на базе Raspberry Pi. Эта платформа позволит нам работать со всем понятным Linux, с легкостью использовать любой нужный нам софт, а также задействовать почти любую периферию.

  • Raspberry Pi модели В — 2200 р.
  • Веб-камера — 1500 р.
  • Wi-Fi-донгл — 300 р.
  • Аккумулятор на 12 В 7 А • ч — 500 р.
  • Колесная база, провода и двигатели от какой-нибудь игрушки

О компьютере

Я использовал стандартный Raspberry Pi версии B, который обладает двумя USB-портами, Ethernet-портом и 512 Мб оперативной памяти. Также существует модель А, в которой есть только один USB-порт, 256 Мб памяти и отсутствует Ethernet. Такая плата более сложна в настройке, но зато ей нужно намного меньше питания.

В качестве ОС я выбрал стандартную Raspbian (оптимизированный под железо «малинки» Debian). Для установки операционной системы нам потребуется SD- или SDHC-карта объемом желательно не менее 4 Гб класса 10 и любой компьютер с кардридером. Сам процесс заливки довольно тривиален. Пользователям UNIX будет достаточно утилиты dd. Вставляем готовую карточку в «малинку», подключаем ее к сети, включаем любимый SSH-клиент. Стандартный логин pi, пароль — raspberry.

При первом запуске появится окно с конфигурациями — если этого не произошло, то его можно вызвать командой raspi-config. Нас волнует несколько пунктов:

  • Expand filesystem — расширение основного раздела на всю карту памяти. Иначе системе не будет доступно больше 4 Гб.
  • Change User Password — стандартный пароль лучше все-таки сменить.
  • Internationalisation Options — выставляем локаль ru_RU.UTF-8 UTF-8 и соответствующий часовой пояс.
  • Enable Camera — включение поддержки камеры. Потребуется для камер с DSI-интерфейсом (например, для официальной камеры), но в моем примере это не нужно, то есть можно поставить значение Disable.

Для того чтобы избавиться от сетевого кабеля, нужен поддерживаемый Wi-Fi-донгл. Я использовал D-Link DWA-110, а полный список есть в интернете (bit.ly/1cQXMFP). Расскажу немного о настройке:

  1. Подключаем Wi-Fi к Raspberry.
  2. Смотрим, определилась ли она

Получим что-то подобное:

Подключаемся к нашей сетке:

и проверим, подключились ли мы к точке доступа:

Управление

Для начала установим веб-интерфейс, через который мы будем управлять роботом. Я остановился на WebIOPi. Этот продукт разработан специально для применения RPi в автоматизации и робототехнике.

Установка интерфейса производится следующим образом:

  1. Скачиваем архив программы в любой каталог командой
  2. Распаковываем архив в текущую директорию
  3. Переходим в каталог с программой

Вес пакета составляет всего 152 Кб.

  • Запускаем установочный файл
  • И ставим веб-интерфейс на автозапуск
  • Теперь займемся созданием страницы управления. Для начала скачаем архив проекта по адресу bit.ly/1di2qgl. Распакуем его в каталог пользователя:

    Далее редактируем конфиг из корня сервера webiopi:

    Устанавливаем «глаза»

    Итак, подключаем к роботу веб-камеру. Я использовал камеру HP HD-4110 с поддержкой Full HD и V4L, но смысла брать именно Full HD камеру нет, так как у нас разрешение изображения 640 на 480. Полный список есть здесь: bit.ly/1cR06N4. Почти для каждой камеры в этой табличке указано, требуется ли ей внешнее питание. Это важно, поскольку «малинка» может стабильно питать по USB далеко не каждый девайс, а у некоторых камер питание в принципе подводится через внешний адаптер. Поэтому стоит остерегаться некоторых моделей от Logitech и Microsoft. Дальше по списку:

    Получим что-то подобное: Bus 001 Device 004: ID 03f0:9207 Hewlett-Packard

  • Устанавливаем пакет video for Linux
  • Устанавливаем утилиту mjpg-streamer-rpi
  • Переименовываем скачанный файл
  • Распаковываем
  • Переходим в каталог с программой
  • Запускаем
  • При необходимости настраиваем скрипт под себя
  • При 30 кадрах в секунду моя система работала нормально (без оверклока), но, чтобы снять нагрузку с компьютера, значение можно снизить вплоть до 5. Также обрати внимание на YUV — это позволит нам немного оптимизировать размер видеопотока за счет другого принципа кодирования цвета. Создаем скрипт автоматизации запуска:

    Далее для автозапуска с системой мы добавляем строчку с нашим скриптом в файл / etc/rc.local до строчки exit 0.

    Если хочешь полюбоваться результатом, то зай ди в браузере по адресу http://raspberrypi:8000, логин webiopi, пароль raspberry. В качестве бонуса можно открыть веб-интерфейс в «мир». Для этого нужно дать в твоем роутере доступ к портам 8000 и 8080 для IP твоей «малинки». Естественно, перед этим нужно сменить стандартные логин и пароль WebIOPi командой

    После чего запустится генератор файла пароля и запросит сначала логин, а потом пароль дважды. Результатом будет: Hash: «длинная-длинная строчка с множеством символов» Saved to /etc/webiopi/passwd

    После проведенных операций требуется перезагрузка сервера

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

    Схема взята из самой машинки. Все номиналы деталей и транзисторы взяты прямо оттуда. Транзисторы Q1, Q2 лучше использовать B772, транзисторы Q3, Q4 — D882. Если ты экономишь место, то транзисторы Q5 и Q6 лучше брать SMD с маркировкой 6C. Схема скопирована с платы машинки, от которой взята колесная база, но я добавил резисторы на 1 МОм параллельно входам управления, дабы погасить наводки. Двигатель питается напрямую через драйверы от аккумулятора 12 В. При желании можно организовать регулировку скорости машинки посредством широтно-импульсной модуляции. Теперь подключаем все по такой схеме:

    • За движение вперед отвечает порт GPIO 11, назад — GPIO 9, влево — GPIO 25, вправо — GPIO 8. Подключаем к драйверам двигатели, а драйверы к соответствующим портам на Raspberry Pi.
    • Питание управляющей части робота осуществляется через DC/DC-преобразователь на микросхеме LM2596.
    • На вход мы подключаем аккумулятор, а на выход Raspberry Pi. Когда наш робот выключен, у нас будет утечка тока через транзисторы драйверов и БП Raspberry, поэтому надо поставить тумблеры в разрез цепям питания, первый тумблер между плюсом аккумулятора и преобразователем, а второй так же между плюсом аккумулятора и клеммой питания драйверов.

    Итак, долгожданный пуск готового устройства. Производим подключение по следующей схеме:

    • К RPi подключаем веб-камеру, USB-адаптер Wi-Fi, преобразователь и проводники, ведущие к драйверам.
    • Далее подсоединяем Raspberry к аккумулятору через преобразователь и включаем его. Аккумулятора хватает на два-три часа.
    • После загрузки компьютера включаем тумблер подачи напряжения на драйверы.
    • Заходим с любого устройства из нашей локалки по адресу http:/адрес_твоего_RPi:8000 и катаемся на машинке по квартире :).
    Источники:
    • http://dml.compkaluga.ru/forum/index.php?showtopic=100248
    • http://blog.amperka.ru/eyeduino-%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D0%B7%D1%80%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B0-%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE
    • http://robotclass.ru/articles/raspberrypi-3-opencv-3-install/
    • http://academicfox.com/raspoznavanye-lyts-s-pomoschyu-opencv-y-raspberry-pi/
    • http://www.cnx-software.ru/2018/08/15/%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D0%B0-%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B7%D1%80%D0%B5%D0%BD%D0%B8%D1%8F-pixy2-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0/
    • http://xakep.ru/2014/10/30/video-robots-rapberry-pi/