Многие из форумчан уже делали лайнтрейсеров примерно такой конструкции: два ведущих колеса, одно подруливающее, линейка датчиков линии. Алгоритмы соотношения скоростей колес в зависимости от положения линии в текущий момент могут быть разными, в частности ПД (есть мнение, и я с ним согласен, что это лучший алгоритм для этого дела. Но чтобы он работал хорошо - нужно правильно подобрать коэффициенты П и Д). Обычно это делают в ручную, ориентируясь на поведение бота - если ездит примерно плавно, то настройка окончена. Мало кто может точно засечь изменение времени прохождения трассы, чтобы можно было определить лучшую пару коэффициентов. Предложенный далее алгоритм предназначен для автоматизации подбора этих коэффициентов.
Исходные данные. У вас уже есть подпрограмма ПД регулятора, и подпрограмма для опроса датчиков линии. Саму трассу придется немного модифицировать - поперек трассы наклеить кусок черной изоленты. Это будет точка отсчета, старт/финиш. Критерием качества прохождения линии будет время прохождения линии, его нужно минимизировать. Подпрограмму опроса датчиков линии нужно дописать таким образом, чтобы бот всегда знал: на старте он или на линии. С датчиков кроме информации о положении линии приходит флаг: старт/финиш или линия. Сама процедура автонастройки имеет несколько режимов, о них далее. Перед началом автонастройки нужно грубо найти минимальный коэффициент П, при котором бот не теряет линию (при нулевом коэффициенте Д). Итак, все готово.
Переход со старта на линию - это событие, по которому начинается заезд. Переход с линии на финиш - это событие, по которому подводится итог и делаются все нужные действия. Чтобы на подбор коэффициентов не влияли случайности, введено фильтрование - результат усредняется за 4 круга.
В начале режим нулевой. Бот выезжает на линию, проезжает 4 круга, усредняет время - это наше первое время, именно его мы будем улучшать. В качестве времени выступает число циклов опроса датчиков линии. Затем режим становится первым.
В первом режиме подбирается коэффициент П при нулевом коэффициенте Д. Увеличиваем его, 4 заезда, усредняем, сравниваем время. Если получилось быстрее - берем новый коэффициент П. Если медленнее - берем старый коэффициент П, а режим становится вторым.
Тут нужно небольшое пояснение. Представьте декартову плоскость, первый квадрант. Ось Х - это П, вторая ось - это Д. Где-то лежит наша точка минимума. Мы не знаем сколько в этой функции двух переменных локальных минимумов. Проверять все комбинации точек - очень долго. Поэтому алгоритм строится на предположении, что минимум у нас один.
Во втором режиме вокруг каждой точки находятся 8 точек (кроме границ). Вокруг нашей выбранной точки лежит 5 точек, в двух из которых мы побывали чуть ранее. Обход остальных точек будем делать по часовой (это связано с тем, что одновременно с уменьшением П увеличивают Д - чаще всего это помогает). Чтобы не проверять точки дважды - их координаты (суть пара коэффициентов) заносятся в кольцевой буфер на 8 пар коэффициентов. После каждой проверки пары сравнивается время. Если его удалось уменьшить - запоминаем эту пару как текущую, если нет - эту пару заносим в буфер и переходим к следующей паре. Как только все точки вокруг текущей оказываются проверенными (во всех их время больше) - мы нашли минимум.
Внешне работа алгоритма выглядит просто - бот катается по трассе минут 5 - 10, потом останавливается. Коэффициенты можно хранить в ее проме, потом считать их оттуда и все.
Я описал алгоритм до того, как его реализовал. Может вы найдете в нем грубые ошибки и это поможет сохранить мое время. Собираюсь реализовать алгоритм в течение новогодних каникул.