Сетки занятости используются для представления рабочего пространства робота в виде дискретной сетки. Информация об окружающей среде может быть собрана с датчиков в реальном времени или загружена из предыдущих знаний. Лазерные дальномеры, датчики ударов, камеры и датчики глубины обычно используются для поиска препятствий в среде вашего робота.
Сетки занятости используются в алгоритмах робототехники, таких как планирование пути (см. mobileRobotPRM (Панель инструментов робототехнической системы) или plannerRRT). Они используются в картографических приложениях для интеграции сенсорной информации в дискретную карту, при планировании путей для поиска путей, свободных от столкновений, и для локализации роботов в известной среде (см. monteCarloLocalization или matchScans). Можно создавать карты с различными размерами и разрешением в соответствии с конкретным приложением.
Для получения 3-D карт заполняемости см. occupancyMap3D.
Для 2-D сеток занятости существует два представления:
Двоичная сетка занятости (см. binaryOccupancyMap)
Таблица вероятностной занятости (см. occupancyMap)
Двоичная сетка занятости использует true значения для представления занятого рабочего пространства (препятствия) и false значения для представления свободной рабочей области. Эта сетка показывает, где находятся препятствия и может ли робот перемещаться через это пространство. Используйте двоичную сетку заполнения, если размер памяти является коэффициентом в приложении.
Сетка вероятностной занятости использует значения вероятностей для создания более подробного представления карты. Это представление является предпочтительным способом использования сеток занятости. Эту сетку обычно называют просто сеткой занятости. Каждая ячейка в сетке занятости имеет значение, представляющее вероятность занятости этой ячейки. Значения, близкие к 1, представляют высокую уверенность в том, что ячейка содержит препятствие. Значения, близкие к 0, представляют уверенность в том, что ячейка не занята и не содержит препятствий. Вероятностные значения могут обеспечить лучшую верность объектов и улучшить производительность определенных алгоритмических приложений.
Двоичные и вероятностные сетки занятости имеют несколько свойств и деталей алгоритма. Координаты сетки и мира применяются к обоим типам сеток занятости. Функция инфляции также применяется к обеим сеткам, но каждая сетка реализует ее по-разному. Эффекты представления логарифмических шансов и насыщения вероятности применяются только к сеткам вероятностного занятия.
При работе с сетками занятости в MATLAB ® можно использовать координаты мира, локальные координаты или координаты сетки.
Абсолютная опорная рамка, в которой работает робот, называется мировой рамкой в сетке занятости. Большинство операций выполняется в мировой рамке и является выбором по умолчанию при использовании функций MATLAB на этой панели инструментов. Мировые координаты используются как абсолютная координатная рамка с фиксированным началом координат, а точки могут быть заданы с любым разрешением. Однако все местоположения преобразуются в ячейки сетки из-за ограничений хранения и разрешения данных на самой карте.
Локальный кадр относится к эгоцентрическому кадру для транспортного средства, осуществляющего навигацию по карте. GridOriginInLocal и LocalOriginInWorld свойства определяют начало сетки в локальных координатах и относительное расположение локального кадра в мировых координатах. Вы можете настроить эту локальную рамку с помощью move функция. Пример использования локального кадра в качестве эгоцентрической карты для эмуляции транспортного средства, перемещающегося вокруг и посылающего локальные препятствия, см. в разделе Создание эгоцентрических карт занятости с помощью датчиков дальности.
Координаты сетки определяют фактическое разрешение сетки занятости и конечное расположение препятствий. Начало координат сетки находится в левом верхнем углу сетки, при этом первое расположение имеет индекс (1,1). Тем не менее, GridLocationInWorld Свойство заполняющей сетки в MATLAB определяет левый нижний угол сетки в мировых координатах. При создании объекта сетки занятости такие свойства, как XWorldLimits и YWorldLimits определяются входными данными width, height, и resolution. На этом рисунке показано визуальное представление этих свойств и связь между координатами мира и сетки.

Как бинарная, так и нормальная сетки размещения имеют возможность раздувания препятствий. Эта инфляция используется для добавления фактора безопасности на препятствиях и создания буферных зон между роботом и препятствием в окружающей среде. inflate функция объекта сетки занятости преобразует указанное radius до числа ячеек, округленных от resolution*radius значение. Каждый алгоритм использует это значение ячейки отдельно для изменения значений вокруг препятствий.
inflate функция принимает каждую занятую ячейку и непосредственно раздувает её, добавляя занятое пространство вокруг каждой точки. Этот пример базовой инфляции иллюстрирует использование значения радиуса.
В этом примере показано, как создать карту, задать местоположения препятствий и надуть ее на радиус 1 м. Дополнительные графики на рисунке помогают проиллюстрировать инфляцию и сдвиг из-за преобразования в местоположения сетки.
Создать двоичную сетку занятости. Установите заполняемость позиции [5,5].
map = binaryOccupancyMap(10,10,5); setOccupancy(map,[5 5], 1);
Надуть занимаемые пространства на карте на 1м.
inflate(map,1); show(map)

