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

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

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

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

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

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

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

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

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

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

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

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

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

Например я запустил версию 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 и не включить это в примеры кода - я не знаю).

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

Комментарии (2)


  1. forester2k
    13.10.2024 17:56

    Однако какой-нибудь плашки что я квалифицировался - по-моему нигде не нахожу.

    Меня это тоже удивило. Немного потыркавшись увидел, что внизу каждой решённой задачи есть подпись "Ответ принят". Это, конечно, не то, ну да ладно, хоть что-то.