Опции решателя для оптимизации графика положения
возвращает набор опций решателя со значениями по умолчанию для заданного типа решателя графика положения.solverOptions
= poseGraphSolverOptions(solverType
)
Оптимизируйте график положения на основе узлов и ограничений по ребрам. Обрезка цикла закрыта на основе их ребра невязкой ошибок.
Загрузите набор данных, содержащий 2-D графики положения. Осмотрите poseGraph
объект для просмотра числа узлов и замыканий цикла.
load grid-2d-posegraph.mat pg disp(pg)
poseGraph with properties: NumNodes: 120 NumEdges: 193 NumLoopClosureEdges: 74 LoopClosureEdgeIDs: [1x74 double] LandmarkNodeIDs: [1x0 double]
Постройте график положения с отключенными идентификаторами. Красные линии указывают на закрытие цикла, идентифицированное в наборе данных. Положения в графике должны следовать сетке, но показу свидетельством дрейфа с течением времени.
show(pg,'IDs','off'); title('Original Pose Graph')
Оптимизируйте график положения с помощью optimizePoseGraph
функция. По умолчанию эта функция использует "builtin-trust-region"
решатель. Поскольку график положения содержит некоторые плохие замыкания цикла, полученный график положения фактически нежелателен.
pgOptim = optimizePoseGraph(pg); figure; show(pgOptim);
Проверьте остаточные ошибки ребра для исходного графика положения. Значения ошибки больших выбросов в конце указывают на плохие закрытия цикла.
resErrorVec = edgeResidualErrors(pg);
plot(resErrorVec);
title('Edge Residual Errors by Edge ID')
Некоторые замыкания цикла должны быть отделены от графика положения на основе их остаточной ошибки. Используйте trimLoopClosures
функция для обрезки замыканий плохих циклов. Установите максимальный и порог усечения для параметров триммера. Этот порог устанавливается на основе точности измерений и должен быть настроен для вашей системы.
trimParams.MaxIterations = 100; trimParams.TruncationThreshold = 25; solverOptions = poseGraphSolverOptions;
Используйте trimLoopClosures
функция с параметрами триммера и опциями решателя.
[pgNew, trimInfo, debugInfo] = trimLoopClosures(pg,trimParams,solverOptions);
Из trimInfo
выход, постройте график замыканий цикла, удаленный из оптимизированного графика положения. При построении графика с графиком остаточных ошибок ранее можно увидеть, что закрытие большого цикла ошибок было удалено.
removedLCs = trimInfo.LoopClosuresToRemove; hold on plot(removedLCs,zeros(length(removedLCs)),'or') title('Edge Residual Errors and Removed Loop Closures') legend('Residual Errors', 'Removed Loop Closures') xlabel('Edge IDs') ylabel('Edge Residual Error') hold off
Отобразите новый график положения с обрезкой замыканий плохих циклов.
show(pgNew,"IDs","off");
solverType
- Тип решателя графика положения'builtin-trust-region'
(по умолчанию) | 'g2o-levenberg-marquardt'
График положения решателя, заданный как 'builtin-trust-region'
или 'g2o-levenberg-marquardt'
.
Функция генерирует набор опций решателя со значениями по умолчанию для заданного типа решателя графика положения:
pgSolverTrustRegion = poseGraphSolverOptions('builtin-trust-region')
pgSolverTrustRegion = TrustRegion (builtin-trust-region-dogleg) options: MaxIterations: 300 MaxTime: 10 FunctionTolerance: 1.0000e-08 GradientTolerance: 5.0000e-09 StepTolerance: 1.0000e-12 InitialTrustRegionRadius: 100 VerboseOutput: 'off'
pgSolverG2o = poseGraphSolverOptions('g2o-levenberg-marquardt')
pgSolverG2o = G2oLevenbergMarquardt (g2o-levenberg-marquardt) options: MaxIterations: 300 MaxTime: 10 FunctionTolerance: 1.0000e-09 VerboseOutput: 'off'
Типы данных: char
| string
solverOptions
- Опции решателя графика положенияposeGraphSolverOptions
параметрыОпции решателя графика положения, заданные как набор параметров, сгенерированных вызовом poseGraphSolverOptions
функция. Функция генерирует набор опций решателя с значениями по умолчанию для заданного типа решателя графика положения.
Если на solverType
установлено значение "builtin-trust-region"
:
Дефолт | Описание | |
---|---|---|
MaxIterations | 300 | Максимальное количество итераций, заданное как положительное целое число. Оптимизатор выходит после того, как превысит это количество итераций. |
MaxTime | 500 | Максимально допустимое время, заданное как положительный числовой скаляр в секундах. Оптимизатор выходит после того, как превысит это время. |
FunctionTolerance | 1e-8 | Нижняя граница изменения функции затрат, заданная как скаляр. Если изменение функции стоимости падает ниже этого значения между шагами оптимизации, оптимизатор выходит. |
GradientTolerance | 0.5e-8 | Нижняя граница нормы градиента, заданная как скаляр. Норма градиента вычисляется на основе функции затрат оптимизации. Если норма падает ниже этого значения, оптимизатор выходит. |
StepTolerance | 1e-12 | Нижняя граница размера шага, заданная как скаляр. Если норма шага оптимизации падает ниже этого значения, оптимизатор выходит. |
InitialTrustRegionRadius | 100 | Радиус начальной доверительной области, заданный как скаляр. |
VerboseOutput | 'off' или 'on' | Отображение информации о промежуточной итерации в MATLAB® командная строка. |
Если на solver
установлено значение "g2o-levenberg-marquardt"
:
Дефолт | Описание | |
---|---|---|
MaxIterations | 300 | Максимальное количество итераций, заданное как положительное целое число. Оптимизатор выходит после того, как превысит это количество итераций. |
MaxTime | 500 | Максимально допустимое время, заданное как положительный числовой скаляр в секундах. Оптимизатор выходит после того, как превысит это время. |
FunctionTolerance | 1e-8 | Нижняя граница изменения функции затрат, заданная как скаляр. Если изменение функции стоимости падает ниже этого значения между шагами оптимизации, оптимизатор выходит. |
VerboseOutput | 'off' или 'on' | Отображение информации о промежуточной итерации в командной строке MATLAB. |
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.