Особливості
Дивлячись на базовий приклад 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 .
Поєднання технік
Зрештою, залежно від ваших вимог до точності, можливо, вам буде потрібно використовувати комбінацію цих методів.
Якщо можливий направляючий промінь, ви можете зробити те, що хочете, дуже просто невидимою лінією за наступною технікою . Якщо вам потрібно рухатися будь-якою довільною прямою лінією в обмеженій області, то, як і кімнатна кімната, ви, можливо, зможете використовувати пару направляючих балок (під прямим кутом один до одного), щоб дозволити виправити своє синтезоване положення на одній декартовій осі кожен раз, коли робот проходить один з променів.
Тут є маса варіантів, і те, що ви вибрали, залежатиме від того, що вам потрібно.