Постройте график исходного местоположения, преобразуйте положение сетки и нарисуйте исходный круг. На этом графике видно, что центр сетки - [4.9 4.9], который смещен от местоположения [5 5]. Оттуда вычерчивается окружность размером 1 м, и все ячейки, которые касаются этой окружности, помечаются как занятые. Изображение увеличено до соответствующей области.
hold on theta = linspace(0,2*pi); x = 4.9+cos(theta); % x circle coordinates y = 4.9+sin(theta); % y circle coordinates plot(5,5,'*b','MarkerSize',10) % Original location plot(4.9,4.9,'xr','MarkerSize',10) % Grid location center plot(x,y,'-r','LineWidth',2); % Circle of radius 1m. axis([3.6 6 3.6 6]) ax = gca; ax.XTick = [3.6:0.2:6]; ax.YTick = [3.6:0.2:6]; grid on legend('Original Location','Grid Center','Inflation')

Как видно из приведенного выше рисунка, даже ячейки, которые едва перекрываются с радиусом инфляции, помечены как занятые.
inflate функция использует радиус инфляции для выполнения вероятностной инфляции. Вероятностная инфляция действует как локальный оператор максимума и находит самые высокие значения вероятности для соседних ячеек. inflate функция использует это определение для раздувания более высоких значений вероятности по всей сетке. Эта инфляция увеличивает размер любых занятых мест и создает буферную зону для роботов для навигации по препятствиям. В этом примере показано, как инфляция работает с диапазоном значений вероятности.
В этом примере показано, как метод раздувания выполняет вероятностную инфляцию на препятствиях для раздувания их размеров и создания буферной зоны для районов с более высокой вероятностью препятствий.
Создайте пустую карту размером 10 м x 10 м.
map = occupancyMap(10,10,10);
Обновление заполняемости мировых местоположений с конкретными значениями в pvalues.
x = [1.2; 2.3; 3.4; 4.5; 5.6]; y = [5.0; 4.0; 3.0; 2.0; 1.0]; pvalues = [0.2 0.4 0.6 0.8 1]; updateOccupancy(map,[x y],pvalues) figure show(map)

Надувать занимаемые площади на заданный радиус. Большие значения занятости записываются поверх меньших значений. Карту можно скопировать заранее, чтобы отменить любые нежелательные изменения.
savedMap = copy(map); inflate(map,0.5) figure show(map)

При использовании сетей занятости со значениями вероятности целью является оценка вероятности расположения препятствий для использования в приложениях робототехники в реальном времени. occupancyMap класс использует логарифмическое представление значений вероятности для каждой ячейки. Каждое значение вероятности преобразуется в соответствующее логарифмическое значение для внутреннего хранения. При обращении значение преобразуется обратно в вероятность. Это представление эффективно обновляет значения вероятности с наименьшим количеством операций. Поэтому можно быстро интегрировать данные датчиков в карту.
Представление логарифмических шансов использует следующее уравнение:


Примечание
Значения логарифмов сохраняются как int16 значения. Этот тип данных ограничивает разрешение значений вероятности до ± 0,001, но значительно улучшает размер памяти и позволяет создавать большие карты.
При обновлении сетки занятости с наблюдениями с использованием представления логарифмов значения имеют диапазон от - ∞ до ∞. Этот диапазон означает, что если робот наблюдает местоположение, такое как закрытая дверь, несколько раз, значение логарифмических шансов для этого местоположения становится излишне высоким, или вероятность значения насыщается. Если дверь открывается, роботу необходимо наблюдать, как дверь открывается много раз, прежде чем вероятность изменится с занятой на свободную. В динамических средах необходимо, чтобы карта реагировала на изменения для более точного отслеживания динамических объектов.
Чтобы предотвратить это насыщение, обновите ProbabilitySaturation свойство, которое ограничивает минимальное и максимальное значения вероятности, допускаемые при включении нескольких наблюдений. Это свойство является верхней и нижней границей значений логарифмов и позволяет карте быстро обновляться в соответствии с изменениями в среде. Минимальные и максимальные значения пределов насыщения по умолчанию: [0.001 0.999]. Для динамических сред предлагаемые значения не менее [0.12 0.97]. Рассмотрите возможность изменения этого диапазона, если карта не обновляется достаточно быстро для нескольких наблюдений.
binaryOccupancyMap | occupancyMap | occupancyMap3D