Реалізація алгоритму PID з використанням комп'ютерного зору


10

Я будую автоматичний лабіринт-вирішувач лабіринту та використовую веб-камеру для управління своїм лабіринтом.

На основі пропозицій на інших форумах я намагаюся контролювати рух кулі лабіринту хоча б в одному напрямку в даний момент. Отже, я намагаюся керувати рухом м’яча між двома координатами 466,288 і 466,152. Вхід на плату контролера крокового двигуна - час, кількість кроків для обертання для кожної осі, тобто x і y.

Плата контролера крокового двигуна, якою я користуюся, - це плата контролера крокового двигуна яєчного бота: http://www.sparkfun.com/products/10025

Тож, щоб рухатись між двома точками, я повинен створити декілька точок шляху між двома точками, а саме 288 та 152 (скажімо, 260 240 230 ... 150) і відкоригувати свій рух м'яча?

Мій алгоритм обробки зображень недостатньо швидкий для того, щоб відслідковувати кулю, що м'яч просто би крутився і потрапляв у лунку.

Деякі запропонували використовувати стандартний шаблон, як показано на наступному відео, і виправити рухи м'яча для відхилення шляху:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

Я також натрапив на інструмент для обробки зображень, де вони вирішили ту саму проблему, використовуючи точки руху для руху м’яча. Бачачи занадто багато рішень однієї і тієї ж проблеми, я повністю заплутаний у вирішенні проблеми. Мені відомо, що я повинен реалізувати PID-контролер. Але як я повинен вирішувати проблеми поетапно? Я застряг і просто засмучений у пошуку головної частини у вирішенні проблеми.

Моя установка виглядає так:

картинка налаштування

... і ось скріншот мого програмного забезпечення:

скріншот

Версія 2: Зараз я також зіткнувся з новою проблемою: раніше я керував кроковими двигунами через аплет Java для серійного порту Arduino. Я вмію водити степери за допомогою аплету.

Мені доводиться скидати плату щоразу, коли я намагаюся спілкуватися через послідовний порт. Також кроковий двигун заряджає себе невеликими інтервалами, коли на нього не надсилається жодна команда. Коли кроковий двигун переходить у цей режим, я не можу керувати своєю платою, не скидаючи плату. Будь-яка допомога буде вдячна.

Версія 3:

Я досяг певного прогресу там, де я реалізував алгоритм PID. Знайдіть відео нижче: http://www.youtube.com/watch?v=MEfp7RqPmqY

Тепер у мене є проблема зі швидкістю, з якою реалізується алгоритм PID. Насправді моя обробка зображення закінчує цикл у 200 мс, визначає кульку та надсилає команди на плату контролера крокового двигуна. Незважаючи на те, що на мій послідовний порт надсилаються команди для перемикання напрямків, мій степпер продовжує обертатися в тому ж напрямку. Ви можете знайти дивну поведінку у відео вище.

Моя думка полягає в тому, що я повинен обмежувати значення PID стелею, де, якщо обчислене значення PID більше 100, я повинен просто надіслати 100. Я з нетерпінням чекаю ваших думок з цього приводу.

Те, як я реалізував PID-контролер, полягає в тому, що я визначив початкову точку шаблону за допомогою алгоритму відповідності шаблону та визначив кулю за допомогою іншого алгоритму відповідності шаблону. Тепер я змусив м'яч переміститися до центрального шаблону вихідної точки. Як змусити його слідувати прямій лінії з алгоритмом PID?

Версія 4:

Траєкторія Blob ізольовані

Я виділив траєкторію, але я не в змозі знайти правильну функцію для друку правильних координат пікселів від початкової точки. Будь-які думки?


1
Re PS: Тоді просто опублікуйте посилання на зображення, і я впевнений, що хтось прийде і замінить його самим зображенням ...
Majenko

@Matt - виправлено! Однак я вважаю за краще, щоб користувач надав текстові зображення разом із зображеннями, а не лише посиланнями на зображення. Я не впевнений, де їх хотів @Sai, я просто поклав їх на дно.
Кевін Вермер

Нічого ... Чи мають у цих степперів десь достатній крутний момент для переміщення дошки з якоюсь швидкістю? Я сподіваюсь, що десь там знижується передача.
Вонор Коннор

