Алгоритм ПИД для лайн-трейсера

Автомат, адаптивный автомат ... разум

Алгоритм ПИД для лайн-трейсера

Сообщение Radist » 07 май 2010, 06:54

Перед созданием темы я поизучал имеющиеся материалы, касающиеся лайн-трейсеров. Кроме того, мне по работе приходилось иметь дело с ПИД регуляторами. Сейчас у меня пока нет своего лайн-трейсера, механика еще не готова, да и пока я занимаюсь другим роботом, поэтому проверить алгоритм на практике я не имею возможности. Может кто-то заинтересуется и проверит, а может в результате обсуждения выяснится, что алгоритм никуда не годится. Приступим.

Для начала о том, сколько датчиков, на каком расстоянии, в линию или нет.
Один датчик - отслеживание края линии. Регулировать тут нечего. Два датчика, линия между ними - постоянный поиск линии между датчиками. Регулировать также нечего. Три датчика, один на линии и два по бокам - вот тут уже можно развернуться. Практически все используют такую конструкцию: нечетное число датчиков, один на линии, остальные по бокам. Ставят и 5 датчиков, и 7. По моему это экстенсивный путь развития. Предлагаемый алгоритм будет рассматривать работу с тремя датчиками. Ширина линии 20 мм, расстояние между датчиками 15 мм (чтоб при уходе линии срабатывали два датчика), это расстояние тоже многие делают именно таким. Про расположение датчиков в линию, треугольником или обратным треугольником я пока не думал (может вместе придем к лучшему варианту), поэтому пусть датчики будут в ряд.

Теперь пару слов о классическом ПИД регуляторе температуры. Есть уставка, есть измеренное значение, их разность называется ошибкой (невязкой, рассогласованием). Сигнал управления складывается из трех составляющих: пропорциональная (ошибка умножается на коэффициент пропорциональности), интегральная (все ошибки суммируются с учетом знака, результат делится на время интегрирования), диференциальная (разность между соседними ошибками (суть производная) умножается на время дифференцирования). Пропорциональная составляющая имеет ускоряющую суть, интегральная - сглаживающую суть, диференциальная держит в узде пропорциональную составляющую (когда она растет - уменьшает ее, когда падает - не дает падать быстро). На печке ПИД регулятор работает отлично, все просто и понятно. Чем печка отличается от моторчика? В первую очередь инерционностью. Моторчик гораздо менее инерционный. Да и показания от датчиков трудно понять как перевести в сигнал управления.

Подбираемся помаленьку к сути. Есть три датчика, информация на них будет такая:
010 - положение при старте
как будут меняться данные при уходе линии вправо
010
011
001
000
и при уходе линии влево
010
110
100
000
От датчиков мы имеем информацию о стороне, о степени ухода линии (3 градации) и о времени между изменениями.
Как вы знаете, любой ПИД регулятор перед работой требует настройки. Есть разные способы (мне лично известны три), но они все хорошо работают с инерционными объектами типа "печь". Настройку регулятора лайн-трейсера можно обсудить дополнительно, сейчас у меня этой методики нет. Но всегда можно настроить подбором коэффициентов. Теперь расскажу, что на что будет влиять.
Есть два параметра, определяемых пользователем. Это период опроса датчиков и период ШИМ. Логично предположить, что период ШИМ должен быть меньше периода опроса, далее будет понятно почему. Зададимся также пределами изменения ШИМ. Сверху понятно что 100%, а вот снизу - тут надо подумать. Это уже настраиваемый параметр системы и он зависит от системы. Некоторые моторчики при низком ШИМ вообще не крутятся, а значит делать его очень низким нельзя (например при ШИМ 50% колесо практически не крутится). С другой стороны, поднимать нижнюю границу ШИМ тоже чревато - увеличится радиус поворота. Для определенности в качестве примера пусть пределы ШИМ будут 70 - 100%. Частота опроса 100 раз в секунду (период 10 мс), частота ШИМ 1 кГц, период 1 мс.
Вводим коэффициент пропорциональности. Если линия ушла вправо, то надо увеличить скорость левого колеса (а если она уже 100%, то уменьшить скорость правого колеса). Пусть за один период опроса датчиков ШИМ меняется на 10 % при отклонении на одну условную единицу (это и есть коэффициент пропорциональности). За время между опросами пройдет 10 периодов ШИМ, в каждом из них он будет изменяться на 1% (помним, что за плавность отвечает интегральная составляющая).

