exponenta event banner

trimLoopClosures

Оптимизация графика позы и удаление плохих замыканий контура

Описание

poseGraphUpdated = trimLoopClosures(poseGraphObj,trimParams,solverOptions) оптимизирует график позы для наилучшего удовлетворения ограничений кромки и удаляет любые поврежденные кромки замыкания контура на основе параметров остаточной ошибки, указанных в trimParams. Создать solverOptions ввод с помощью poseGraphSolverOptions функция.

Функция реализует метод градуированной невыпуклости (GNC) с устойчивыми затратами на усеченные наименьшие квадраты (TLS) в сочетании с не минимальным решателем графов позы [1].

пример

[poseGraphUpdated,trimInfo] = trimLoopClosures(poseGraphObj,trimParams,solverOptions) возвращает дополнительную информацию, связанную с процессом обрезки.

Примеры

свернуть все

Оптимизируйте график позы на основе узлов и ограничений кромок. Контур обрезки замкнут на основании остаточных ошибок их кромок.

Загрузите набор данных, содержащий график 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')

Figure contains an axes. The axes with title Original Pose Graph contains 3 objects of type line.

Оптимизировать график позы с помощью optimizePoseGraph функция. По умолчанию эта функция использует "builtin-trust-region" решатель. Поскольку график позы содержит несколько плохих замыканий цикла, результирующий график позы фактически нежелателен.

pgOptim = optimizePoseGraph(pg);
figure;
show(pgOptim);

Figure contains an axes. The axes contains 225 objects of type line, text.

Посмотрите на остаточные ошибки ребра для исходного графика позы. Большое отклонение значений ошибок в конце указывает на плохое замыкание контура.

resErrorVec = edgeResidualErrors(pg);
plot(resErrorVec);
title('Edge Residual Errors by Edge ID')

Figure contains an axes. The axes with title Edge Residual Errors by Edge ID contains an object of type line.

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

Figure contains an axes. The axes with title Edge Residual Errors and Removed Loop Closures contains 45 objects of type line. These objects represent Residual Errors, Removed Loop Closures.

Показать новый график позы с обрезанными замыканиями неправильного цикла.

show(pgNew,"IDs","off");

Figure contains an axes. The axes contains 3 objects of type line.

Входные аргументы

свернуть все

График позы, указанный как poseGraph или poseGraph3D объект.

Параметры остаточной ошибки для замыканий контура обрезки, заданные как структура с полями:

  • MaxIterations - максимальное число итераций, разрешенных для обрезки замыкания цикла, указанное как положительное целое число. В одной итерации отсечения график позы оптимизирован на основе опций решателя и любых ребер за пределами TruncationThreshold обрезают.

  • TruncationThreshold - максимально допустимая остаточная ошибка для края. Это значение сильно зависит от графика позы, указанного в poseGraphObj. Чтобы найти правильный порог на основе всех ошибок, используйте edgeResidualErrors функция для графа позы.

Пример: struct('MaxIterations',10,'TruncationThreshold',20)

Типы данных: struct

Опции решателя графов позы, заданные как набор параметров, генерируемых вызовом poseGraphSolverOptions функция. Функция генерирует набор опций решателя со значениями по умолчанию для указанного типа решателя графика позы:

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'

Измените параметры решателя, используя точечную нотацию.

pgSolverG2o.MaxIterations = 200;

Выходные аргументы

свернуть все

График позы с отсеченными замыканиями с закольцовыванием, указанный как poseGraph или poseGraph3D объект.

Информация из процесса обрезки, возвращенная в виде структуры с полями:

  • LoopClosuresToRemove - Идентификаторы краев замыкания контура для удаления из ввода poseGraphObj. Эти замыкатели контура удаляются на выходе poseGraphUpdated.

  • Iterations - количество выполненных итераций обрезки.

Ссылки

[1] Ян, Хэн, и др. «Градуированная невыпуклость для надежного пространственного восприятия: от несимметричных решателей до глобального отклонения». IEEE Robotics and Automation Letters, vol. 5, no. 2, Apr. 2020, pp. 1127-34. DOI.org (Crossref), doi:10.1109/LRA.2020.2965893.

Представлен в R2020b