matchScans

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

Описание

пример

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 имя аргумента и 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.

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

Введенный в R2019b