При старте оба мотора были при ШИМ 100 % (это же гонки!). Вот линия ушла вправо. Как резко она ушла - зависит от системы. Естественно она не должна уйти так: 010 -> 000. К следующему циклу измерения ШИМ правого моторчика станет 90/80/70 % в зависимости от скорости ухода линии. Если параметры регулятора подобраны правильно, то робот должен вернуться на линию (а может поворачивать так плавно, что и не вернется на линию). Робот вернулся на линию (010), а такая комбинация говорит, что делать ничего не надо. Но ШИМ моторов разный, значит линия уйдет влево (110 к примеру). Алгоритм продолжает свою работу: если линия ушла влево, то увеличиваем ШИМ правого моторчика (теперь это возможно). Но пока ШИМ увеличивался, робот с линии немного съехал, а значит потом будет уменьшаться ШИМ левого мотора. Плавность налицо, а амплитуда виляния по линии напрямую зависит от настройки регулятора.

Пока я ничего не сказал про дифференциальную составляющую. Печки неплохо работают и с ПИ регуляторами, думаю и робот тоже будет и без дифференциальной составляющей ездить. Как же сюда ввести дифференциальную составляющую? Я думаю так: через число циклов измерения, когда происходит смена данных. Вот мы едем по прямой, и у нас 10 раз подряд данные 010. Потом линия ушла вправо, данные стали таким (к примеру): 011 011 011 010. Смотрю на этот пример и думаю: что должна сделать диф. составляющая? Увеличить рассогласование ШИМ? По идее надо уменьшать. Но чтобы все работало плавно - нужна честная производная, а у нас конечные разности. Ну пусть даже конечные разности. При переходе от 010 к 011 диф. составляющая вносит свою лепту: пропорциональная составляющая за цикл изменяет ШИМ не на 10 %, а на 5%. Еще плавнее получается.

Ну и в конце резюмирую, какие параметры нужно подобрать:
-период опроса датчиков
-период ШИМ
-ограничение ШИМ снизу
-на сколько процентов изменять ШИМ за один цикл опроса при разных отклонениях (в моем примере на 10/20/30 %)
-на сколько процентов изменять ШИМ за один цикл опроса при изменении отклониния (диф. составляющая).

Вроде в общих чертах все. Рассчитываю на конструктивное обсуждение.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Алгоритм ПИД для лайн-трейсера

Сообщение Michael_K » 07 май 2010, 07:50

Что тут обсуждать? Робот роботу рознь.

Вы начали со странных (как минимум далеко не очевидных) предпосылок.
Можно и на одном датчике прекрасно ездить с ПИД-ом (например, если датчик аналоговый).
Можно и моторы реверсировать (например, чтобы динамику поворота хорошую получить).

Про составляющие - вообще посыл очень спорный.
Дело в том, что хотя на вход регулятора у вас и поступает положение линии,
на выходе у него - фиг знает что...
Два ШИМА, от которых зависят мощности на валах, от которых зависят скорости,
от которых зависит скорость поворота, от которой зависит угол, от которого
зависит уже наконец положение линии.

Почти каждая из этих зависимостей и нелинейная, и "во времени" (то есть там присутствует dt),
и все эти кривые зависимости сидят в вашей "петле регулирования"... Какое там ПИ, или Д, или ДД
в результате получается - сказать трудно... а тем более рассчитать коэффициенты
(для этого нужно знать очень много параметров, измерить которые не так уж просто)...

Можно и период ШИМ делать больше частоты опроса - какие проблемы-то?

В целом непонятно, какого конструктивного обсуждения вы ждете.
Можно ли сделать так как вы написали? - Конечно.
Будет ли хорошо работать? - Зависит от кучи конкретных условий.
Оценить, не попробовав на конкретном роботе и на конкретной трассе, представляется малореальным.

Я пробовал ПИ - на двух датчиках и с реверсированием движков, у меня работал.
Но это совсем не значит, что такой же пи будет работать на другом роботе, на другой трассе.
И уж конечно не значит, что он оптимален даже для конкретного случая (наверняка можно сделать лучше).
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Алгоритм ПИД для лайн-трейсера

