RoboCup Championship 2026
Соревнование по роботофутболу 2 на 2 — программируйте агентов, побеждайте соперников
Турнир — среда 15 апреля 2026 · Регистрация — 14 апреля 23:59 МСК · Загрузка моделей — 15 апреля 12:00 МСК
Наш турнир подошёл к концу, его итоги:
- Гурин Владислав
- Москалёв Никита
- Гришанова Арина
- Хамитов Данил
- Галайчук Егор
Мы хотим поблагодарить каждого из вас за участие и ваши интересные модели)
Для получения рекомендаций мы ждём от вас небольшое эссе (его шаблон представлен на сайте). Пожалуйста, не затягивайте с эссе🥹 На финальные результаты будет влиять не только ваше место в лидерборде! Нам важно узнать вас поближе, и хотелось бы, чтобы ваши научные интересы совпали с тем, чего от вас хочет научный руководитель.
Эссе нужно отправить через нашу группу ВКонтакте:
vk.com/club237329636
Финальные результаты мы планируем объявить завтра заочно.
Правила
Каждая команда управляет 2 роботами. Матч длится 2 минуты. Побеждает тот, кто забьёт больше голов. Чистый оффлайн-агент в виде .pkl.
Формат моделей
Напишите Python-класс с методом get_actions(obs), сохраните через cloudpickle в .pkl и загрузите на сайт. Можно ML или чистый алгоритм.
Призы
🥈 2 место — рекомендация на кафедру НДС
Топ-5 участников должны будут сдать эссе; оно влияет на итоговое место.
Лидерборд
| # | Игрок | Очки | В | Н | П | Матчи |
|---|
Активные матчи
Последние результаты
Войдите, чтобы играть
Ваша модель
Как создать .pkl файл
import cloudpickle, math
class MyModel:
def get_actions(self, obs):
# obs: my_robots, opponent_robots,
# ball, score, time_remaining, field
# Вернуть: [[ax0,ay0,kick0],[ax1,ay1,kick1]]
return [[0, 0, 0], [0, 0, 0]]
with open("my_model.pkl", "wb") as f:
cloudpickle.dump(MyModel(), f)
Скачать пример (.pkl)
Быстрый матч
Войдите в очередь — сыграйте против случайного соперника
Вызов
Выберите соперника для личного матча
Входящие вызовы
Нет
Grand Tournament 2026
15 апреля 2026, 10:00 МСК · Финальный турнир · Прямой эфир
До закрытия регистрации
14 апреля 2026, 23:59 МСК
Участие в турнире
Войдите, чтобы записаться
Заполните данные для участия в турнире:
🔒 Загрузка моделей закрыта (15 апреля 12:00 МСК).
Участники
Загрузка...
Формат модели (API)
Модель — Python-класс, сохранённый в .pkl через cloudpickle. Метод get_actions вызывается каждый шаг симуляции (~60 раз/сек).
import cloudpickle, math
class MyModel:
def get_actions(self, observation):
"""
observation = {
"my_robots": [{"x","y","vx","vy","angle","kick_ready"}, ...], # 2 робота
"opponent_robots": [...],
"ball": {"x","y","vx","vy"},
"score": {"my": int, "opponent": int},
"time_remaining": float, # секунд
"field": {
"x": 0.0, "y": 0.0,
"width": 1080.0, "height": 640.0,
"goal_y_top": 210.0, "goal_y_bottom": 430.0
}
}
Система координат: (0,0) — левый верхний угол поля.
Ваши ворота всегда СЛЕВА (x=0). Атакуете ВПРАВО (x=width).
Физика (за один шаг dt=1/60 с):
vx += ax * ACCEL * dt # ax ∈ [-1, 1]
vy += ay * ACCEL * dt # ay ∈ [-1, 1]
vx *= DRAG; vy *= DRAG # DRAG = 0.90 → max ~150 px/s
x += vx * dt; y += vy * dt
Мяч: скользит с drag=0.97, отталкивается от стенок.
Возвращать: список из 2 действий
[[ax0, ay0, kick0], [ax1, ay1, kick1]]
ax, ay ∈ [-1.0, 1.0] — желаемое ускорение (нормировано)
kick ∈ {0, 1} — удар (только если kick_ready == 1.0)
"""
my = observation["my_robots"]
ball = observation["ball"]
actions = []
for robot in my:
dx = ball["x"] - robot["x"]
dy = ball["y"] - robot["y"]
d = math.hypot(dx, dy) or 1.0
kick = 1 if d < 60 and robot["kick_ready"] >= 1.0 else 0
actions.append([dx/d, dy/d, kick])
return actions
# Сохранить в .pkl (обязательно через cloudpickle):
with open("my_model.pkl", "wb") as f:
cloudpickle.dump(MyModel(), f)
⬇ Скачать готовый пример (.pkl)
📋 Полные правила турнира
⚙️ Физика симуляции
- Поле: 1080 × 640 px. Ворота — слева и справа, y ∈ [210, 430].
- Каждый шаг: dt = 1/60 с. Агент возвращает ax, ay ∈ [−1, 1] и kick ∈ {0, 1}.
- Скорость робота обновляется:
vx += ax·ACCEL·dt,vy += ay·ACCEL·dt, затемvx *= DRAG(DRAG = 0.90). Максимальная установившаяся скорость ≈ 150 px/с. - Мяч: drag = 0.97, упруго отражается от стен. При ударе получает импульс вдоль направления от робота к мячу.
- Kick_ready = 1.0 означает, что удар готов; после удара кулдаун ~0.5 с.
🏆 Призы и рекомендации
- 🥇 1 место — рекомендательное письмо на кафедру ММП (Математические методы прогнозирования).
- 🥈 2 место — рекомендательное письмо на кафедру НДС (Нелинейная динамика и системы управления).
- Итоговое место определяется результатом турнира. Топ-5 дополнительно сдают эссе, которое влияет на финальный рейтинг.
- Не обязательно делать ML-решение — хорошо запрограммированный алгоритм (геометрия, физика, управление) оценивается наравне с нейросетями.
📝 Эссе (только для топ-5)
Эссе подают только 5 лучших участников по итогам турнира (PDF, до 2 стр.) — оно влияет на финальное место. В нём нужно описать:
- О себе — кратко: курс, группа, средний балл.
- Оценки и предметы — какие предметы понравились больше всего и почему.
- Достижения — олимпиады, проекты, публикации, стажировки, спортивные достижения, личные прорывы, хобби и интересы (если есть).
- Ожидания от научного руководителя — что хотите изучать, какой формат работы предпочитаете.
🤖 Описание решения (только для топ-5)
Отдельный раздел в эссе или отдельный файл:
- Что пробовали: какие подходы рассматривали, почему отказались.
- Что выбрали: почему именно этот метод, архитектура или алгоритм.
- Результаты: сколько голов в тестовых матчах, против каких соперников.
📦 Требования к файлу модели (.pkl)
- Формат: .pkl, сохранённый через
cloudpickle(не stdlib pickle). - Максимальный размер: 512 КБ.
- Класс должен иметь метод
get_actions(self, observation) → list. - Запрещено: файловый IO, сеть, subprocess, системные вызовы, бесконечные циклы.
- Если модель 3 раза подряд выдаёт исключение — засчитывается техническое поражение (0:3).