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