Очень часто на хабре появляются статьи о том как использовать 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
Собственно фото моего нанотехнологичного робота и пара видео его езды по различным соревновательным трекам в качестве демонстрации:
Линия профи(прерывистая)
Тонкая линия с резкими поворотами(Евро)
В общем обзорная статья закончена — рассказал об основных используемых инструментах, далее уже будет более конкретно, а именно:
1.Введение
2.Первоначальная настройка Raspberry Pi + отладка по Wifi
3.Начало работы с OpenCV, Raspicam на Python
4.Управление роботом, ПИД регулятор, примеры
Вопросы, замечания, дополнения и пожелания по следующим статьям оставляйте в комментариях, очепятки и прочее — в личку
Введение
Всегда было интересно программировать что то механическое —
Во многих своих творениях, а тем более роботах — человек всегда старается повторить самого себя, или часть своих функций. 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
Собственно фото моего нанотехнологичного робота и пара видео его езды по различным соревновательным трекам в качестве демонстрации:
Линия профи(прерывистая)
Тонкая линия с резкими поворотами(Евро)
В общем обзорная статья закончена — рассказал об основных используемых инструментах, далее уже будет более конкретно, а именно:
1.Введение
2.Первоначальная настройка Raspberry Pi + отладка по Wifi
3.Начало работы с OpenCV, Raspicam на Python
4.Управление роботом, ПИД регулятор, примеры
Вопросы, замечания, дополнения и пожелания по следующим статьям оставляйте в комментариях, очепятки и прочее — в личку