readMessages

Считайте сообщения из rosbag

Описание

пример

msgs = readMessages(bag) возвращает данные из всех сообщений в BagSelection или rosbagreader объект bag. Сообщения возвращены в массиве ячеек сообщений. Получить BagSelection объект, использовать rosbag.

пример

msgs = readMessages(bag,rows) возвращает данные из сообщений в строках, заданных rows. Область значений строк [1, bag.NumMessages].

пример

msgs = readMessages(___,"DataFormat",Format) возвращает данные как массив ячеек структур или массив ячеек объектов сообщения с помощью любого набора предыдущих входных параметров. Определение формата как любой "struct" или "object".

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

Примечание

В будущем релизе ROS Toolbox будет использовать структуры сообщения вместо объектов для сообщений ROS.

Чтобы использовать структуры сообщения теперь, установите "DataFormat" аргумент значения имени к "struct". Для получения дополнительной информации смотрите, что ROS передает Структуры.

Примеры

свернуть все

Считайте rosbag и фильтр по теме и время.

bagselect = rosbag('ex_multiple_topics.bag');
bagselect2 = select(bagselect,'Time',...
[bagselect.StartTime bagselect.StartTime + 1],'Topic','/odom');

Возвратите все сообщения как массив ячеек.

allMsgs = readMessages(bagselect2);

Возвратите первые десять сообщений как массив ячеек.

firstMsgs = readMessages(bagselect2,1:10);

Загрузите rosbag.

bag = rosbag('ros_turtlesim.bag');

Выберите определенную тему.

bSel = select(bag,'Topic','/turtle1/pose');

Считайте сообщения как структуру. Задайте DataFormat пара "имя-значение" при чтении сообщений. Смотрите первую структуру в возвращенном массиве ячеек структур.

msgStructs = readMessages(bSel,'DataFormat','struct');
msgStructs{1}
ans = struct with fields:
        MessageType: 'turtlesim/Pose'
                  X: 5.5016
                  Y: 6.3965
              Theta: 4.5377
     LinearVelocity: 1
    AngularVelocity: 0

Извлеките точки xy из сообщений и постройте траекторию робота.

Используйте cellfun извлекать весь X и Y поля от структуры. Эти поля представляют xy положения робота во время записи rosbag.

xPoints = cellfun(@(m) double(m.X),msgStructs);
yPoints = cellfun(@(m) double(m.Y),msgStructs);
plot(xPoints,yPoints)

Figure contains an axes object. The axes object contains an object of type line.

Загрузите rosbag файл журнала и проанализируйте определенные сообщения на основе выбранных критериев.

Создайте rosbagreader объект всех сообщений в rosbag файле журнала.

bagMsgs = rosbagreader("ros_multi_topics.bag")
bagMsgs = 
  rosbagreader with properties:

           FilePath: '/mathworks/devel/bat/BR2021bd/build/matlab/toolbox/robotics/robotexamples/ros/data/bags/ros_multi_topics.bag'
          StartTime: 201.3400
            EndTime: 321.3400
        NumMessages: 36963
    AvailableTopics: [4x3 table]
    AvailableFrames: {0x1 cell}
        MessageList: [36963x4 table]

Выберите подмножество сообщений на основе их метки времени и темы.

bagMsgs2 = select(bagMsgs,...
    Time=[bagMsgs.StartTime bagMsgs.StartTime + 1],...
    Topic='/odom')
bagMsgs2 = 
  rosbagreader with properties:

           FilePath: '/mathworks/devel/bat/BR2021bd/build/matlab/toolbox/robotics/robotexamples/ros/data/bags/ros_multi_topics.bag'
          StartTime: 201.3400
            EndTime: 202.3200
        NumMessages: 99
    AvailableTopics: [1x3 table]
    AvailableFrames: {0x1 cell}
        MessageList: [99x4 table]

Получите сообщения в выборе как массив ячеек.

msgs = readMessages(bagMsgs2)
msgs=99×1 cell array
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
      ⋮

Возвратите определенные свойства сообщения как временные ряды.

ts = timeseries(bagMsgs2,...
    'Pose.Pose.Position.X', ...
    'Twist.Twist.Angular.Y')
  timeseries

  Timeseries contains duplicate times.

  Common Properties:
            Name: '/odom Properties'
            Time: [99x1 double]
        TimeInfo: tsdata.timemetadata
            Data: [99x2 double]
        DataInfo: tsdata.datametadata

Входные параметры

свернуть все

Индекс сообщений в rosbag в виде BagSelection или rosbagreader объект.

Строки BagSelection или rosbagreader объект в виде n - вектор элемента, где n является количеством строк, чтобы получить сообщения из. Каждая запись в векторе соответствует пронумерованному сообщению в сумке. Область значений строк [1, bag.NumMessage].

Выходные аргументы

свернуть все

Данные о сообщении ROS, возвращенные как объект, массив ячеек объектов сообщения или массив ячеек структур. Данные прибывают от любого BagSelection объект создал использование rosbag или rosbagreader объект.

Необходимо задать "DataFormat","struct" в функции, чтобы получить сообщения как массив ячеек структур. Используя структуры может быть значительно быстрее, чем использование объектов сообщения, и пользовательские данные о сообщении могут быть считаны непосредственно, не загружая использование определений сообщения rosgenmsg.

Вопросы совместимости

развернуть все

Изменение поведения в будущем релизе

Смотрите также

| | |

Введенный в R2019b