Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Trabajar con logfilesrosbag

A o bag es un formato de archivo en ROS para almacenar datos de mensajes.rosbag Estas bolsas se crean a menudo mediante la suscripción a uno o más temas de ROS, y el almacenamiento de los datos de mensajes recibidos en una estructura de archivos eficiente. MATLAB® puede leer estos archivos de rosbag y ayudar con el filtrado y la extracción de datos de mensajes. Consulte para obtener más información sobre el soporte de rosbag en MATLAB.

En este ejemplo, cargará un rosbag y aprenderá a seleccionar y recuperar los mensajes contenidos.

Requisitos previos:Trabajar con Basic ROS mensajes

Cargue unrosbag

Cargue un archivo de ejemplo con el comando.rosbag

bag = rosbag('ex_multiple_topics.bag')
bag =    BagSelection with properties:             FilePath: '/tmp/Bdoc19a_1063752_83125/tp7ef839b5/robotics-ex73200760/ex_multiple_topics.bag'           StartTime: 201.3400             EndTime: 321.3400         NumMessages: 36963     AvailableTopics: [4x3 table]     AvailableFrames: {0x1 cell}         MessageList: [36963x4 table]  

El objeto devuelto por la llamada es un objeto, que es una representación de todos los mensajes en el rosbag.rosbagBagSelection

La visualización del objeto muestra los detalles sobre cuántos mensajes están contenidos en el archivo () y la hora en que se registraron el primer () y el último () mensaje.NumMessagesStartTimeEndTime

Evalúe la propiedad para ver más información sobre los temas y tipos de mensaje que se registran en la bolsa:AvailableTopics

bag.AvailableTopics
ans=4×3 table
                           NumMessages         MessageType                MessageDefinition       
                           ___________    ______________________    ______________________________

    /clock                    12001       rosgraph_msgs/Clock       ''                            
    /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...'             

La tabla contiene la lista ordenada de temas que se incluyen en el rosbag.AvailableTopics La tabla almacena el número de mensajes, el tipo de mensaje y la definición de mensaje para el tema. Para obtener más información sobre el tipo de datos de tabla de MATLAB y las operaciones que puede realizar en él, consulte la documentación.Tablas (MATLAB)

Inicialmente, el rosbag solo está indexado por MATLAB y no se leen datos de mensajes reales.

Es posible que desee filtrar y restringir la selección de mensajes tanto como sea posible en función de este índice antes de que se carguen los mensajes en la memoria de MATLAB.

Seleccione mensajes

Antes de recuperar cualquier dato de mensaje, debe seleccionar un conjunto de mensajes basados en criterios como la marca de tiempo, el nombre del tema y el tipo de mensaje.

Puede examinar todos los mensajes de la selección actual:

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   
      ⋮

La tabla contiene una fila por cada mensaje en la bolsa (hay más de 30.000 filas para la bolsa en este ejemplo).MessageList Las filas se ordenan por la marca de tiempo de la primera columna que representa el tiempo (en segundos) cuando se grabó este mensaje.

Dado que la lista es muy grande, también puede mostrar una selección de filas con la sintaxis de selección de fila y columna familiar:

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  

Utilice la función para delimitar la selección de mensajes. La función funciona en el objeto.bag

Puede filtrar la lista de mensajes por hora, nombre del tema, tipo de mensaje o cualquier combinación de los tres.

Para seleccionar todos los mensajes que se publicaron en el tema, utilice el siguiente comando:/odom

bagselect1 = select(bag, 'Topic', '/odom')
bagselect1 =    BagSelection with properties:             FilePath: '/tmp/Bdoc19a_1063752_83125/tp7ef839b5/robotics-ex73200760/ex_multiple_topics.bag'           StartTime: 201.3400             EndTime: 321.3300         NumMessages: 11998     AvailableTopics: [1x3 table]     AvailableFrames: {0x1 cell}         MessageList: [11998x4 table]  

Las llamadas a la función devuelven otro objeto, que se puede usar para realizar más selecciones o recuperar datos de mensajes.BagSelection Todos los objetos de selección son independientes entre sí, por lo que puede eliminarlos del espacio de trabajo una vez que haya terminado.

Puede hacer una selección diferente que combine dos criterios. Para obtener la lista de mensajes que se registraron en los primeros 30 segundos del rosbag y publicados en el tema, escriba el siguiente comando:/odom

