exponenta event banner

Работа с rosbag Logfiles

Rosbag или bag - формат файла в ROS для хранения данных сообщения. Эти пакеты часто создаются путем подписки на один или более разделов ROS и сохранения принятых данных сообщения в эффективной файловой структуре. MATLAB ® может считывать эти файлы rosbag и помогать с фильтрацией и извлечением данных сообщений. Дополнительные сведения о поддержке rosbag в MATLAB см. в разделе Файлы журнала ROS (rosbags).

В этом примере вы загрузите росбаг и узнаете, как выбрать и извлечь содержащиеся сообщения.

Предпосылки: Работа с основными сообщениями ROS

Загрузить a 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)

Figure contains an axes. The axes with title Time Series Plot:/odom Properties contains 2 objects of type line.