Підхід до використання PID, щоб отримати диференціальний керування роботом прямо


13

Розглянемо робот диференціального приводу, який має два моторизовані колеса з кодером, прикріпленим до кожного для зворотного зв'язку. Передбачається, що існує функція для кожного двигуна постійного струму, який приймає поплавок від -1 до 1 і встановлює сигнали ШІМ, щоб забезпечити пропорційну кількість потужності цього двигуна. На жаль, не всі двигуни створюються однаковими, тому передача кожному двигуну однакового ШІМ-сигналу робить робота веера вліво або вправо. Я намагаюся подумати про те, як керувати роботом прямо, використовуючи кодери, приєднані до кожного двигуна, як вхід до циклу PID.

Ось як я це зробив: я б взяв різницю між лівим і правим кодерами, зв'язав помилку між деяким діапазоном, нормалізував би її від [-1, 1], а потім відзначив її на потужність двигуна 0 до 1. Отже, якщо я і D були нульовими, і ми отримуємо помилку 1 (тому лівий мотор повернувся набагато більше, ніж правий мотор), тоді лівий мотор буде встановлений на 0, а правий на мотор - на 1 (спричиняючи важкий зліва).

Чи є з цим проблеми? Який кращий підхід?

Відповіді:


5

Чи є з цим проблеми?

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

Який кращий підхід?

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

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

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

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

Одна з проблем полягає в тому, що навіть якщо ваше ліве і праве колеса переміщаються на 1000 кодерів, ви все одно можете опинитися в іншому положенні на двох різних пробігах.

Наприклад, скажімо, що ви маєте максимум наступних помилок у 10 підрахунках кодерів, і ваші двигуни працюють зі швидкістю, наприклад 10 підрахунків кодера за ітерацію циклу PID. Ваш лівий мотор може рухатися 5,10,10,10 ... 10,5, а правий мотор може мати профіль 4,11,10,10 ... 10,5 і навіть незначну різницю в прискоренні на старті рух може призвести до того, що робот рушив трохи в неправильному напрямку. Мало того, але чим далі ви рухаєтесь у цьому напрямку, тим більшою буде помилка в абсолютних показниках. Це те, про що ми говоримо, коли ми говоримо про помилку Abbe , і без складної кінематичної моделі чи якоїсь зовнішньої посилання ви ніколи не зможете її виправити.

Для отримання додаткової інформації дивіться мою відповідь на подібний, але не зовсім повторюваний питання: Як я можу використовувати бібліотеку PID Arduino для керування роботом по прямій лінії? і моя відповідь на також пов'язану оптимізацію послідовника рядків


2

У мене є бот з 2 незалежно керованими колесами.

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

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

Наприклад, я встановив швидкість на 50%, а заголовок - на 20 градусів. це, як правило, приводить в рух обидва мотора з 50% потужністю. але коли заголовок відхиляється, PID вноситиме корективи, додаючи деяку потужність одному двигуну та відбираючи деяку потужність від іншого, так що ви можете в кінцевому підсумку з 45% / 55% розділити потужність між двигунами, як pid коригує заголовок.

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

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


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

Ось посилання на мій код, я боюся, що це може бути непросто зрозуміти. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Роберт Саттон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.