Форматы представления 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 состоит из трех основных частей:

  1. std_msgs/Header header: Это обязательный блок метаданных, который обеспечивает контекст для карты. Он содержит временную метку (timestamp): Фиксирует время создания или последнего обновления карты. Идентификатор системы координат (frame_id): Это текстовая метка (например, "map"), которая определяет, относительно какой базовой точки отсчета построена вся карта.

  2. nav_msgs/MapMetaData info: Информация о самой карте: resolution: Разрешение карты в метрах на ячейку (например, 0.05 м/пиксель). width и height: Размеры карты в ячейках. geometry_msgs/Pose origin: Позиция и ориентация (вращение) левого нижнего угла карты в пространстве.

  3. 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, сколько занимает свою незаменимую нишу в иерархии представлений окружающего мира.