Як я можу використовувати бібліотеку PID Arduino для керування роботом по прямій лінії?


19

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

На концептуальному рівні (якщо припустити, що двигуни не відповідають однаково рівню ШІМ), як я можу реалізувати PID-контроль, щоб він рухався по прямій лінії зі швидкістю, пропорційною відстані, що залишилася для проїзду?


Це питання має своє місце і тут, оскільки воно спеціально базується на бібліотеці PID Arduino .
Anindo Ghosh

Відповіді:


18

Особливості

Дивлячись на базовий приклад PID, я думаю, що вам потрібно створити дві копії PID-контролера, по одній на кожне колесо, кодер і pwm:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);

Потім у вашому loop()еквіваленті ви просто читаєте обидва кодери, передаєте кожне значення кодера у відповідне PIDі, нарешті, виписуєте обидва значення ШІМ.

Наразі SetpointLeftі SetpointRightнасправді можна вказати на одне значення, але визначення їх окремо, як це, дозволяє додати можливість повернути пізніше.

Поняття

Хоча це може працювати в основному випадку, чи достатньо це насправді, залежить від того, наскільки точно вам потрібна пряма лінія.

Мертвий розрахунок

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

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

Визначення відносної позиції

Як пропонує Джон , можливо, ви зможете використовувати акселерометр для визначення положення, але зважаючи на їх точність та вплив накопичених помилок з часом, можливо, вам буде краще використовувати дані акселерометра для виявлення та виправлення прослизання коліс.

У мобільній робототехніці методи фільтрації Кальмана зазвичай використовуються для сплавлення даних з різних джерел, таких як акселерометр та колісні кодери для кращого визначення поточного положення.

Все , що ви робите з відносним визначенням позиції , однак, з часом положення ви вважаєте себе в буде віддалятися від фактичного фізичного стану.

Визначення абсолютної позиції

Єдиний спосіб обійти це - мати орієнтир поза межами системи відліку ваших транспортних засобів.

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

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

Ще одним варіантом, якщо вам потрібно, щоб ваш робочий автомобіль рухався по прямій лінії на сотні метрів, - це перейти на іншу техніку, наприклад, додати щит Arduino GPS .

Поєднання технік

Зрештою, залежно від ваших вимог до точності, можливо, вам буде потрібно використовувати комбінацію цих методів.

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

Тут є маса варіантів, і те, що ви вибрали, залежатиме від того, що вам потрібно.


1

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


0

Як було сказано вище, ви починаєте, кажучи кожному колесу рухатися з однаковою швидкістю, а потім PID переконується, що вони працюють з такою швидкістю. Але це НЕ буде ідеальним. Потрібно постійно перевіряти та виправляти помилки (1), періодично читати та порівнювати кількість кодувальників двох коліс та змусити одне колесо пройти трохи швидше, якщо потрібно, щоб підрахунок був рівним. і (2) кодери НІКОЛИ не ідеальні, вам потрібен акселерометр і компас.

Ви дивитесь фільтр Кальмана. якщо ви хочете поєднати дані кодера, компаса та акселерометра, щоб дати вам заголовок.


0

Це посилання дає хороший приклад без двох розрахунків PID. Крім того, ви можете застосувати іму / компас для вимірювання прямого шляху

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.