Skip to main content

Оптимизация пути

Построив маршрут с помощью того или иного планировщика, необходимо оптимизировать этот маршрут.

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

Основная логика прописана в базовом классе project.optimize_path.PathOptimizer

Для реализации планировщика необходимо реализовать только метод

/**
* Оптимизировать путь
* @param path путь
* @return оптимизированный путь
*/
virtual std::vector<std::vector<double>> optimizePath(std::vector<std::vector<double>> path) = 0;

Сам медианный оптимизатор прописан в классе project.optimize_path.MedianPathOptimizer

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

Для этого у медианного оптимизатора добавлен параметр checkCnt. Если промежуточные проверки выполнять не требуется, то необходимо установить этому параметру значение 0.

Количество циклов оптимизации указывается в параметре optimizeLoopCnt.

Для повышения гладкости можно дополнительно разделить каждый этап исходного пути на заданное количество частей divideCnt. Если этот параметр равен 0, то путь сразу передаётся оптимизатору без изменений.

Для моделирования был написан дополнительный класс project.optimize_path.OptimizePathGenerator по аналогии с генератором путей.

Однако, оптимизационный генератор в отличие от генератора планировщиков считывает список файлов экспериментов и оптимизирует каждый из путей.

Для сравнения работы алгоритма было проведено несколько непрерывных оптимизаций одного и того же пути