А начало было таким интригующим .. 2017г. Ну и как результаты, опыт, где алгоритмы?
попробую ответить со своего опыта:
1. Датчики и их расположение. Да, аналоговые не в пример лучше, можно ехать и на одном, но неудобно - все-таки малоинформативно, а как автор писал: чем точнее определяется ошибка от оси линии, тем лучше - это верно.
То есть сколько надо датчиков? Ответ: чем больше - тем лучше, сколько "влезет".
Какое расположение датчиков "оптимально"? А вот тут есть два решения для "цифровых" и "аналоговых" датчиков. С цифровыми - всё просто. Главный датчик (№0) размещаем на оси линии, а вправо и влево от него (+1/-1, +2/-2, ..) боковые на оптимальном расстоянии равном ..
ДВЕ ТРЕТИ от ширины линии. Только в этом случае длительность работы всех состояний датчиков составляет одинаковые периоды при равномерном отклонении машинки от осевой.
А как для аналоговых? .. оставляю любопытным на "самостоятельное решение".
Кстати, когда вся линейка датчиков теряет линию .. это тоже можно рассматривать как "следующее" отклонение, можно даже с к-т 1.5 или 2 смотря как управляем - аналогово или "по таблицам" (мне нравится второй вариант - он во первых считается на моделях, а во вторых проще объяснять детишкам)
2. Моторы, ШИМ, мощность или таки скорость? Чем "управляет ШИМ"?
Ответ: ШИМ управляет .. током, который есть момент .. то есть таки "мощность". Но мощность мотора практически напрямую выдает скорость движения машинки (смотрим мех. характеристику коллекторников - она линейна!) .. так все-таки скорость? Почти. Зависимость скорости от ШИМ правильнее всего снять опытным путем, измеряя путь скажем за 1 сек. при разном ШИМ. Это заодно, позволяет выяснить при каких ШИМ машинка уже "не едет" и создать в программе управления "таблицу пересчета" ШИМ-скорость.
Заодно можно построить 2 таблицы для правого и левого колеса, ибо двух полностью идентичных .. ни бываит.
3. Регулятор .. ПИД? Нет, не всегда а для гонок - так точно нет. Почему?
При отклонении от осевой машинки находится в "повороте". Соответственно, мало того что колеса надо крутить с линейной разностью для движения по окружности, но на гонке на машинку ещё действует существенная центробежная сила, которую гонщики называют "переносом центра тяжести в повороте". Эта сила дополнительно прижимает внешнее колесо и разгружает внутреннее, то есть изменяет соотношение мощность-скорость и .. практически тоже линейно от радиуса поворота и .. текущей скорости. Итого, получаем КУБИЧЕСКУЮ зависимость регулятора от величины отклонения. Упс .. какой же это "ПИД"?
Самое простое решение - ага, таблица зависимости величины регулировки "П" от величины отклонения "Х". Можно заметить что достаточно только в одну сторону, скажем вправо. влево - оно же будет работать также. Дополнительно, для учета текущей скорости (ШИМ) можно домножать данные таблицы на этот самый "средний ШИМ моторов" с коэффициентом (или пересчитать табличку на к-т заранее).
3.а) Вспоминаем, что датчики разнесены "оптимально" и соответственно "ошибка" - дискретна и проявляется не "когда попало", а строго когда датчик сменит показание. Тангенс угла, из смещения датчика от осевой и расстояния линейки датчиков до оси вращения тележки дает нам "волшебные" радиусы поворота, когда можно ехать только на одном "П" по трассам с фиксированными радиусами .. или подобрать вынос датчиков под трассу.
Так называемая "езда на боковом датчике" с ненулевой постоянной ошибкой..
3.б) "Д" .. ну вот как тут учитывать это самое "Д" при дискретности опросов? А просто. Мы помним предыдущую ошибку (предыдущий опрос) и может сравнить его с текущим. Если ошибка не изменилась, то можем инкрементировать счетчик "длительности" езды в таком положении, а как только положение изменилось .. а вот она "скорость изменения ошибки"! Величина, обратная счетчику и есть "дифференциальная составляющая" в том цикле опроса, в котором обнаружено изменение ошибки.
Далее плюсуем её и получаем нелинейный "ПД" регулятор. Нелинейный, потому что таблица "П" содержит кубическую зависимость.
Только опят жеж .. у нас дискретность и, "Д" будет изменять "П" на всем протяжении новой ошибки, пока не изменится счетчик? Зачем, можно на каждый следующий цикл управления делить полученное "Д" пополам, пока оно не перестанет влиять на ШИМ, то есть плавно возвращаться к требуемому "П".. а можно оставить и так как есть. А можно .. корректировать "П" так, чтобы при каждом последующем проходе этого участка трассы "Д" получалось как можно меньше (машинка, привыкающая к трассе).
3.в) "И" .. а оно вообще надо? Надо. Оно как раз отвечает за кривизну моторов, кривизну трассы, особенно для несимметричных трасс, где "правых поворотов больше чем левых" и прочие кривости. Ну, тут дкмаю все понятно: тупо накапливаем ошибку, можно каким-то скользящим алгоритмом (последние 10-100 значений) и умножаем накопленную сумму на свой "И" к-т..
Ну вот .. как-то так нам и удается ехать трассу Робофест за 6.2-6.5секунд.
Всем удачных покатушек, Всех с Новым Годом!