Работа с 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/BR2019bd_1276998_130124/mlx_to_docbook4/tpc0c1221a/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.

Выберите Messages

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

Можно исследовать все сообщения в текущем выборе:

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/BR2019bd_1276998_130124/mlx_to_docbook4/tpc0c1221a/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/BR2019bd_1276998_130124/mlx_to_docbook4/tpc0c1221a/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/BR2019bd_1276998_130124/mlx_to_docbook4/tpc0c1221a/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/BR2019bd_1276998_130124/mlx_to_docbook4/tpc0c1221a/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
    {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)