@Fake - У степперів із цим не повинно бути проблем. Дошка не важить багато, а її вага збалансований. У мене настінний годинник з руками 40 см завдовжки, він керується тим же маленьким механізмом, що і будь-який інший, це теж степер. (Механізм 5cmx5cm виглядає смішно маленьким порівняно з діаметром годинника
80cm

@Fake: Стів має рацію. У мене немає степових проблем. Вся справа в алгоритмі PID
Sai

Відповіді:


2

По-перше, оскільки степери чудово позиціонують (немає необхідності у зворотному становищі), ви, звичайно, повинні обмежувати їх рух, як ви самі говорили. Я не впевнений, як зараз сконструйований вал двигуна, але якщо він був закріплений на моторі, дозволяючи йому продовжувати обертання, ризикує пошкодити обладнання.

Далі, затримка транспортування у вашому датчику за 200 мс, ймовірно, буде надто повільною, інакше вам знадобиться багато сповільнити речі, щоб уповільнити саму кульку. Подібно до того, що сказав Rocket Surgeon , вам слід спростити алгоритм обробки зображень, щоб обчислити шлях лише один раз , а потім швидко обчислити лише положення кулі в кожному кадрі. Якщо ви хочете швидко пропустити цей крок, знайдіть червону кулю замість цього, а потім перевірте лише червоний компонент на вашому RGB-зображенні, поки ви не знайдете кращий алгоритм.

Для управління PID почніть з того, що вам фактично потрібні два окремі PID-контролери, один для двигуна схід-захід, другий для північ-південь. Якщо у вас два точних мотора, їх параметри повинні бути рівними.

Щоб діяв PID-контролер, він повинен знати помилку : різницю між бажаним положенням і фактичним положенням кулі. Компоненти X і Y цього зміщення будуть входами для двох PID-контролерів (по одному для кожного двигуна). Щоб отримати помилку, потрібно спочатку мати потрібне положення на своєму шляху: траєкторію .

Щоб отримати траєкторію, потрібно обробити зображення та отримати шлях , а також його початкову та кінцеву точку. Я не впевнений, чи здатний ваш алгоритм відрізнити шлях від решти плати прямо зараз, але якщо ні, зауважте, що це власний алгоритм, який потрібно впоратися, перш ніж продовжувати. Знову ж таки, ви можете пропустити цю частину, ввівши вручну точки з'єднання, якщо ви хочете швидко побачити деякі результати. У будь-якому випадку, ви повинні мати можливість визначити задану швидкість і змусити ваше програмне забезпечення переміщувати потрібну позицію координати по шляху, починаючи від початку до кінця. Очевидно, ви почнете з низькою бажаною швидкістю.

Отже, перш ніж починати з контролю, спочатку слід пройти наступний контрольний список:

  • Спростіть алгоритм обробки зображень для швидшого реагування
  • Створіть алгоритм, який створює траєкторію щодо вашого шляху, використовуючи заздалегідь задану швидкість
  • У кожному кадрі:
    • Обчисліть різницю між траєкторією та положенням кулі
    • Проведіть компонент delta-X до PID схід-захід, пройдіть delta-Y на PID північ-південь

Може виявитися, що краще створити траєкторію по одному відрізку і продовжити з наступним відрізком, коли ця куля закінчить попередній. В іншому випадку вам потрібно буде подбати про те, щоб м'яч не переступив потрібну траєкторію (що може бути важко виконати)


1

Якщо ви маєте фіксовану позицію для зчитування камери та мометаріуму для обох осей, то вам не потрібно розпізнавати намальовані доріжки, отвори та стіни у рамах. Це можна зробити одним знімком під час налаштування. Під час роботи вам може знадобитися лише визначити точне розташування одного блискучого металевого кульки.

Для спостереження за кулькою можна використовувати 1 фіксований ІК світлодіодний фільтр та вузькосмуговий фільтр на камері. Алгоритм повинен обчислити найяскравіший піксель і перевести X, Y в реальний X, Y з урахуванням таких кроків, як:

  • знайти найяскравіший піксель
  • використовуйте кут для обох осей (зчитування з сервоприводу), щоб відновити відстань від камери
  • використовувати часову позначку для зчитування положення осей
  • застосовувати інтерполяцію через час для читання позиції, якщо це необхідно
  • використовувати відомі спотворення лінзи
  • перевести світ X, Y пікселя до кута відображення від ідеальної сфери, щоб знайти справжній центр кулі у світі X, Y
  • дельта-час для відновлення справжнього часу кадру
  • інтерполяція в часі положення в площині X, Y, якщо потрібно
  • відправити результат X, Y (t) в алгоритм PID
  • відправити другу ціль подачі X, Y (t) з генератора / послідовності траєкторій
  • нехай PID вирішує питання про вихід
  • виконати вихід (останні кроки можна зробити паралельно)

Він не повинен бути обчислювально інтенсивним і в основному залежить від пари абсолютних значень.

Зазвичай невеликий процесор повинен робити це з темпом кадрів.


Я не впевнений, що розумію ваше рішення. Я вважаю ваше рішення цікавим. Як я можу забезпечити, щоб мій м'яч йшов правильним шляхом? Чи слід переконатися, що у мене є набір шляхових точок, які слід дотримуватися?
Сай

Так. Програмне забезпечення управління рухом завжди повинно мати "генератор траєкторій", який є звичайним способом, що забезпечує ідеальну кінцеву послідовність X, Y (t) для будь-якого даного етапу часу. Ця послідовність подається на перший вхід контуру управління, другий вхід контуру управління - послідовність реальних позицій. Контрольна програма повинна обчислювати помилки положення / швидкості / прискорення та підсилювати / підсумовувати всі помилки відповідно до PID та створювати результуючі коректуючі сигнали.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.