exponenta event banner

multiLayerMap

Управление несколькими слоями карты

Описание

multiLayerMap группы объектов и сохранение нескольких слоев карты как mapLayer, occupancyMap, или binaryOccupancyMap объекты.

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

Создание

Описание

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

пример

map = multiLayerMap(maps) создает многослойную карту из массива ячеек mapLayer, occupancyMap, или binaryOccupancyMap объекты. Объекты, объединенные в многослойную карту, должны быть определены с одинаковым разрешением и охватывать одну и ту же область в пространстве, но могут представлять различные категории информации в общей области.

map = multiLayerMap(names,mapData) создает многослойную карту из массива ячеек имен слоев и связанного массива ячеек матриц карт. Матрицы должны иметь одни и те же первые два измерения, чтобы охватить одну и ту же общую область. Разрешение по умолчанию - 1 ячейка на метр.

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

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

map = multiLayerMap(names,rows,cols,'grid') определяет ширину и высоту карты как размер сетки, указанный в rows и cols входные данные.

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

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

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

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

Свойства

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Типы данных: cell | string

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

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

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

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

Количество слоев карты, сохраненных как положительное целое число.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

свернуть все

multiLayerMap позволяет группировать несколько слоев карты и определять поведение этих слоев при настройке и получении данных. С помощью отдельных слоев карты можно сохранять различные данные карты и задавать различные варианты поведения для каждого из них. Можно также определить SetTransformFcn и GetTransformFcn дескрипторы функций для слоя карты, так что зависимости создаются между слоями. В этом примере показано, как хранить данные на уровне карты и реализовывать прослушиватели событий, которые обновляют другие карты. В этих картах хранится количество обновлений или обращений к данным.

Зависимые слои

Создайте два независимых слоя карты.

mapAccessed = mapLayer(zeros(10,10),'LayerName','GetListener');
mapModified = mapLayer(zeros(10,10),'LayerName','SetListener');

Укажите дескрипторы функций для функций get и set transform, используемых в основном слое карты. Эти функции увеличивают значение местоположения сетки при получении или установке данных карты на входной карте. mainMap. См. раздел Дескрипторы функций прослушивателя для реализации функции.

setHookFcn = @(mainMap,values,varargin)exampleHelperSetHookFcn(mapModified,mainMap,values,varargin{:});
getHookFcn = @(mainMap,values,varargin)exampleHelperGetHookFcn(mapAccessed,mainMap,values,varargin{:});

Создайте главный слой карты со значениями по умолчанию 0,5. Укажите дескрипторы функций для создания зависимостей слоев.

map = mapLayer(repmat(0.5,10,10),...
                'GetTransformFcn',getHookFcn,...
                'SetTransformFcn',setHookFcn);

Добавление всех карт к одному и тому же multiLayerMap объект.

mapLayers = multiLayerMap({map,mapAccessed,mapModified});

Установите (0,0) местоположение карты со значением нуля, используя setMapData объектная функция map.

setMapData(map,[0 0],0)

Проверьте, что mapModified увеличили их значение.

getMapData(mapModified,[0 0])
ans = 1

Получите только что установленные данные на уровне основной карты. Возвращается ожидаемое значение, равное нулю.

getMapData(map,[0 0])
ans = 0

Проверьте, что mapAccessed увеличили их значение.

getMapData(mapAccessed,[0 0])
ans = 1

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

setMapData(map,rand(10,10))
getMapData(map)
ans = 10×10

    0.6443    0.2077    0.3111    0.5949    0.0855    0.9631    0.0377    0.1068    0.0305    0.1829
    0.3786    0.3012    0.9234    0.2622    0.2625    0.5468    0.8852    0.6538    0.7441    0.2399
    0.8116    0.4709    0.4302    0.6028    0.8010    0.5211    0.9133    0.4942    0.5000    0.8865
    0.5328    0.2305    0.1848    0.7112    0.0292    0.2316    0.7962    0.7791    0.4799    0.0287
    0.3507    0.8443    0.9049    0.2217    0.9289    0.4889    0.0987    0.7150    0.9047    0.4899
    0.9390    0.1948    0.9797    0.1174    0.7303    0.6241    0.2619    0.9037    0.6099    0.1679
    0.8759    0.2259    0.4389    0.2967    0.4886    0.6791    0.3354    0.8909    0.6177    0.9787
    0.5502    0.1707    0.1111    0.3188    0.5785    0.3955    0.6797    0.3342    0.8594    0.7127
    0.6225    0.2277    0.2581    0.4242    0.2373    0.3674    0.1366    0.6987    0.8055    0.5005
    0.5870    0.4357    0.4087    0.5079    0.4588    0.9880    0.7212    0.1978    0.5767    0.4711

Проверьте, что mapModified и mapAccessed увеличили их значения.

getMapData(mapModified)
ans = 10×10

     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     2     1     1     1     1     1     1     1     1     1

getMapData(mapAccessed)
ans = 10×10

     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     1     1     1     1     1     1     1     1     1     1
     2     1     1     1     1     1     1     1     1     1

Нижнее левое расположение возвращает два, а все остальные значения равны одному. Это подтверждает, что функции прослушивателя работают по назначению.

Дескрипторы функций прослушивателя

Эти функции реализуют вспомогательные функции get и set example, которые обновляют другие слои карты.

function valuesOut = exampleHelperSetHookFcn(modifiedMap,sourceLayer,valueIn,varargin)
    % Pass output through
    valuesOut = valueIn;
    
    % If no additional inputs are passed, return immediately.
    if numel(varargin) == 0
        return;
    else
        % Otherwise, increment the value in the modifiedMap.
        if numel(varargin) == 1
            currentValue = getMapData(modifiedMap);
            setMapData(modifiedMap,currentValue+1);
        else        
            currentValue = getMapData(modifiedMap,varargin{1},varargin{3:end});
            % setMapData syntax <<<<>>>>
            setMapData(modifiedMap,varargin{1},currentValue+1,varargin{3:end});
        end
    end
end

function data = exampleHelperGetHookFcn(accessedMap,sourceLayer,valuesIn,varargin)
    
    data = valuesIn;

    % If no additional inputs are passed, check if the values in
    if numel(varargin) == 0
        if isequal(size(valuesIn),sourceLayer.DataSize)
            % Increment the depedent map.
            currentValue = getMapData(accessedMap);
            setMapData(accessedMap,currentValue+1);
        end
    else
        currentValue = getMapData(accessedMap,varargin{:});
        setMapData(accessedMap,varargin{1},currentValue+1,varargin{3:end});
    end
end

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

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