2013-03-27 3 views
0

Я реализую A * для поиска пути мобильного робота внутри коридора. На данный момент путь создается внутри коридора, но он скользит вправо по всем краям препятствий, но я предпочитаю, чтобы путь лежал посреди коридора. 1.Есть ли какой-нибудь сглаживающий алгоритм? 2. Как включить ограничения рулевого управления, чтобы я мог получить реалистичный/допустимый путь? 3. Как дать штраф за «поворот», чтобы избежать зигзагообразных путей.Поиск пути в коридоре

Поскольку я новичок в A * algo, я обнаружил трудности в вышеупомянутых проблемах. Ссылка на любую ссылку, книга также приветствуется. Спасибо ..

+0

Вы либо хотите использовать сглаживание траектории, либо [алгоритм поиска по любому углу] (http://stackoverflow.com/a/14328161/238419). Оба они довольно просты в реализации, хотя алгоритмы с любым углом зрения лучше всего подходят для поиска почти оптимальных путей. –

ответ

0

Вы можете просто ограничить полезную площадь до середины коридора.

0

Вы можете предварительно сформировать поле, на котором вы запустите A *, предположив сокращение его на 1 плиту, чтобы ячейка, которая пересекает непроходимую ячейку в 4-стороннем районе, станет непроходимой. Тогда ваш результирующий путь A * будет ближе к центру коридора. Конечно, несколько коридоров могут стать непроходимыми полностью, но это то, что ожидается, поскольку мы практически имитируем 3x3 кросс-образный робот, чтобы ходить по сетке, а крест 3x3 не может пройти через путь 2xN.

О добавлении стоимости для поворота - вы должны добавить текущее направление к массиву, содержащему данные A *, и реализовать функцию с двумя аргументами, которая вернет неотрицательное значение для пары (старое направление, новое направление) аргументы. Скажем, «если old_direction не соответствует новому направлению, верните 1, else верните 0». Затем добавьте результат этой функции к любой стоимости, которую вы вычислили для каждого шага A * -терации.

+0

Идея добавления стоимости в очередь звучит хорошо. Не могли бы вы объяснить немного больше о том, как найти направление старого или нового шага? Благодарю. – user1785307

+0

Вы делаете себя enum/set констант и поле 'direction', а когда вы добавляете новую клетку достижимости в A *, вы берете координатную разницу между этой и текущей обработанной ячейкой, выводите направление оттуда. – Vesper

Смежные вопросы