При работе над робототехнической системой часто приходится работать с 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. Теперь проверим что экспорт прошел успешно.
Выведем список файлов в папке

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

UPD: недавно на Discourse появился тред об обновлении пакета.
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 есть инструменты для трансформации точек и легкого проецирования точек на изображение с камеры.
На этом все. До новых встреч!
