主要内容

一起工作rosbag日志文件

一个rosbag或袋是在ROS的文件格式,用于存储消息数据。这些袋子经常通过订阅一个或多个ROS的主题,并以有效的文件结构中存储所接收的消息数据创建的。MATLAB®可以过滤和提取信息数据读取这些文件rosbag和帮助。看ROS日志文件(rosbags),以获取更多关于MATLAB中支持rosbag的信息。金宝app

在这个例子中,你会加载一个rosbag并学习如何选择和检索所包含的信息。

先决条件:使用基本的ROS消息

加载一个rosbag

使用。加载示例文件rosbag命令。

袋= rosbag (“ex_multiple_topics.bag”
袋= BagSelection与属性:文件路径: '/tmp/Bdoc21b_1757077_5950/tp4a369ca5/ros-ex71482057/ex_multiple_topics.bag' 开始时间:201.3400结束时间:321.3400 NumMessages:36963个AvailableTopics:[4x3的表] AvailableFrames:{为0x1细胞} MessageList中:[表36963x4]

从返回的对象rosbag电话是BagSelection对象,这是在rosbag所有消息的表示。

大约有多少邮件文件中包含的对象屏幕显示的细节(NumMessages)和第一次(开始时间),最后(时间结束)信息被记录下来。

评估AvailableTopics财产看到有关记录在包的主题和消息类型的详细信息:

袋里。一个vailableTopics
ANS =4×3表NumMessages MessageType MessageDefinition  ___________ ______________________ ________________________________ / 钟12001 rosgraph_msgs /时钟{0 x0 char} /露台/ link_states 11999 gazebo_msgs / LinkStates {' geometry_msgs /体式[]…} /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表时间主题消息类型的FileOffset ______ ___________________ ______________________ __________ 201.34 /凉亭/ link_states gazebo_msgs / LinkStates 9866 201.34 /奥多姆nav_msgs /里程计7666 201.34 /时钟rosgraph_msgs /时钟4524 201.35 /时钟rosgraph_msgs /时钟10962 201.35 /时钟rosgraph_msgs /时钟12876 201.35 /奥多姆nav_msgs /里程计12112 201.35 /凉亭/ link_states gazebo_msgs / LinkStates 11016 201.36 /凉亭/ link_states gazebo_msgs / LinkStates 12930 201.36 /奥多姆nav_msgs /测距14026 201.37 /奥多姆nav_msgs /测距14844 201.37 /凉亭/ link_states gazebo_msgs / LinkStates 15608 201.37 /时钟rosgraph_msgs /时钟14790201.38 /时钟rosgraph_msgs /时钟16704 201.38 /凉亭/ link_states gazebo_msgs / LinkStates 16758 201.38 /奥多姆nav_msgs /里程计17854 201.39 /凉亭/ link_states gazebo_msgs / LinkStates 18672⋮

MessageList表为包中的每个消息包含一行(在本例中,包有超过30,000行)。行按第一列中的时间戳排序,这表示记录消息的时间(以秒为单位)。

由于名单是非常大的,你也可以显示选择与熟悉的行和列选择语法行:

bag.MessageList(500:505,:)
ANS =6×4表时间主题消息类型的FileOffset ____ ___________________ ______________________ __________ 203 /时钟rosgraph_msgs /时钟339384 203 /凉亭/ link_states gazebo_msgs / LinkStates 331944 203 /凉亭/ link_states gazebo_msgs / LinkStates 333040 203 /凉亭/ link_states gazebo_msgs / LinkStates 334136 203 /凉亭/ link_states gazebo_msgs / LinkStates335232 203 /奥多姆nav_msgs /里程计336328

使用选择功能缩小消息的选择。的选择功能上的操作目的。

您可以过滤通过时间信息列表中,主题名称,消息类型,或三者的任意组合。

要选择刊登于所有消息/ - 奥多姆主题,请使用以下选择命令:

bagselect1 =选择(包,“话题”“/  - 奥多姆”
bagselect1 = BagSelection与属性:文件路径: '/tmp/Bdoc21b_1757077_5950/tp4a369ca5/ros-ex71482057/ex_multiple_topics.bag' 开始时间:201.3400结束时间:321.3300 NumMessages:11998个AvailableTopics:[1×3表] AvailableFrames:{为0x1细胞} MessageList中:[表11998x4]

呼叫到选择函数返回一个BagSelection对象,该对象可用于进行进一步选择或检索消息数据。所有的选择对象都是相互独立的,所以您可以在完成之后将它们从工作区中清除。

你可以做出不同的选择,结合两个标准。要获取录的rosbag的前30秒内,并发表了消息列表/ - 奥多姆Topic,输入以下命令:

启动= bag.StartTime
启动= 201.3400
bagselect2 =选择(包,“时间”,[start start + 30],“话题”“/  - 奥多姆”
bagselect2 = BagSelection with properties: FilePath: '/tmp/Bdoc21b_1757077_5950/tp4a369ca5/ os-ex71482057/ex_multiple_topics. /tmp/Bdoc21b_1757077_5950/袋' StartTime: 201.3400 EndTime: 231.3200 NumMessages: 2997 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [2997x4 table]

使用最后选择的时间窗口,进一步缩小:

bagselect3 =选择(bagselect2,“时间”206年[205])
bagselect3 = BagSelection与属性:文件路径: '/tmp/Bdoc21b_1757077_5950/tp4a369ca5/ros-ex71482057/ex_multiple_topics.bag' 开始时间:205.0200结束时间:205.9900 NumMessages:101个AvailableTopics:[1×3表] AvailableFrames:{为0x1细胞} MessageList中:[表101x4]

在这最后一步的选择对现有操作bagselect2选择并返回一个新的bagselect3目的。

如果您想要保存一组选择的选项,在存储单元阵列选择元素,然后再使用后,它作为一个输入选择功能:

selectOptions = {“时间”开始,开始+ 1;开始+ 5 + 6)开始,“MessageType”[“sensor_msgs /提升”“nav_msgs /测程法”]};bagselect4 =选择(袋、selectOptions {:})
bagselect4 = BagSelection with properties: FilePath: '/tmp/Bdoc21b_1757077_5950/tp4a369ca5/ os-ex71482057/ex_multiple_topics. '袋' StartTime: 201.3400 EndTime: 207.3300 NumMessages: 209 AvailableTopics: [2x3 table] AvailableFrames: {0x1 cell} MessageList: [209x4 table]

阅读选择的消息数据

当你缩小你的消息选择,你可能想读的实际消息数据到MATLAB。根据您选择的尺寸,这可能需要很长的时间,消耗了大量的计算机内存中。为了提高时间效率,在结构格式rosbag读取消息。

要检索您选择的单元阵列的邮件,使用readMessages功能:

公司= readMessages (bagselect3,“DataFormat”“结构”);大小(公司)
ans =.1×2101 1

将得到的细胞阵列包含的元素中所指示的NumMessages属性。

在读取消息数据时,还可以更有选择性,只在特定的索引中检索消息。下面是一个检索消息的例子:

封邮件= readMessages(bagselect3,[1 2 3 7],“DataFormat”“结构”
封邮件=4×1单元阵列{1x1的结构} {1x1的结构} {1x1的结构} {1x1的结构}
封邮件{2}
ans =.同场的结构:消息类型: 'nav_msgs /里程计' 部首:[1x1的结构] ChildFrameId: 'base_footprint' 姿势:[1x1的结构]扭:[1x1的结构]

单元阵列中的每个消息都是一个标准的MATLAB ROS消息结构。有关消息的更多信息,请参见使用基本的ROS消息例子。

提取信息数据的时间序列

有时候,你是不是在完整的消息感兴趣,但是仅在通用于所有在选择邮件特定的属性。在这种情况下,是有帮助的检索信息数据的时间序列来代替。时间序列是随时间采样,并表示一个或多个动态特性随时间的演变数据向量。有关MATLAB的时间序列支持的更多信息,请参阅文档金宝app时间序列

在rosbag内的ROS消息的情况下,时间序列可以帮助表达特定消息元素随时间的变化。你可以通过timeseries函数。这是内存效率高的,因为完整的消息不必存储在内存中。

使用相同的选择,但是使用timeseries功能只提取x位置的属性和Z轴角速度:

ts = timeseries (bagselect3,“Pose.Pose.Position.X”“Twist.Twist.Angular.Z”
timeseries timeseries包含重复的时间。常用属性:Name: '/odom Properties' Time: [101x1 double] TimeInfo: tsdata. Name: '/odom Properties'timemetdata数据:[101x2 double] DataInfo: tsdata. datametdata . time

这个调用的返回值是atimeseries可用于进一步的分析或处理对象。

需要注意的是,如果当前选择包含一个消息类型单一主题提取数据的方法仅支持。金宝app

要查看包含在时间序列中的数据,访问数据财产:

ts.Data
ans =.101×20.0003 0.0003 0.0003 -0.0006 0.0003 -0.0006 0.0003 -0.0010 0.0003 -0.0003 0.0003 -0.0003 -0.0003 -0.0003 -0.0003⋮

还有许多其他可能的方式与时间序列数据进行工作。计算数据列的平均值:

平均(TS)
ans =.1×210-3×0.3213 -0.4616

你也可以绘制时间序列的数据:

图图(TS,“行宽”,3)

图中包含一个轴对象。标题为Time Series Plot:/odom Properties的轴对象包含两个类型为line的对象。