Простой алгоритм парковки автомобиля

Я ищу простой алгоритм парковки автомобиля для игры.

Позиции автомобиля и гаража определяются тремя числами (x, y, theta). Где x и y - центр объекта и theta - угол между осью объекта и осью X.

введите здесь описание изображения

Движение автомобиля упрощено - это точка (не нужно рассчитывать точное движение шин), которая может двигаться с fixed speed назад и вперед или поворачивать по кругу с радиусом R (радиус поворота может быть фиксированным или гибкий - не важно - мне подойдет любой вариант) и у него no inertia or acceleration.

Гараж имеет 3 стены, которых не должна касаться машина. Можно использовать точные размеры для столкновения, но для простоты столкновение проверяется путем измерения углов между автомобилем и гаражом и расстояния между осью автомобиля и центром гаража. Когда машина и гараж находятся достаточно близко (расстояние между центрами меньше некоторой константы CloseEnough) столкновение проверяется (alpha, d) < (maxAlpha, maxDistance)

введите здесь описание изображения

В мире, моделируемом тиками, мы берем текущее управление автомобилем — moving direction вперед или назад и turning angle и вычисляем следующую позицию автомобиля.

Алгоритм должен выдавать серию управляющих команд, например [forward, left], [forward, left], [backward, straight], [forward, right].

Это нормально, если это будет итеративно и будет производиться одна команда за раз, а затем проверять, что происходит на следующем такте, и производить другую. Он может попросить механизм моделирования смоделировать и создать новые координаты с учетом управляющей команды или использовать механизм моделирования, чтобы попробовать несколько вариантов и выбрать лучший.

Также нормально, если он делает это серией приблизительных движений, как раз попробовал - промазал, попробовал в другой раз - приблизиться, а в третий раз - в итоге припарковался (но это должно быть более-менее разумно и не делайте десятки или сотни итераций вперед и назад).


person Alex Craft    schedule 11.01.2019    source источник
comment
Я думаю, было бы полезно координировать преобразование гаража в фиксированное положение.   -  person Neil    schedule 12.01.2019
comment
Этот тип робота является неголономным, так как его движение ограничено. Транспортное средство, которое вы описываете, полностью соответствует модели Дубина. Вероятно, вы могли бы преобразовать описанный на этой странице алгоритм, который управляет точкой и ориентацией, в алгоритм парковки, просто обработав случай, когда автомобиль должен объехать парковочное место.   -  person c2huc2hu    schedule 17.01.2019


Ответы (1)


Есть несколько особенностей, которые нужно решить, например, какая точность требуется для успешной стыковки и какую точность позволяют «галочки». Вам придется поэкспериментировать. Но вот общий подход:

Без потери общности предположим, что машина движется по прямым линиям и по кругу с минимальным радиусом. (Большие круги дадут более короткую и мягкую езду, но оставьте это на потом.) На практике это будет означать чередование линия-круг-линия-круг-линия...

Конечная цель — заехать прямо в гараж.

Цель перед этим («предпоследняя») — попасть на одну из окружностей, касательных к этому пути, как можно ближе к гаражу. Итак, если гараж находится в (0,0,0), круги центрируются в (0, +/1r). В общем, если гараж находится в (x, y, θ), окружности центрируются в (x-/+rsinθ, y+/-rcosθ).

Цель до этого («предпоследняя»?) состоит в том, чтобы попасть из одного из кругов, на котором машина уже находится (крайний левый или крайний правый), на линию, которая касается как этого круга, так и целевого круга.

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

Этого достаточно?

person Beta    schedule 17.01.2019
comment
Ну я примерно понял, проблема в том, что мой компьютер не такой шустрый и требует более подробной инструкции :). Спасибо, понятно, тоже думаю воспользоваться поиском по дереву. - person Alex Craft; 18.01.2019
comment
@AlexeyPetrushin: Да, кому-то придется написать код. - person Beta; 19.01.2019