Запись и воспроизведение: 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 вместе с данными.