PID регулирование двигателей робота

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

PID регулирование двигателей робота

Сообщение Lockdog » 10 сен 2015, 14:25

Добрый день!
Помогите, плиз, разобраться. Есть робот, который должен двигаться вдоль стены на заданном расстоянии, сбоку стоят два сонара спереди и сзади, которые смотрят на стену. Есть два мотора: слева и справа, с ШИМ управлением. Как построить пид регулятор, чтобы всё время робот двигался на заданном расстоянии от стены? Всем спасибо :)
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

Re: PID регулирование двигателей робота

Сообщение dccharacter » 10 сен 2015, 17:12

Вот тут boez все разжевывает: forum16/topic9781.html
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: PID регулирование двигателей робота

Сообщение Lockdog » 10 сен 2015, 18:02

Неправильно я наверное выразился. Что такое пид и как работает я в курсе. Но я хочу понять, как управлять двумя моторами с двумя датчиками - для каждого мотора свой пид или есть что-то более изящное?
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

Re: PID регулирование двигателей робота

Сообщение linvinus » 10 сен 2015, 18:37

Полагаю ещё наверное желательно двигаться равномерно вдоль стены?

должно быть несколько уровней управления.

Самый низкий - управляет моторами

Для каждого мотора:
1) получает на вход требуемую скорость вращения колеса
Далее зависит от конструкции, где у вас стоят энкодеры, если на самом колесе то манипулировать данными с энкодера не нужно.
Если энкодеры на моторе или между мотором и колесом (на промежуточной шестерне), то требуемую скорость колеса нужно привести к скорости энкодера через передаточное число редуктора

2) Считывает текущую скорость вращения колеса с энкодера и вычисляет ошибку
2) пропускает ошибку через пид регулятор получает значение ШИМ для мотора
3) Заносит новые значение ШИМ в таймер.

Более высокий уровень, оперирует в абсолютных координатах (V - линейная скорость, W - угловая )
1) получает на вход требуемое расстояние до стены, желаемую линейную скорость V (как быстро ехать)
2) вычисляет текущее расстояние до стены
3) пропускает через пид регулятор, ошибку расстояния до стены, получает W куда двигаться лево-право и как быстро
4) вычисляет какая скорость должна быть у каждого колеса чтобы получить необходимый вектор {V,W}
5) передаёт новые скорости колёс на уровень ниже.
Подробнее про управление тут
mobile_robot_control.pdf
(277.21 КиБ) Скачиваний: 0

Еще подробнее тут Уравнения движения роботов с двумя независимыми ведущими колёсами
fpm918.pdf
(1.58 МиБ) Скачиваний: 0
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: PID регулирование двигателей робота

Сообщение Lockdog » 10 сен 2015, 18:40

Спасибо за ответ. На колёсах энкодеров нет, то есть обратная связь только через сонары.
Аватара пользователя
Lockdog
 
Сообщения: 650
Зарегистрирован: 06 июл 2006, 20:42
Откуда: Москва
прог. языки: C/C++, Python

Re: PID регулирование двигателей робота

Сообщение linvinus » 10 сен 2015, 18:46

Lockdog писал(а):Неправильно я наверное выразился. Что такое пид и как работает я в курсе. Но я хочу понять, как управлять двумя моторами с двумя датчиками - для каждого мотора свой пид или есть что-то более изящное?

Более изящное, наверное, реализовать аналоговый пид.

Можно попробовать так
L0 - необходимое расстояние
L1 - расстояние спереди
L2 - расстояние сзади
K - коэффициент угловой скорости (подбирается эмпирически , можно начать с 1)
ШИМ_V - линейная скорость приведённая к ШИМ.
датчики по правому борту робота.
То
ШИМ_L = ШИМ_V - (L0-L1)*K
ШИМ_R = ШИМ_V - (L0-L2)*K

формула не вовсех случаях верна, лень просчитывать, самое простое отдельно для четырёх вариантов проработать
L1>L0 && L2>L0,
L1>L0 && L2<L0,
L1<L0 && L2>L0,
L1<L0 && L2<L0,


ещё можно
(L0-L1)*K заменить на ПИ или ПИД регулятор. pid(L0,L1)

Только нужно проверять что L1 и L2 находятся в пределах диапазона (стена видна) иначе стоп.
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1672
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: PID регулирование двигателей робота

Сообщение Myp » 11 сен 2015, 10:50

а зачем пид? инерционности то вроде нет.
есть всего 4 варианта, то есть просто проверяем 4 условия в цикле, и корректируем шим моторов пропорционально погрешности в каждом условии.
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: PID регулирование двигателей робота

Сообщение dccharacter » 11 сен 2015, 18:18

Т.е. ПИД только с Ki и Kd равными нулю?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: PID регулирование двигателей робота

Сообщение Radist » 26 окт 2015, 19:50

Давайте рассмотрим эту задачу по простому, может и без шима обойдемся. Представим, что сонары дают расстояние в миллиметрах. Стена для определенности слева. Передний сонар показывает 100 мм, задний - 99, значит робот смотрит от стены. Включаем правый мотор, а выключим его когда передний сонар покажет 99 - робот стал параллельно стене.Теперь включаем левый мотор, а выключаем его когда передний сонар покажет 100 мм. Повторить нужное количество раз. Включение и выключение - чем не ШИМ? ПИД регулятор выродился в позиционный (П=много, время интегрирования бесконечно, время дифференцирования равно 0). Дополнительный бонус - задний радар не нужен - можно в два раза больше роботов сделать. Не напоминает движение пылесоса вдоль плинтуса? Первые модели щупали стену контактным бампером, те, что понавороченней - щупают стену бесконтактным датчиком.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 10