Отбор на соревнование МТС (TrueTechArena) — противоречивые впечатления

Вчера заметил здесь же на хабре объявление о соревновании от МТС — сейчас как раз идёт отбор, до 15 числа можно влиться. Точнее их там даже два — алгоритмическое и «программирование роботов». Я продрался сквозь регистрацию и сейчас немного расскажу что внутри, чтобы вы могли легче решиться попробовать (или наоборот).

Сайт честно говоря немного расфуфыренный и невнятный, поэтому я не сразу нашёл даты — и не особо понял, что требуется для участия в роботах.

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

Алгоритмический трек

Для квалификационного раунда выложено три задачи, нужно решить хотя бы одну. Задачи буквально на несколько строчек, я сдал на питоне хотя не очень был уверен в своих скиллах в нём — всё зашло с первой попытки. Однако какой-нибудь плашки что я квалифицировался — по-моему нигде не нахожу. Код задач впрочем сохранён — возможно он будет окончательно верифицирован 16 числа по окончании приёмки задач. В общем, тут больше делать нечего.

Заметил краем глаза что Go версии 1.19 — учитывая что в версиях 21–23 подвезли многие приятные ништяки, непонятно что помешало организаторам установить у себя компилятор посвежее.

Программирование роботов

Здесь всё гораздо более насосно :) В интерфейсе для решения задачи сверху ссылка на «дополнительные материалы» — ну я думаю, что-то скачать для локального запуска придётся.

1d42a68505c4e45cca57e4133dc3fbdd.png

О-о-о, переходя по этой ссылке мы попадаем на другой вообще домен (cybertech.ai) с плашкой «авторизоваться через True Tech Arena». Мудрено, но да ладно.

На что нужно обратить внимание — ваш токен. Он понадобится в дальнейшем, но вспомнить на какой странице его искать — это может быть проблематично.

9b26a015f1e92e48f341d35c48869450.png

Здесь нужно скачать бандл на 260 мегабайт. Внутри вы найдёте некую приложеньку которая запускает локальный сервер с АПИ робота и сваггером.

Фиг знает почему таким путём пошли — казалось бы, ну запустили бы это незамысловатое АПИ на своём публичном сервере. Зачем всем N участникам качать этот страх -, а самим разработчикам упарываться над инструкциями и поддержкой?

662b9470fb665dfe11cb27987956a535.png

Дальше всё приблизительно понятно — нужно делать вызовы к АПИ чтобы двигать робота, и как указано в задании выше — например, определить конфигурацию лабиринта. Тут главное не запутаться в вызовах, т.к. они на все задачи и на разные способы запуска похоже.

Например я запустил версию No UI — и не сразу понял почему АПИ меня посылает к лешему (утверждая что «нет робота» или как-то так). Оказывается нужно было найти другие методы — по странице сваггера они в самом конце.

Попробуем их и посмотрим формат ответа. Если вы не очень знакомы со сваггером (или с данной версией) то в первые секунды можно задуматься что же тут нажать. Открываете нужный эндпойнт, находите справа кнопку «Try it out» — после этого поля для ввода токена (и параметров, если они есть) станут доступны. Введите, после чего нажмите синенькую «Execute».

/robot-python/restart — я вызвал вначале, хотя возможно он в начале не требуется. Почему эндпойнты для «No UI» называются robot-python я не знаю. В тексте эндпойнты называются на нашем родном наречии «ручками», что заставляет задуматься когда же дойдут до переименования небогоугодных словечек вроде «файл» или «сервер».

/robot-python/sensor-data — возвращает текущее положение робота и что он «видит», например:

{
  "down_x_offset": -107.9,
  "down_y_offset": -124.5,
  "front_distance": 5,
  "back_distance": 5,
  "left_45_distance": -1,
  "right_45_distance": -1,
  "left_side_distance": 5,
  "right_side_distance": 38.3,
  "rotation_pitch": 0,
  "rotation_yaw": 0,
  "rotation_roll": 0
}

Как видим, с непривычки такое обилие данных может немного смутить. Первые два поля — это так завуалированно обозвали координаты в лабиринте. Следующие шесть — расстояния измеренные датчиками в каждом из направлений до стены, если она видна поблизости. Значение »-1» предположительно означает что датчика такого нет. Пространственные углы ориентации (последние три) вам наверное не понадобятся по крайней мере для первой задачи (меняться будет только rotation_yaw — при поворотах).

/robot-python/forward — попытка двинуться вперед из положения указанного выше ни к чему не приводит — sensor-data возвращает неизменную позицию. Ага, понятно — потому что у нас перед носом была стенка.

/robot-python/right — попробуем повернуться назад — увидимо что координаты остались те же, а вот расстояния до стен поменялись, по-видимому, релевантно повороту на 90 градусов. Это подтверждается тем что rotation_yaw меняет значение на 90.

После этого повторный /forward срабатывает и мы уже где-то в новой точке.

{
  "down_x_offset": -91.3,
  "down_y_offset": -124.5,
  "front_distance": 21.6,
  "back_distance": 21.6,
  "left_45_distance": -1,
  "right_45_distance": -1,
  "left_side_distance": 5,
  "right_side_distance": 5,
  "rotation_pitch": 0,
  "rotation_yaw": 90,
  "rotation_roll": 0
}

Видим что ddown_x_offset уменьшился — мы сдвинулись в сторону центра лабиринта -, а вот down_y_offset остался прежним — ну это нормально, мы ведь проехали строго вдоль оси X.

Заключение

В общем, пользоваться можно! Возможно даже немного развлекательно (задачи с роботом) -, но вероятно потребуют у вас хоть час-другой времени чтобы просто раскурить что тут делать надо. Кроме условия задачи технические вопросы можно найти, кажется, только в FAQ, вперемежку с нетехническими. Токен например видимо нужно хардкодить (почему было не сделать через ENV и не включить это в примеры кода — я не знаю).

Если будете пробовать — поделитесь пожалуйста тоже — интересно обменяться мнениями :)

© Habrahabr.ru