Перед созданием темы я поизучал имеющиеся материалы, касающиеся лайн-трейсеров. Кроме того, мне по работе приходилось иметь дело с ПИД регуляторами. Сейчас у меня пока нет своего лайн-трейсера, механика еще не готова, да и пока я занимаюсь другим роботом, поэтому проверить алгоритм на практике я не имею возможности. Может кто-то заинтересуется и проверит, а может в результате обсуждения выяснится, что алгоритм никуда не годится. Приступим.
Для начала о том, сколько датчиков, на каком расстоянии, в линию или нет.
Один датчик - отслеживание края линии. Регулировать тут нечего. Два датчика, линия между ними - постоянный поиск линии между датчиками. Регулировать также нечего. Три датчика, один на линии и два по бокам - вот тут уже можно развернуться. Практически все используют такую конструкцию: нечетное число датчиков, один на линии, остальные по бокам. Ставят и 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 %)
-на сколько процентов изменять ШИМ за один цикл опроса при изменении отклониния (диф. составляющая).
Вроде в общих чертах все. Рассчитываю на конструктивное обсуждение.