Инженерный тур. 3 этап
На заключительном этапе команды разрабатывают программно-аппаратное решение для управления небольшим, полностью автоматизированным складом площадью \(2\times 2\) м.
Участникам предстоит заранее разместить грузы в зонах хранения с учетом известного приблизительного времени их востребования, задействовав при этом двух мобильных роботов и видеопоток с IP-камеры, маркированные ArUco-метки и интерфейсы управления по Wi-Fi/Bluetooth.
Затем, по мере поступления запросов, нужно максимально быстро доставить грузы в зону разгрузки, учитывая реальные нестабильные условия работы за пределами идеальной симуляции.
На складе компании МоДист много маленьких роботов, которые могут перемещать только малые и средние МТР. Командам предстоит применить методы мультиагентного управления и масштабировать склад с маленькими мобильными роботами для транспортировки крупных и тяжелых грузов.
Количество участников в команде: 3–4 человека.
Компетенции, которыми должны обладать члены команды:
- Специалист AI и обработки изображения: программирование системы машинного зрения, определение координат объектов на изображении, классификация объектов, определение препятствий; в приоритете хорошее знание программирования, алгоритмов машинного зрения и основ использования нейронных сетей.
- Специалист по навигации и теории управления: программирование системы управления роботом, планирования пути и следование по нему; понимание того, как работает теория графов и как настраиваются регуляторы; в приоритете хорошее знание программирования, алгоритмов планирования пути (графы), теории управления (ПИД-регуляторы и др.).
- Системный администратор/программист высокоуровневых систем управления: проектирование архитектуры решения и высокоуровневой интеллектуальной системы управления, создание связи между системой управления робота, системой навигации и планирования движения и системой машинного зрения; в приоритете хорошее знание программирования, алгоритмов планирования пути, машинного зрения (OpenCV) и теории управления (ПИД-регуляторы и др.), а также опыт работы в операционной системе Linux системами и Docker.
Схема, приведенная на рис. 4.1, отражает взаимодействие всех компонентов системы в следующем порядке:
- изображение с IP-камеры поступает на сервер, где обрабатывается с помощью алгоритмов компьютерного зрения;
- сервер, используя данные задания из API, рассчитывает траектории и передает команды на робоплатформы через Raspberry Pi 4B;
- роботы выполняют действия на поле и отправляют обратную связь серверу, обеспечивая замкнутый цикл управления.
На рис. 4.2 представлен общий вид полигона с размещенными роботами и грузами с IP-камерами; в таблице 1.1 приведено описание оснащения полигона.
| Наименование | Описание | Назначение |
|---|---|---|
| Модификация «Роббо Робоплатформы» на ESP32 — https://robbo.ru/products/robbokit/ | Мобильная дифференциальная платформа, управляемая по Wi-Fi или Bluetooth; оснащена моторами, поддержкой регулировки напряжения и возможностью подключения внешних модулей | Перемещение и взаимодействие с грузами (захват, доставка, позиционирование) |
| Raspberry Pi 4B — https://www.raspberrypi.com/products/raspberry-pi-4-model-b/ | Одноплатный компьютер, выступающий в качестве промежуточного управляющего устройства между роботом и сервером | Управление роботом, обработка видеопотока, отправка и получение данных по сети |
| IP-камера Axis M3014 — https://www.group-sb.ru/catalog/kupolnye-ip/axis-m3014/ | Камера с поддержкой потоковой трансляции (30 Гц), установлена над полем на высоте 2,5 м | Передача изображения поля для сегментации, распознавания объектов и построения карты |
| Серверный ПK | Компьютер с установленной ОС Linux, подключенный к IP-камере и получающий команды от роботов (доступ по Wi-Fi или SSH) | Запуск пользовательских программ управления, обработка заданий, координация взаимодействия роботов и системы |
| Программное обеспечение (Python, OpenCV, библиотеки управления) | Средства разработки и библиотеки: Python 3, OpenCV (в том числе модуль aruco), модули управления двигателями | Обработка изображения, сегментация объектов, построение алгоритмов управления, взаимодействие с API задания |
В тексте заданий используются следующие термины:
Задача — набор действий и алгоритмов, которые команда должна выполнить (решить).
Этап — подзадача, на которую разбивается задача заключительного этапа.
Попытка — сдача решения задачи в рамках этапа с целью получения баллов (как правило, проверка происходит в установленные временные слоты).
Тест — проверка решения во время попытки при определенной конфигурации грузов и роботов. Другими словами, допускается добавление/удаление/перемещение груза на поле, а также перемещение роботов, после чего участник запускает решение задачи. Во время попытки может проводиться несколько тестов, при которых жюри изменяет условия на поле, а участник перезапускает решение.
На заключительном этапе задачи второго этапа объединены в одну, актуальную для складской логистики задачу, которая сфокусирована на апробации полученных решений в реальных условиях на реальных роботах.
Команды должны написать программу для управления небольшим, полностью автоматизированным складом. Управляя двумя мобильными роботами, нужно расставить грузы в места хранения до их востребования, а после востребования как можно быстрее перевезти их в зону разгрузки.
Ориентировочное время востребования считается известным и необходимо для оптимального расположения грузов в зонах хранения, поскольку важно выдать их как можно быстрее с момента востребования.
Содержание:
- Описание подзадачи.
- Ключевые результаты выполнения подзадачи.
- Возможные проблемы при ее решении.
- Что дает для решения общей задачи? Что происходит, если команда не справилась с решением?
Команде требуется написать программу, осуществляющую сегментацию/детекцию зон и роботов на поле, а также управление роботом в пределах поля. Нужно получить изображение с IP-камеры по соответствующему адресу от организаторов (пример см. ниже).
import cv2 as cv
video_stream = cv.VideoCapture('http://root:admin@10.128.73.50/mjpg/video.mjpg')
while True:
_, frame = video_stream.read()
video_stream.release()
В части сегментации необходимо продемонстрировать судьям обработанное изображение с камеры, на котором выделены контуры всех зон, грузов и роботов. Для зон нужно добавить подпись или обозначения (для однозначной интерпретацией жюри) с их ID (при наличии). Контуры грузов и роботов следует обозначить разными цветами (в зависимости от типа выделенного объекта: зона, робот, груз) и подписать их ID (пример — см. рис. 5.1–5.2).
В части управления роботом команда получает задание на движение к грузу с заданным (целевым) ArUco-маркером по ID. При этом груз будет считаться достигнутым, как только робот произведет касание.
Касанием считается непосредственный контакт робота с грузом, однако груз не должен сдвинуться более, чем на половину наименьшей стороны (например, для груза \(10 \times 10\) см допустимый сдвиг — 5 см).
Для получения задания необходимо добавить следующие строки в программу управления.
task = Task()
task.start()
task.getTask()
Здесь для старта обязательно необходимо вызвать task.start(). Функция вернет словарь в виде строки (далее при необходимости задание можно будет получить командой task.getTask()):
[{"cargo_id": 1}, {"cargo_id": 2}, {"cargo_id": 3}]
где "cargo_id": 1 задает id ArUco-маркера груза (в примере id = 1). Необходимо найти груз с заданным ID на поле, после чего привести робота к грузу и произвести касание.
Командам предоставляется мобильная дифференциальная платформа с возможностью управления через Wi-Fi или Bluetooth. Участники могут управлять мобильной платформой, задавая напряжение на левом и правом двигателе.
Для получения максимального балла нужно успешно пройти все тесты. Предусмотрено начисление баллов за достижение маркеров (робот доехал до груза и произвел касание).
Порядок действий:
- Команда готовится к запуску робота не более 5 мин до начала временного слота. Участники обновляют решение с
git-репозитория, проверяют изображение с камеры, подключаются к роботу. - Судья устанавливает грузы с маркерами и одного–двух роботов в соответствии со спецификацией к тесту.
- Команда запускает съемку проезда робота на телефон, а также сохраняет видео с IP-камеры в процессе прохождения теста.
- Члены команды демонстрирует обработанное изображение с камеры, на котором обведены и подписаны все зоны, роботы и грузы (с которыми связаны ArUco-маркеры).
- Команда запускает систему управления роботом, которая должна выполнить
task.getTask()с соответствующими аргументами и отобразить результат в терминале с задержкой в 5 с, чтобы члены жюри сфотографировали задание. - Программа должна рассчитать траекторию и начать движение к первому грузу из списка (например:
"cargo_id": 1). - После касания с первым грузом из списка робот должен рассчитать траекторию и начать движение ко второму грузу из списка и так далее.
- Судьи устанавливают грузы на старые места (из п. 2) и робота в другое начальное положение.
- Команда заново запускает решение и повторяет пп. 2–9 при наличии следующего теста.
- Попытка прерывается, если у участника не осталось времени на ее выполнение.
Важно сохранять последовательность касания грузов, поскольку получить максимальный балл за задание возможно только при последовательном касании всех заданных грузов.
Баллы начисляются за каждое касание по достижению, в соответствии с порядком задания.
В качестве первого теста команде нужно предъявить сегментацию карты, далее следует продемонстрировать распознавание роботов и грузов, а также управление роботом по камере, для чего необходимо, чтобы робот коснулся заданных грузов в заданном порядке.
Пример разметки поля, разделенного на объекты, представлен на рис. 5.1–5.2. На поле выделяются:
- зона погрузки,
- зоны разгрузки,
- зоны хранения,
- роботы и грузы (обведены контуром, исходя из их формы).
Цвет обводки (контура) выбран в зависимости от типа объекта поля, и его ориентация совпадает с ориентацией объекта. Линия обводки может иметь любую форму (сплошная, штриховая, пунктирная и т. д).
Помимо целевых грузов, задействованных в тесте (в соответствии с ID), на поле также могут лежать и грузы с другим ID.
- Верная сегментация зон хранения — максимально 1 балл.
- Верная сегментация зон погрузки — максимально 1 балл.
- Верная сегментация зон разгрузки — максимально 1 балл.
- Верная сегментация грузов и роботов — максимально 1 балл.
- Касание суммарно всех грузов за тест — 1,5 балла, то есть за каждый груз по \(1{,}5/n\) балл, где \(n\) — количество целевых грузов в словаре с заданием.
- Зоны хранения выделены разными цветами — 0 баллов за верную сегментацию зон хранения.
- Зоны погрузки выделены разными цветами — 0 баллов за верную сегментацию зон погрузки.
- Аналогично в случае сегментации зон разгрузки, грузов и роботов.
- Все зоны выделены одним цветом — 0 баллов за сегментацию в целом.
- Ориентация контура отличается от ориентации объекта более, чем на 30° — 0 баллов за сегментацию соответствующего типа объектов поля.
- Не все объекты поля обведены контуром — 0 баллов за сегментацию соответствующего типа объектов поля.
- Контуры не соответствуют форме объектов — 0 баллов за сегментацию соответствующего типа объектов поля.
- Контуры роботов и грузов отступают от границ объекта более, чем на половину от их минимальной длины — 0 баллов за сегментацию соответствующего типа объектов поля.
- ID объектов не соответствуют реальным значениям — 0 баллов за сегментацию соответствующего типа объектов поля.
Тест прерывается и начинается следующий в случаях, если:
- целевой груз сбит (груз сместился более, чем на половину наименьшей стороны груза);
- произведено более двух касаний нецелевых грузов;
- нарушен порядок касания грузов;
- осуществлен выезд за пределы поля (когда проекция робота полностью выезжает за пределы линии поля).
За тест начисляется 0 баллов, если:
- не было ни одного касания целевого груза, ни одна из зон не сегментирована верно;
- команда исправляет код во время прохождения попытки.
Задача прерывается и оценивание прекращается в случае тайм-аута (10 мин).
Технический параметр задачи: частота обновления изображения с камеры 30 Гц (IP-камера).
Команда должна написать программу управления роботом для перемещения небольших грузов на основе обратной связи по изображению. Для этого выдается задание на перемещение нескольких грузов, которые обозначаются ArUco-маркерами, расположенными на поле.
Целевые грузы могут располагаться в любой точке, из которой возможно выполнение задания. Местами доставки служат зоны хранения и погрузки. Зоны погрузки определяются конкретно по их ID. Зоны хранения никак не обозначены, конкретная зона не задается, однако в одной зоне должно располагаться не более одного груза.
Чтобы получить информацию о задании, в программу интеллектуального управления мобильной платформой необходимо добавить следующие строки.task = Task()
task.start()
task.getTask()
Здесь для старта обязательно необходимо вызвать task.start(). Функция вернет словарь в виде строки (далее при необходимости задание можно будет получить командой task.getTask()):
[{"unloading_zone": "1", "cargo_id": 1},
{"storage_zone": "", "cargo_id": 2},
{"storage_zone": "", "cargo_id": 41},
{"unloading_zone": "2", "cargo_id": 25}]
В случае "unloading_zone": "1", "cargo_id": 1 задает id ArUco-маркера зоны разгрузки (в примере id = 1) маркера груза. Участнику необходимо сегментировать карту для обнаружения необходимых зон и детектировать все маркеры на поле. Демонстрировать сегментацию на данном этапе не требуется.
В случае "storage_zone": "", "cargo_id": 2 доставлять груз необходимо в зону хранения. Эти зоны обозначаются лишь цветом, поэтому достаточно перевести груз в любую зону хранения.
Команде предоставляется мобильная дифференциальная платформа с возможностью управления через Wi-Fi или Bluetooth. Участник может управлять мобильной платформой, задавая напряжение на левом и правом двигателе.
Для получения полного балла нужно успешно пройти два теста. Предусмотрено начисление баллов за доставку грузов в целевые зоны.
Порядок действий:
- Команда готовится к запуску робота не более 5 мин. Участники обновляют решение с git-репозитория, проверяют изображение с камеры, подключаются к роботу.
- Судья устанавливает грузы с маркерами и одного–двух роботов в соответствии со спецификацией к тесту.
- Команда запускает съемку на телефон проезда робота, а также сохраняет видео с IP-камеры в процессе прохождения теста.
- Команда запускает систему управления роботом, которая должна выполнить
task.getTask()с соответствующими аргументами и отобразить результат в терминале с задержкой в 5 с, чтобы члены жюри сфотографировали задание. - После запуска робот должен рассчитать траекторию и начать движение к первому грузу из списка.
- После касания необходимо рассчитать траекторию движения робота в сцепке с грузом для его перемещения в целевую зону.
- Робот должен рассчитать траекторию и начать движение ко второму грузу из списка и так далее.
- Для прохождения следующего теста судья устанавливает грузы с маркерами и одного-двух роботов в соответствии со спецификацией к тесту.
- Команда заново запускает решение и повторяет пункты при наличии следующего теста.
- Тест прерывается, и начинается следующий, если робот полностью полностью выехал за пределы поля, включая линию, определяющую ее границы.
- Попытка прерывается, если у участника не осталось времени на ее выполнение.
Важно сохранять последовательность передвигаемых грузов, поскольку получить максимальный балл за задание возможно только при последовательном перемещении всех грузов.
Баллы начисляются за каждое перемещение груза в целевую зону, в соответствии с порядком задания (см. словарь терминов).
Считается, что груз расположен в зоне, если он полностью располагается внутри нее без перекрывания цветных границ зоны (линий). Если груз перекрывает цветную линию зоны и не выходит за пределы зоны, считается, что он расположен частично успешно (за это вычитаются баллы).
![]() |
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|---|
| OK | не ОК | не ОК | частично ОК | OK |
- Перемещение каждого груза в заданную зону (за каждый груз: \(5/n\), где \(n\) — количество грузов в тесте) — максимально 5 баллов.
- Расположение груза в зоне, частично перекрывающей цветные границы зоны — половина от балла \(5/n\), начисленного за перемещение груза.
- Касание с перемещением нецелевого груза — минус \(5/2n\) баллов.
- Не полностью доставленный груз (частично находится за пределами целевой зоны, включая цветовую линию) — 0 баллов за доставку данного груза.
Тест прерывается и начинается следующий в случаях, если:
- целевой груз сбит (груз сместился более, чем на половину наименьшей стороны груза);
- нарушен порядок доставки грузов;
- груз доставлен не в целевую зону, а за ее пределы;
- осуществлен выезд за пределы поля (когда проекция робота полностью выезжает за пределы линии поля).
Участник получает 0 баллов при прохождении теста, если ни один груз не был переставлен в требуемую зону.
Задача прерывается и оценивание прекращается в случае тайм-аута (10 мин).
Технический параметр задачи: частота обновления изображения с камеры 30 Гц (USB-камера).
Третий этап моделирует работу реального склада. По сценарию вначале все грузы располагаются на зоне погрузки, затем программа начинает попытку и получает задание.
В задании содержится информация о той зоне погрузки, в которую нужно привезти груз (после востребования), а также примерное время, когда он будет востребован. Все грузы необходимо расположить в зоны хранения до их востребования. Участники должны разместить их так, чтобы в случае надобности можно было доставить груз как можно быстрее.
Важно! Грузы не должны располагаться вне зон без непосредственного контакта с роботом.
Примерное время востребования отличается от действительного времени востребования на \(\pm 30\) с по аналогии с ожидаемым временем прибытия такси. (Оценка этих значений происходит, исходя из усредненных известных данных, и может отличаться как в большую сторону (например, водитель пропустил поворот и пришлось объезжать), так и в меньшую (например, водитель нашел быстрый объезд, который не учитывался при оценке времени прибытия).
Следует иметь ввиду, что сервер не будет инициатором сообщения о том, что какой-то из грузов стал востребован — решение этой задачи входит в программу участников (способ проверки указан далее).
Во избежание спорных моментов, при необходимости, учитывается время доставки грузов от момента востребования. Оно рассчитывается от момента востребования (Внимание! Не от того момента, когда программа узнала о востребовании.) до того времени, когда программа участника доложит серверу о том, что груз доставлен (способ будет указан далее).
Для начала задания команде необходимо выполнить следующие строки кода.
task = Task()
task.start()
task.getTask()
В первую очередь следует вызвать task.start(). Для получения задания — task.getTask(). Функция вернет словарь в виде строки:
{"task_token": “EVlsaAwSasd12Wweqedl”, "cargoes": [
{"cargo_id": 1, "time": 125, "loading_zone": 1},
{"cargo_id": 2, "time": 452, "loading_zone": 1},
{"cargo_id": 5, "time": 223, "loading_zone": 2},
]}
где
task_id: токен попытки. Данный токен необходимо указывать при всех последующих вызовах функций классаTask, поскольку задание завязано на время, и использование данного токена позволит привязать последующие обращения к попытке.cargoes: массив словарей, содержащий:cargo_id: ID груза;time: примерное время востребования (может отличаться от действительного на \(\pm 30\) с );loading_zone: idзоны погрузки.
Исходя из знания примерного времени востребования и зоны погрузки, необходимо расставить грузы по зонам хранения (на это участнику выделяется определенное время, в котором гарантируется отсутствие востребованных грузов).
Далее члену команды требуется постоянно отправлять запрос на проверку востребованности грузов через функцию task.getCargoDemand() с указанием токена попытки task_token, полученного из команды task.start(). Функция вернет список словарей в виде строки:
[{"cargo_id": 1, "unloading_zone": 1},
{"cargo_id": 2, "unloading_zone": 2}]
где
cargo_id: ID груза;unloading_zone: зона разгрузки, на которой ожидается груз.
Как только груз становится востребованным, его можно доставлять до заданной зоны разгрузки, после чего участнику требуется отправить запрос, что груз был доставлен через функцию task.cargoDelivered() с указание токена попытки task_token, робота(-ов) которые доставляли груз, id доставленного груза и id зоны разгрузки.
Важно! На этом этапе возможно наличие большого груза, взаимодействовать с которым получится только с использованием двух роботов.
Команде предоставляется мобильная дифференциальная платформа с возможностью управления через Wi-Fi или Bluetooth. Член команды может управлять мобильной платформой, задавая напряжение на левом и правом двигателе.
Этап состоит из одного теста. Для получения полного балла нужно успешно перевезти все грузы в зону погрузки за 10 мин. Предусмотрено начисление баллов за выдачу груза после его востребования в заданной зоне разгрузки.
Порядок действий:
- Команда готовится к запуску робота не более 5 мин.
- Судья устанавливает грузы в соответствии с заданием.
- После запуска, исходя из предварительной информации, роботы должны расставить грузы из зоны разгрузки по зонам хранения. В одной зоне хранения должен находиться лишь один груз.
- Далее необходимо постоянно поддерживать коммуникацию с серверами, отслеживая статус востребованности грузов.
- После востребованности груза необходимо доставить его до зоны погрузки.
- Далее необходимо подтвердить, что груз был доставлен, после чего перейти к п. 5.
Тест прерывается, если:
- робот полностью выехал за проезжую часть (он может двигаться только по проезжей части и остановкам;
- у участника не осталось времени на его выполнение.
Считается, что груз расположен в зоне, если он полностью располагается внутри зоны без касания цветных границ зоны. Если груз перекрывает цветную линию зоны и не выходит за пределы зоны, считается, что он расположен частично успешно (за это будут вычитаться баллы).
![]() |
![]() |
![]() |
![]() |
![]() |
|---|---|---|---|---|
| OK | не ОК | не ОК | частично ОК | OK |
- Доставка груза в зону хранения (5 / количество грузов) — максимально 5 баллов.
- Доставка груза в зону разгрузки по востребованию (5 / количество грузов) — максимально 5 баллов (при спорных ситуациях время от востребования до доставки учитывается для получения дополнительных баллов).
- Расположение груза в зоне, частично перекрывающей цветные границы зоны — минус 2,5 / количество грузов.
- Ошибочная зона выгрузки и/или ошибочный груз при выгрузке — минус 5 / количество грузов.
- Нарушение последовательности, в которой должны перемещаться грузы — минус 5 / количество грузов.
Участник получает 0 баллов при прохождении теста, если ни один груз не был доставлен в требуемую зону разгрузки при востребовании.
Задача прерывается и оценивание прекращается:
- при пересечении хотя бы одним из роботов внешних границ поля,
- в случае тайм-аута (15 мин).
На данном этапе команда представляет свое решение перед жюри, демонстрируя наработки, архитектуру системы и алгоритмы, использованные для решения задач инженерного тура. Защита включает:
- презентацию краткого видео с демонстрацией работы системы,
- объяснение кода и алгоритмов,
- ответы на вопросы жюри.
- Презентация команды (до 1 мин). Команда кратко представляет себя и поясняет общую концепцию решения.
- Демонстрация видео (1–2 мин). Включает нарезку лучших попыток работы системы, позволяющую жюри увидеть алгоритмы в действии. Разрешается комбинировать видеозаписи с экрана и реальные съемки.
- Объяснение алгоритмов и кода (2–3 мин). Представление кода: через
README.mdв git-репозитории, пояснение принципов работы всех алгоритмов с визуальной поддержкой. Ответы на вопросы жюри. Участникам задаются вопросы по коду, математическим алгоритмам и разным аспектам решения:
- компьютерное зрение,
- планирование движения,
- управление роботом,
- логистика грузов,
- коммуникация между роботом и компьютером.
Команды готовят решения для этапов задачи (подзадачи) и сдают его в течение трех дней инженерного тура. Количество попыток не ограничено.
Для успешной сдачи необходимо записаться во временной слот. Каждый слот занимает по 10 мин, между ними выделяется 5 мин на подготовку команды к сдаче этапа. Соответственно каждый этап ограничен интервалом в 10 мин.
В одно время доступно 2 слота. Команда может занимать только каждый четвертый (по времени) слот, при этом возможны исключения, если:
- одна из из команд пожертвовала своим слотом,
- слот никто не занял, а его время уже началось.
Важно! За каждой командой закреплено одно из четырех полей. Команда не может выбрать время, в котором уже занято поле.
Критерии оценивания этапов:
Баллы за прохождение «Базовое управление роботом и сегментация карты»
Максимальное количество баллов за этап — 10, при этом:
- команда получает баллы за корректную детекцию, трекинг и сегментацию поля, грузов и робота;
- баллы начисляются в случае корректного движения в сторону груза и его достижения;
- ограничение времени на попытку — 10 мин.
В своем слоте команда последовательно выполняет 5 тестов (количество запусков при разных условиях), в которых судья переставляет грузы и робота, а участники перезапускают решение. За выполнение каждого теста команда получает максимум 2 балла.
Баллы за прохождение «Передвижение грузов роботом»
Максимальное количество баллов за этап — 10, при этом:
- команда получает баллы за транспортировку груза в целевую зону;
- команда получает неполный балл, если груз, расположенный в целевой зоне, частично перекрывает цветную линию зоны;
- команда теряет баллы при столкновении;
- рестарт происходит при жестком или множественном столкновении, а также при выезде за пределы поля;
- ограничение времени на попытку — 10 мин.
В своем слоте команда последовательно выполняет 2 теста. Команда получает баллы за каждый успешный тест и теряет при пересечении запрещенной зоны грузом или роботом, выезде за пределы поля, а также при перемещении неверного груза.
Баллы за прохождение «Организация работы автоматизированного складского помещения»
Максимальное количество баллов за этап — 10, при этом:- команда получает баллы за транспортировку грузов в зону хранения и целевую зону погрузки при востребованности;
- команда получает неполный балл, если груз, расположенный в целевой зоне, частично перекрывает цветную линию зоны;
- команда теряет баллы при столкновении;
- рестарт происходит при жестком или множественном столкновении, а также при выезде за пределы поля;
- ограничение времени на попытку — 10 мин.
- учитывается время, за которое доставили груз в зону погрузки при его востребованности;
Проводится всего один тест, в котором участники получают условия (смотри описание этапов выше и условие задачи) и начинают выполнение этапа.
Баллы за прохождение «Защита решений»
Максимальное количество баллов за этап — 15, при этом:- команда выступает перед жюри и получает от 0 до 17 баллов в соответствии с критериями ниже;
- если команда набрала больше 15 баллов, то за этап она получает 15 баллов за этап.
Общие критерии, которые применяются ко всем аспектам решения:
- Гибкость решения: насколько алгоритмы способны адаптироваться к изменениям, а не зависят от жестко заданных условий (входит в другие пункты).
- Распределение вклада: оценивается вклад всех участников, т. е. если весь код написан одним человеком, команда получает 0 баллов за этот пункт; вклад оценивается через коммиты в репозитории команды. 2 балла
- Продвинутость решений: использование современных и оптимальных подходов вместо неоправданно сложных или избыточных алгоритмов (входит в другие пункты).
- Качество оформления README: структурированность, наличие схем, разборчивость кода и пояснений. 2 балла
Частные критерии для каждой отдельной задачи:
Компьютерное зрение:
- Применение как стандартных алгоритмов обработки изображений и выделения объектов, так и нестандартных (например, в рамках библиотеки OpenCV). 1 балл
- Алгоритмы работы изображения при разных условиях освещенности. 0,5 балла
- Алгоритмы фильтрации данных и устойчивость к шумам. 0,5 балла
- Алгоритмы обработки изображений. (входит в другие пункты)
- Обоснованность выбора алгоритмов (сравнение с другими). 1 балл
Планирование движения:
- Гибкость решения (с точки зрения выбора коэффициентов и расширяемости на двух и более роботов) построения траекторий и обхода препятствий. 1 балл
- Устойчивость алгоритмов навигации с учетом препятствий и мультиагентного перемещения груза. 2 балла
- Реализация методов динамического или статического планирования пути. 1 балл
- Обоснованность выбора алгоритмов (сравнение с другими). 1 балл
Управление роботом:
- Учет физических параметров системы (скорость, инерция, задержки). 1 балл
- Обоснованность алгоритмов управления мобильной платформой через напряжение двигателей. 1 балл
Логистика грузов:
- Оптимизация расстановки грузов с учетом временных ограничений. 1 балл
- Эффективность (с точки зрения минимизации пути, пройденного роботами) маршрутизации грузов с минимальными задержками. 1 балл
Коммуникация между роботом и компьютером:
- Обоснованность выбора методов коммуникации. 0,5 балла
- Схема коммуникации между агентами (ПК, Raspberry, колесная платформа) в решении. 0,5 балла
После дедлайна сдачи решений этапа №№ 2 и 3 проводится защита решений для всех команд.
Командный балл рассчитывается как сумма баллов за все этапы плюс балл за защиту решения. (Выбирается максимальный балл из всех попыток сдать этап.)
Например, команда успешно выполнила все три этапа. Первый этап она сдала за две попытки на 8 баллов, т. к. выбирается максимальный балл за все попытки. За второй этап команда получила 6,5, за последний (третий) — 7. Итого: \(8 + 6{,}5 + 7 = 21{,}5\) балл.
Далее командный балл приводится к 100-балльной системе. Для этого вычисляется коэффициент \(k = 100/\)(макс. балл из всех команд), далее баллы всех команд умножаются на этот коэффициент.
Итоговый индивидуальный балл участника равен: математика \(\times\) 0,2 + информатика \(\times\) 0,2 + командный балл \(\times\) 0,6.
В случае равенства итогового индивидуального балла призеры и победители определяются по наилучшим результатам инженерного тура (с максимальным количеством командного балла).
В случае равенства командного балла победителем инженерного тура будет считается команда, набравшая наибольший балл за третий этап, который рассчитывается по формуле: балл_за_доставку_груза / ВД, где ВД — время доставки (подробный расчет балла за доставку груза — в условии задачи).
Для распознавания зон на поле (погрузки, разгрузки, хранения) используется маскирование по цвету в HSV-пространстве с заранее заданными диапазонами. Изображение «пустого» поля используется как эталон для определения границ зон.
Контуры зон извлекаются с помощью морфологических операций (открытие, закрытие) и функции cv.findContours, затем приводятся к нужному виду и обрезаются по границам поля.
Маска с расположением контуров записывается в файл. При запуске она накладывается на изображение с поля, что позволяет определять контура объектов, когда робот перекрывает контуры объектов.
Для определения координат роботов используется распознавание ArUco-маркеров и вычисление вектора ориентации по положению сторон маркера.
Для каждого найденного робота или груза сохраняется центр и угол поворота. Контуры грузов восстанавливаются по заранее заданным шаблонам (малый и большой) и трансформируются с учетом положения ArUco.
Код разделен на сегменты, обрабатывающие зоны, грузы и роботов, с возможностью настройки масок и параметров через свойства класса.
По ссылке можно найти программный код на Python, который выполняет описанные выше операции: https://gitlab.com/ovcharov.alex.o/nto2025-solution/-/blob/feature/segmentation/segmentation.py.
Для определения текущего положения и ориентации робота используется IP-камера, установленная над полем. Обработка изображения включает выделение ArUco-маркера и вычисление центра робота и угла его ориентации.
Управление основано на кинематической модели робота с дифференциальной кинематикой. Вначале рассчитываются линейная и угловая скорости на основе желаемого и измеренного положения робота (\(x\), \(y\), \(\theta\)). Далее из кинематической модели рассчитываются желаемые напряжения двигателей.
Для стабилизации движения к цели применяется ПИД-регулятор по расстоянию и углу между направлением робота и вектором на цель. Это позволяет роботу плавно и точно достигать заданных точек.
Команды управления передаются на робота по Bluetooth или Wi-Fi через промежуточный контроллер Raspberry Pi, обеспечивая обратную связь в реальном времени.
При достижении цели робот останавливается и ждет следующей команды — в рамках одного теста таких команд может быть несколько (как минимум три).
По следующей ссылке можно найти программный код на Python, который выполняет описанные выше операции: https://gitlab.com/ovcharov.alex.o/nto2025-solution/-/tree/feature/robot-control.
Алгоритм планирования учитывает расположение всех объектов на поле:
- грузов,
- роботов,
- занятых и свободных ячеек хранения, распознанных по результатам сегментации.
В начальной фазе задачи все грузы размещаются в зоне погрузки, и необходимо рассчитать оптимальные маршруты для их перемещения в свободные ячейки хранения.
Система компьютерного зрения передает бинарную карту с участками, где можно передвигаться и где запрещено. На карту накладывается дилатация с радиусом, равным размеру робота. Это позволяет планировать маршрут для центра робота и не сталкиваться со стенками.
При помощи RRT строится направленный граф (путь для груза) так, что изменение направления движения меняется на 90°.
При помощи PRM строится маршрут до начальной точки пути для груза, а также маршрут, когда робот должен переехать с одной грани на другую для изменения направления движения груза.
Для хранения используется правило: один груз — одна ячейка, при этом предпочтение отдается ближним ячейкам, чтобы минимизировать время будущей доставки.
Планирование логистики происходит с учетом примерного времени востребования груза, позволяя расставлять грузы так, чтобы позже сократить путь к зоне разгрузки.
В процессе выполнения система регулярно опрашивает API на предмет востребованности грузов и перестраивает приоритеты движения на основе обновленных данных.
По следующей ссылке можно найти программный код на Python, который выполняет описанные выше операции: https://gitlab.com/ovcharov.alex.o/nto2025-solution/-/tree/feature/planning?ref_type=heads.
Команда, которая справилась с заданием лучше всех, успешно реализовала все вышеперечисленные шаги решения, разработав быстрый и надежный алгоритм: https://disk.360.yandex.ru/d/acdepDCaHocbhw.
- Курс. Суть матанализа. Глава 1: https://www.youtube.com/watch?v=qd0rzmSGPWg&list=PLVjLpKXnAGLVbrcJdDb0a2RS6MmRCgxJz.
- Курс. Сущность линейной алгебры. Введение: https://www.youtube.com/watch?v=RNTRYicPvWQ&list=PLVjLpKXnAGLXPaS7FRBjd5yZeXwJxZil2.
- Курс. Hardcore Math Materials: https://www.lektorium.tv/hardcoremath-materials.
- Курс. Control of Mobile Robots — 1.1 Control of Mobile Robots: https://www.youtube.com/watch?v=aSwCMK96NOw&list=PLp8ijpvp8iCvFDYdcXqqYU5Ibl_aOqwjr.
- Туториал. OpenCV-Python Tutorials: https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html.
- Курс. Computer Vision — AVT: https://avt.global/cv.
- Казаков К. А. и др. Обзор современных методов планирования движения.
- Павловский И. Обзор алгоритмов планирования пути: https://habr.com/ru/post/349044/.
- Russian Blogs. Обзор методов планирования пути: https://russianblogs.com/article/8569373974/.
- PythonRobotics. Path Planning: https://github.com/AtsushiSakai/PythonRobotics#path-planning.









