detectLoop

Обнаружьте закрытия цикла

Описание

пример

loopViewIds = detectLoop(loopDetector) обнаруживает закрытия цикла для последнего добавленного дескриптора и возвращает идентификаторы представления loopViewIds это соответствует закрытиям цикла. Если функция не обнаруживает закрытий цикла, loopViewIds isempty. Детектор закрытия цикла игнорирует количество последний раз добавленных дескрипторов, установленных NumExcludedDescriptors аргумент значения имени, чтобы не обнаруживать закрытия цикла против недавних дескрипторов.

loopViewIds = detectLoop(loopDetector,descriptor) обнаруживает закрытия цикла с помощью дескриптора контекста скана descriptor.

[loopViewIds,dists] = detectLoop(___) возвращает расстояния контекста скана dists между дескриптором цикла и дескрипторами запроса, с помощью любой комбинации входных параметров от предыдущих синтаксисов. Функция вычисляет расстояние между дескрипторами контекста скана, нормированными к области значений [0,1], с помощью модифицированного расстояния косинуса.

[___] = detectLoop(___,Name=Value) задает опции с помощью одних или нескольких аргументов name-value в дополнение к любой комбинации аргументов от предыдущих синтаксисов. Например, detectLoop(loopDetector,NumExcludedDescriptors=15) обнаруживает закрытия цикла для последнего добавленного дескриптора при игнорировании только 15 последний раз добавленных дескрипторов цикла.

Примеры

свернуть все

Создайте детектор закрытия цикла.

loopDetector = scanContextLoopDetector;

Создайте средство чтения файлов Velodyne PCAP.

veloReader = velodyneFileReader('lidarData_ConstructionRoad.pcap','HDL32E');

Считайте облака точек и извлеките дескриптор контекста скана из каждого скана облака точек. Добавьте дескрипторы в детектор.

for viewId = 1:10
    ptCloud = readFrame(veloReader,viewId);
    descriptor = scanContextDescriptor(ptCloud);
    addDescriptor(loopDetector,viewId,descriptor);
end

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

viewId = viewId + 1;
ptCloud = readFrame(veloReader,viewId);
descriptor = scanContextDescriptor(ptCloud);
[loopViewId,dists] = detectLoop(loopDetector,descriptor,'NumExcludedDescriptors',0)
loopViewId = uint32
    10
dists = single
    0.0831

Входные параметры

свернуть все

Детектор закрытия цикла в виде scanContextLoopDetector объект.

Отсканируйте дескриптор контекста в виде M-by-N матрица, где M является количеством радиальных интервалов, и N является количеством азимутальных интервалов.

Аргументы name-value

Задайте дополнительные пары аргументов как Name1=Value1,...,NameN=ValueN, где Name имя аргумента и Value соответствующее значение. Аргументы name-value должны появиться после других аргументов, но порядок пар не имеет значения.

Пример: detectLoop(loopDetector,NumExcludedDescriptors=15) обнаруживает закрытия цикла для последнего добавленного дескриптора при игнорировании только 15 последний раз добавленных дескрипторов цикла.

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

Количество последний раз добавленных дескрипторов, чтобы исключить как кандидаты закрытия цикла в виде неотрицательного целого числа. Исключите последний раз добавленные дескрипторы, чтобы не обнаруживать закрытия цикла для последний раз добавленного дескриптора против недавних дескрипторов. Увеличьте NumExcludedDescriptors если много последовательных дескрипторов соответствуют той же области.

Поисковый радиус на пробеле поддескриптора в виде положительной скалярной величины. Функция вычисляет расстояние контекста скана только для тех дескрипторов в поисковом радиусе. Увеличение этого значения может возвратить больше закрытий цикла, но может также увеличить ложные положительные стороны. Типичные значения располагаются между 0.2 и 0.4.

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

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

свернуть все

Закрытие цикла просматривает идентификаторы, соответствующие закрытиям цикла, возвращенным как P - вектор элемента из целочисленных значений. Если функция не находит закрытий цикла, она возвращает loopViewIds как пустой вектор. Детектор закрытия цикла игнорирует последние дескрипторы NumExcludedDescriptors, чтобы не обнаруживать закрытия цикла против недавних дескрипторов.

Отсканируйте расстояния контекста, возвращенные как P - вектор элемента из положительных значений. Расстояния представляют расстояние контекста скана между дескриптором цикла и соответствующим дескриптором запроса. Функция вычисляет расстояние между дескрипторами контекста скана, нормированными к области значений [0,1], с помощью модифицированного расстояния косинуса.

Алгоритмы

ring key descriptor является поддескриптором, извлеченным из дескриптора контекста скана. Это - отношение заполнения каждого азимутального интервала, который делает его инвариантом вращения.

scan context loop closure detector является двухфазным алгоритмом. Это сначала использует кольцевой ключевой дескриптор для самого близкого соседнего поиска, чтобы найти закрытия цикла кандидата. Затем это вычисляет расстояние контекста скана с помощью дескрипторов контекста скана и порогов это, чтобы идентифицировать лучшие обнаружения закрытия цикла.

Введенный в R2021b