exponenta event banner

mapLayer

Создание слоя карты для N-мерных данных

Описание

mapLayer объект создает N-мерную сетку, где первые два размера определяют компоновку карты, а все последующие размеры определяют размер и компоновку данных, хранящихся в каждой ячейке. Для хранения скалярных двоичных или вероятностных значений для карты сетки используйте binaryOccupancyMap или occupancyMap вместо этого объекты.

Слой карты хранит данные для ячеек сетки, которые представляют дискретизированную область пространства. Для запроса и обновления данных с использованием мировых, локальных или сетевых координат используйте getMapData и setMapData функции объекта. Каждая ячейка сетки на карте может хранить данные любого размера от одного значения до многомерного массива. Дополнительные сведения см. в свойстве DataSize.

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

Создание

Описание

map = mapLayer создает пустой объект карты, занимающий 10 на 10 метров пространства с разрешением 1 ячейка на метр.

map = mapLayer(p) создает карту из значений в матрице или матричном массиве p. Для 3-D матричных массивов каждая ячейка карты заполняется вектором значений в каждом местоположении сетки вдоль третьего размера массива. Для матричного массива N-на-D каждая ячейка содержит матрицу (N = 4) или матричный массив (N > 4) данных для этого местоположения сетки.

map = mapLayer(width,height) создает карту, охватывающую указанные ширину и высоту с разрешением 1 ячейка на метр.

map = mapLayer(rows,cols,'grid') создает карту с размером сетки rows,cols с разрешением 1 ячейка на метр.

map = mapLayer(width,height,cellDims) создает карту, где размер данных, хранящихся в каждой ячейке, определяется массивом целых чисел cellDims.

map = mapLayer(rows,cols,cellDims,'grid') создает карту с размером сетки rowscols где размер данных, хранящихся в каждой ячейке, определяется массивом целых чисел cellDims.

map = mapLayer(sourceMap) создает новый объект с использованием слоев, скопированных из другого mapLayer объект.

пример

map = mapLayer(___,Name,Value) задает значения свойств с помощью пар «имя-значение».

Например, mapLayer(__,'LocalOriginInWorld',[15 20]) задает локальное начало координат для определенного местоположения мира.

Свойства

развернуть все

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

Если карта хранит вектор значений n-элемента в каждой ячейке, то это свойство будет [width height n].

Если на карте хранится сетка 10 на 10 с каждой ячейкой, содержащей матричный массив 3 на 3, размер данных будет равен [10 10 3 3 3].

Это свойство устанавливается при создании объекта на основе размеров входной матрицы p или вводы width, height, и cellDims.

После создания объекта это свойство доступно только для чтения.

Типы данных: double

Тип данных значений, сохраненных в карте, указанный как символьный вектор.

Это свойство устанавливается на основе типа данных ввода p или тип данных DefityValue. После создания объекта это свойство доступно только для чтения.

Типы данных: char

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

Если при создании объекта задаются свойства GetTransformFcn или SetTransformFcn, значение по умолчанию обновляется на основе этой функции преобразования. При создании карты с матрицей значений pфункция преобразования изменяет значения перед сохранением.

Типы данных: double

Применяет преобразования к значениям, полученным getMapData функция, указанная как дескриптор функции.

Этот дескриптор функции вызывается внутри getMapData объектная функция. Его можно использовать для применения преобразования к значениям, извлеченным из слоя карты. Определение функции должно иметь следующий формат:

modifiedValues = getTransformFcnHandle(map,values,varargin)

Размер выходного сигнала modifiedValues должен соответствовать размеру входа values. Функция предоставляет все данные карты, доступные из getMapData объектная функция для этой функции преобразования через varargin входные данные.

Это свойство можно задать при создании объекта. После создания объекта это свойство доступно только для чтения.

Типы данных: function_handle

Расположение нижнего левого угла сетки в мировых координатах, определяемое как двухэлементный вектор, [xWorld yWorld].

Это свойство можно задать при создании объекта.

Типы данных: double

Расположение нижнего левого угла сетки в локальных координатах, заданных как двухэлементный вектор, [xLocal yLocal].

Это свойство можно задать при создании объекта.

Типы данных: double

Количество строк и столбцов в сетке, сохраненное в виде вектора вещественного значения 1 на 2, представляющего количество строк и столбцов в указанном порядке.

