Робот на RaspberryPi, Arduino і RaspiCam + OpenCV. Частина 1 Оглядова

Дуже часто на хабре з'являються статті про те, як використовувати Raspberry Pi, як медіацентр, пересувну відеокамеру, віддалену web камеру і… власне все. Дуже дивно, що в такій великій IT тусовці — досить мало інформації про те як його програмувати і використовувати одноплатний комп'ютер там, де він дійсно досить корисний — у всяких вбудованих системах, де є обмеження за розміром і вартістю, але також є потреба в продуктивності. У кількох статтях постараюся описати на прикладі створення мобільного колісного робота з комп'ютерним зором — як можна використовувати малинку для створення роботів(штук з інтелектом на борту, а не керованих з андроїда машинок з веб камерою).
image
image
image
image
image

Введення
Завжди було цікаво програмувати що то механічне — відчуваєш себе Богом(як і більшість програмістів) — вдихаєш у купу деталей душу. Напевно всі пам'ятають ту дитячу радість від першого миготіння світлодіодом, ворухливого сервоприводу і т. д. — коли зробив щось, що можна помацати, що живе, рухається, а не сайтик на php.
У багатьох своїх творах, а тим більше роботах — людина завжди намагається повторити самого себе, або частину своїх функцій. 80% інформації про навколишній світ ми отримуємо через зір — так що комп'ютерне зір, на мій погляд, одна з основних областей знання в робототехніці.
image
Вивчення її я починав з читання академічних праць за алгоритмами паралельно з освоєнням бібліотеки комп'ютерного зору OpenCV на C++(у випадку з Raspberry — Python)- знання принципів роботи алгоритмів допоможе Вам оцінити складність і здійснимість завдання, ще до початку її виконання, а також оптимізувати алгоритми в критичних місцях. Навіть якщо Ви будете користуватися в основному бібліотечними функціями — вони добре оптимізовані, і навряд чи ви з нуля напишете краще — Ви зможете оптимізувати якісь параметри, які незначно впливають в конкретному випадку на рішення вашої задачі, але значно впливають на швидкість її рішення — у загальному повертаючись до холивару — «потрібна програмісту математика» — В даному випадку потрібна, так що раджу трохи напружити звивини і розбиратися хоча б поверхово в роботі алгоритмів.

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


Складові частини робота
image
Навряд чи у Вас під рукою опиняться 1 в 1 ті ж деталі, що і в мене, якщо захочете повторити — тому буду описувати загальну концепцію, а ви вже дивіться самі.

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

image

Контролер двигунів
В якості контролера двигунів можна використовувати будь-мікроконтролер, у мене використовується Arduino nano — тому що просто попалося під руку.
Можливо виникне питання — чому б не управляти безпосередньо з Raspberry? Справа в тому, що у оперционной системи квант часу набагато більше, ніж у мікроконтролера, крім того немає апаратних ШІМов, плюс, якщо ми захочемо поліпшити управління двигунами за допомогою зворотного зв'язку і Теорії Управління — це зажадає обчислювальних витрат і більш швидкої реакції — тому керуюча двигунами частина і мозок робота розділені — arduino просто отримує по UART команду — з якими швидкостями і напрямками мозок б хотів, щоб крутилися двигуни — як це буде досягатися — просто включенням ШИМа з потрібною шпаруватістю чи хитрим управлінням, коли спочатку ми подаємо напругу більше уставки, розкручуючи двигун, а потім вирівнюємо — таким чином прискорюючи розкручування двигуна до потрібної швидкості — все це вже турботи контролера двигунів, а не Raspberry — оскільки це взагалі кажучи завдання набагато більш жорсткого часу — на порядок — два меншого, ніж дозволяє Raspberry, та й взагалі подібні системи.

Драйвер двигунів
Однієї лише ардуинки недостатньо, щоб двигуни закрутилися — струм, що звільнюється ніжкою занадто малий — якщо ми на маленький вихідний транзистор ніжки контролера посадимо обмотку двигуна, потребує струм порядку ампер — то просто влаштуємо КЗ — замкнемо ключ сам на себе-він скоріше всього просто вийде з ладу — тому потрібен більш потужний ключ, що дозволяє пропускати через себе великий струм — якщо нам потрібно крутити двигун в одному напрямку — в загальному то нам досить одного транзистора, але якщо ми хочемо крутити в різних — нам їх вже потрібно 4 — така схема називається H — міст — замикаючи діагональні ключі при закритих інших діагональних — ми можемо змінювати напрямок струму в двигуні.
І така схема необхідна для кожного колеса. На щастя в наш час немає потреби її збирати — вона реалізована у вигляді інтегральних мікросхем, яких безліч, так що підійде будь-яка, здатна керувати струмом, потрібне вашому двигуну. У мене використовується ось такий двоканальний від pololu:

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

Загалом з'єднавши таким чином Arduino, драйвер двигунів, двигуни і батарейку(або просто який-небудь джерело струму на довгому дроті) можете вже починати гратися з управлінням моторами. Для отримання команд від Raspberry потрібно реалізувати прийом рядки по UART і її парсинг — протокол можете тут придумати якийсь вашій душі завгодно. перераховане вище — основні частини практично будь-якого колісного робота — далі вже починаються варіанти — можете взагалі забити на комп'ютерне зір і зробити робота чисто на Arduino, який, наприклад, їздить по лінії, об'їжджає перешкоди за допомогою датчиків відстані і т.п.

Головний контролер
image
Моє ж завдання — зробити кілька більш інтелектуальну платформу для огляду комп'ютерного зору та теорії управління — так що наступним елементом системи буде одноплатний комп'ютер Raspberry Pi B+ на увазі його невисокої ціни, поширеності і доступності інформації. У збірку Raspbian включений інтерпретатор Python — так що писав програму для робота я на ньому

Камера
image
В якості камери можна взагалі використовувати будь-яку вебку(що я перший час і робив) — у мене використовується 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.Управління роботом, ПІД регулятор, приклади
Питання, зауваження, доповнення, побажання по наступним статтям залишайте в коментарях, очепятки та інше — в лічку

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.