Инженерный тур. 2 этап
Задачи второго этапа знакомят участников с одним из основных вызовов робототехники — автономной навигацией мультиагентных робототехнических систем. Подобные задания можно встретить в таких международных соревнованиях, как: RoboCup, Robotex International, Darpa Robotic Challenge. Они максимально приближены к реальности, их развитие будет представлено на заключительном этапе уже на реальных роботах. Аналогичные задачи решаются по отношению к любому автопилоту на автономных складах, в роботах-пылесосах и системе доставки.
Количество участников в команде: 3–4 человека.
Роли:
- Математик-алгоритмист. Подбор и разработка алгоритмов для программистов: управления и навигации, создания графа занятости, алгоритмов поиска пути в графе, построения траектории и т. д. В приоритете хорошее знание математики, алгоритмов планирования пути и машинного зрения.
Программист системы управления и навигации робота. Программирование системы управления роботом, планирования пути и следование по нему. Понимание того, как работает теория графов и как настраиваются регуляторы.
В приоритете хорошее знание программирования, алгоритмов планирования пути, теории управления (ПИД-регулятор и др.).
Программист машинного зрения. Программирование системы машинного зрения, определение координат объектов на изображении, классификации объектов, определения препятствий.
В приоритете хорошее знание программирования, алгоритмов машинного зрения.
Капитан команды. Распределение задач, расстановка приоритетов, распределение ресурсов, разрешение споров, проектирование архитектуры решения, программирование высокоуровневой интеллектуальной системы управления, создание связи между системой управления робота, системой навигации и планирования движения и системой машинного зрения.
В приоритете хорошее знание программирования, алгоритмов планирования пути, машинного зрения (OpenCV) и теории управления (ПИД-регулятор и др.), также приветствуются хорошие коммуникативные навыки.
Участники должны понимать основы математического анализа, алгебры, геометрии, основы программирования на C/C++ и Python. Им потребуется владение алгоритмами поиска пути, планирования движения, алгоритмов управления, алгоритмов обработки изображения, знание библиотеки OpenCV. Также очень важным аспектом является знание и умение работы в операционной системе Linux.
Командные задачи второго этапа инженерного тура открыты для решения. Соревнование доступно на платформе Яндекс.Контест:
- 1 блок: https://contest.yandex.ru/contest/69982/enter/.
- 2 блок: https://contest.yandex.ru/contest/69985/enter/.
- 2 блок: https://contest.yandex.ru/contest/69987/enter/.
Имя входного файла: стандартный ввод или input.txt.
Имя выходного файла: стандартный вывод или output.txt.
Ограничение по времени выполнения программы: 100 с.
Ограничение по памяти: 400 Мбайт.
Рассматривается мобильный робот с дифференциальной платформой и карта местности со статичными препятствиями. Требуется написать программу для планирования пути для посещения целевых точек (в правильном порядке), при этом избегая столкновений с препятствиями. Целевые точки задаются в виде координат на изображении карты местности в системе координат OpenCV (ось \(x\) смотрит вправо, ось — \(y\) вниз), положительный угол отсчитывается против часовой стрелки относительно оси \(x\).
В этой задаче рассматривается только форма робота, без учета его кинематики. Принимается, что в точках найденного пути робот может поворачиваться, а между ними он движется прямолинейно. Считается, что по пути передвигается центр масс маски робота (имеется в виду центр масс, определяемый по изображению маски робота), и вокруг нее происходит вращение робота при повороте на месте. Найденный путь должен проходить через заданные целевые точки.
Для обеспечения безопасного движения по пути требуется, чтобы расстояние от робота до препятствий было не менее трех пикселей. Причем в точках пути робот должен быть способен выполнить полный оборот.
Карта местности, где требуется построить маршрут, и форма робота (вид сверху) задаются в виде черно-белых изображений. Целевые точки задаются в виде координат на изображении карты местности. Порядок прохождения точек имеет значение.
Гарантируется, что:
- при расположении центра масс робота в ключевой точке столкновения с препятствиями отсутствуют, в том числе при выполнении полного оборота;
- путь до каждой целевой точки существует.
На рис. 1.1 приведен пример сегментированной карты местности.
Формат входных данных
- Первая строка содержит два числа \(N\) и \(M\) — ширина и высота изображения сегментированной карты.
- Вторая строка содержит изображение заранее сегментированной карты пространства (черным цветом обозначены препятствия, белым — пространство, где можно двигаться) в виде \(N\times M\) элементов, разделенных пробелами (сначала элементы первой строки, далее второй и т. д.).
- Третья строка содержит два числа \(K\) и \(L\) — ширина и высота изображения маски робота.
- Четвертая строка содержит изображение маски робота (черным цветом обозначен фон, белым цветом — сам робот) в виде \(K\times L\) элементов, разделенных пробелами (сначала элементы первой строки, далее — второй и т. д.).
- Пятая строка содержит два целых числа, соответствующие начальному положению робота \(XY\).
- Шестая строка содержит начальную ориентацию робота.
- Следующие строки содержат координаты целевых точек в формате \(XY\), то есть два целых числа, разделенных пробелом. Обратите внимание, что порядок прохождения заданных точек важен!
Формат выходных данных
- Первая строка содержит целое число \(C\) — количество точек в найденном пути.
- Следующие строки содержат координаты маршрута в формате \(XY\), то есть два целых числа, разделенных пробелом.
Тестовые данные
Строки, соответствующие изображениям, слишком велики, поэтому вместо примеров ввода и вывода предлагаем скачать файлы, содержащие один из тестов, для тестирования на вашем ПК.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/1/input.1.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/1/output.1.txt.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/1/input.2.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/1/output.2.txt.
- Сначала необходимо произвести эрозию на изображение карты с использованием маски робота в различных ориентациях. Желательно после произвести повторную операцию эрозии с использованием круга с радиусом три пикселя, чтобы избежать возможных проблем с погрешностью отрисовки робота.
- Далее следует построить граф, включающий целевые точки. Сделать это можно несколькими способами, например, через скелетизацию, сетку с равномерными шагом или через точную/примерную декомпозицию пространства на ячейки.
- Затем нужно последовательно применить методы поиска пути (например, алгоритм Дейкстры,
A*, волновой и т. д.) для построения пути.
Пример программы-решения
https://disk.yandex.ru/d/oAF6TMss93XjJg/1/solution.py.
- Баллы начисляются пропорционально последовательно успешно пройденным тестам (до первого неуспешного).
- Максимальное количество баллов зависит от времени отправки решения.
Имя входного файла: стандартный ввод или input.txt.
Имя выходного файла: стандартный вывод или output.txt.
Ограничение по времени выполнения программы: 100 с.
Ограничение по памяти: 631 Мбайт.
Рассматривается задача сегментации изображения складского помещения. Пример такого изображения представлен на рис. 1.2. На исследуемом изображении можно найти:
- карту-схему складского помещения;
- техническую зону для роботов (обозначена зеленым цветом с заполнением);
- запрещенные зоны, на которых роботу нельзя находиться (обозначены красным цветом со штрихом);
- зоны хранения (обозначены желтым цветом без заполнения, но с
ArUco-маркером в центре); - хранящиеся на складе грузы (обозначены светлыми фигурами).
Необходимо написать программу, которая по полученному изображению будет производить сегментацию складского помещения:
- на техническую зону;
- на зоны со свободными местами хранения;
- на зоны, где робот может передвигаться.
Также требуется определить массив идентификаторов ArUco-маркеров свободных мест и координаты центров масс каждого груза. Форма грузов может быть произвольной, как и цвет, но при этом цвет груза не совпадает с цветами зон, и расположение груза находится в пределах зон хранения. Площадь груза не менее девятой части площади зоны хранения. Если в зоне хранения расположен груз, то эта зона будет считаться запрещенной для перемещения робота. По пустым зонам хранения передвигаться можно. Зоны хранения могут иметь различные размеры. Возможная вариация расцветок зон не отличается в открытой и закрытой части тестов.
Более точный пример можно найти в формате ввода.
Формат входных данных
- Первая строка содержит два числа \(N\) и \(M\) — ширина и высота изображения сегментированной карты.
- Следующие три строки содержат BGR-каналы изображения, которое нужно сегментировать, в виде \(N \times M\) элементов, разделенных пробелами (сначала идут элементы первой строки, далее второй и т. д.).
Формат выходных данных
- Первая строка содержит маску технической зоны.
- Вторая строка содержит маску зоны, где робот может передвигаться.
- Третья строка содержит маску мест свободных зон хранения.
- Четвертая строка содержит словарь, в котором в качестве ключей содержатся
IDArUco-маркеров свободных зон хранения, значения которых будут содержать центр соответствующей зоны хранения. - Пятая строка содержит двумерный массив центров масс каждого из грузов.
Тестовые данные
Поскольку строки, соответствующие изображениям, слишком велики, вместо первого примера ввода и вывода предлагаем скачать файлы, содержащие один из тестов, для тестирования на вашем ПК.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/2/input.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/2/output.txt.
| Номер теста | Стандартный ввод | Стандартный вывод |
|---|---|---|
1 |
1280 720 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 ,[30,30],[150,50],[50,150]] |
0 0 0 0 … 0 0 0 0 0 0 … 0 0 0 0 0 0 … 0 0 "27": [110, 250], "51": [660, 351] |
Переведем изображение из RGB-формата в HSV. На тестовом изображении найдем значения для каждого из цветов, обозначающих конкретный цвет. Затем определим, к каким зонам относятся найденные значения цветов. После этого на каждом новом изображении мы будем каждое значение цвета сопоставлять в пару с ранее найденными значениями. Определив наиболее близкие пары, сможем получить маски разметок.
Для поиска цвета мест хранения можно использовать ArUco-маркеры.
Для технической зоны маска разметки будет соответствовать маске самой зоны. Для запрещенной зоны необходимо найти контуры, после чего отфильтровать контуры, которые находятся внутри других контуров, затем, заполнив эти контуры, получим маску запрещенных зон, которую после дополним занятыми зонами хранения.
Далее, для зон хранения определяем контуры и так же, как и для запрещенных зон, фильтруем контуры, которые находятся внутри других контуров.
Теперь находим контуры грузов. Проводим фильтрацию по площади, чтобы исключить элементы маркеров. Далее, проверяем, внутри каких контуров зон хранения находятся контуры грузов, и при обнаружении такого контура дополняем маску запрещенных зон занятой зоной хранения. Из оставшихся контуров составляем маску свободных зон хранения.
Также, исходя из оставшихся контуров, проходимся по каждому контуру, маской вырезаем зону хранения из основного изображения, переведенного в оттенки серого, после чего, используя пороговую фильтрацию, получаем маску ArUco-маркера, по которой определяем его значение. Зная контуры свободных зон хранения, определяем координаты их центров масс и, найдя все соответствующие ArUco-маркеры, составляем словарь.
Возвращаясь к контурам грузов, для каждого контура находим координату центра масс и заносим их в отдельный массив.
Примечания
При использовании компилятора (make) Python 3.12.3 будут доступны пакеты scipy, numpy и cv2. В качестве маркеров используются ArUco-маркеры \(3\times 3\), которые были сгенерированы, согласно задаче «Определение идентификаторов», представленной в теоретических материалах. Для определения этих маркеров необходимо написать свою функцию, основываясь на том, как они создаются (средствами OpenCV детектировать эти маркеры не получится).
Пример программы-решения
https://disk.yandex.ru/d/oAF6TMss93XjJg/2/solution.py.
- Баллы начисляются пропорционально последовательно успешно пройденным тестам (до первого неуспешного).
- Максимальное количество баллов зависит от времени отправки решения.
Имя входного файла: стандартный ввод или input.txt.
Имя выходного файла: стандартный вывод или output.txt.
Ограничение по времени выполнения программы: 100 с.
Ограничение по памяти: 400 Мбайт.
В этой задаче рассматривается мобильный робот с дифференциальной платформой, которому необходимо посещать целевые точки в пространстве со статичными препятствиями, избегая столкновений с ними. Напишите программу для расчета требуемых скоростей колес робота с заданной частотой дискретизации, при которых робот посетит все целевые точки, избегая столкновений с препятствиями. Кинематическая модель робота описывается следующими уравнениями: \[\dot{p} = \begin{bmatrix} \dot{x} \\ \dot{y} \\ \dot{\theta} \end{bmatrix} = \begin{bmatrix} v \cos \theta \\ -v \sin \theta \\ \omega \end{bmatrix},\] \[v = \frac{(w_r + w_l) r}{2} \cdot \frac{\pi}{180},\] \[\omega = \frac{(w_r - w_l) r}{b},\] где
- \(r\) — радиус колес,
- \(b\) — расстояние между колесами,
- \(w_r\) и \(w_l\) — угловые скорости правого и левого колес соответственно (град/c),
- \(x, y\) — координаты центра робота относительно неподвижной системы отсчета,
- \(\theta\) — ориентация робота (град, угол поворота относительно оси \(x\)).
Положительное вращение робота соответствует правилу правой руки (против часовой стрелки), отрицательное — по часовой стрелке.
Шаг времени при генерации требуемых угловых скоростей колес должен быть равен 0,01 с. При проверке предоставленного решения дифференциальные уравнения кинематики робота будут решаться с использованием метода Коши (см. задание 1.2 инженерного тура отборочного этапа). Робот должен посетить все целевые точки не более, чем за 100 с. Для обеспечения безопасного движения по пути требуется, чтобы расстояние от робота до препятствий было не менее трех пикселей.
Целевая точка считается пройденной, если центр робота прошел не дальше, чем три пикселя от точки. Порядок прохождения точек имеет значение.
Формат входных данных
- Первая строка содержит два числа \(N\) и \(M\) — ширина и высота изображения сегментированной карты.
- Вторая строка содержит изображение заранее сегментированной карты пространства (черным цветом обозначены препятствия, белым — пространство, где можно двигаться) в виде \(N \times M\) элементов, разделенных пробелами (сначала элементы первой строки, далее — второй и т. д.).
- Третья строка содержит два числа \(K\) и \(L\) — ширина и высота изображения маски робота.
- Четвертая строка содержит изображение маски робота в виде \(K \times L\) элементов, разделенных пробелами (сначала элементы первой строки, далее — второй и т. д.). Робот имеет круглую форму с центром в середине, однако его размеры четко не определены.
Следующая строка содержит словарь, который будет содержать следующие поля:
init— массив из трех чисел, которые обозначают начальное положение и ориентацию робота \([x, y, \theta]\).params— массив, содержащий параметры робота \([r, b, \text{max\_speed}]\), где \(\text{max\_speed}\) — максимальная угловая скорость колес.points— массив целевых точек в формате \([x, y]\), которые робот должен посетить.
Формат выходных данных
- Первая строка содержит целое число \(C\) — количество точек траектории.
- Следующие строки содержат временную метку (время задания скоростей), а также задаваемые угловые скорости для левого и правого колеса в формате \(\langle t, \omega_l, \omega_r \rangle\).
Тестовые данные
Строки, соответствующие изображениям, слишком велики, поэтому вместо примеров ввода и вывода предлагаем скачать файлы, содержащие один из тестов, для тестирования на вашем ПК.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/3/input.1.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/3/output.1.txt.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/3/input.2.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/3/output.2.txt.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/3/input.3.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/3/output.3.txt.
- Из первого задания имеется требуемый путь робота. По условию, робот двигается линейно между точками пути, следовательно, можно реализовать подобное движение и в данной задаче.
- Разделим движение между точками на два этапа: движение по прямой (когда скорости обоих колес равны), поворот робота (скорости колес противоположны).
- Для движения по прямым линиям и поворота имеет смысл задавать максимальные угловые скорости колес (по абсолютному значению), причем после движения по прямой линии должна следовать остановка, как и после поворота.
- В конце остается только реализовать замедление и ускорение робота согласно ограничениям на максимальную и минимальную скорость.
Пример программы-решения
https://disk.yandex.ru/d/oAF6TMss93XjJg/3/solution.py.
- Баллы начисляются пропорционально последовательно успешно пройденным тестам (до первого неуспешного).
- Максимальное количество баллов зависит от времени отправки решения.
Имя входного файла: стандартный ввод или input.txt.
Имя выходного файла: стандартный вывод или output.txt.
Ограничение по времени выполнения программы: 100 с.
Ограничение по памяти: 400 Мбайт.
Задача является продолжением задачи «Траекторное управление» 1.3. Рассматривается команда мобильных роботов с дифференциальной платформой, которым необходимо посещать целевые точки в пространстве со статичными препятствиями. Напишите программу для расчета требуемых скоростей колес для каждого из роботов с заданной частотой дискретизации, при которых они посетят все целевые точки, избегая столкновений с препятствиями и другими роботами.
Кинематическая модель робота описывается следующими уравнениями: \[\dot{p} = \begin{bmatrix} \dot{x} \\ \dot{y} \\ \dot{\theta} \end{bmatrix} = \begin{bmatrix} v \cos \theta \\ -v \sin \theta \\ \omega \end{bmatrix},\] \[v = \frac{(w_r + w_l) r}{2} \cdot \frac{\pi}{180},\] \[\omega = \frac{(w_r - w_l) r}{b},\] где
- \(r\) — радиус колес,
- \(b\) — расстояние между колесами,
- \(w_r\) и \(w_l\) — угловые скорости правого и левого колес соответственно (град/c),
- \(x, y\) — координаты центра робота относительно неподвижной системы отсчета,
- \(\theta\) — ориентация робота (град, угол поворота относительно оси \(x\)).
Положительное вращение робота соответствует правилу правой руки (против часовой стрелки), отрицательное — по часовой стрелке.
Шаг времени при генерации требуемых угловых скоростей колес должен быть равен 0,01 с. При проверке предоставленного решения дифференциальные уравнения кинематики робота будут решаться с использованием метода Коши (см. задание 1.2 инженерного тура отборочного этапа). Роботы должны посетить все целевые точки не более, чем за 100 с.
Целевая точка отмечается как пройденная, если центр робота прошел не дальше, чем два пикселя от точки. Порядок прохождения точек имеет значение. Для обеспечения безопасного движения по пути требуется, чтобы расстояние от робота до препятствий и других роботов было не менее трех пикселей.
Формат входных данных
- Первая строка содержит два числа \(N\) и \(M\) — ширина и высота изображения сегментированной карты.
- Вторая строка содержит изображение заранее сегментированной карты пространства (черным цветом обозначены препятствия, белым — пространство, где можно двигаться) в виде \(N \times M\) элементов, разделенных пробелами (сначала элементы первой строки, далее — второй и т. д.).
- Третья строка содержит два числа \(K\) и \(L\) — ширина и высота изображения маски робота.
- Четвертая строка содержит изображение маски робота в виде \(K \times L\) элементов, разделенных пробелами (сначала элементы первой строки, далее — второй и т. д.). Робот имеет круглую форму с центром в середине, однако его размеры четко не определены.
Следующая строка содержит словарь, который будет содержать следующие поля:
init— массив из трех чисел, которые обозначают начальное положение и ориентацию робота \([x, y, \theta]\).params— массив, содержащий параметры робота \([r, b, \text{max\_speed}]\), где \(\text{max\_speed}\) — максимальная угловая скорость колес.points— массив целевых точек в формате \([x, y]\), которые робот должен посетить.
Формат выходных данных
- Первая строка содержит целое число \(C\) — количество точек траектории.
- Следующие строки содержат временную метку (время задания скоростей), а также задаваемые угловые скорости для левого и правого колеса в формате \(\langle t, \omega_l, \omega_r \rangle\).
Тестовые данные
Строки, соответствующие изображениям, слишком велики, поэтому вместо примеров ввода и вывода предлагаем скачать файлы, содержащие один из тестов, для тестирования на вашем ПК.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/4/input.1.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/4/output.1.txt.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/4/input.2.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/4/output.2.txt.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/4/input.3.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/4/output.3.txt.
Решение задачи будет продолжением решения задания «Траекторное управление» 1.3. Дополнительно требуется добавить проверку расстояния между роботами и, если расстояние будет меньше определенного значения, то нужно остановить обоих роботов и спланировать их поведение для объезда друг друга. Один из способов реализации данного алгоритма заключается в следующих шагах:
- выбрать одного из роботов и найти недалеко от него положение, которое не будет пересекаться с маршрутом второго робота (проверку пересечения следует производить с учетом габаритов робота);
- переместить первого робота в положение из предыдущего пункта;
- переместить второго робота и, как только он проедет пересечение новых маршрутов, проложить новый путь для первого робота или вернуть его обратно и продолжить движение.
Пример программы-решения
https://disk.yandex.ru/d/oAF6TMss93XjJg/4/solution.py.
- Баллы начисляются пропорционально последовательно успешно пройденным тестам (до первого неуспешного).
- Максимальное количество баллов зависит от времени отправки решения.
Имя входного файла: стандартный ввод или input.txt.
Имя выходного файла: стандартный вывод или output.txt.
Ограничение по времени выполнения программы: 100 с.
Ограничение по памяти: 917 Мбайт.
Рассматривается несколько последовательных изображений складского помещения (вид сверху), на которых помимо статических объектов также присутствуют роботы, которые передвигаются от кадра к кадру. Требуется написать программу для детекции и отслеживания перемещений роботов. Для первого кадра положения роботов известны. Для всех остальных кадров необходимо определить положение центра (центра масс маски робота). Всего дано не менее трех кадров в каждом тесте. На рис. 1.3 представлен пример одного кадра.
Раскраска роботов заранее неизвестна и является случайной, однако она отличается у разных роботов в рамках одного теста. Форма роботов является произвольной и может совпадать у разных роботов в рамках одного теста. Отдельно отметим, что робот явно виден на фоне, то есть исключено наличие случаев частичного перекрытия или слияния робота с окружением. Все остальные элементы, кроме роботов, на всех кадрах статичны, то есть не изменяются от кадра к кадру, а роботы между последовательными кадрами передвигаются. Кроме того, никакие два робота во время своего движения не сталкивались, то есть отсутствуют кадры, где изображения роботов бы перекрывались.
Формат входных данных
- Первая строка содержит два целых числа \(N\) и \(M\) — ширина и высота изображения сегментированной карты в пикселях.
- Следующие строки содержат последовательные изображения карты с роботами в виде \(N \times M\) элементов, разделенных пробелами (сначала идут элементы первой строки, далее — второй и т. д.). Каждый кадр представлен тремя строками, в которых последовательно содержатся три канала изображения BGR.
- Последняя строка содержит положения роботов на первом кадре в виде двумерного массива, см. примеры.
Формат выходных данных
- Для каждого робота на отдельной строке должны быть выведены координаты положений роботов, соответствующих порядку последовательных изображений, в виде целых чисел, разделенных пробелами. Например, для трех кадров строка будет иметь вид \(\langle X1\ Y1\ X2\ Y2\ X3\ Y3 \rangle\), и так для каждого робота.
- Порядок вывода, то есть в какой строке координаты какого робота, неважен.
- Координаты рекомендуется округлить до целых чисел, и выводить сначала координату по оси \(OX\), потом \(OY\).
Примечания
В примере ниже приведены три последовательных кадра, на которых изображены четыре робота.
| Номер теста | Стандартный ввод | Стандартный вывод |
|---|---|---|
1 |
640 480 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 0 0 0 0 ... 0 0 , [316, 464], [344, 239], [420, 334]] |
231 105 150 444 150 444 316 464 50 72 400 410 344 239 151 63 344 237 420 334 321 321 211 312 |
Поскольку строки, соответствующие изображениям, слишком велики, полные примеры входных данных можно найти по ссылкам ниже. Только один из примеров содержится в тестах.
Тестовые данные
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/5/input.1.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/5/output.1.txt.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/5/input.2.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/5/output.2.txt.
Стандартный ввод: https://disk.yandex.ru/d/oAF6TMss93XjJg/5/input.3.txt.
Стандартный вывод: https://disk.yandex.ru/d/oAF6TMss93XjJg/5/output.3.txt.
- Сначала нужно попиксельно сравнить два последовательных изображения с целью составить маску, на которой выделены положения всех или части роботов.
- Далее выделяются отдельные контуры, области внутри которых сравниваются с окружением на каждом из сравниваемых изображений. Если на изображении делается вывод, что контур обозначает робота, то в отдельный массив заносится информация с внешним видом робота, а также определяется его местоположение на карте, исходя из центра масс области внутри контура.
- Для сравнения уже опознанных роботов предлагается сравнивать расцветку найденного робота с записанной, постепенно вращая ее на небольшой фиксированный угол. Если сходство будет более 90%, то можно считать, что робот опознан.
- Описанный алгоритм необходимо вызывать между каждыми двумя последовательными изображениями, чтобы найти всех роботов, в том числе и тех, что на первом изображении были неподвижны.
Пример программы-решения
https://disk.yandex.ru/d/oAF6TMss93XjJg/5/solution.py.
- Баллы начисляются пропорционально последовательно успешно пройденным тестам (до первого неуспешного).
- Максимальное количество баллов зависит от времени отправки решения.
Имя входного файла: стандартный ввод или input.txt.
Имя выходного файла: стандартный вывод или output.txt.
Ограничение по времени выполнения программы: 100 с.
Ограничение по памяти: 400 Мбайт.
Рассматривается мультиагентная система из \(S\) (\(S\leqslant 7\)) одинаковых круглых роботов на омниплатформе (роботы могут двигаться в любом направлении), расположенная на некоторой плоской местности. На местности присутствует одно круглое препятствие.
Задача роботов: из произвольных начальных положений образовать формацию, описываемую графом расстояний между каждым роботом и всеми остальными. Это значит, что для каждого робота заданы желаемые расстояния до всех других роботов.
Формация должна быть образована не более, чем за 1000 с, при этом расстояния между роботами должны отличаться от желаемых не более, чем на 5%. Гарантируется, что желаемые расстояния между роботами строго больше их диаметра, кроме того, формирование указанной формации возможно.
Напишите одну программу-регулятор, которая будет исполняться на каждом из роботов (на всех роботах будет одновременно запущена одна и та же программа), и формировать сигнал управления, обеспечивающий решение задачи, так что роботы не будут сталкиваться между собой и с препятствием, не будут выезжать за границы карты. Сигналом управления для каждого из роботов являются проекции линейной скорости, то есть модель \(i\)-го робота выглядит следующим образом: \[\left\{ \begin{aligned} \dot{x}_i (t)&=u_{x,i} (t),\\ \dot{y}_i (t)&=u_{y,i} (t), \end{aligned} \right.\] где \(u_{x,i} (t)\) и \(u_{y,i} (t)\) — проекции желаемой скорости на соответствующие оси. Решение этих дифференциальных уравнений производится методом Эйлера.
За основу решения задачи возьмите следующий пропорциональный регулятор, в котором специальным образом определен сигнал ошибки, на основе координат роботов и желаемых расстояний. Очевидно, что ошибку можно посчитать, например, как \[e_d=d_{ij}^2-m_{ij}^2,\] где \(d_{ij}\) — фактическое расстояние между \(i\)-м и \(j\)-м роботом, а \(m_{ij}\) — желаемое расстояние между ними. Однако из разницы между расстояниями или квадратами расстояний непонятно, в каком направлении следует двигаться на плоскости, поэтому предлагается рассмотреть модифицированную ошибку, которая может быть рассчитана по каждой из осей: \[\left\{ \begin{aligned} e_{x,ij}&=(d_{ij}^2-m_{ij}^2 )(x_j-x_i ),\\ e_{y,ij }&=(d_{ij}^2-m_{ij}^2 )(y_j-y_i ), \end{aligned} \right.\] где \(x_i\) и \(x_j\) — координаты \(i\)-го и \(j\)-го роботов по оси \(OX\) соответственно, \(y_i\) и \(y_j\) — координаты \(i\)-го и \(j\)-го роботов по оси \(OY\) соответственно.
Тогда управление для \(i\)-го робота с помощью пропорционального регулятора можно рассчитать, как сумму модифицированных ошибок по расстоянию между \(i\)-м роботом и всеми остальными, умноженную на некоторый коэффициент: \[\left\{ \begin{aligned} u_{x,i} (t)=\alpha\sum_{j=1,j\neq i}^S e_{x,ij },\\ u_{y,i} (t)=\alpha\sum_{j=1,j\neq i}^S e_{y,ij}, \end{aligned} \right.\] где \(\alpha>0\) — коэффициент регулятора, \(u_{x,i} (t)\) и \(u_{y,i} (t)\) — элементы вектора управления для \(i\)-го робота.
Если у всех роботов реализовать такой регулятор, то гарантируется сходимость расстояний между роботами к желаемым значениям. Однако он не учитывает препятствия, возможные столкновения между роботами, не предотвращает выезд робота за пределы местности. Внесите модификацию, чтобы решить эту проблему. Кроме того, можно реализовать любой другой регулятор.
Формат входных данных
Участникам требуется подготовить файл на языке Python, содержащий функцию следующего вида:def controller(robot_position, other_robot_positions, target_distances, map_image, robot_mask, max_velocity, data):
...
return velocity, data
где
robot_position— положение робота на карте в системе координат OpenCV (listс двумя числами типаfloat).other_robot_positions— положения остальных роботов на карте в системе координат OpenCV (listизlist-ов, которые аналогичныrobot_position).target_distances— желаемые расстояния до роботов. Порядок соответствует порядку координат вother_robot_positions.map_image— изображение карты.robot_mask— маска робота.max_velocity— максимальная скорость по одной из осей.data— словарь, куда можно сохранять то, что нужно участнику. Он будет передаваться от цикла к циклу. У каждого робота свой словарь.
Так как данная задача является интерактивной, то простой набор входных и выходных данных отсутствует. Однако примеры задач можно найти в папке по ссылке: https://disk.yandex.ru/d/oAF6TMss93XjJg/6/input/.
Здесь:
- первая строка содержит два числа \(N\) и \(M\) — ширина и высота изображения местности;
- вторая строка содержит изображение местности (черным цветом обозначено препятствие, белым — пространство, где можно двигаться) в виде \(N \times M\) элементов, разделенных пробелами (сначала элементы первой строки, далее — второй и т. д.);
- третья строка содержит два числа \(K\) и \(L\) — ширина и высота изображения маски робота;
- четвертая строка содержит изображение маски робота в виде \(K \times L\) элементов, разделенных пробелами (сначала элементы первой строки, далее — второй и т. д.), робот имеет круглую форму с центром в середине, однако его размеры четко не определены;
- следующая строка содержит двумерный массив, представляющий собой
listначальных положений роботов в системе координат OpenCV, сами начальные положения тоже представляют собойlist, содержащий два числа типаfloat.
Задав желаемые расстояния между роботами, можно провести тестирование своей программы.
Формат выходных данных
Ожидается, что функция участника вернет рассчитанную скорость для робота в системе координат OpenCV в виде массива с двумя числами типа float и словарь data.
Для решения задачи требуется реализовать П-регулятор по ошибке формирования требуемого расстояния от управляемого робота до соседнего. Результирующее управляющее воздействие рассчитывать как сумму управляющих воздействий по каждому соседу.
Основная сложность состоит в корректном формировании сигнала ошибки. Одним из вариантов решения данной проблемы является рассмотрение разницы между желаемым и фактическим расстоянием между роботами, умноженным на разницу координат для учета взаимного расположения роботов.
Для избежания столкновений робота с соседними, необходимо:
- выделить проекцию вектора скорости на вектор, соединяющий его с управляемым роботом для каждого соседа;
- умножить полученную проекцию на коэффициент, зависящий от расстояния между управляемым роботом и соответствующим соседом и корректирующий данную проекцию вектора скорости, тем самым уменьшая ее по достижении определенного порогового значения.
Аналогично необходимо поступить для избежания столкновения с препятствием или границей карты.
Пример программы-решения
https://disk.yandex.ru/d/oAF6TMss93XjJg/6/solution.py.
Баллы начисляются пропорционально последовательно успешно пройденным тестам (до первого неуспешного).



