Почему запись ROSBag записывает только десять событий в секунду с любого датчика?

Пример ROSBags, предоставленный как часть руководств Cartographer (https://google-cartographer-ros.readthedocs.io/en/latest/demos.html) имеют частоту сообщений около 1507 сообщений в секунду для сообщений LiDAR и 250 сообщений в секунду от IMU. У меня есть IMU, транслирующий около 100 сообщений в секунду, и Velodyne VLP-16, транслирующие сообщения с использованием собственного драйвера Velodyne (VLP16_points.launch). Для обоих датчиков запись rosbag записывает только до 10 сообщений в секунду. Как я могу увеличить эту частоту записи?


person Michael Kossin    schedule 29.06.2021    source источник
comment
Как ты называешь Росбаг? Через файл запуска или со своей нодой?   -  person JWCS    schedule 30.06.2021
comment
Просто из командной строки: rosbag Record imu points2   -  person Michael Kossin    schedule 30.06.2021


Ответы (1)


Я подозреваю, что это скорее функция ограничителя времени (например, частота, передаваемая обратному вызову таймера, который выполняет запись, как вы могли ожидать), на самом деле это узкое место буфера.

Он принимает столько данных для записи на диск или данных в абонентских буферах, прежде чем будет отбрасывать кадры для записи или обработки уже имеющихся данных.

Помимо написания собственного узла с использованием их API C++ и профилирования самой проблемы (также допустимый и не слишком сложный вариант, если он очень необходим), есть некоторые встроенные параметры командной строки, которые управляют размерами буфера (ниже выделено мной).

Я также рекомендую рассчитать желаемую скорость записи в кбит/с; если вы знаете размер одного лидарного сообщения, сколько вы хотите сохранить, и скорость их генерации (rostopic hz/rostopic bw), чтобы дать вам хорошую оценку того, что вы на самом деле спрашиваете.

-b SIZE, --buffsize=SIZE

Используйте внутренний буфер SIZE МБ (по умолчанию: 256, 0 = бесконечный). Это очередь сообщений объекта записи до того, как сообщения будут переданы в сумку. Уменьшение этого значения может привести к удалению сообщений до того, как они достигнут процесса записи.

$ rosbag record -b 1024 /chatter

--chunksize=SIZE

Передовой. Запись фрагментами размером SIZE КБ (по умолчанию: 768). Это буфер в объекте файла пакета. Уменьшение этого значения приведет к большему количеству операций записи на диск.

$ rosbag record --chunksize=1024 /chatter

http://wiki.ros.org/rosbag/Commandline#record


Правки из комментариев:

Два вышеуказанных параметра влияют на буферы сериализованных сообщений, когда необработанное сообщение темы преобразуется в текст и сохраняется. Если они превышены, должен быть ROS_WARN msgs в вашем терминале. (Если нет, вы можете включить их.)

Если вы не видите никаких сообщений ROS_WARN о потерянных кадрах, проблема может заключаться в обычных сообщениях о потерянных ros. Ссылаясь на предыдущие вопросы, вы можете включить статистику темы, чтобы увидеть, не удаляются ли какие-либо сообщения из-за размера очереди. Из исходного кода для инструмента командной строки каждая подписанная тема имеет только буфер сообщений из 100 (ops.queue_size = 100;). Если это проблема, самое простое решение — скопировать исходный пакет из github в вашу рабочую область и изменить размер очереди. Но я подозреваю, что это не настоящая проблема.

Если вы записываете более 10 тем, гипотетически может быть другая проблема, так как по умолчанию это запускает только 10 потоков 'async spinner'; но все другие упомянутые потенциальные проблемы, скорее всего, являются основными причинами.

person JWCS    schedule 29.06.2021
comment
Спасибо за ваш ответ, но, похоже, независимо от того, какие значения я передаю --chunksize или -b в вызове командной строки записи rosbag, данные imu и Velodyne_Points записываются только десять раз в секунду. - person Michael Kossin; 30.06.2021
comment
Я добавил еще несколько деталей; в исходном коде нет ограничений на частоту, только ограничения на размер памяти (очередь/буфер). Я бы еще раз проверил, нет ли предупредительных распечаток, посмотрел бы записанные данные о потерянных сообщениях по порядковому номеру и попытался бы сузить круг твоей проблемы с помощью этих диагностических инструментов. Если вы обнаружите более глубокую проблему, это, скорее всего, другой, отличный от того, что вы задали, хороший вопрос. Хотя этот ответ на самом деле не говорит вам почему в вашем конкретном случае, но ответ должен быть в рамках этой области отладки. - person JWCS; 30.06.2021