Опции решателя для оптимизации графика положения
возвращает набор опций решателя со значениями по умолчанию для заданного типа решателя графика положения.solverOptions
= poseGraphSolverOptions(solverType
)
Оптимизируйте график положения на основе ограничений ребра и узлов. Круг для обрезки замкнут на основе их остаточных ошибок ребра.
Загрузите набор данных, который содержит 2D график положения. Смотрите poseGraph
возразите, чтобы просмотреть количество закрытий цикла и узлов.
load grid-2d-posegraph.mat pg disp(pg)
poseGraph with properties: NumNodes: 120 NumEdges: 193 NumLoopClosureEdges: 74 LoopClosureEdgeIDs: [120 121 122 123 124 125 126 127 128 129 130 ... ] 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. |
trimLoopClosures
| edgeResidualErrors
| edgeResidualErrors
| removeEdges
| edgeNodePairs
| edgeConstraints
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.