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