- Необхідне обладнання:
- Вимога до програмування:
- Налаштування обробки на Raspberry Pi:
- Кругова діаграма:
- Програма відстеження кульки Raspberry Pi:
- Робота робота з відстеження кульок Raspberry Pi:
Галузь робототехніки, штучного інтелекту та машинного навчання стрімко розвивається, що в найближчому майбутньому обов’язково змінить спосіб життя людства. Вважається, що роботи розуміють і взаємодіють із реальним світом за допомогою датчиків та обробки машинного навчання. Розпізнавання зображень - це один із популярних способів, коли роботи вважають, що вони розуміють об’єкти, дивлячись на реальний світ через камеру, як і ми. У цьому проекті дозвольте використати силу Raspberry Pi для створення робота, який міг би відслідковувати м’яч і слідувати за ним так само, як роботи, які грають у футбол.
OpenCV - це дуже відомий інструмент із відкритим кодом, який використовується для обробки зображень, але в цьому посібнику для спрощення роботи ми використовуємо IDE для обробки. Оскільки обробка для ARM також випустила бібліотеку GPIO для обробки, нам більше не доведеться переходити від python до обробки для роботи з Raspberry Pi. Звучить круто, правда? Тож давайте почнемо.
Необхідне обладнання:
- Raspberry Pi
- Модуль камери зі стрічковим кабелем
- Шасі робота
- Редукторні двигуни з колесом
- Драйвер двигуна L293D
- Банк живлення або будь-яке інше портативне джерело живлення
Вимога до програмування:
- Монітор або інший дисплей для Raspberry pi
- Клавіатура або миша для Pi
- Обробка програмного забезпечення ARM
Примітка: Під час програмування дисплей повинен бути підключений до Pi через дроти, оскільки лише тоді можна переглядати відео з камери
Налаштування обробки на Raspberry Pi:
Як вже було сказано раніше, ми будемо використовувати середовище обробки для програмування нашого Raspberry Pi, а не спосіб використання за замовчуванням python. Отже, виконайте наведені нижче дії.
Крок 1: - Підключіть Raspberry Pi до монітора, клавіатури та миші та увімкніть його.
Крок 2: - Переконайтеся, що ви Pi підключений до активного з’єднання з Інтернетом, оскільки ми збираємось завантажити кілька речей.
Крок 3: - Клацніть на Processing ARM, щоб завантажити IDE для обробки для Raspberry Pi. Завантаження буде у вигляді ZIP-файлу.
Крок 4: - Після завантаження витягніть файли з папки ZIP у бажаному каталозі. Я просто витягнув його на своєму робочому столі.
Крок 5: - Тепер відкрийте витягнуту папку та натисніть на файл із назвою обробка. Він повинен відкрити вікно, як показано нижче.
Крок 6: - Це середовище, де ми будемо вводити наші коди. Для людей, які знайомі з Arduino, не дивуйтеся ТАК IDE дійсно схожа на Arduino, як і програма.
Крок 7: - Нам потрібні дві бібліотеки, щоб наша програма, що працює за наступною програмою, працювала, і для встановлення натисніть кнопку Ескіз -> Імпорт бібліотеки -> Додати бібліотеку . Відкриється наступне діалогове вікно.
Крок 8: - Використовуйте верхнє ліве текстове поле для пошуку Raspberry Pi і натисніть Enter, результат пошуку повинен виглядати приблизно так.
Крок 9: - Шукайте бібліотеки з назвою “GL Video” та “Hardware I / O” та клацніть на install, щоб встановити їх. Обов’язково встановіть обидві бібліотеки.
Крок 10: - На основі вашого Інтернету встановлення займе кілька хвилин. Після цього ми готові до програмного забезпечення для обробки.
Кругова діаграма:
Принципова схема цього проекту відстеження кульок Raspberry Pi наведена нижче.
Як бачите, схема включає камеру PI, модуль драйвера двигуна та пару двигунів, підключених до Raspberry pi. Повна схема живиться від мобільного енергобанку (представлений батареєю AAA у схемі вище).
Оскільки деталі штифтів не згадуються на Raspberry Pi, нам потрібно перевірити шпильки, використовуючи малюнок нижче
Для керування двигунами нам потрібні чотири штифти (A, B, A, B). Ці чотири висновки з'єднані з GPIO14,4,17 та 18 відповідно. Помаранчевий і білий провід разом утворюють з'єднання для одного двигуна. Отже, у нас є дві такі пари на два мотори.
Двигуни підключені до модуля драйвера двигуна L293D, як показано на малюнку, а модуль драйвера живиться від блоку живлення. Переконайтеся, що заземлення блоку живлення підключено до заземлення Raspberry Pi, лише тоді ваше з’єднання буде працювати.
Це все, що ми закінчили з нашим апаратним з’єднанням, повернемося до нашого середовища обробки та почнемо програмувати, щоб навчити нашого робота відстежувати м’яч.
Програма відстеження кульки Raspberry Pi:
Повна Програма обробки даного проекту наведена в кінці цієї сторінки, яку ви безпосередньо використовуєте. Далі трохи нижче, я пояснив роботу коду, щоб ви могли використовувати його для інших подібних проектів.
Концепція програми дуже проста. Хоча метою проекту є відстеження м’яча, ми насправді не збираємося це робити. Ми просто збираємося ідентифікувати кульку, використовуючи її колір. Як ми всі знаємо, відео - це не що інше, як безперервні кадри зображень. Отже, ми беремо кожен знімок і ділимо його на пікселі. Потім ми порівнюємо кожен колір пікселя з кольором кулі; якщо збіг знайдений, то можна сказати, що ми знайшли м'яч. За цією інформацією ми також можемо визначити положення кулі (колір пікселя) на екрані. Якщо позиція вкрай ліва, ми рухаємо робота вправо, якщо позиція вкрай праворуч, ми рухаємо робота вліво, щоб позиція пікселя завжди залишалася в центрі екрана. Ви можете подивитися відео Computer Vision Даніеля Шиффмана, щоб отримати чітке зображення.
Як завжди, ми починаємо з імпорту двох завантажених бібліотек. Це можна зробити за допомогою наступних двох рядків. Бібліотека апаратного вводу-виводу використовується для доступу до виводів GPIO PI безпосередньо із середовища обробки, бібліотека glvideo - для доступу до модуля камери Raspberry Pi.
обробка імпорту.io. *; імпортувати gohai.glvideo. *;
Усередині функції налаштування ми ініціалізуємо вихідні штифти для управління двигуном, а також отримуємо відео з камери pi і розмірюємо його у вікні розміром 320 * 240.
void setup () {size (320, 240, P2D); відео = новий GLCapture (цей); video.start (); trackColor = колір (255, 0, 0); GPIO.pinMode (4, GPIO.OUTPUT); GPIO.pinMode (14, GPIO.OUTPUT); GPIO.pinMode (17, GPIO.OUTPUT); GPIO.pinMode (18, GPIO.OUTPUT); }
Порожнеча нічия , як нескінченний цикл код всередині цього циклу буде виконувати до тих пір, як програма завершується. Якщо джерело камери доступне, ми читаємо відео, яке виходить з нього
void draw () {background (0); if (video.available ()) {video.read (); }}
Потім ми починаємо ділити відеокадр на пікселі. Кожен піксель має значення червоного, зеленого та синього. Ці значення зберігаються у змінних r1, g1 та b1
for (int x = 0; x <video.width; x ++) {for (int y = 0; y <video.height; y ++) {int loc = x + y * video.width; // Що таке поточний кольоровий колір currentColor = video.pixels; float r1 = червоний (currentColor); float g1 = зелений (currentColor); float b1 = синій (currentColor);
Щоб спочатку виявити колір кулі, ми повинні натиснути на колір. Після натискання колір кульки зберігатиметься у змінній, яка називається trackColour .
void mousePress () {// Зберегти колір там, де клацне миша, у змінній trackColor int loc = mouseX + mouseY * video.width; trackColor = video.pixels; }
Як тільки ми отримаємо колір доріжки та поточний колір, ми повинні їх порівняти. У цьому порівнянні використовується функція dist. Він перевіряє, наскільки близький поточний колір до кольору доріжки.
float d = dist (r1, g1, b1, r2, g2, b2);
Значення дист буде дорівнює нулю для точної відповідності. Отже, якщо значення dist менше за вказане значення (світовий рекорд), то ми припускаємо, що ми знайшли колір треку. Тоді ми отримуємо місце розташування цього пікселя і зберігаємо його у змінній, найближчій X та найближчій Y, щоб знайти місце розташування кулі
якщо (d <worldRecord) {worldRecord = d; найближчіX = x; найближчіY = y; }
Ми також малюємо еліпс навколо знайденого кольору, щоб вказати, що колір знайдений. Значення позиції також друкується на консолі, це дуже допоможе під час налагодження.
if (worldRecord <10) {// Накресліть коло на заливку відстежуваного пікселя (trackColor); ударна вага (4,0); інсульт (0); еліпс (найближчийX, найближчийY, 16, 16); println (найближчийX, найближчийY);
Нарешті, ми можемо порівняти положення найближчого X та найближчого Y та відрегулювати двигуни таким чином, щоб колір потрапляв у центр екрану. Наведений нижче код використовується для повороту робота вправо, оскільки виявлено, що положення кольору X знаходиться в лівій частині екрана (<140)
якщо (найближчеX <140) {GPIO.digitalWrite (4, GPIO.HIGH); GPIO.digitalWrite (14, GPIO.HIGH); GPIO.digitalWrite (17, GPIO.HIGH); GPIO.digitalWrite (18, GPIO.LOW); затримка (10); GPIO.digitalWrite (4, GPIO.HIGH); GPIO.digitalWrite (14, GPIO.HIGH); GPIO.digitalWrite (17, GPIO.HIGH); GPIO.digitalWrite (18, GPIO.HIGH); println ("Повернути праворуч"); }
Подібним чином ми можемо перевірити положення X та Y для управління двигунами у необхідному напрямку. Як завжди, ви можете переглянути повну програму внизу сторінки.
Робота робота з відстеження кульок Raspberry Pi:
Після того, як ви готові з апаратним забезпеченням та програмою, пора розважитися. Перш ніж тестувати наш бот на землі, ми повинні переконатися, що все працює нормально. Підключіть свій Pi до монітора та запустіть код обробки. Ви повинні побачити відеопоток у маленькому вікні. Тепер занесіть кульку всередину кадру та натисніть на неї, щоб навчити робота, що він повинен відстежувати саме цей колір. Тепер перемістіть кульку по екрану, і ви помітите, як обертаються колеса.
Якщо все працює належним чином, відпустіть бота на землю і почніть з ним грати. Переконайтесь, що кімната рівномірно освітлена для досягнення найкращих результатів. Повна робота проекту показана у відео нижче. Сподіваюся, ви зрозуміли проект і сподобалося будувати щось подібне. Якщо у вас виникли проблеми, не соромтеся розмістити їх у розділі коментарів нижче або допомогти.