matchScans

Оцените положение между двумя лазерными сканированиями

Синтаксис

pose = matchScans(currScan,refScan)
pose = matchScans(currRanges,currAngles,refRanges,refAngles)
[pose,stats] = matchScans(___)
[___] = matchScans(___,Name,Value)

Описание

pose = matchScans(currScan,refScan) находит относительное положение между ссылочным lidarScan и текущим объектом lidarScan с помощью нормальных распределений преобразовывают (NDT).

пример

pose = matchScans(currRanges,currAngles,refRanges,refAngles) находит относительное положение между двумя лазерными сканированиями заданным как области значений и углы.

[pose,stats] = matchScans(___) возвращает дополнительную статистику о результате соответствия сканирования с помощью предыдущих входных параметров.

пример

[___] = matchScans(___,Name,Value) задает дополнительные опции, заданные одним или несколькими аргументами пары Name,Value.

Примеры

свернуть все

Создайте ссылочное сканирование лазерного дальномера с помощью lidarScan. Задайте области значений и углы как векторы.

refRanges = 5*ones(1,300);
refAngles = linspace(-pi/2,pi/2,300); 
refScan = lidarScan(refRanges,refAngles);

Используя функцию transformScan, сгенерируйте второе сканирование лазерного дальномера при смещении x,y (0.5,0.2).

currScan = transformScan(refScan,[0.5 0.2 0]);

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

pose = matchScans(currScan,refScan);

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

currScan2 = transformScan(currScan,pose);

subplot(2,1,1);
hold on
plot(currScan)
plot(refScan)
title('Original Scans')
hold off

subplot(2,1,2);
hold on
plot(currScan2)
plot(refScan)
title('Aligned Scans')
xlim([0 5])
hold off

Этот пример использует алгоритм решателя 'fminunc', чтобы выполнить соответствие сканирования. Этот алгоритм решателя требует лицензии Optimization Toolbox™.

Задайте ссылочное лазерное сканирование как области значений и углы.

refRanges = 5*ones(1,300);
refAngles = linspace(-pi/2,pi/2,300);

Используя функцию transformScan, сгенерируйте второе лазерное сканирование при смещении x,y (0.5,0.2).

[currRanges,currAngles] = transformScan(refRanges,refAngles,[0.5 0.2 0]);

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

pose = matchScans(currRanges,currAngles,refRanges,refAngles,'SolverAlgorithm','fminunc');

Улучшите оценку путем предоставления начальной оценки положения.

pose = matchScans(currRanges,currAngles,refRanges,refAngles,...
                  'SolverAlgorithm','fminunc','InitialPose',[-0.4 -0.1 0]);

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

[currRanges2,currAngles2] = transformScan(currRanges,currAngles,pose);

[x1 y1] = pol2cart(refAngles,refRanges);
[x2 y2] = pol2cart(currAngles,currRanges);
[x3 y3] = pol2cart(currAngles2,currRanges2);

subplot(1,2,1)
plot(x1,y1,'o',x2,y2,'*r')
title('Original Scans')
subplot(1,2,2)
plot(x1,y1,'o',x3,y3,'*r')
title('Aligned Scans')

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

свернуть все

Текущие показания сканирования лазерного дальномера, заданные как объект lidarScan.

Ваше сканирование лазерного дальномера может содержать Inf и значения NaN, но алгоритм игнорирует их.

Ссылочные показания сканирования лазерного дальномера, заданные как объект lidarScan.

Ваше сканирование лазерного дальномера может содержать Inf и значения NaN, но алгоритм игнорирует их.

Текущие лазерные области значений сканирования, заданные как вектор. Области значений даны как расстояния до объектов, измеренных от лазерного датчика.

Ваши лазерные области значений сканирования могут содержать Inf и значения NaN, но алгоритм игнорирует их.

Текущие лазерные углы сканирования, заданные как вектор в радианах. Углы даны как ориентации соответствующих измерений области значений.

Ссылочный лазер сканирует области значений, заданные как вектор в метрах. Области значений даны как расстояния до объектов, измеренных от лазерного датчика.

Ваши лазерные области значений сканирования могут содержать Inf и значения NaN, но алгоритм игнорирует их.

Ссылочные лазерные углы сканирования, заданные как вектор в радианах. Углы даны как ориентации соответствующих измерений области значений.

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: "InitialPose",[1 1 pi/2]

Алгоритм оптимизации, заданный или как "trust-region" или как "fminunc". Используя "fminunc" требует лицензии Optimization Toolbox™.

Исходное предположение текущего положения относительно ссылочного лазерного сканирования, заданного как пара, разделенная запятой, состоящая из "InitialPose" и вектора [x y theta]. [x y] является переводом в метрах, и theta является вращением в радианах.

Длина стороны ячейки в метрах, заданных как пара, разделенная запятой, состоящая из "CellSize" и числового скаляра. matchScans использует размер ячейки, чтобы дискретизировать пробел для алгоритма NDT.

Настройка размера ячейки важна для надлежащего использования алгоритма NDT. Оптимальный размер ячейки зависит от входных сканирований и среды вашего робота. Большие размеры ячейки могут привести к менее точному соответствию плохо выбранным областям. Меньшие размеры ячейки требуют большей памяти и меньшего количества изменения между последующими сканированиями. Шум датчика влияет на алгоритм с меньшими размерами ячейки также. Выбор соответствующего размера ячейки зависит от шкалы вашей среды и входных данных.

Максимальное количество итераций, заданных как пара, разделенная запятой, состоящая из "MaxIterations" и скалярного целого числа. Большее число итераций приводит к более точным оценкам положения, но за счет более длительного времени выполнения.

Нижняя граница на изменении в счете NDT, заданном как пара, разделенная запятой, состоящая из "ScoreTolerance" и числового скаляра. Счет NDT хранится в поле Score структуры вывода stats. Между итерациями, если изменения счета меньше, чем этим допуском, алгоритм сходится к решению. Меньший допуск приводит к более точным оценкам положения, но требует более длительного времени выполнения.

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

свернуть все

Положение текущего сканирования относительно ссылочного сканирования, возвращенного как [x y theta], где [x y] является переводом в метрах и theta, является вращением в радианах.

Отсканируйте соответствие со статистикой, возвращенной как структура со следующими полями:

  • Score — Числовой скаляр, представляющий NDT, выигрывает при выполнении соответствия сканирования. Этот счет является оценкой вероятности, что преобразованное текущее сканирование совпадает со ссылочным сканированием. Score является всегда неотрицательным. Большие очки указывают на лучшее соответствие.

  • Hessian — 3х3 матрица, представляющая Гессиан функции стоимости NDT при данном решении pose. Гессиан используется в качестве индикатора неуверенности, сопоставленной с оценкой положения.

Ссылки

[1] Бибер, P. и В. Стрэссер. "Нормальные распределения преобразовывают: новый подход к лазерному соответствию сканирования". Интеллектуальные роботы и системные продолжения. 2003.

[2] Магнуссон, Мартин. "3D нормальные распределения преобразовывают - эффективное представление для регистрации, поверхностного анализа и обнаружения цикла". Диссертация доктора философии. Университет Örebro, школа науки и техники, 2009.

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

Введенный в R2017a