Skip to content
Занятия 13–14. Захват и транспортировка объектов на линии (задачи 3.10, 3.12–3.14, 3.16–3.17)

Занятия 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 мин)

  1. Фазы объезда банки: где события, где слепые размеры?
  2. Почему маршрут — строка, а не последовательность вызовов?
  3. Порог «объект сбоку» — как выбран под диапазон 15–30 см?
  4. Требования к ловителю кегли из занятия 8 — какие добавятся у захвата?

Теория: захват против ловителя

Регламент разводит две компетенции: конструкция для линейного перемещения (толкатель, зан. 8) и для нелинейного (захват): объект нужно возить с поворотами, через перекрёстки, задним ходом — толкатель его теряет. Варианты по возрастанию сложности:

  1. Пассивная скоба с воротами — объект заезжает в П-профиль с подпружиненными «усами»: удерживает при поворотах, отпускает при отъезде назад с прижатием (просто, без привода, но не для всех объектов);
  2. Серво-захват (клешня) — 1 сервопривод, две губки с резинкой/поролоном на рабочих поверхностях. Стандарт де-факто: контролируемые «взял/отпустил»;
  3. Захват с подъёмом — для 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: красные линии

ИК-датчики линии видят отражение в ИК, а не цвет: красная изолента в ИК отражает почти как белое поле — типовой датчик её не заметит, и это опасно (робот посчитает красную линию фоном и, например, не там остановится) либо, на некоторых модулях, наоборот даст промежуточный уровень. Действия по протоколу: (1) измерить 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. Вопрос: «почему красную изоленту не видит ИК-датчик и какие два пути решения у вас готовы?»