Оптимизация пути
Построив маршрут с помощью того или иного планировщика, необходимо оптимизировать этот маршрут.
Пока что в данном фреймворке реализована только медианная оптимизация. По аналогии с медианным фильтром алгоритм последовательно перебирает тройки точек маршрута и заменяет координаты средней из них на среднее арифметическое крайних точек, если новое состояние не соответствует коллизии.
Основная логика прописана в базовом классе
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
по аналогии с генератором путей.
Однако, оптимизационный генератор в отличие от генератора планировщиков считывает список файлов экспериментов и оптимизирует каждый из путей.
Для сравнения работы алгоритма было проведено несколько непрерывных оптимизаций одного и того же пути