Занятие 5. Повороты: танковый и вокруг колеса (задачи 4.6–4.13)
Занятие 5. Повороты на заданный угол (мини-задачи 4.6–4.13)
Цель занятия: обучающиеся выполняют повороты 90° и 180° направо/налево двумя способами — танковым (4.6–4.9) и вокруг заблокированного колеса (4.10–4.13) — с допуском ±5°.
Разминка-вспоминание (5 мин)
- Формула мм/тик? Ваше значение m?
- Зачем трапеция скорости в
driveMM? - Что такое колея B и между чем её измеряют?
- Ваша причина провала из журнала прошлого занятия и что вы изменили?
Теория: вся геометрия поворотов — одна картинка
flowchart TB
subgraph Танковый["ТАНКОВЫЙ (4.6–4.9): центр вращения — середина колеи"]
A["Каждое колесо идёт по дуге радиуса B/2<br/>Путь колеса: L = θ·(B/2)<br/>Колёса крутятся в противоположные стороны"]
end
subgraph Пивот["ВОКРУГ КОЛЕСА (4.10–4.13): центр — заблокированное колесо"]
C["Внешнее колесо идёт по дуге радиуса B<br/>Путь колеса: L = θ·B — вдвое длиннее!<br/>Одно колесо стоит (тормоз!), второе едет"]
end
Расчёт тиков на угол (θ в градусах, перевод в радианы θ·π/180):
- танковый:
T = (θ·π/180)·(B/2) / m, при B=142 мм, m=10,2: 90° → T ≈ 11 тиков на колесо; - пивот:
T = (θ·π/180)·B / m, те же 90° → T ≈ 22 тика внешнего колеса.
Мало тиков на 90° (≈11) — значит одна ошибка счёта = 8°! Отсюда два следствия: (1) поворачиваем на малой мощности — меньше юз после стопа; (2) реальный угол всегда чуть меньше расчётного из-за проскальзывания → вводим коэффициент k: T_реал = k·T_расч, k находится калибровкой и обычно 1,00–1,15. k для танкового и пивота — разные (у пивота внешнее колесо ещё и тащит вбок заблокированное).
Разбор (worked example)
// Танковый поворот. deg>0 — направо (левое вперёд, правое назад).
void tankTurn(float deg) {
const float B = 142.0, m = 10.2, K_TANK = 1.06; // из карты калибровки
long T = K_TANK * fabs(deg) * (PI/180.0) * (B/2.0) / m;
int s = (deg > 0) ? 1 : -1;
resetTicks();
while ((ticksL() + ticksR())/2 < T)
drive(s * 100, -s * 100); // малая мощность: точность важнее скорости
stopBrake();
}
// Пивот вокруг колеса. deg>0 — направо: правое колесо стоит, левое едет.
// fwd=true — рабочее колесо вперёд, false — назад (регламент разрешает оба).
void pivotTurn(float deg, bool fwd) {
const float B = 142.0, m = 10.2, K_PIV = 1.10;
long T = K_PIV * fabs(deg) * (PI/180.0) * B / m;
int v = fwd ? 110 : -110;
resetTicks();
if (deg > 0) { while (ticksL() < T) drive(v, 0); } // drive(x,0): у драйвера с
else { while (ticksR() < T) drive(0, v); } // тормозом при 0 — колесо стоит;
stopBrake(); // иначе блокировать в HAL отдельно
}drive(0, v). Если крутится свободно — реализовать в HAL режим «тормоз одного канала» (обе линии драйвера в LOW/HIGH по даташиту). Это тот случай, когда регламент («одно колесо заблокировано») буквально диктует схемотехнику.Практика
Калибровка k: протокол «10 поворотов»
Команда tankTurn(90) десять раз подряд с паузами. Суммарный угол должен быть 900° — робот смотрит туда же, куда в начале, метки корпуса совпадают. Реальный суммарный угол α измеряем по недовороту/перевороту последней метки. Новое k = k_старое × 900/α. Повторить для пивота отдельно. Оба k — в карту калибровки.
Сдать 4.6–4.9 (танковые)
Судья называет: направо/налево × 90°/180°. Транспортиром или по разметке — отклонение в журнал.
Сдать 4.10–4.13 (пивоты)
То же, плюс судья вправе потребовать вариант «рабочее колесо назад».
Интегральный тест «квадрат»
driveMM(500); tankTurn(90); × 4 — робот обязан вернуться в стартовый контур с ошибкой ≤ 5 см. Квадрат сразу показывает, что врёт: не замыкается по расстоянию → m; развёрнут → k; уводит по спирали → прямолинейность (KP_SYNC/механика).
Типичные ошибки:
- один k на оба типа поворота — пивот стабильно недокручивает;
- калибровка k на гладком столе, заезд на баннере — k зависит от покрытия сильнее, чем m: перекалибровка на поле обязательна (интервальный возврат: повторим перед пробным туром);
- поворот на PWM=200+ — юз после
stopBrake()добавляет случайные 5–15°; - третья точка опоры (шарик/скользун) с большим трением разворачивает робота непредсказуемо — менять опору, программно не лечится.
Мини-проверка выхода
Квадрат замкнулся в допуске + устно: «почему на 90° пивотом тиков вдвое больше, чем танковым?» (радиус дуги B против B/2).