Сообщение Radist » 07 май 2010, 08:47

Согласен. Без информации о реальной скорости (от энкодеров) узнать какой ШИМ к какой скорости приведет - нереально. Но ведь надо от чего то отталкиваться. Можно пройти такой путь от простого к сложному (мысленно):
1 При уходе линии один мотор выключается (или даже реверсируется). Позиционное регулирование, как результат движение рывками.
2 Рассогласование ШИМов пропорциональное отклонению. Пропорциональное регулирование, рывки есть, но меньше.
3 Также рассогласование ШИМ пропорционально отклонению, но изменение не скачком, а за несколько периодов. ПИ регулирование, плавность уже должна быть.

Конечно, придется подбирать эти параметры, и реверсирование тоже можно использовать.
Пока не понял, как регулировать, если период ШИМ будет больше периода опроса. На датчики смотрим часто, видим что линия ушла, меняем ШИМ, и смотрим смотрим смотрим, и видим видим видим, что линия все еще ушла или что ушла еще сильнее. Не понимаю.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Алгоритм ПИД для лайн-трейсера

Сообщение Michael_K » 07 май 2010, 09:19

Конечно нужно отталкиваться.
Примерно так как вы написали и делают.

Только пробовать на другом роботе бесполезно.
Потому что на другом роботе (и линии) будут совсем другие параметры.
На каком-то роботе просто П-составляющая может приводить к "недорегулированию",
а на каком-то к "перерегулированию"... не говоря уже о том, что коэффициенты будут разные,
датчики будут стоять по-разному и т.п.

Поэтому тут обсуждать что-то не имеет особого смысла. Подбирать по месту - самый реальный путь.

"меряем и меряем... ушла и ушла" .... а при этом накапливается И составляющая, например...
Да и усреднять показания датчика тоже не помешает (даже для П) - в общем тут все по-разному и конкретно...
А "общая теория всего"... она неоправданно сложная будет.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Алгоритм ПИД для лайн-трейсера

Сообщение Radist » 07 май 2010, 09:40

Значит опробую этот алгоритм, когда соберу механику. Я планирую в качестве мозга ATTINY25, у нее всего 5 ног ввода вывода. Две на моторы, три на датчики. Поэтому я ничего не писал про реверс - у меня не будет моста, поэтому и три датчика. Хочется сделать дешево и сердито.

Спасибо за обсуждение :) .
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Алгоритм ПИД для лайн-трейсера

Сообщение avr123.nm.ru » 07 май 2010, 21:46

Рекомендю ATTINY13 A по 25 рублей всего.
Последний раз редактировалось avr123.nm.ru 18 июн 2010, 07:39, всего редактировалось 1 раз.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Алгоритм ПИД для лайн-трейсера

Сообщение Radist » 07 май 2010, 22:27

Спасибо, конечно, но есть два нюанса. У 13 всего в 2 раза меньше (памяти), всего одно килослово. А так как я работаю разработчиком, у меня есть доступ к нашему складу (в разумных пределах, конечно), а на складе есть тиньки и 25, и 45. Фирма не разорится, у нас много спаянных плат опытных идет на выброс. Это типа боевые потери.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Алгоритм ПИД для лайн-трейсера

Сообщение Radist » 18 июн 2010, 06:40

Пока я все еще безлошадный (безроботный) - продолжаю обдумывать алгоритм. Я пришел к выводу, что если управляющее воздействие - это не длительность импульса ШИМ для каждого мотора в отдельности, а их разность (например расчеты привели к тому, что правый шим 100%, а левый 80%, то разность 20%) - интегральная составляющая не нужна и даже вредна. Ведь она накапливает ошибку. Когда робот вернется на линию и ошибка станет равной нулю - интегральная составляющая будет иметь накопленную ошибку, в результате робот переедет линию, чтобы ошибку компенсировать. Будет виляние по линии. Вообще интегральная составляющая нужна в системах с потерями мощности (печки например). Если потерь нет, то и интегральной составляющей быть не должно. Например, при управлении задвижками используют вместо закона ПИД закон ПДД (вторая Д - вторая производная, скорость изменения скорости изменения рассогласования). И второй вывод, который я сделал (чисто описание простыми словами того, что большинство и так знает):
- когда линия уходит от робота (или робот уходит от линии, но мне так проще) - дифференциальная составляющая прибавляется к управляющему воздействию
- когда линия идет к роботу - дифференциальная составляющая вычитается из управляющего воздействия.

