Задача F. Автопилот параллельной парковки (Unity)

Автор:Dmitriy Merzlyakov   Ограничение времени:180 сек
Входной файл:input.txt   Ограничение памяти:512 Мб
Выходной файл:output.txt  
Максимальный балл:100  

Условие

Вам поручено разработать систему автоматической параллельной парковки автомобиля на дороге небольшого виртуального городка.

Термины

Описание автомобиля и датчиков

На вашем автомобиле расположены 8 парктроников, а также два датчика разметки.

Для упрощения задачи коллайдер автомобиля представляет собой параллелепипед размерами (1.811328 м в ширину, 4.819343 м в длину и 1.191418 м в высоту) (рис. 1).

Все датчики расположены на высоте ≈0,27 м от нижней грани коллайдера.

Парктроники располагаются по одному на каждой боковой грани по центру, а также в боковых рёбрах под углом 45 градусов к продолжению граней. Датчики разметки расположены на двух боковых рёбрах, ближайших к сплошной по направлению движения автомобиля (движение правостороннее), и направлены в плоскости передней и задней боковой грани.

Датчики разметки игнорируют любые препятствия и выполняют измерения сквозь них, парктроники же считывают первое попадание до препятствия и возвращают расстояние до него (рис. 2). Если расстояние до препятствия больше 10 м, то парктроники возвращают значение, близкое к 10.

Рис. 1. Коллайдер автомобиля (зелёным)
Рис. 2. Расположение датчиков и их нумерация (красными линиями обозначены измерения парктроников, синими – датчиков разметки)

Описание парковочной зоны и препятствий

Локация, в которой происходит парковка представляет собой прямую проезжую часть шириной 12.5 м (каждая полоса 6.25 м) и длиной 50 м. Парковочная зона огорожена двумя блоками и знаком «Парковка».

Вы можете выполнять парковку только внутри этой области. Длина парковочной зоны составляет 40 м, расположение зоны одинаково для всех тестов. Внутри этой области могут находится другие припаркованные транспортные средства. Каждое ТС расположено строго параллельно сплошной, его коллайдер также представляет собой параллелепипед, границы которого не находятся ближе 3 м от сплошной, а также не выходят за пределы проезжей части. Учтите, что припаркованные ТС могут быть различных размеров.

К проезжей части примыкает тротуарная зона, в которой также могут располагаться различные объекты.

Описание стартового положения

Перед началом парковки автомобиль расположен параллельно сплошной, центр автомобиля находится на расстоянии 1.6 м от неё. Передний край коллайдера находится на линии начала парковочной зоны.

Управление автомобилем

Для управления автомобилем вы можете использовать только два метода, реализованных в классе CarController:

void SetSpeed(float value)задаёт скорость движения автомобилем в км/ч. Отрицательные значения value задают движение в обратном направлении.

void SetSteeringAngle(float value)задаёт направление поворота руля. Value может изменяться от -1 до 1, где -1 – крайнее левое положение (максимальный выворот колёс влево), 1 – крайнее правое положение.

float GetParkingSensorDistance(int index) – возвращает текущее показание парктроника с номером index. Нумерация начинается с 0 (передний парктроник) и идёт по часовой стрелке. Если парктроник с запрошенным индексом отсутствует, возвращается -1.

float GetDistanceToLine(int index) – возвращает текущее показание датчика разметки с номером index. 0 соответствует переднему датчику, 1 – заднему.

Данные с датчиков обновляются после каждого выполнения FixedUpdate().

Примечание о работе функций

Поведение функции SetSpeed приближено к поведению при управлении автомобилем в ручном режиме. При вызове функции SetSpeed происходит набор скорости автомобиля до установленного значения путём нажатия на полный газ. Как только разгон до нужной скорости будет выполнен, автомобиль сразу же начинает сбавлять скорость путём подачи полного газа на обратный ход. Как только скорость становится ниже заданной, автомобиль снова начинает её набирать. Таким образом, после разгона до нужной скорости vзаданная, автомобиль продолжает её поддерживать в пределах |vфакт − vзаданная| < 0.3. Вызов функции SetSpeed обрабатывается сразу, т.е. если, например, вы задали скорость, равной 40 и не дожидаясь её полного набора установили скорость 0, то автомобиль сразу начнёт процесс снижения скорости.

При вызове функции SetSteeringAngle происходит поворот колёс до установленного положения. Полный выворот от начального положения до одного из краевых составляет примерно 0.4 секунды. Функция обрабатывает все запросы по очереди, т.е. если вы находитесь в процессе движения из состояния 0 в состояние 1, и не дожидаясь завершения полного поворота колёс вызываете переход в состояние -1, то сначала колёса выкручиваются в положение, соответствующее состоянию 1, и только затем начинают выкручиваться до состояния -1.

Требования к парковке

Внутри парковочной зоны необходимо найти пространство, в которое можно будет припарковать автомобиль. Гарантируется, что парковочное место, достаточное для осуществления парковки с помощью вышеуказанных функций, существует. Требуется припарковать автомобиль параллельно сплошной по направлению движения, ближайшая точка коллайдера должна быть не ближе, чем 3 м от сплошной, при этом автомобиль должен находится строго внутри проезжей части (не заезжать на тротуар). Также требуется припарковать автомобиль на расстоянии от 0.2 до 0.4 м до ближайшего препятствия позади автомобиля.

По завершении парковки вы должны вызвать функцию EndOfParking() находящуюся в классе CarController. Убедитесь в том, что перед вызовом EndOfParking() скорость автомобиля была установлена равной 0.

Оценивание и ограничения

Тестирование проводится на наборе сцен, соответствующих указанному описанию. Вам нужно выполнить процедуру поиска парковочного места и самой парковки за 50 секунд.

Результат теста будет оцениваться по качеству осуществлённой парковки. Если ваш автомобиль после парковки попадает в указанную зону и находится на нужном расстоянии от препятствия сзади (измерение берётся по парктронику №4), то в случае, если угол автомобиля отклоняется не более чем на 1 градус от идеальной параллельной парковки, вы получаете максимальный балл за тест. За большее отклонение по каждому из параметров предусматривается штраф.

В процессе парковки вам нельзя сталкиваться с любыми другими объектами на сцене. Также вам нельзя выезжать любой частью хитбокса на встречную полосу за сплошную. При нарушении этих требований симуляция завершается с результатом в 0 баллов.

Также вы не сможете устанавливать скорость движения автомобиля свыше 60 км/ч в любую из сторон.

Всё ваше решение должно находиться в классе Solution. Этот класс не должен содержать публичные методы, значения которых устанавливаются из редактора движка. Также запрещается обращаться к любым объектам на сцене, в том числе запрашивать и/или изменять компоненту Transform, а также создавать свои игровые объекты. Вы можете использовать только данный вам экземпляр CarController и вызывать указанные в нём методы.

Проект

Проект с демонстрационной сценой доступен по этой ссылке: https://github.com/Collider24/NTO_Parallel_Parking_Autopilot. Вам осталось реализовать класс Solution.

Вы можете открыть сцену в папке Assets/Scenes для тестирования своего решения. Писать код с решением нужно в файл Assets/Scripts/Solution.cs. Для моделирования различных дорожный ситуаций вы можете расставлять на сцене объекты с машинами, находящиеся в папке Assets/Prefabs.

Внимание! Не изменяйте остальные файлы и другие игровые объекты. Изменения, внесённые куда-либо кроме файла Solution.cs не учитываются.


0.158s 0.029s 17