Это свойство устанавливается при создании объекта на основе первых двух измерений входной матрицы p, входы width и height, или входы row и col.

Типы данных: double

Имя слоя карты, заданного как вектор символа или скаляр строки.

Это свойство можно задать при создании объекта. После создания объекта это свойство доступно только для чтения.

Типы данных: double

Местоположение начала локального кадра в мировых координатах, определяемое как двухэлементный вектор, [xLocal yLocal]. Используйте move используется для перемещения локальной рамы по мере перемещения транспортного средства.

Это свойство можно задать при создании объекта.

Типы данных: double

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

Разрешение сетки, хранящееся в виде скаляра в ячейках на метр, представляющего количество и размер расположений сетки.

Это свойство можно задать при создании объекта. После создания объекта это свойство доступно только для чтения.

Типы данных: double

Применяет преобразования к значениям, заданным setMapData функция, указанная как дескриптор функции.

Этот дескриптор функции вызывается внутри setMapData объектная функция. Его можно использовать для применения преобразования к значениям, заданным в слое карты. Функция должна иметь следующий синтаксис:

modifiedValues = setTransformFcnHandle(map,values,varargin)        
        if numel(varargin) == 0
            return; %
        else
          % Custom Code
        end
end

Размер выходного сигнала, modifiedValues, должно соответствовать размеру входного сигнала, values. Функция предоставляет все данные карты, указанные в setMapData объектная функция для этой функции преобразования. При создании этого объекта без начальных значений функция вызывается без дополнительных входных аргументов, поэтому укажите оператор if для возврата, когда число элементов в varagin равно нулю.

Это свойство можно задать при создании объекта. После создания объекта это свойство доступно только для чтения.

Типы данных: function_handle

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

Минимальное и максимальное значения координат x в локальном кадре, хранящиеся в виде двухэлементного горизонтального вектора формы [min max]. Локальный кадр определяется LocalOriginInWorld собственность.

Типы данных: double

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

Минимальное и максимальное значения координат y в локальном кадре, хранящиеся в виде двухэлементного горизонтального вектора формы [min max]. Локальный кадр определяется LocalOriginInWorld собственность.

Типы данных: double

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

Минимальное и максимальное значения мирового диапазона координат x, сохраненные в виде вектора 1 на 2, представляющего минимальное и максимальное значения, в этом порядке.

Типы данных: double

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

Минимальное и максимальное значения мирового диапазона координат y, сохраненные в виде вектора 1 на 2, представляющего минимальное и максимальное значения, в этом порядке.

Типы данных: double

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

getMapDataИзвлечение данных из слоя карты
grid2localПреобразование индексов сетки в локальные координаты
grid2worldПреобразование индексов сетки в мировые координаты
local2gridПреобразование локальных координат в индексы сетки
local2worldПреобразование локальных координат в мировые
moveПереместить карту в мировой рамке
setMapDataНазначение данных слою карты
syncWithСинхронизировать карту с перекрывающейся картой
world2gridПреобразование мировых координат в индексы сетки
world2localПреобразование мировых координат в локальные

Примеры

свернуть все

Создайте слой карты, в котором в качестве скоростей xy хранятся два значения для каждого расположения сетки.

Создайте матрицу значений m-by-n-by-2. Первый элемент в третьем измерении является dx, а второй - dy в качестве скоростей.

dXY = reshape(1:200,10,20);
dXY(:,:,2) = dXY;

Создайте слой карты из матрицы. Укажите разрешение и имя слоя.

vLayer = mapLayer(dXY,'Resolution',1,'LayerName','dXY');

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

v = getMapData(vLayer);

R = 1/(2*vLayer.Resolution);
xLim = vLayer.XWorldLimits;
yLim = vLayer.YWorldLimits;
xLoc = (xLim(1)+R):R*2:(xLim(2)-R);
yLoc = (yLim(2)-R):-R*2:(yLim(1)+R);

quiver(xLoc,yLoc,v(:,:,1),v(:,:,2))

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

Установите для нижнего левого квадранта новые обновленные значения. Создайте значения в виде матрицы и укажите левый нижний угол (0,0) в координатах карты setData функция.

updateValues = repmat(reshape([-50,100],[1 1 2]),5,10);

