Skip to content
Занятия 9–10. Движение по линии: от релейного регулятора к PID

Занятия 9–10. Движение по линии: от релейного регулятора к PID

Занятия 9–10. Движение по чёрной линии (основа задач 3.1–3.17)

Цель занятия 9: обучающиеся проезжают трассу релейным и P-регулятором и объясняют разницу. Цель занятия 10: обучающиеся настраивают PID по протоколу и снижают время круга минимум на 20%.

Разминка-вспоминание (занятие 9, 5 мин)

  1. Как калибруется порог линии и почему «на глаз» нельзя?
  2. Конечный автомат 4.23 — состояния и события?
  3. Три требования к ловителю кегли?
  4. Чем лазерный 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-член и как выглядит его переизбыток?»


Теория под этим занятием

Релейный регулятор, П и ПИД — это не приёмы «для линии», а общий способ управления с обратной связью: