rosbag LogfilesRosbag или bag - формат файла в ROS для хранения данных сообщения. Эти пакеты часто создаются путем подписки на один или более разделов ROS и сохранения принятых данных сообщения в эффективной файловой структуре. MATLAB ® может считывать эти файлы rosbag и помогать с фильтрацией и извлечением данных сообщений. Дополнительные сведения о поддержке rosbag в MATLAB см. в разделе Файлы журнала ROS (rosbags).
В этом примере вы загрузите росбаг и узнаете, как выбрать и извлечь содержащиеся сообщения.
Предпосылки: Работа с основными сообщениями ROS
rosbagЗагрузите файл примера с помощью rosbag команда.
bag = rosbag('ex_multiple_topics.bag')bag =
BagSelection with properties:
FilePath: '/tmp/BR2021ad_1684407_61364/mlx_to_docbook6/tp6773ed82/ros-ex71482057/ex_multiple_topics.bag'
StartTime: 201.3400
EndTime: 321.3400
NumMessages: 36963
AvailableTopics: [4x3 table]
AvailableFrames: {0x1 cell}
MessageList: [36963x4 table]
Объект, возвращенный из rosbag вызов является BagSelection объект, представляющий все сообщения в rosbag.
На экране объекта отображаются сведения о количестве сообщений, содержащихся в файле (NumMessages) и время, когда первый (StartTime) и последний (EndTime) сообщение было записано.
Оцените AvailableTopics для просмотра дополнительной информации о темах и типах сообщений, записанных в сумке:
bag.AvailableTopics
ans=4×3 table
NumMessages MessageType MessageDefinition
___________ ______________________ ________________________________
/clock 12001 rosgraph_msgs/Clock {0x0 char }
/gazebo/link_states 11999 gazebo_msgs/LinkStates {'geometry_msgs/Pose[] Pose...'}
/odom 11998 nav_msgs/Odometry {' uint32 Seq...' }
/scan 965 sensor_msgs/LaserScan {' uint32 Seq...' }
AvailableTopics содержит отсортированный список тем, включенных в rosbag. В таблице хранится количество сообщений, тип сообщения и определение сообщения для раздела. Для получения дополнительной информации о типе данных таблицы MATLAB и о том, какие операции с ней можно выполнить, см. документацию для Таблицы.
Первоначально rosbag индексируется только MATLAB, и фактические данные сообщения не считываются.
Перед загрузкой сообщений в память MATLAB можно отфильтровать и максимально сузить выбор сообщений на основе этого индекса.
Перед извлечением данных сообщения необходимо выбрать набор сообщений на основе таких критериев, как метка времени, название темы и тип сообщения.
Можно просмотреть все сообщения в текущем выборе:
bag.MessageList
ans=36963×4 table
Time Topic MessageType FileOffset
______ ___________________ ______________________ __________
201.34 /gazebo/link_states gazebo_msgs/LinkStates 9866
201.34 /odom nav_msgs/Odometry 7666
201.34 /clock rosgraph_msgs/Clock 4524
201.35 /clock rosgraph_msgs/Clock 10962
201.35 /clock rosgraph_msgs/Clock 12876
201.35 /odom nav_msgs/Odometry 12112
201.35 /gazebo/link_states gazebo_msgs/LinkStates 11016
201.36 /gazebo/link_states gazebo_msgs/LinkStates 12930
201.36 /odom nav_msgs/Odometry 14026
201.37 /odom nav_msgs/Odometry 14844
201.37 /gazebo/link_states gazebo_msgs/LinkStates 15608
201.37 /clock rosgraph_msgs/Clock 14790
201.38 /clock rosgraph_msgs/Clock 16704
201.38 /gazebo/link_states gazebo_msgs/LinkStates 16758
201.38 /odom nav_msgs/Odometry 17854
201.39 /gazebo/link_states gazebo_msgs/LinkStates 18672
⋮
MessageList таблица содержит одну строку для каждого сообщения в пакете (в этом примере для пакета имеется более 30000 строк). Строки сортируются по метке времени в первом столбце, которая представляет время (в секундах) записи сообщения.
Поскольку список очень большой, можно также просмотреть выборку строк со знакомым синтаксисом выбора строк и столбцов:
bag.MessageList(500:505,:)
ans=6×4 table
Time Topic MessageType FileOffset
____ ___________________ ______________________ __________
203 /clock rosgraph_msgs/Clock 339384
203 /gazebo/link_states gazebo_msgs/LinkStates 331944
203 /gazebo/link_states gazebo_msgs/LinkStates 333040
203 /gazebo/link_states gazebo_msgs/LinkStates 334136
203 /gazebo/link_states gazebo_msgs/LinkStates 335232
203 /odom nav_msgs/Odometry 336328
Используйте select для ограничения выбора сообщений. select функция работает на bag объект.
Список сообщений можно фильтровать по времени, названию темы, типу сообщения или любой комбинации этих трех параметров.
Чтобы выбрать все сообщения, опубликованные в /odom раздел, используйте следующее select команда:
bagselect1 = select(bag, 'Topic', '/odom')
bagselect1 =
BagSelection with properties:
FilePath: '/tmp/BR2021ad_1684407_61364/mlx_to_docbook6/tp6773ed82/ros-ex71482057/ex_multiple_topics.bag'
StartTime: 201.3400
EndTime: 321.3300
NumMessages: 11998
AvailableTopics: [1x3 table]
AvailableFrames: {0x1 cell}
MessageList: [11998x4 table]
Звонки в select функция возвращает другую BagSelection объект, который может использоваться для дальнейшего выбора или извлечения данных сообщения. Все объекты выбора независимы друг от друга, поэтому их можно удалить из рабочей области после завершения.
Можно сделать другой выбор, объединяющий два критерия. Чтобы получить список сообщений, которые были записаны в течение первых 30 секунд от rosbag и опубликованы на /odom введите следующую команду:
start = bag.StartTime
start = 201.3400
bagselect2 = select(bag, 'Time', [start start + 30], 'Topic', '/odom')
bagselect2 =
BagSelection with properties:
FilePath: '/tmp/BR2021ad_1684407_61364/mlx_to_docbook6/tp6773ed82/ros-ex71482057/ex_multiple_topics.bag'
StartTime: 201.3400
EndTime: 231.3200
NumMessages: 2997
AvailableTopics: [1x3 table]
AvailableFrames: {0x1 cell}
MessageList: [2997x4 table]
Используйте последний выбор, чтобы еще больше сузить временное окно:
bagselect3 = select(bagselect2, 'Time', [205 206])bagselect3 =
BagSelection with properties:
FilePath: '/tmp/BR2021ad_1684407_61364/mlx_to_docbook6/tp6773ed82/ros-ex71482057/ex_multiple_topics.bag'
StartTime: 205.0200
EndTime: 205.9900
NumMessages: 101
AvailableTopics: [1x3 table]
AvailableFrames: {0x1 cell}
MessageList: [101x4 table]
Выбор на этом последнем шаге работал с существующим bagselect2 выделение и возврат нового bagselect3 объект.
Если требуется сохранить набор параметров выбора, сохраните элементы выбора в массиве ячеек, а затем повторно используйте их в качестве входных данных для select функция:
selectOptions = {'Time', [start, start+1; start+5, start+6], 'MessageType', {'sensor_msgs/LaserScan', 'nav_msgs/Odometry'}};
bagselect4 = select(bag, selectOptions{:})bagselect4 =
BagSelection with properties:
FilePath: '/tmp/BR2021ad_1684407_61364/mlx_to_docbook6/tp6773ed82/ros-ex71482057/ex_multiple_topics.bag'
StartTime: 201.3400
EndTime: 207.3300
NumMessages: 209
AvailableTopics: [2x3 table]
AvailableFrames: {0x1 cell}
MessageList: [209x4 table]
После сужения выбора выходного документа может потребоваться считывание фактических данных выходного документа в MATLAB. В зависимости от выбранного размера, это может занять много времени и потреблять много памяти компьютера.
Для получения сообщений, выбранных как массив ячеек, используйте readMessages функция:
msgs = readMessages(bagselect3); size(msgs)
ans = 1×2
101 1
Результирующий массив ячеек содержит столько элементов, сколько указано в NumMessages свойства объекта выделения.
При чтении данных сообщения можно также использовать более селективный метод и извлекать сообщения только с определенными индексами. Ниже приведен пример получения 4 сообщений:
msgs = readMessages(bagselect3, [1 2 3 7])
msgs=4×1 cell array
{1x1 Odometry}
{1x1 Odometry}
{1x1 Odometry}
{1x1 Odometry}
msgs{2}ans =
ROS Odometry message with properties:
MessageType: 'nav_msgs/Odometry'
Header: [1x1 Header]
Pose: [1x1 PoseWithCovariance]
Twist: [1x1 TwistWithCovariance]
ChildFrameId: 'base_footprint'
Use showdetails to show the contents of the message
Каждое сообщение в массиве ячеек является стандартным объектом сообщения MATLAB ROS. Дополнительные сведения о сообщениях см. в примере Работа с базовыми сообщениями ROS.
Иногда вас интересуют не все сообщения, а только определенные свойства, общие для всех сообщений в выборке. В этом случае полезно получить данные сообщения в виде временного ряда. Временной ряд - это вектор данных, который дискретизируется во времени и представляет эволюцию во времени одного или нескольких динамических свойств. Для получения дополнительной информации о поддержке временных рядов MATLAB см. документацию для Временной ряд.
В случае сообщений ROS в rosbag временной ряд может помочь выразить изменение конкретных элементов сообщения во времени. Вы можете извлечь эту информацию через timeseries функция. Это эффективно для памяти, так как полные сообщения не должны храниться в памяти.
Использовать тот же выбор, но использовать timeseries функция для извлечения свойств только для угловой скорости по оси X и оси Z:
ts = timeseries(bagselect3, 'Pose.Pose.Position.X', 'Twist.Twist.Angular.Z')
timeseries
Timeseries contains duplicate times.
Common Properties:
Name: '/odom Properties'
Time: [101x1 double]
TimeInfo: tsdata.timemetadata
Data: [101x2 double]
DataInfo: tsdata.datametadata
Возврат этого вызова является timeseries объект, который может использоваться для дальнейшего анализа или обработки.
Следует отметить, что этот метод извлечения данных поддерживается только в том случае, если текущий выбор содержит одну тему с одним типом сообщения.
Для просмотра данных, содержащихся в временных рядах, вызовите Data свойство:
ts.Data
ans = 101×2
0.0003 0.0003
0.0003 0.0003
0.0003 -0.0006
0.0003 -0.0006
0.0003 -0.0010
0.0003 -0.0010
0.0003 -0.0003
0.0003 -0.0003
0.0003 -0.0003
0.0003 -0.0003
⋮
Существует много других возможных способов работы с данными временных рядов. Вычислите среднее значение столбцов данных:
mean(ts)
ans = 1×2
10-3 ×
0.3213 -0.4616
Можно также построить график данных временного ряда:
figure
plot(ts, 'LineWidth', 3)