ЗЫ. В качестве управляющего воздействия я считаю разность DUTY ШИМов. Система должна стремиться к тому, чтобы DUTY был как можно ближе к 100% и чтобы ошибка была равной 0.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Алгоритм ПИД для лайн-трейсера

Сообщение avr123.nm.ru » 18 июн 2010, 11:59

Д - в обоих случаях прибавляется просто имеет разный знак.

И - вам не нужна, так как она за точночть установки отвечает.

У вас будет ПД регулятор.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Алгоритм ПИД для лайн-трейсера

Сообщение Radist » 11 окт 2010, 20:03

Много воды утекло с тех пор как я начал эту тему. Теперь у меня есть тележка и я поднабрался некоторых знаний. Я был неправ насчет количества датчиков, поскольку узко мыслил. Суть датчика - получить отклонение от линии. Чем больше градаций - тем лучше. Поэтому выгоднее использовать отражательные оптроны не в дискретном (через компаратор и порог), а в аналоговом виде (через ацп). Чем больше пятно над линией - тем хуже его видно и наоборот. Итак, для работы алгоритма нужно знать отклонение от линии, знать с какой стороны линия, знать на линии мы или потеряли ее. Также нужно знать предыдущее отклонение от линии. Очень удобно отклонения хранить со знаком. Представьте ось Х, начало отсчета - это линия. Если робот левее нуля - отклонение отрицательное (-1 = FF), правее нуля - положительное. Объектом регулирования является разность скоростей колес, но поскольку скорости зависят от шима, считаем что объект регулирования - это разность шимов колес. При этом больший шим всегда максимальный. Если разность больше максимального шима - минимальный шим равен нулю. Интегральная составляющая не нужна, поскольку когда отклонение от линии будет нулевым и предыдущее тоже нулевым - рассогласование шимов будет нулевым и робот поедет прямо с максимальной скоростью. Обозначим текущее отклонение Х1, а предыдущее Х2, тогда формула будет простой:
Y = П*Х1 + Д*(Х2-Х1), где П - коэффициент пропорциональности, Д - коэффициент дифференциальной составляющей. Методика подбора коэффициентов проста:
- задаем максимальную скорость шима (для начала не очень большую, но такую, чтоб робот мог крутиться на одном колесе)
- Д = 0, П - берем произвольно и пускаем робота по прямой к повороту. Если робот не вписывается в поворот - П надо увеличить, если едет резкими дугами - уменьшить.
- найден такой П, при котором робот не теряет линию. Уменьшаем П, увеличиваем Д до тех пор, пока не устроит результат.
- если все получилось - можно увеличить максимальную скорость шима и повторить подбор коэффициентов.

Часто бывает, что полностью реализовать скоростной потенциал не удается.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Алгоритм ПИД для лайн-трейсера

Сообщение Arhat109 » 29 дек 2017, 13:14

А начало было таким интригующим .. 2017г. Ну и как результаты, опыт, где алгоритмы? :D

попробую ответить со своего опыта:

1. Датчики и их расположение. Да, аналоговые не в пример лучше, можно ехать и на одном, но неудобно - все-таки малоинформативно, а как автор писал: чем точнее определяется ошибка от оси линии, тем лучше - это верно.
То есть сколько надо датчиков? Ответ: чем больше - тем лучше, сколько "влезет".

Какое расположение датчиков "оптимально"? А вот тут есть два решения для "цифровых" и "аналоговых" датчиков. С цифровыми - всё просто. Главный датчик (№0) размещаем на оси линии, а вправо и влево от него (+1/-1, +2/-2, ..) боковые на оптимальном расстоянии равном ..

ДВЕ ТРЕТИ от ширины линии. Только в этом случае длительность работы всех состояний датчиков составляет одинаковые периоды при равномерном отклонении машинки от осевой.

А как для аналоговых? .. оставляю любопытным на "самостоятельное решение". :)

Кстати, когда вся линейка датчиков теряет линию .. это тоже можно рассматривать как "следующее" отклонение, можно даже с к-т 1.5 или 2 смотря как управляем - аналогово или "по таблицам" (мне нравится второй вариант - он во первых считается на моделях, а во вторых проще объяснять детишкам)