start = bag.StartTime
start = 201.3400 
bagselect2 = select(bag, 'Time', [start start + 30], 'Topic', '/odom')
bagselect2 =    BagSelection with properties:             FilePath: '/tmp/Bdoc19a_1063752_83125/tp7ef839b5/robotics-ex73200760/ex_multiple_topics.bag'           StartTime: 201.3400             EndTime: 231.3200         NumMessages: 2997     AvailableTopics: [1x3 table]     AvailableFrames: {0x1 cell}         MessageList: [2997x4 table]  

Utilice la última selección para reducir aún más la ventana de tiempo:

bagselect3 = select(bagselect2, 'Time', [205 206])
bagselect3 =    BagSelection with properties:             FilePath: '/tmp/Bdoc19a_1063752_83125/tp7ef839b5/robotics-ex73200760/ex_multiple_topics.bag'           StartTime: 205.0200             EndTime: 205.9900         NumMessages: 101     AvailableTopics: [1x3 table]     AvailableFrames: {0x1 cell}         MessageList: [101x4 table]  

La selección en este último paso operó en la selección existente y devolvió un nuevo objeto.bagselect2bagselect3

Si desea guardar un conjunto de opciones de selección, almacene los elementos de selección en una matriz de celdas y, a continuación, vuelva a utilizarlo más adelante como entrada para la función:

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/Bdoc19a_1063752_83125/tp7ef839b5/robotics-ex73200760/ex_multiple_topics.bag'           StartTime: 201.3400             EndTime: 207.3300         NumMessages: 209     AvailableTopics: [2x3 table]     AvailableFrames: {0x1 cell}         MessageList: [209x4 table]  

Leer datos de mensaje seleccionados

Después de restringir la selección de mensajes, es posible que desee leer los datos reales del mensaje en MATLAB. Dependiendo del tamaño de su selección, esto puede tomar mucho tiempo y consumir una gran cantidad de la memoria de su computadora.

Para recuperar los mensajes en la selección como una matriz de celdas, utilice la función:readMessages

msgs = readMessages(bagselect3); size(msgs)
ans = 1×2

   101     1

La matriz de celdas resultante contiene tantos elementos como se indica en la propiedad del objeto de selección.NumMessages

En la lectura de los datos del mensaje, también puede ser más selectivo y solo recuperar mensajes en índices específicos. Aquí está un ejemplo de recuperar 4 mensajes:

msgs = readMessages(bagselect3, [1 2 3 7])
msgs = 4x1 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  

Cada mensaje de la matriz de celdas es un objeto de mensaje de MATLAB ROS estándar. Para obtener más información sobre los mensajes, consulte el ejemplo.Trabajar con Basic ROS mensajes

Extraer datos de mensaje como series de tiempo

A veces no está interesado en los mensajes completos, pero sólo en propiedades específicas que son comunes a todos los mensajes en una selección. En este caso, es útil recuperar los datos del mensaje como una serie de tiempo en su lugar. Una serie temporal es un vector de datos que se muestrea con el tiempo y representa la evolución del tiempo de una o más propiedades dinámicas. Para obtener más información sobre el soporte de serie temporal de MATLAB, consulte la documentación.Series temporales (MATLAB)

En el caso de los mensajes ROS dentro de un rosbag, una serie de tiempo puede ayudar a expresar el cambio en los elementos de mensaje en particular a través del tiempo. Puede extraer esta información a través de la función. Esto es eficiente en memoria, ya que los mensajes completos no tienen que almacenarse en la memoria.

Utilice la misma selección, pero utilice la función para extraer sólo las propiedades para la posición x y la velocidad angular del eje 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 

La devolución de esta llamada es un objeto que se puede utilizar para su posterior análisis o procesamiento.timeseries

Tenga en cuenta que este método de extracción de datos solo se admite si la selección actual contiene un solo tema con un solo tipo de mensaje.

Para ver los datos contenidos en la serie temporal, acceda a la propiedad: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
      ⋮

Hay muchas otras formas posibles de trabajar con los datos de series de tiempo. Calcule la media de las columnas de datos:

mean(ts)
ans = 1×2
10-3 ×

    0.3213   -0.4616

También puede trazar los datos de la serie temporal:

figure plot(ts, 'LineWidth', 3)