При работе над робототехнической системой часто приходится работать с bag файлами. bag файлы очень удобны для отладки исключительных ситуаций и для тестирования алгоритмов без использования реального робота.

В этой статье я расскажу о полезных инструментах для работы с bag файлами в ROS2. Эти инструменты покрывают широкий диапазон возможностей и отличаются предлагаемым интерфейсом (CLI, GUI и веб). Кому интересно прошу под кат.

ros2_unbag

Инструмент для экспорта файлов в удобный для человека формат позволяет извлекать данные топиков из .db3 or .mcap bag файлов в форматы такие как CSV, JSON, PCD, изображения и т.д.

Исходный код инструмента можно найти на гитхаб.

Перейдем к установке. Сначала установим необходимые зависимости:

sudo apt update
sudo apt install libxcb-cursor0 libxcb-shape0 libxcb-icccm4 libxcb-keysyms1 libxkbcommon-x11-0

Установим ros2_unbag через pip

pip install ros2-unbag

Запустим ros2_unbag

Выберем файл в формате .mcap или .db3

Выберем интересующие нас топики, нажмем Next. Здесь можно выбрать пути для сохранения отдельных файлов:

Окно можно прокрутить вниз

Нажмем Export. Теперь проверим что экспорт прошел успешно.

Выведем список файлов в папке

Выведем список файлов для топика:

hector_recorder

Исходный код пакета доступен на github.

Обсуждение на Discourse.

Приступим к установке hector_recorder.

Установим зависимости:

sudo apt update &&
sudo apt install libncurses-dev libfmt-dev libyaml-cpp-dev

Склонируем и скомпилируем пакет:

colcon build --packages-select hector_recorder hector_recorder_msgs
source install/setup.bash

После этого не забудьте сделать source воркспейса.

Для примера будем записывать данные для turtlesim. Запустим узел для черепашки

ros2 run turtlesim turtlesim_node

Выведем список топиков

Запустим утилиту для записи всех топиков в bag файл

bag_recorder --all

Увидим что-то подобное:

Для записи одного топика запустим такую команду:

bag_recorder --topics /turtle1/cmd_vel

Окно программы будет выглядеть соответственно:

После завершения записи выведем список файлов в папке результата:

Также можно задать путь до конфиг файла:

bag_recorder --config bag_recorder_config.yaml

Пример файла конфига:

node_name: "my_node_name"     # defaults to 'hector_recorder'
output: "/home/vlad/bags"           # will be normalized, timestamp subdir if directory
topics: 
 - "/turtle1/cmd_vel" 
 - "/turtle1/pose"
max_bag_duration: 30          # split the bag at 30s
publish_status: true          # publish hector_recorder_msgs status

Здесь мы указываем что хотим разбивать на отдельные bag файлы через каждые 30 секунд (каждый bag файл будет максимальной длиной 30с).

При запуске bag_recorder с конфиг файлом мы увидим такое окно

Файлы которые получаем в результате:

ROS2 Bag Manager

https://medium.com/p/af360035876f/edit

Простой инструмент для управления bag файлами с веб интерфейсом, который построен на FastAPI (чистый и responsive).

Исходный код пакета доступен на github.

Приступим к установке

Выполним команду:

curl -LsSf https://astral.sh/uv/install.sh

Затем установим системные зависимости

sudo apt install p7zip-full

Установим зависимости Python

uv pip install -e .

Запустим сервер из папки

uv run app.py

Откроем в браузере страницу http://127.0.0.1:8000

Нажмем кнопку “Browse” чтобы выбрать наш bag файл

Как только bag файл будет загружен мы увидим следующие экран

Нажмем на кнопку Play и увидим

Выведем список активных топиков:

You can select speed

You can click button Compress bag


Compression process will start in background.

Once the compression is complete

Original db3 file has size of 1.2GB. Compressed archive has size of 323 MB.

bag2mesh

Это мощный standalone инструмент написанный на Python предназначенный для конвертации ROS bag файлов в высококачественные 3D меши.
bag2mesh не требует установ��и ROS. Он использует файлы rosbag напрямую и Open3D для продвинутой обработки что делает инструмент легковесным и простым в использовании.

Исходный код пакета доступен на github.

Установка

Клонируем репозиторий

git clone https://github.com/alex9978/bag2mesh.git
cd bag2mesh

Лучше создать отдельный virtuelenv для Python:

sudo apt install python3-venv
python3 -m venv .venv
source .venv/bin/activate

Установим зависимости Python

pip install -r requirements.txt

Конвертируем bag файл в меш используя настройки по умолчанию

python bag2mesh.py input.bag output.ply

robotdatapy

Это пакет на Python который позволяет получить доступ и работать с данными геометрии робота.

Исходный код доступен на гитхабе.

Обсуждение пакета на Discourse.

Можно установить через pip

pip install robotdatapy

или из исходников

git clone git@github.com:mbpeterson70/robotdatapy.git
cd robotdatapy
pip install .

Авторы говорят что основная цель пакета это дать пользователю универсальный интерфейс для работы с данными робота, которые хранятся в различных форматах (bag файлы, csv, изображения итд). Этот пакет предоставляет классы для загрузки данных из различных источников. По словам авторов в пакете robotdatapy внимание акцентируется на синхронизации по времени (robotdatapy позволяет получать фото с камеры и легко находить позицию робота в момент когда был получен кадр с камеры).

Посмотрим на некоторые примеры кода работы с библиотекой.

Работа с данными позиции. Класс PoseData позволяет загружать информацию из ROS1/2 bag файлов, csv файлов, датасета KITTI или напрямую из набора меток времени и позиций.

Вот например код для визуализации траектории робота:

import robotdatapy as rdp

bag_path = # path to bag
topic = # Odometry or Pose msg
pose_data = rdp.data.PoseData.from_bag(bag_path, topic=topic, interp=True)

pose_data.plot2d(dt=1.0, trajectory=True, pose=False)     # plots only position every second
pose_data.plot2d(dt=5.0, trajectory=False, pose=True)     # plots coordinate frames of the poses every 5 seconds

Пример работы с изображениями

ImgData позволяет читать данные из ROS1/2 bag файловЮ архивов, файлов numpy npz с метками времени и изображениями или напрямую.

import robotdatapy as rdp

bag_path = # add ROS 1/2 bag path
topic = # camera image topic

img_data = rdp.data.ImgData.from_bag(
    bag_path,
    topic=topic
    compressed=True # tells the loader that the images are ROS CompressedImage messages
)

img_data.show(img_data.t0) # shows the first image

Для работы с облаками точек предназначен класс PointCloudData. PointCloudData может загружать данные из ROS1/2 bag файлов.

Пример работы с облаками точек

import robotdatapy as rdp

bag_path = # ROS 1/2 bag path
topic = # ROS point cloud topic

ptcld_data = rdp.data.PointCloudData.from_bag(
    bag_path,
    topic=topic,
)

В robotdatapy есть инструменты для трансформации точек и легкого проецирования точек на изображение с камеры.

На этом все. До новых встреч!