Создание карты маркеров


Формат YAML

Карту можно описать в формате YAML. Этот формат позволяет хранить параметры карты в удобном для чтения виде и добавлять новые параметры без изменения структуры файла.

Не знакомы с форматом YAML? См. краткую памятку по YAML.

name: simulation          # Имя карты (по умолчанию — имя файла)
default_size: 0.36        # Размер маркера по умолчанию в метрах 

markers:
  - id: 0                 # Уникальный ID маркера из словаря ArUco (обязательно)
    # size: 0.15          # Размер конкретного маркера. Если параметр не указан, применяется default_size)
    pose:
      x: 0.0              # Позиция по оси  X (м)
      y: 0.0              # Позиция по оси Y (м)
      # z: 0.0            # Позиция по оси Z (м), по умолчанию 0
    rot:
      yaw: -1.57079632    # Рыскание (рад), опционально
      # roll: 0.0         # Крен (рад), опционально
      # pitch: 0.0        # Тангаж (рад), опционально

Поля в markers

Поле

Обязательно

По умолчанию

Описание

id

да

-

ID маркера из словаря ArUco

size

нет

default_size

Длина стороны маркера в метрах. Если параметр не указан, используется значение default_size. Если не указаны оба параметра, программа выдаст ошибку

pose.x

нет

0.0

Позиция по X в метрах

pose.y

нет

0.0

Позиция по Y в метрах

pose.z

нет

0.0

Позиция по Z в метрах

rot.roll

нет

0.0

Крен (рад)

rot.pitch

нет

0.0

Тангаж (рад)

rot.yaw

нет

0.0

Рыскание (рад)

quat.x/y/z/w

нет

(0,0,0,1)

Альтернативный способ задания ориентации с помощью кватерниона

frame_id

нет

"{frame_id}_aruco_{id}"

Пользовательское имя TF-фрейма конкретного маркера, если программа поддерживает его задание на уровне маркера

Поворот маркера задается одним из двух способов: через rot (RPY) или через quat (кватернион). Одновременно использовать оба способа нельзя.

Пример: базовая карта с default_size

name: my_room
frame_id: map
version: 0
default_size: 0.30

markers:
  - id: 12
    pose:
      x: 1.0
      y: 0.5
  - id: 13
    pose:
      x: 1.0
      y: 1.5

В этом примере для обоих маркеров используется size=0.30 из default_size.

Пример: индивидуальный размер и поворот

markers:
  - id: 0
    size: 0.25
    pose:
      x: 0.0
      y: 0.0
      z: 0.5
    rot:
      yaw: 1.57
      pitch: 0.1

В этом примере для маркера с ID=0 задан собственный размер size=0.25. Поворот задан через параметры yaw и pitch.

Пример: кватернион вместо RPY

markers:
  - id: 42
    pose:
      x: 2.0
      y: 3.0
    quat:
      x: 0.0
      y: 0.0
      z: 0.707
      w: 0.707

В этом примере ориентация маркера задана с помощью кватерниона quat.

Формат TXT (альтернативный)

Осторожно

Рекомендуем использовать YAML. Он позволяет задавать больше параметров карты и расширять ее структуру.

Карту также можно сохранить в текстовом формате с расширением .txt:

id size x y [z yaw pitch roll]

Каждая строка содержит данные одного маркера. Используйте пробел в качестве разделителя. Строки, начинающиеся с #, программа игнорирует.

# id size x y z yaw pitch roll
0 0.36 0.0 0.0 0.0 -1.57 0.0 0.0
1 0.36 0.0 -1.0 0.0 -1.57 0.0 0.0
2 0.36 0.0 -2.0 0.0 -1.57 0.0 0.0

Поля z, yaw, pitch, roll опциональны. Если поле не указано, используется значение 0.0.

Как загружается карта

  1. clover2_map ищет файл по пути, указанному в параметре map_path.

  2. Программа определяет формат карты по расширению файла: .yaml/.yml или .txt.

  3. Для каждого маркера программа создает Geometry_msgs/PoseWithCovariance и статический TF-фрейм.

  4. По умолчанию программа формирует имя TF-фрейма по шаблону {frame_id}_aruco_{id} (например, map_aruco_0).

  5. Если для маркера задан собственный frame_id, программа использует его вместо имени, сформированного автоматически.

  6. Программа публикует карту через сервис ~/get_map и в топик ~/map_update при обновлении карты.

Создание карты для помещения

  1. Распечатайте ArUco-маркеры из словаря 4X4_1000. Убедитесь, что размер стороны распечатанного маркера соответствует размеру, указанному в карте.

  2. Разместите маркеры на потолке или стенах вдоль предполагаемой траектории полета.

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

  4. Запишите в YAML-файл параметры id, pose.x/y/z, rot.yaw.

  5. Укажите в default_size фактическую длину стороны маркера в метрах. Размер маркера — это длина стороны черного квадрата с изображением ArUco.

Проверка карты и камеры

Проверка топиков

Сначала проверьте, что камера публикует отладочное изображение и правильно распознает маркеры.

Откройте в браузере топик /main_camera/feat_detector/output/debug и наведите камеру на маркеры. На изображении должны появиться обнаруженные метки.

Также распознавание можно проверить в терминале квадрокоптера по топику /main_camera/feat_detector/output/markers. При наведении камеры на маркеры в этом топике должны появляться сообщения с данными обнаруженных маркеров.

ros2 topic echo /main_camera/feat_detector/output/markers

Проверка удержания позиции над полем маркеров

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

  1. Разместите квадрокоптер на поле, состоящем из ArUco-маркеров.

  2. Переключите полетный контроллер в режим Stabilized.

  3. Выполните ручной взлет.

  4. После взлета удерживайте стик газа в положении примерно 50%.

  5. Переключите полетный режим в Position.

  6. Убедитесь, что квадрокоптер самостоятельно завис и удерживает позицию над полем маркеров.