edgeResidualErrors

Вычислите остаточные ошибки ребра графика положения

    Описание

    пример

    resErrorVec = edgeResidualErrors(poseGraphObj) возвращает остаточные ошибки для каждого ребра в графике положения с текущими оценками узла положения. Порядок остаточных ошибок совпадает с порядком идентификаторов ребра в poseGraph.

    Примеры

    свернуть все

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

    Загрузите набор данных, который содержит 2D график положения. Смотрите 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 объект.

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

    свернуть все

    Остаточные ошибки ребра для графика положения в виде вектора из положительных скалярных величин.

    Расширенные возможности

    Смотрите также

    Функции

    Объекты

    Введенный в R2020b