2. Моторы, ШИМ, мощность или таки скорость? Чем "управляет ШИМ"?
Ответ: ШИМ управляет .. током, который есть момент .. то есть таки "мощность". Но мощность мотора практически напрямую выдает скорость движения машинки (смотрим мех. характеристику коллекторников - она линейна!) .. так все-таки скорость? Почти. Зависимость скорости от ШИМ правильнее всего снять опытным путем, измеряя путь скажем за 1 сек. при разном ШИМ. Это заодно, позволяет выяснить при каких ШИМ машинка уже "не едет" и создать в программе управления "таблицу пересчета" ШИМ-скорость.
Заодно можно построить 2 таблицы для правого и левого колеса, ибо двух полностью идентичных .. ни бываит. :)

3. Регулятор .. ПИД? Нет, не всегда а для гонок - так точно нет. Почему?
При отклонении от осевой машинки находится в "повороте". Соответственно, мало того что колеса надо крутить с линейной разностью для движения по окружности, но на гонке на машинку ещё действует существенная центробежная сила, которую гонщики называют "переносом центра тяжести в повороте". Эта сила дополнительно прижимает внешнее колесо и разгружает внутреннее, то есть изменяет соотношение мощность-скорость и .. практически тоже линейно от радиуса поворота и .. текущей скорости. Итого, получаем КУБИЧЕСКУЮ зависимость регулятора от величины отклонения. Упс .. какой же это "ПИД"? :)

Самое простое решение - ага, таблица зависимости величины регулировки "П" от величины отклонения "Х". Можно заметить что достаточно только в одну сторону, скажем вправо. влево - оно же будет работать также. Дополнительно, для учета текущей скорости (ШИМ) можно домножать данные таблицы на этот самый "средний ШИМ моторов" с коэффициентом (или пересчитать табличку на к-т заранее).

3.а) Вспоминаем, что датчики разнесены "оптимально" и соответственно "ошибка" - дискретна и проявляется не "когда попало", а строго когда датчик сменит показание. Тангенс угла, из смещения датчика от осевой и расстояния линейки датчиков до оси вращения тележки дает нам "волшебные" радиусы поворота, когда можно ехать только на одном "П" по трассам с фиксированными радиусами .. или подобрать вынос датчиков под трассу. :)
Так называемая "езда на боковом датчике" с ненулевой постоянной ошибкой..

3.б) "Д" .. ну вот как тут учитывать это самое "Д" при дискретности опросов? А просто. Мы помним предыдущую ошибку (предыдущий опрос) и может сравнить его с текущим. Если ошибка не изменилась, то можем инкрементировать счетчик "длительности" езды в таком положении, а как только положение изменилось .. а вот она "скорость изменения ошибки"! Величина, обратная счетчику и есть "дифференциальная составляющая" в том цикле опроса, в котором обнаружено изменение ошибки.
Далее плюсуем её и получаем нелинейный "ПД" регулятор. Нелинейный, потому что таблица "П" содержит кубическую зависимость.

Только опят жеж .. у нас дискретность и, "Д" будет изменять "П" на всем протяжении новой ошибки, пока не изменится счетчик? Зачем, можно на каждый следующий цикл управления делить полученное "Д" пополам, пока оно не перестанет влиять на ШИМ, то есть плавно возвращаться к требуемому "П".. а можно оставить и так как есть. А можно .. корректировать "П" так, чтобы при каждом последующем проходе этого участка трассы "Д" получалось как можно меньше (машинка, привыкающая к трассе).

3.в) "И" .. а оно вообще надо? Надо. Оно как раз отвечает за кривизну моторов, кривизну трассы, особенно для несимметричных трасс, где "правых поворотов больше чем левых" и прочие кривости. Ну, тут дкмаю все понятно: тупо накапливаем ошибку, можно каким-то скользящим алгоритмом (последние 10-100 значений) и умножаем накопленную сумму на свой "И" к-т..

Ну вот .. как-то так нам и удается ехать трассу Робофест за 6.2-6.5секунд.

Всем удачных покатушек, Всех с Новым Годом!
Arhat109
 
Сообщения: 1
Зарегистрирован: 29 дек 2017, 12:29


Вернуться в Алгоритмы

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

cron