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 (Robotics System Toolbox) функция, сгенерируйте второй скан лидара в 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

Figure contains 2 axes. Axes 1 with title Original Scans contains 2 objects of type line. Axes 2 with title Aligned Scans contains 2 objects of type line.

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

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

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

Используя transformScan (Robotics System Toolbox) функция, сгенерируйте второй лазерный скан в 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')

Figure contains 2 axes. Axes 1 with title Original Scans contains 2 objects of type line. Axes 2 with title Aligned Scans contains 2 objects of type line.

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

свернуть все

Текущие чтения сканов лидара в виде 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