pcmapndt

Карта локализации, основанная на преобразовании нормальных распределений (NDT)

    Описание

    The pcmapndt объект создает карту преобразования нормальных распределений (NDT) из предварительно построенной карты облака точек окружения. Карта NDT является сжатым, эффективным в памяти представлением, подходящим для локализации. Объект преобразует карту облака точек в набор вокселей (3-D ящиков), каждый из которых представлен 3-D нормальным распределением. Используйте selectSubmap функция объекта, чтобы выбрать подкарту в карте из грубой оценки положения. Используйте findPose функция объекта для локализации положения датчика на основе собранной карты.

    Создание

    Описание

    пример

    ndtMap = pcmapndt(ptCloudMap,voxelSize) возвращает карту NDT из карты облака точек, ptCloudMap.

    Свойства

    расширить все

    Это свойство доступно только для чтения.

    В настоящее время отобранная подкарта, определенная как вектор с 6 элементами формы [xmin, <<reservedrangesplaceholder4> <reservedrangesplaceholder3> <reservedrangesplaceholder2> <reservedrangesplaceholder1> <reservedr angesplaceholder0> ], который описывает область значений подкарты вдоль каждой оси. Элементы вектора описывают необходимую область, представленную подкартой.

    Это свойство доступно только для чтения.

    Размер вокселей, заданный как скалярное значение в мировых единицах измерения.

    Это свойство доступно только для чтения.

    Область значений карты вдоль оси x, заданный как 2-элементный вектор вида [xmin xmax].

    Это свойство доступно только для чтения.

    Область значений карты вдоль оси Y, заданный как 2-элементный вектор вида [ymin ymax].

    Это свойство доступно только для чтения.

    Область значений карты вдоль оси z, заданный как 2-элементный вектор вида [zmin zmax].

    Это свойство доступно только для чтения.

    Среднее значение каждого воксель, заданное как матрица M -by-3. Каждая строка матрицы содержит значения [x y z] для воксель. M - количество вокселей.

    Это свойство доступно только для чтения.

    Ковариация каждого вокселя, заданная как массив 3 на 3 M для M вокселей.

    Это свойство доступно только для чтения.

    Число точек в каждом вокселе, заданное как вектор M-на-1 для M вокселей.

    Функции объекта

    selectSubmapВыберите подкарту в пределах карты
    isInsideSubmapПроверьте, находится ли позиция запроса внутри выбранной подкарты
    findPoseЛокализуйте облако точек в карте с помощью алгоритма преобразования нормальных распределений (NDT)
    showВизуализируйте карту преобразования нормальных распределений (NDT)

    Примеры

    свернуть все

    Загрузите карту преобразования нормальных распределений (NDT) из файла MAT.

    data = load('ndtMapParkingLot.mat');
    ndtMap = data.ndtMapParkingLot;

    Загрузите сканы облака точек и поместите оценки из второго файла MAT.

    data = load('parkingLotData.mat');
    ptCloudScans = data.parkingLotData.ptCloudScans;
    initPoseEsts = data.parkingLotData.initPoseEsts;

    Отобразите карту NDT.

    show(ndtMap)

    Измените угол обзора на вид сверху.

    view(2)

    Выберите подкарту с центром вокруг первой оценки.

    center = initPoseEsts(1).Translation;
    sz = [70 50 20];
    ndtMap = selectSubmap(ndtMap,center,sz);

    Установите радиус для визуализации текущего местоположения и порог расстояния, чтобы обновить подкарту.

    radius = 0.5;
    distThresh = 15;

    Закольцовывайте облака точек, локализуйте их на карте и обновляйте выбранную подкарту по мере необходимости.

    numScans   = numel(ptCloudScans);
      
    for n = 1:numScans
        ptCloud = ptCloudScans(n);
        initPose = initPoseEsts(n);
    
        poseTranslation = initPose.Translation;
        [isInside,distToEdge] = isInsideSubmap(ndtMap,poseTranslation);
        submapNeedsUpdate = ~isInside ...       % Current pose is outside submap
            || any(distToEdge(1:2) < distThresh);   % Current pose is close to submap edge
    
    if submapNeedsUpdate
        ndtMap = selectSubmap(ndtMap,poseTranslation,sz);
    end
    
    % Localize the point cloud scan in the map.
    currPose = findPose(ndtMap,ptCloud,initPose);
    
    % Display the position of the estimate as a circle.
    pos = [currPose.Translation(1:2) radius]; 
    showShape('circle',pos,'Color','r');
    
    % Pause to view the change.
    pause(0.05)
    end

    Figure contains an axes. The axes contains an object of type scatter.

    Ссылки

    Бибер, П. и У. Страссер. Преобразование нормальных распределений: новый подход к лазерному Сопоставлению сканов. В Трудах 2003 IEEE/RSJ Международная конференция по интеллектуальным роботам и системам (IROS 2003) (Кат. No.03CH37453) том 3, 2743-48. Лас-Вегас, Невада, США: IEEE, 2003. https://doi.org/10.1109/IROS.2003.1249285.

    [1] Магнуссон, Мартин. Трехмерное преобразование нормальных распределений: эффективное представление для регистрации, анализа поверхности и обнаружения цикла. Докторская диссертация, университет Эребру, 2009. http://urn.kb.se/resolve?urn=urn: nbn: se: oru: diva-8458 urn: nbn: se: oru: diva-8458.

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

    Генерация кода C/C + +
    Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

    .

    См. также

    Функции

    Введенный в R2021a