Занятия 9–10. Движение по линии: от релейного регулятора к PID
Занятия 9–10. Движение по чёрной линии (основа задач 3.1–3.17)
Цель занятия 9: обучающиеся проезжают трассу релейным и P-регулятором и объясняют разницу. Цель занятия 10: обучающиеся настраивают PID по протоколу и снижают время круга минимум на 20%.
Разминка-вспоминание (занятие 9, 5 мин)
- Как калибруется порог линии и почему «на глаз» нельзя?
- Конечный автомат 4.23 — состояния и события?
- Три требования к ловителю кегли?
- Чем лазерный ToF лучше УЗ для «объекта сбоку»?
Теория: ошибка → поправка
Любой регулятор линии делает одно: считает ошибку e (насколько линия смещена от центра датчиков) и превращает её в разность мощностей колёс: drive(BASE − u, BASE + u).
Нормализация (обязательный шаг до всего): датчики с Ali разбросаны по чувствительности; сырые значения не сравнимы. Для каждого датчика i калибруем min_i (белое) и max_i (чёрное) — прокаткой робота по линии 3–4 c при старте — и приводим к шкале 0–1000:
v_i = 1000·(raw_i − min_i)/(max_i − min_i).
Позиция линии для K датчиков с координатами x_i (мм от центра, из карты конфигурации):
pos = Σ(v_i·x_i) / Σ(v_i) — взвешенное среднее; e = pos (центр = 0).
Для двух датчиков по краям линии проще: e = v_left − v_right.
Регуляторы:
- релейный: e>0 → крутим влево фиксированно, e<0 → вправо. Едет, но зигзагом; скорость ограничена; на перекрёстках срывается. Нужен как точка отсчёта.
- P:
u = Kp·e— поправка пропорциональна ошибке: маленькое смещение — маленький доворот. Плавно, быстрее релейного. - PID:
u = Kp·e + Kd·(e−e_prev) + Ki·Σe. D гасит раскачку (реагирует на скорость роста ошибки — «предсказывает» вылет на повороте), I добирает систематический увод (несимметричный робот). Для соревновательной линии обычно достаточно PD; I добавляют последним и маленьким (с ограничением суммы — анти-windup).
Разбор (worked example): PD-контур
float Kp = 0.35, Kd = 2.0, Ki = 0.0; // стартовые для e в шкале ±1000
int BASE = 120; // базовая скорость
float eSum = 0, ePrev = 0;
void lineStep() { // вызывается каждый цикл loop()
float e = linePos(); // нормализованная позиция, ±~1000
eSum = constrain(eSum + e, -3000, 3000); // анти-windup
float u = Kp*e + Kd*(e - ePrev) + Ki*eSum;
ePrev = e;
drive(constrain(BASE - u, -255, 255),
constrain(BASE + u, -255, 255)); // отрицательная мощность внутреннего
} // колеса = проходим крутые повороты
Разобрать вслух: почему constrain на моторах разрешает минус (внутреннее колесо назад — робот вписывается в поворот радиусом меньше колеи), и почему период цикла должен быть стабильным (D-член — это разность за такт: плавающий такт = шумный D).
Протокол настройки (worked procedure — так настраивают, а не «крутим всё сразу»)
Kd=0, Ki=0. Поднимать Kp
С малого, ×1,5 за шаг, пока робот не начнёт заметно рыскать на прямой. Откатить на шаг назад.
Добавлять Kd
Пока рысканье не погаснет и повороты не станут собранными. Слишком большой Kd — дрожь на прямой (усиливает шум датчиков): откатить.
Поднимать BASE
До первого вылета на самом крутом повороте трассы, откатить на шаг. Каждый шаг — фиксация времени круга в журнал.
Ki — только при видимом систематическом смещении
С очень малого (Kp/100), с анти-windup. Нет смещения — Ki=0, не трогаем.
Практика
Занятие 9: нормализация + релейный
Написать калибровку-прокатку, показать в сериал-мониторе v_i на белом/чёрном (0…1000). Проехать круг релейным — засечь время.
Занятие 9: P-регулятор
Тот же круг на P. Сравнить: время и «зигзаг» (визуально по следу движения). Вывод в журнал: за счёт чего P быстрее.
Занятие 10: PD по протоколу
Таблица настройки в журнал: Kp/Kd/BASE/время круга/поведение. Цель — −20% ко времени занятия 9.
Занятие 10: стресс-тест
Перекалибровка при другом освещении (штора/лампа) — время круга не должно деградировать более чем на 10%. Если деградирует — калибровка при старте написана неверно (константы зашиты).
Типичные ошибки:
- датчики высоко над полом (>10–12 мм) — сигнал слабый и шумный: занизить, это решает половину «не едет по линии»;
- внешняя засветка (солнце из окна) бьёт в датчики — экран-юбка вокруг блока датчиков;
delay(50)внутри контура «для стабильности» — регулятор с частотой 20 Гц слеп на скорости: цикл должен крутиться на сотнях Гц;- подбор коэффициентов на свежей батарее, заезд на севшей — BASE в «попугаях» ШИМ зависит от напряжения; перед зачётом батарея штатной заряженности.
Мини-проверка выхода
Занятие 9 — круг на P без схода. Занятие 10 — круг на PD, −20% времени, таблица настройки предъявлена. Вопрос: «что физически делает D-член и как выглядит его переизбыток?»
Теория под этим занятием
Релейный регулятор, П и ПИД — это не приёмы «для линии», а общий способ управления с обратной связью:
- Управление и обратная связь — три ступени от «налить стакан вслепую» до разбора, почему робота качает и чем это лечится;
- Сигналы и данные — почему показания датчика шумят и что даёт усреднение;
- Настройка ПИД для дрона — тот же регулятор на трёх осях и в каскаде: полезно посмотреть, как приём переносится.