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