Сетки заполнения используются, чтобы представлять рабочую область робота как дискретную сетку. Информация о среде может быть собрана от датчиков в режиме реального времени или загрузиться от предварительных знаний. Лазерные средства поиска области значений, датчики удара, камеры и датчики глубины обычно используются, чтобы найти препятствия в среде вашего робота.
Сетки заполнения используются в алгоритмах робототехники, таких как планирование пути (см. robotics.PRM
). Они используются в отображении приложений для интеграции информации о датчике в дискретной карте в планировании пути для нахождения путей без коллизий, и для локализации роботов в известной среде (см. robotics.MonteCarloLocalization
). Можно создать карты с различными размерами и разрешениями, чтобы соответствовать определенному приложению.
2D сетки заполнения имеют два представления:
Бинарная сетка заполнения (см. robotics.BinaryOccupancyGrid
),
Сетка заполнения вероятности (см. robotics.OccupancyGrid
),
Бинарная сетка заполнения использует значения true
, чтобы представлять занятую рабочую область (препятствия) и значения false
, чтобы представлять свободную рабочую область. Эта сетка показывает, где препятствия и может ли робот переместиться через тот пробел. Используйте бинарную сетку заполнения, если емкость памяти является фактором в вашем приложении.
Сетка заполнения вероятности использует значения вероятности, чтобы создать более подробное представление карты. Это представление является предпочтительным методом для использования сеток заполнения. Эта сетка обычно упоминается как просто сетка заполнения. Каждая ячейка в сетке заполнения имеет значение, представляющее вероятность заполнения той ячейки. Значения близко к 1 представляют высокую уверенность, что ячейка содержит препятствие. Значения близко к 0 представляют уверенность, что ячейка не занята и свободное препятствие. Вероятностные значения могут дать лучшую точность объектов и улучшать производительность определенных приложений алгоритма.
Двоичный файл и сетки заполнения вероятности совместно используют несколько свойств и деталей алгоритма. Сетка и координаты слова применяются к обоим типам сеток заполнения. Метод инфляции также применяется к обеим сеткам, но каждая сетка реализует его по-другому. Эффекты насыщения представления и вероятности логарифмических разногласий применяются к сеткам заполнения вероятности только.
При работе с сетками заполнения в MATLAB® можно использовать или мировые или декартовы координаты.
Кадр абсолютной ссылки, в котором действует робот, упоминается как world frame в сетке заполнения. Операции Most Robotics System Toolbox™ выполняются в мировом кадре, и это - выбор по умолчанию при использовании функций MATLAB в этом тулбоксе. Мировые координаты используются в качестве кадра абсолютной координаты с фиксированным источником, и точки могут быть заданы с любым разрешением. Однако все местоположения преобразованы в местоположения сетки из-за хранения данных и пределов разрешения самой карты.
Декартовы координаты задают фактическое разрешение сетки заполнения и конечные местоположения препятствий. Источник декартовых координат находится в верхнем левом углу сетки с первым местоположением, имеющим индекс (1,1)
. Однако свойство GridLocationInWorld
сетки заполнения в MATLAB задает нижний левый угол сетки в мировых координатах. При создании объекта сетки заполнения свойства, такие как XWorldLimits
и YWorldLimits
заданы входом width
, height
и resolution
. Эти данные показывают визуальное представление этих свойств и отношения между мировыми и декартовыми координатами.
При установке местоположений заполнения можно ввести местоположения или в декартовых или в мировых координатах. Однако на основе пределов сетки, местоположения установлены в самые близкие местоположения сетки. Ребра сетки принадлежат нижнему левому местоположению сетки.
Покажите, как местоположения интерпретированы на сетке путем создания сетки заполнения и установки точек, как занято препятствиями. Затем постройте исходные точки ввода по карте, чтобы показать, как они интерпретированы. Если какая-либо точка в ячейке сетки установлена столь же занятая, целая ячейка сетки установлена, как занято.
Создайте карту сетки заполнения и установите местоположения препятствия.
map = robotics.BinaryOccupancyGrid(10,10,5); xy = [5 5; 4.3 4.4; 5.6 5.3]; setOccupancy(map,xy,1);
Отобразите карту, исходные точки, и установите пределы осей, чтобы увеличить масштаб. Вы видите, как точки ребра влияют на целое состояние местоположения сетки.
show(map); hold on plot(xy(:,1),xy(:,2),'xr','MarkerSize', 20) grid on set(gca,'XTick',0:0.2:10,'YTick',0:0.2:10) xlim([4 6]) ylim([4 6])
И бинарные и нормальные сетки заполнения имеют опцию для расширения препятствий. Эта инфляция используется, чтобы добавить коэффициент безопасности на препятствиях и создать буферные зоны между роботом и препятствием в среде. Метод inflate
объекта сетки заполнения преобразовывает заданный radius
в количество ячеек, окруженных от значения resolution*radius
. Каждый алгоритм использует это значение ячейки отдельно, чтобы изменить значения вокруг препятствий.
Метод robotics.BinaryOccupancyGrid.inflate
берет каждую занятую ячейку и непосредственно раздувает ее путем добавления занятого места вокруг каждой точки. Этот основной пример инфляции иллюстрирует, как значение радиуса используется.
Этот пример показывает, как создать карту, установить местоположения препятствия и раздуть ее радиусом 1 м. Дополнительные графики на фигуре помогают проиллюстрировать инфляцию и сдвиг из-за преобразования в местоположения сетки.
Создайте бинарную сетку заполнения. Установите заполнение положения [5,5].
map = robotics.BinaryOccupancyGrid(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')
Как вы видите от вышеупомянутой фигуры, даже ячейки, которые едва накладываются с радиусом инфляции, маркированы, как занято.
Метод robotics.OccupancyGrid.inflate
использует радиус инфляции, чтобы выполнить вероятностную инфляцию. Вероятностная инфляция действует как локальный максимальный оператор и находит самые высокие значения вероятности для соседних ячеек. Метод inflate
использует это определение, чтобы раздуть более высокие значения вероятности в сетке. Эта инфляция увеличивает размер любых занятых местоположений и создает буферную зону для роботов, чтобы перейти вокруг препятствий. Этот пример показывает, как инфляция работает с областью значений значений вероятности.
Этот пример показывает, как раздувать метод выполняет вероятностную инфляцию на препятствиях, чтобы раздуть их размер и создать буферную зону для областей с более высокой вероятностью препятствий.
Создайте пустую карту на 10 м x 10 м.
map = robotics.OccupancyGrid(10,10,10);
Обновите заполнение мировых местоположений с определенными значениями в pvalues
.
map = robotics.OccupancyGrid(10,10,10); 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)
При использовании сеток заполнения со значениями вероятности цель состоит в том, чтобы оценить вероятность местоположений препятствия для использования в режиме реального времени приложения робототехники. Класс OccupancyGrid
использует представление логарифмических разногласий значений вероятности для каждой ячейки. Каждое значение вероятности преобразовано в соответствующее значение логарифмических разногласий для внутренней памяти. Значение преобразовано назад в вероятность, когда получено доступ. Это представление эффективно обновляет значения вероятности с наименьшим количеством операций. Поэтому можно быстро интегрировать данные о датчике в карту.
Представление логарифмических разногласий использует следующее уравнение:
Значения логарифмических разногласий хранятся как значения int16
. Этот тип данных ограничивает разрешение значений вероятности к ±0.001, но значительно улучшает емкость памяти и допускает создание увеличенных карт.
При обновлении сетки заполнения с наблюдениями с помощью представления логарифмических разногласий значения имеют область значений – ∞ к ∞. Эта область значений означает, наблюдает ли робот местоположение, такое как закрытая дверь многократно, значение логарифмических разногласий для этого местоположения становится излишне высоким, или вероятность значения насыщается. Если дверь затем открывается, робот должен наблюдать дверь, открытую много раз, прежде чем вероятность изменится от занятого до свободного. В динамических средах вы хотите, чтобы карта реагировала на изменения, чтобы более точно отследить динамические объекты.
Чтобы предотвратить это насыщение, обновите свойство ProbabilitySaturation
, которое ограничивает минимальные и максимальные значения вероятности, позволенные при слиянии нескольких наблюдений. Это свойство является верхней и нижней границей на значениях логарифмических разногласий и позволяет карте обновить быстро к изменениям в среде. Минимальными и максимальными значениями по умолчанию пределов насыщения является [0.001 0.999]
. Для динамических сред предложенными значениями является, по крайней мере, [0.12 0.97]
. Рассмотрите изменение этой области значений, если карта не обновляет достаточно быстро для нескольких наблюдений.
readBinaryOccupancyGrid
| readOccupancyGrid
| robotics.BinaryOccupancyGrid
| robotics.OccupancyGrid
| robotics.OccupancyMap3D
| writeBinaryOccupancyGrid
| writeOccupancyGrid