Запись и воспроизведение: ros2 bag

Чтобы отлаживать робота не на ходу, а спокойно за столом, его данные записывают через ros2 bag.

ros2 bag — инструмент записи сообщений топиков в файл и их последующего воспроизведения с теми же временными метками, как будто данные идут вживую.

Зачем записывать данные

Робот ведёт себя странно только в коридоре на третьем этаже в момент, когда мимо проходит человек. Воспроизвести это вручную почти невозможно. Решение — записать все топики во время инцидента, а потом сколько угодно раз проигрывать запись на столе, разбираясь в причине. Запись (bag) — это «чёрный ящик» робота и одновременно мощный инструмент разработки.

Запись

# записать конкретные топики
ros2 bag record /scan /odom /tf -o my_run

# записать вообще все топики
ros2 bag record -a -o full_run

Создаётся папка с файлом данных и метаинформацией: какие топики, типы, сколько сообщений, длительность.

Воспроизведение

# проиграть запись
ros2 bag play my_run

# в два раза медленнее — удобно для отладки
ros2 bag play my_run --rate 0.5

# посмотреть, что внутри
ros2 bag info my_run

Вывод (ros2 bag info):

Duration:    45.3s
Messages:    2380
Topics:      /scan  (453 msgs)  sensor_msgs/LaserScan
             /odom  (2265 msgs) nav_msgs/Odometry
             /tf    (... )

Отладка без робота

Магия в том, что для остальной системы воспроизведение неотличимо от живых датчиков: ros2 bag play публикует в те же топики (/scan, /odom) с исходными временными метками. Можно запустить узел навигации, проиграть ему запись реальной поездки и смотреть в RViz, как он бы себя повёл — при этом сам робот стоит выключенный в углу. Поправили алгоритм — проиграли ту же запись снова, сравнили. Это превращает отладку в воспроизводимый эксперимент.

Запись как набор тестов

Записи реальных поездок становятся регрессионными тестами: «на этой записи объезд раньше срабатывал, проверим, что новая версия не сломала его». Команды копят библиотеку показательных bag-ов — сложные перекрёстки, скользкий пол, появление человека — и гоняют на них новый код перед выкаткой на железо.

Как работает под капотом

При записи bag создаёт подписчиков на указанные топики и складывает каждое пришедшее сообщение в базу данных (по умолчанию формат на основе SQLite) вместе с точной временной меткой получения. При воспроизведении он читает сообщения по порядку и публикует их, выдерживая исходные интервалы времени между ними — поэтому скан, пришедший через 0.1 с после предыдущего, и при проигрывании появится через 0.1 с. Флаг --rate просто масштабирует эти интервалы. Важно: bag хранит сериализованные сообщения, поэтому тип сообщения должен быть доступен и при проигрывании.

Частые ошибки

  • Записать без /tf. Без преобразований запись бесполезна для навигации — данные не привязать к роботу.
  • Забыть про use_sim_time при проигрывании. Узлы должны брать время из записи, иначе TF рассинхронизируется.
  • Огромные bag-и от камеры. Запись /image на полной частоте быстро съедает диск; пишите только нужные топики.

Итоги

  • ros2 bag записывает топики в файл и воспроизводит их с исходным временем.
  • Воспроизведение неотличимо от живых датчиков — отладка без робота.
  • Записи служат воспроизводимыми тестами для алгоритмов.
  • Для навигации обязательно записывать /tf вместе с данными.
Проверьте себя
1. Что делает ros2 bag?
AСобирает пакеты
BЗаписывает сообщения топиков в файл и воспроизводит их
CРисует граф узлов
DУправляет моторами
2. Чем полезно воспроизведение записи для отладки?
AОно ускоряет робота
BСистема получает те же топики, что от живых датчиков — можно отлаживать без робота
CОно компилирует код
DОно создаёт карту
3. Что обязательно записывать вместе с данными датчиков для навигации?
AСписок узлов
BПреобразования /tf
CПараметры сборки
DЛоги colcon