Форматы представления 3D изображений
8. Robot Operating System (ROS) сетки занятости (Occupancy Grids)
1. История и происхождение формата
ROS (Robot Operating System) — это гибкий фреймворк с открытым исходным кодом для разработки программного обеспечения роботов. Это набор инструментов, библиотек и соглашений, которые упрощают создание сложного поведения роботов. ROS был первоначально разработан в 2007 году в Лаборатории искусственного интеллекта Стэнфордского университета для своего проекта по созданию интеллектуального робота. Позже разработку продолжил исследовательский институт Willow Garage, который сделал ROS открытым и популярным во всем мире.
Создание и цели сеток занятости:
Формат nav_msgs/OccupancyGrid является неотъемлемой частью ROS (Robot Operating System). Он был разработан в конце 2000-х годов в исследовательском институте Willow Garage. Целью было создание общего стандарта, по которому роботы будут представлять для себя окружающий мир в виде цифровой карты.
Решаемая проблема: На момент создания формата отсутствовал единый подход к представлению карт для задач навигации. Роботам требовался легковесный и простой для обработки способ хранения информации о препятствиях. Сетки занятости, предложенные Альберто Эльфсом в 1980-х, стали идеальной теоретической основой. ROS-сообщество адаптировало эту концепцию, создав стандартный формат данных nav_msgs/OccupancyGrid, чтобы унифицировать процессы SLAM (одновременной локализации и картографирования) и планирования пути.
2. Структура данных и принцип работы
Тип геометрии: Для представления карты занятости используется дискретная двумерная сетка (2D Grid). Каждая ячейка сетки представляет собой квадратный участок реального мира и хранит информацию о вероятности его "занятости".
Хранимые данные:
Формат данных nav_msgs/OccupancyGrid состоит из трех основных частей:
-
std_msgs/Header header: Это обязательный блок метаданных, который обеспечивает контекст для карты. Он содержит временную метку (timestamp): Фиксирует время создания или последнего обновления карты. Идентификатор системы координат (frame_id): Это текстовая метка (например, "map"), которая определяет, относительно какой базовой точки отсчета построена вся карта. -
nav_msgs/MapMetaData info: Информация о самой карте:resolution: Разрешение карты в метрах на ячейку (например, 0.05 м/пиксель).widthиheight: Размеры карты в ячейках.geometry_msgs/Pose origin: Позиция и ориентация (вращение) левого нижнего угла карты в пространстве. -
int8[] data: Одномерный массив, хранящий данные о занятости всех ячеек в построчном порядке (row-major order). Значения в массиве интерпретируются следующим образом: 0 – 100: Вероятность того, что ячейка занята (является препятствием). -1: Неизвестная территория, еще не исследованная роботом.
Представление в файле:
Формат nav_msgs/OccupancyGrid — это формат для обмена данными между нодами (программами) ROS в реальном времени. Для сохранения и загрузки карты используется пакет map_server, который представляет сетку в виде двух файлов:
- .pgm (Portable Gray Map): Файл изображения, где цвет каждого пикселя кодирует состояние ячейки (белый — свободна, черный — занята, серый — неизвестна).
- .yaml: Текстовый файл с метаданными, описывающими изображение (разрешение, начало координат и т.д.).
Схематичное изображение структуры данных:
3. Достоинства и недостатки
| Достоинства | Недостатки |
|---|---|
|
Простота и эффективность Легко обрабатывается и требует мало вычислительных ресурсов. |
Строго 2D Неспособен представить 3D-объекты (например, стол). |
|
Вероятностный подход Возможность хранить неопределенность (-1) и степень уверенности (0-100). |
Статичность Формат предназначен для статических карт. |
|
Стандарт в ROS Является основным форматом для 2D-навигации. |
Фиксированное разрешение Разрешение карты одинаково для всех ее участков, что неэффективно для больших пустых пространств. |
|
Универсальность Подходит для любых данных, которые можно спроецировать на 2D-плоскость (лидары, сонары). |
Большой объем памяти Для карт высокого разрешения или больших территорий размер массива data может быть очень большим. |
4. Сфера применения
Области и ПО:
OccupancyGrid — это важная часть всего стека навигации ROS (ROS Navigation Stack). Он используется в:
* SLAM-алгоритмах для построения карт.
* Алгоритмах локализации (amcl) для определения положения робота на существующей карте.
* Планировщиках пути (move_base, Nav2) для построения глобальных и локальных маршрутов, избегая препятствий.
* Инструментах визуализации, в первую очередь в RViz, для отображения карты и положения робота.
Импорт и экспорт:
Формат является и тем, и другим. Внутри ROS он передается между узлами как сообщение. С помощью утилиты map_server карту можно "экспортировать" в файлы .pgm и .yaml для хранения и "импортировать" обратно для использования в системе навигации.
5. Практический пример (наглядная демонстрация)
Примеры можно посмотреть по ссылке - https://github.com/ros-navigation/navigation2/tree/main/nav2_bringup/maps
Пример файла warehouse.yaml (текстовое представление):
Этот файл используется map_server для загрузки карты.
image: warehouse.pgm # Путь к файлу изображения карты mode: trinary # Каждый пиксель это свободно, занято или неизвестно resolution: 0.03 # 3 сантиметра на пиксель origin: [-15.1, -25, 0] # Координаты левого нижнего угла negate: 0 # Не инвертировать цвета occupied_thresh: 0.65 # Пиксели с яркостью < 0.65 считаются занятыми free_thresh: 0.1 # Пиксели с яркостью > 0.1 считаются свободными
Пример карты занятости:

6. Место в современном конвейере обработки 3D-данных
nav_msgs/OccupancyGrid является современным и широко распространенным стандартом, но строго нишевым. Его ниша — 2D-навигация роботов. Он не устарел и активно используется как в ROS1, так и в более современном ROS2.
Перспективы формата остаются высокими в своей области. Для огромного класса роботов (складские роботы, роботы-пылесосы), работающих на плоских поверхностях, 2D-сетка является наиболее эффективным и вычислительно дешевым решением.
В то же время, для более сложных задач (дроны, роботы-манипуляторы, беспилотные автомобили) активно развиваются 3D-представления, такие как OctoMap (на основе октодеревьев), которые позволяют хранить трехмерную информацию о пространстве. Однако OccupancyGrid часто используется и здесь — как 2D-срез 3D-карты для быстрой навигации по поверхности. Таким образом, формат не столько конкурирует с 3D, сколько занимает свою незаменимую нишу в иерархии представлений окружающего мира.