rosbag
Файлы журналаrosbag или сумка являются форматом файла в ROS для того, чтобы хранить данные о сообщении. Эти сумки часто создаются, подписываясь на одну или несколько тем ROS и храня полученные данные о сообщении в эффективной файловой структуре. MATLAB® может считать эти rosbag файлы и справку с фильтрацией и извлечением данных о сообщении. Смотрите Файлы журнала ROS (rosbags) для получения дополнительной информации о поддержке rosbag в MATLAB.
В этом примере вы загрузите rosbag и изучите, как выбрать и получить содержавшие сообщения.
Предпосылки: работа с основными сообщениями ROS
rosbag
Загрузите файл в качестве примера с помощью rosbag
команда.
bag = rosbag('ex_multiple_topics.bag')
bag = BagSelection with properties: FilePath: '/tmp/BR2020ad_1302590_239645/mlx_to_docbook4/tp43413096/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. Таблица хранит количество сообщений, типа сообщения и определения сообщения для темы. Для получения дополнительной информации о типе данных table MATLAB и какие операции можно выполнить на нем, см. документацию для Таблицы (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
таблица содержит одну строку для каждого сообщения в сумке (существует более чем 30 000 строк для сумки в этом примере). Строки сортируются по метке времени в первом столбце, который представляет время (в секундах), что сообщение было зарегистрировано.
Поскольку список является очень большим, можно также отобразить выбор строк со знакомым синтаксисом выбора строки и столбца:
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/BR2020ad_1302590_239645/mlx_to_docbook4/tp43413096/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/BR2020ad_1302590_239645/mlx_to_docbook4/tp43413096/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/BR2020ad_1302590_239645/mlx_to_docbook4/tp43413096/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/BR2020ad_1302590_239645/mlx_to_docbook4/tp43413096/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] ChildFrameId: 'base_footprint' Pose: [1x1 PoseWithCovariance] Twist: [1x1 TwistWithCovariance] Use showdetails to show the contents of the message
Каждым сообщением в массиве ячеек является стандартный MATLAB объект сообщения ROS. Для получения дополнительной информации о сообщениях смотрите работу с Основным примером сообщений ROS.
Иногда вы не интересуетесь полными сообщениями, но только определенными свойствами, которые характерны для всех сообщений в выборе. В этом случае полезно получить данные о сообщении как временные ряды вместо этого. Временные ряды являются вектором данных, который производится в зависимости от времени и представляет эволюцию времени одного или нескольких динамических свойств. Для получения дополнительной информации о поддержке временных рядов MATLAB см. документацию для Временные ряды (MATLAB).
В случае сообщений ROS в rosbag временные ряды могут помочь выразить изменение в конкретных элементах сообщения в течение времени. Можно извлечь эту информацию через timeseries
функция. Это эффективно памятью, поскольку полные сообщения не должны храниться в памяти.
Используйте тот же выбор, но используйте timeseries
функционируйте, чтобы только извлечь свойства для скорости вращения оси z и x-position:
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
Возврат этого вызова является a 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)