Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Что у тебя в сумке? Как работать с bag файлами и не утонуть в данных

Что у тебя в сумке? Как работать с bag файлами и не утонуть в данных

Oleg Shipitko

February 15, 2020
Tweet

More Decks by Oleg Shipitko

Other Decks in Programming

Transcript

  1. ❏ Зав. лаб. – к.ф.-м.н. Д. П. Николаев ❏ 50+

    сотрудников ❏ 100+ публикаций в 2019 году ❏ МИП «Визиллект Сервис» ❏ Разработка индустриальных распознающих систем ❏ 5 крупных проектов за 5 лет Лаборатория зрительных систем ИППИ РАН 2
  2. Области исследования ❏ Быстрые процедуры обработки изображений ❏ Алгоритмы томографической

    реконструкции ❏ Методы и технологии обучения машин ❏ Комплексирование и фильтрация данных ❏ Проблемы «слепой» автокалибровки ❏ Модели внимания человеческого зрения ❏ Цвет и мультиспектральная визуализация Лаборатория зрительных систем ИППИ РАН 3
  3. Автономные автомобили Waymo генерируют от 11 TB до 152 TB

    данных в день 6 Источник: https://www.tuxera.com
  4. 7 “We’re entering a new world in which data may

    be more important than software.” Tim O’Reilly, founder, O’Reilly Media. “The goal is to turn data into information and information into insight.” Carly Fiorina, former chief executive officer, Hewlett Packard. “Errors using inadequate data are much less than those using no data at all.” Charles Babbage, mathematician, engineer, inventor, and philosopher. “The world is one big data problem.” Andrew McAfee, principal research scientist, MIT.
  5. Что такое bag файл? ❏ Bag файлы содержат сериализованные ROS-сообщения.

    ❏ Bag файлы могут быть проиграны в виде топиков, которые в них записаны. ❏ Формат bag файлов эффективен как для записи, так и для проигрывания так как сообщения хранятся в том же формате, что и при передаче по сети внутри ROS. Bag формат 2.0 ❏ компрессия: сообщения хранятся блоками, которые могут сжиматься отдельно, но все еще позволяют случайный доступ ❏ высокоуровневое индексирование: второй уровень индексирования позволяет быстро собирать статистику по bag файлу ❏ соединения: сообщения хранятся в привязке к соединению, что делает публикацию записанных сообщений более надежной ❏ компактный формат: формат был значительно сжат , записи не содержат дублированных топиков и информацию о подключениях 8
  6. #ROSBAG V2.0 <record 1><record 2>....<record N> Что у него внутри?

    9 <header_len><header><data_len><data> <field1_len><field1_name>=<field1_value>... <fieldN_len><fieldN_name>=<fieldN_value> Record Header Bag файл Каждый header должен содержать op-код (1 байт), использующийся для различения разных типов записей: ❏ Bag header - хранит информацию о файле (количество блоков данных, соединений и т.д.) ❏ Chunk - хранит (возможно в сжатом виде) записи данных и соединений ❏ Connection - хранит header ROS-соединения, включая имя топика и полный текст msg-файла ❏ Message data - хранит сериализованные данные сообщений, включая ID соединения ❏ Index data - хранит индекс сообщений из предшествующего блока данных ❏ Chunk info - информация о сообщениях в блоке (первая/последняя временная метка, количество соединений и т.д.)
  7. Что у него внутри? 10 <header_len><header><data_len><data> <field1_len><field1_name>=<field1_value>... <fieldN_len><fieldN_name>=<fieldN_value> Record Header

    Bag файл #ROSBAG V2.0 <record 1><record 2>....<record N> Каждый header должен содержать op-код (1 байт), использующийся для различения разных типов записей: ❏ Bag header - хранит информацию о файле (количество блоков данных, соединений и т.д.) ❏ Chunk - хранит (возможно в сжатом виде) записи данных и соединений ❏ Connection - хранит header ROS-соединения, включая имя топика и полный текст msg-файла ❏ Message data - хранит сериализованные данные сообщений, включая ID соединения ❏ Index data - хранит индекс сообщений из предшествующего блока данных ❏ Chunk info - информация о сообщениях в блоке (первая/последняя временная метка, количество соединений и т.д.)
  8. Что у него внутри? 11 <header_len><header><data_len><data> <field1_len><field1_name>=<field1_value>... <fieldN_len><fieldN_name>=<fieldN_value> Record Header

    Bag файл #ROSBAG V2.0 <record 1><record 2>....<record N> Каждый header должен содержать op-код (1 байт), использующийся для различения разных типов записей: ❏ Bag header - хранит информацию о файле (количество блоков данных, соединений и т.д.) ❏ Chunk - хранит (возможно в сжатом виде) записи данных и соединений ❏ Connection - хранит header ROS-соединения, включая имя топика и полный текст msg-файла ❏ Message data - хранит сериализованные данные сообщений, включая ID соединения ❏ Index data - хранит индекс сообщений из предшествующего блока данных ❏ Chunk info - информация о сообщениях в блоке (первая/последняя временная метка, количество соединений и т.д.)
  9. #ROSBAG V2.0 <record 1><record 2>....<record N> Что у него внутри?

    12 <header_len><header><data_len><data> <field1_len><field1_name>=<field1_value>... <fieldN_len><fieldN_name>=<fieldN_value> Record Header Каждый header должен содержать op-код (1 байт), использующийся для различения разных типов записей: ❏ Bag header - хранит информацию о файле (количество блоков данных, соединений и т.д.) ❏ Chunk - хранит (возможно в сжатом виде) записи данных и соединений ❏ Connection - хранит header ROS-соединения, включая имя топика и полный текст msg-файла ❏ Message data - хранит сериализованные данные сообщений, включая ID соединения ❏ Index data - хранит индекс сообщений из предшествующего блока данных ❏ Chunk info - информация о сообщениях в блоке (первая/последняя временная метка, количество соединений и т.д.) Bag файл
  10. Что у него внутри? 13 id: 42 topic: /foo/bar definition:

    float32 f MyType m ====================== MSG: MyType int32 i string s Запись соединения Connection id: 42 time: 12345.67 Data(binary): 1110101110011100111 Запись сообщения Struct MsgType { float32 f; MyType m; } Struct MyType { int32 i; string s; }
  11. Что можно делать с bag файлами? Записывать Воспроизводить Хранить ❏

    Просматривать / инспектировать ❏ Размечать (аннотировать) ❏ Индексировать 14
  12. Как записать bag файл? -d, --duration Максимальная продолжительность файла. $

    rosbag record --duration=30 /chatter $ rosbag record --duration=5m /chatter $ rosbag record --duration=2h /chatter --split Разделение файла когда достигнута максимальная длина/продолжительность $ rosbag record --split --size=1024 /chatter $ rosbag record --split --duration=30 /chatter $ rosbag record --split --duration=5m /chatter $ rosbag record --split --duration=2h /chatter --max-splits=MAX_SPLITS Разделить bag максимум MAX_SPLITS раз, после чего начать удалять устаревшие файлы. $ rosbag record --split --size 1024 --max-splits 3 /chatter $ rosbag record --split --duration 10m --max-splits 6 /chatter 15 -b SIZE, --buffsize=SIZE Использовать внутренний буфер размера SIZE MB (Default: 256, 0 = бесокнечный). Создает очередь сообщений объекта recorder, которая заполняется до того как быть записанов в файл. Уменьшения размера буфера приведет к потере сообщений. $ rosbag record -b 1024 /chatter --chunksize=SIZE Записывать блоки данных размера SIZE KB (Default: 768). Это размер буфера объекта bag файл.Уменьшение буфера приведет к более частой записи на диск. $ rosbag record --chunksize=1024 /chatter -l NUM, --limit=NUM Записать только NUM сообщений из каждого топика. $ rosbag record -l 1000 /chatter --node=NODE Записать все топики, на которые подписан NODE. $ rosbag record --node=/joy_teleop -j, --bz2 Применить компрессию BZ2. $ rosbag record -j /chatter --lz4 Применить компрессию LZ4. $ rosbag record --lz4 /chatter rosbag record <topic-names>
  13. Сжатие 16 Тип Время (сек) Размер от исходного (%) bz2

    (python) 2986.8 17.16 bz2 (C++) 3050.0 17.16 lz4 (C++) 51.2 25.83 Тип Время (сек) bz2 (python) 333.1 bz2 (C++) 351.9 lz4 (C++) 88.8 Сжатие Восстановление lz4 существенно быстрее bz2 обеспечивает лучшее сжатие
  14. Как записать изображения? 17 Запись сжатого изображения rosbag record /front_camera/image_raw/compressed

    Воспроизведение $ rosbag play <bag-file> Декомпрессия rosrun image_transport republish compressed in:=/internet/image out:=/camera/image Важно! По умолчанию compressed_image_transport использует JPEG (сжатие с потерями). Через dynamic_reconfigure можно выбрать сжатие PNG.
  15. Еще немного про запись 18 ❏ Отображение статистики топиков: количество

    сообщений, bandwidth, количество пропущенных сообщений и т.д. ❏ Bash-автодополнение названий топиков ❏ Опциональное ограничение частоты записываемых данных для каждого топика Запись данных с пакетом rosbag_fancy
  16. 19 Данные для тестирования bag файл с сырыми данными отдельный

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

    данные bag файл с предобработанными данными Результат
  18. Проигрывание 22 -r FACTOR, --rate=FACTOR Умножить скорость воспроизведения на FACTOR.

    $ rosbag play -r 10 recorded1.bag -s SEC, --start=SEC Начать воспроизведение с SEC секунды от начала файла. $ rosbag play -s 5 recorded1.bag -u SEC, --duration=SEC Проиграть SEC секунд файла. $ rosbag play -u 240 recorded1.bag --skip-empty=SEC Пропустить участки bag файла без сообщений длиной более SEC секунд. $ rosbag play --skip-empty=1 recorded1.bag -l, --loop Зациклить воспроизведение. $ rosbag play -l recorded1.bag -k, --keep-alive Не останавливать воспроизведение после проигрывания всех сообщений (полезно для публикации latched топиков). $ rosbag play -k recorded1.bag rosbag play <bag-files> - считывает содержимое bag файлов и публикует их синхронизируя по времени -i, --immediate Проиграть все сообщения без задержки. $ rosbag play -i recorded1.bag --pause Начать проигрывание в режиме “Пауза”. $ rosbag play --pause recorded1.bag --queue=SIZE Размер очереди публикации сообщений SIZE (по умолчанию: 0). $ rosbag play --queue=1000 recorded1.bag --clock Публиковать время. $ rosbag play --clock recorded1.bag --hz=HZ Публиковать время с частотой HZ (по умолчанию: 100). $ rosbag play --clock --hz=200 recorded1.bag -d SEC, --delay=SEC Делать паузу в проигрывании на SEC секунд после каждого нового объявления топика (чтобы подписчики имели время на подписку). $ rosbag play -d 5 recorded1.bag
  19. ❏ rosbag info <bag-files> ❏ rostopic list -b <bag-file> ❏

    rostopic echo -b <bag-file> Просмотр 23
  20. Инспекция Пакет rqt_bag ❏ Показывает наличие сообщений в топиках ❏

    Показывает thumbnails изображения на временной шкале ❏ Позволяет строить графики числовых сообщений ❏ Публиковать / записывать выбранные топики ❏ Экспортировать сообщения из выбранного временного промежутка в новый bag 24 rqt_bag имеет API, позволяющий реализовывать свои плагины
  21. 25 Воспроизведение/запись/навигация Индикация прихода сообщений в топик Список топиков Визуализация

    топиков с изображениями Выбор типа визуализации (сырые данные/график/изображение)
  22. Пакет rosbag-sliding-windows-annotator Аннотация (разметка наборов данных) числовых данных на основе

    визуальных Пример конфигурационного файла config.json { "Human": { "Activity": ["Walking", "Running", "Jumping"], "Speed": ["Slow", "Normal", "Fast", "Very Fast"], "Force Intensity": ["Weak", "Medium", "Strong"], }, "Robot": { "Speed": ["Slow", "Normal", "fast"], "Is Touching Human?" : ["No","Almost","Yes"] } } Аннотация bag файлов 26
  23. Индексация 29 Список сообщений /can2/brake_state/forward /imu/xsens/imu /gnss/fix /control/trajectory/waypoints /left/tf/vision/front/left/image/compressed Библиотека

    визуализаций (график, траектория, гистограмма, slit-изображение, thumbnail-изображения и т.д.) Стиль (шрифты, цвета и т.д.) Сеточное разбиение Индексатор бэгов
  24. Миграция или что делать если изменились типы сообщений 30 Struct

    MsgType { float32 f; MyType m; } Struct MsgType { float32 f; MyType m; MyNewType n; } Struct MsgType { float32 f; MyType m; } Struct MsgType { float32 f; MyType m; MyNewType n; } A B Правило перехода из A в B: float32 f = float32 f; MyType m = MyType m; MyNewType n = 0;
  25. Миграция или что делать если изменились типы сообщений 31 rosbag/migration

    ❏ savemsg.py позволяет сохранить определение сообщения в временный файл (.saved), позволяющий в перспективе создать правило миграции. rosrun rosbag savemsg.py mypkg/MyMsg > MyMsg.saved ❏ makerule.py генерирует правила миграции между сохраненным типом сообщения и типом сообщения, существующим в системе в данный момент. rosrun rosbag makerule.py MyMsg.saved myrule.bmr
  26. 32 ❏ Общая документация по rosbag: http://wiki.ros.org/rosbag ❏ rosbag code

    API: http://wiki.ros.org/rosbag/Code%20API#cpp_api ❏ Rosbag migration: http://wiki.ros.org/rosbag/migration ❏ Описание image_transport: https://wiki.ros.org/image_transport ❏ DConf 2019: Using D for ROS Bag File Manipulation for Autonomous Driving -- Ali Çehreli: https://www.youtube.com/watch?v=8JhP_Bd2DMc Источники