setMapData(vLayer,[0 0],updateValues)
v = getMapData(vLayer);
quiver(xLoc,yLoc,v(:,:,1),v(:,:,2))

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

Задайте новые значения для верхнего левого квадранта с помощью координат сетки. Для карт верхнее левое расположение сетки - (1,1).

setMapData(vLayer,[1 1],updateValues,'grid')
v = getMapData(vLayer);
quiver(xLoc,yLoc,v(:,:,1),v(:,:,2))

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

mapLayer позволяет применять пользовательские преобразования по элементам при настройке и получении данных на карте. Для преобразования данных, установленных или полученных с карты, укажите дескрипторы функций для GetTransfomFcn и SetTransformFcn свойства. В этом примере показано, как реализовать вероятностный уровень карты логарифмических шансов путем создания таблицы поиска для значений вероятностей и логарифмических шансов. Функции преобразования используют эти таблицы подстановки для преобразования между этими значениями при установке или получении данных.

Создание таблиц подстановки

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

Создание массива int16 значения из intmin кому intmax. Определите пределы вероятности.

intType = 'int16';
intLinSpace = intmin(intType):intmax(intType);
numOfPoints = length(intLinSpace);
probLimits = [0.001 .999];

exampleHelperProbToLogodds и examplerHelperLogoddsToProb функции скрыты между логарифмическими коэффициентами и значениями вероятности. Используйте вспомогательные функции, чтобы получить пределы логарифмических шансов и создать массив для поиска значений логарифмических шансов. Создайте интерполированную сетку для всей таблицы подстановки.

logOddsLimits = exampleHelperProbToLogodds([0.001 .999]);
logOddsLookup = single(exampleHelperLogoddsToProb(linspace(logOddsLimits(1),logOddsLimits(2),numOfPoints)));
interpTable = griddedInterpolant(logOddsLookup,single(intLinSpace),'nearest');

Задание дескрипторов функций преобразования

В обработчиках функции преобразования используются примеры вспомогательных устройств, которые определяют способ преобразования между целочисленными значениями логарифмических шансов и значениями вероятности с примененным пределом насыщения. Пределы насыщения вероятности: [0.001 .999] как было указано ранее. Это поведение аналогично occupancyMap объект.

getXformFcn = @(obj,logodds,varargin)...
    exampleHelperIntLogoddsToProb(logodds,logOddsLookup(:),intLinSpace);

setXformFcn = @(obj,prob,varargin)...
    exampleHelperProbToIntLogodds(prob,interpTable,logOddsLookup(:),intLinSpace,probLimits);

Создать слой карты

Создайте объект уровня карты занятости из матрицы значений вероятности. Укажите функции преобразования get и set.

occupancyLayer = mapLayer(repmat(0.5,10,10),...
                           'LayerName','Occupancy',...
                           'GetTransformFcn',getXformFcn,...
                           'SetTransformFcn',setXformFcn);

Обратите внимание, что при создании карты значение по умолчанию равно 0,001, а не 0. Это различие связано с SetTransformFcn функция была применена к значению по умолчанию 0 при создании объекта, которое насыщает значение 0,001.

disp(occupancyLayer.DefaultValue)
    0.0010

Получение и установка данных карты

Данные карты соответствуют матрице, заданной при создании.

extData = getMapData(occupancyLayer) 
extData = 10×10

    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000
    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000    0.5000

Задайте конкретные расположения карт для следующих значений:

  • Вне пределов насыщения вероятности.

  • Более высокая точность, чем разрешение таблиц подстановки.

setMapData(occupancyLayer,[0 0],0.00001)
setMapData(occupancyLayer,[5 5],0.25999)

Для первого местоположения вероятность привязана к пределам насыщения.

extData = getMapData(occupancyLayer,[0 0])
extData = 0.0010

Второе местоположение возвращает значение, наиболее близкое к значению вероятности в таблице поиска.

extData2 = getMapData(occupancyLayer,[5 5])
extData2 = 0.2600

Сгенерированный уровень карты теперь может быть использован для обновления карты вероятности занятия, которые сохранены как int16 значения. Сведения об объединении этой карты с другими слоями или типами карт см. в разделе multiLayerMap объект.

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

.
Представлен в R2021a