Занятия 13–14. Захват и транспортировка объектов на линии (задачи 3.10, 3.12–3.14, 3.16–3.17)
Занятия 13–14. Транспортировка объектов
Цель занятия 13: обучающиеся собирают захват, берут объект со вспомогательной линии и довозят его до перекрёстка (3.10), перемещают объект между перекрёстками (3.12), едут по линии с грузом (3.16), учитывают красные линии (3.17). Цель занятия 14: обучающиеся переставляют объект относительно линии (3.13) и через перекрёсток (3.14); кумулятивный квиз №2.
Разминка-вспоминание (занятие 13, 5 мин)
- Фазы объезда банки: где события, где слепые размеры?
- Почему маршрут — строка, а не последовательность вызовов?
- Порог «объект сбоку» — как выбран под диапазон 15–30 см?
- Требования к ловителю кегли из занятия 8 — какие добавятся у захвата?
Теория: захват против ловителя
Регламент разводит две компетенции: конструкция для линейного перемещения (толкатель, зан. 8) и для нелинейного (захват): объект нужно возить с поворотами, через перекрёстки, задним ходом — толкатель его теряет. Варианты по возрастанию сложности:
- Пассивная скоба с воротами — объект заезжает в П-профиль с подпружиненными «усами»: удерживает при поворотах, отпускает при отъезде назад с прижатием (просто, без привода, но не для всех объектов);
- Серво-захват (клешня) — 1 сервопривод, две губки с резинкой/поролоном на рабочих поверхностях. Стандарт де-факто: контролируемые «взял/отпустил»;
- Захват с подъёмом — для 3.17 (перенос через красные линии-изоленту толщина мешает волочению) и для «сбивать предмет на высоте» из перечня компетенций: губки на качающемся рычаге со вторым серво.
Конструкционные требования: губки шире объекта на 2–3 см (самоцентрирование), захват на высоте центра масс, датчики линии остаются открытыми, объект в захвате не перекрывает передний дальномер (иначе 3.11 с грузом ослепнет — либо дальномер выше объекта, либо сбоку).
Разбор (worked example): 3.10 — полный сценарий «взять сбоку и довезти»
Самая богатая задача блока — конечный автомат из всех предыдущих кирпичей:
stateDiagram-v2
ЛИНИЯ_PD --> ДЕТЕКТ : боковой dist < 350 мм
ДЕТЕКТ --> ПОЗИЦИЯ : стоп + запомнить тики
ПОЗИЦИЯ --> ДОВОД : доехать до оси объекта (смещение датчика!)
ДОВОД --> ПОВОРОТ90 : танковый к объекту
ПОВОРОТ90 --> ПОДЪЕЗД : медленно до dist = захватная дистанция
ПОДЪЕЗД --> ЗАХВАТ : серво закрыть + пауза 300 мс
ЗАХВАТ --> РАЗВОРОТ : назад на исходную ось…
РАЗВОРОТ --> ЗАХВАТ_ЛИНИИ : …поворот до чёрного в центре
ЗАХВАТ_ЛИНИИ --> ЛИНИЯ_С_ГРУЗОМ : PD до перекрёстка (3.16!)
ЛИНИЯ_С_ГРУЗОМ --> ФИНИШ : crossHere() -> стоп
Ключевые места (разобрать вслух, это концентрат ошибок):
// 1) Боковой датчик стоит не на оси поворота: когда он увидел объект,
// ось объекта — на offset мм ВПЕРЕДИ/ПОЗАДИ оси колёс. Меряем offset линейкой,
// доводим по энкодерам:
long hitTicks = (ticksL()+ticksR())/2; // момент детекта
driveMM(SIDE_SENSOR_OFFSET); // теперь ось поворота напротив объекта
// 2) Подъезд к объекту — до дистанции, не на слепые 15–30 см (они меняются!):
tankTurn(90 * sideSign);
while (distMM() > GRIP_DIST) drive(70, 70); // GRIP_DIST: губки вокруг объекта
stopBrake(); gripClose(); delay(300);
// 3) Возврат: задним ходом ровно столько, сколько проехали вперёд (по тикам!),
// затем поворот до захвата линии — как на перекрёстке:
driveMM(-distDrivenToObject);
tankTurn(-60 * sideSign);
while (normCenter() < 700) drive(-60*sideSign, 60*sideSign);3.16: линия с грузом — что меняется
Ничего в алгоритме, многое в физике: масса выше и впереди → робот инертнее, PD раскачивается. Протокол: снизить BASE на 15–20%, при необходимости поднять Kd. Отдельный набор коэффициентов «с грузом» — в карту калибровки (переключение флагом).
3.13–3.14: перестановка объекта
Композиции без нового кода: взять объект (как в 3.10) → манёвр (переезд линии: crossForward-логика поперёк; или через перекрёсток: runRoute("SF")) → позиционироваться → gripOpen() → отъехать назад. На бумаге рисуется план из кирпичей, только потом код.
3.17: красные линии
lineRaw на белом / чёрном / красном своего поля; (2) если красный отличим — ввести три диапазона с гистерезисом (чёрный / красный / фон) и обрабатывать красный отдельным событием; (3) если неотличим — красный детектируется датчиком цвета (отдельный сенсор) или учитывается геометрически (по карте поля через энкодеры). И механика: толщина изоленты — ступенька ~0,2 мм, волочимый объект на ней подпрыгивает и выскальзывает — потому 3.17 в регламенте связана с захватом, поднимающим объект.Практика
Занятие 13: захват — сборка и стендовые испытания
Эскиз → защита 60 с → сборка. Стенд: 10 циклов «закрыть/открыть» на объекте, объект не выскальзывает при подъёме робота за корпус и наклоне 15°.
Занятие 13: 3.10 по протоколу
Судья ставит объект на 15 / 22 / 30 см от линии, слева и справа (сторона — параметр!). 3 попытки.
Занятие 13: 3.16 + замер красного
Круг по линии с объектом в захвате; таблица «BASE/Kd с грузом». Измерить и записать lineRaw на красной изоленте.
Занятие 14: 3.13 или 3.14 по жребию
План из кирпичей на бумаге до кода. Сдача по протоколу.
Занятие 14: кумулятивный квиз №2 (занятия 1–13)
10 вопросов: формулы пути/поворота, пороги и калибровки, автоматы 4.23/3.8/3.10, признак перекрёстка, красные линии в ИК, правила ЛиПо.
Типичные ошибки:
- смещение бокового датчика не учтено — захват промахивается на 3–5 см ровно систематически (диагноз: промах всегда в одну сторону);
gripClose()без паузы — робот стартует раньше, чем губки сомкнулись;- возврат на линию «поворотом на слепые 90°» вместо захвата центра — после манёвров у объекта накоплен угол, линия теряется;
- коэффициенты «с грузом» не сохранены — на турнире груз есть, настройки — «без груза».
Мини-проверка выхода
Занятие 13 — 3.10 на двух расстояниях с двух сторон. Занятие 14 — 3.13/3.14 по жребию + квиз ≥7/10. Вопрос: «почему красную изоленту не видит ИК-датчик и какие два пути решения у вас готовы?»