有工作rosbag日志文件

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

在本例中,您将加载一个rosbag,并学习如何选择和检索包含的消息。

先决条件:与基本ROS信息工作

负载rosbag

使用负载的示例文件rosbag命令。

袋= rosbag('ex_multiple_topics.bag'
bag = BagSelection with properties: FilePath: '/tmp/Bdoc20a_1326390_189878/tpbf9c0fc7/ los -ex71482057/ex_multiple_topics。袋' StartTime: 201.3400 EndTime: 321.3400 NumMessages: 36963 AvailableTopics: [4x3 table] AvailableFrames: {0x1 cell} MessageList: [36963x4 table]

方法返回的对象rosbag电话是一个BagSelection对象,它是rosbag中所有消息的表示形式。

大约有多少邮件文件中包含的对象屏幕显示的细节(NumMessages)和时间当所述第一(开始时间)和最后(EndTime)消息的记录。

评估AvailableTopics属性可查看有关包中记录的主题和消息类型的更多信息:

bag.AvailableTopics
ans =4×3表NumMessages消息类型MessageDefinition ___________ ______________________ ________________________________ /时钟12001个rosgraph_msgs /时钟{为0x0炭} /凉亭/ link_states 11999个gazebo_msgs / LinkStates { 'geometry_msgs /姿态[]姿态...'} /奥多姆11998个nav_msgs /里程计{” UINT32 SEQ ...'} /扫描965 sensor_msgs /激光扫描{' UINT32序列...”}

AvailableTopics表包含包含在rosbag主题的排序列表。该表存储的消息数,消息类型,以及用于该主题的消息定义。有关MATLAB表数据类型和什么样的操作,你可以在其上执行的更多信息,请参阅文档(MATLAB)。

最初rosbag仅由MATLAB索引,并没有实际的消息数据被读取。

在将任何消息加载到MATLAB内存之前,您可能希望根据此索引尽可能筛选和缩小消息的选择范围。

选择信息

您检索到任何消息数据之前,您必须选择基于标准,如时间戳,主题名称和消息类型的一组消息。

您可以检查当前选择的所有消息:

bag.MessageList
ans =36963×4表时间主题MessageType 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 /奥多姆nav_msgs /测程法14026 201.36 12930 201.37奥多姆nav_msgs /测程法14844 201.37 /露台/ link_states gazebo_msgs / LinkStates 15608 201.37 /时钟rosgraph_msgs /时钟14790 201.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 with properties: '/tmp/Bdoc20a_1326390_189878/tpbf9c0fc7/ rss -ex71482057/ex_multiple_topics。袋' StartTime: 201.3400 EndTime: 321.3300 NumMessages: 11998 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [11998x4 table]

调用选择函数返回另一个BagSelection对象,它可用于作进一步的选择或检索消息数据。所有的选择对象是相互独立的,所以你可以从工作区清除它们一旦你完成。

您可以结合两个条件做出不同的选择。获取在rosbag发布后30秒内被记录并发布在其上的消息列表/ - 奥多姆话题,输入以下命令:

启动= bag.StartTime
启动= 201.3400
bagselect2 =选择(袋,'时间',[start启动+ 30],“主题”“/奥多姆
bagselect2 = BagSelection与属性:文件路径: '/tmp/Bdoc20a_1326390_189878/tpbf9c0fc7/ros-ex71482057/ex_multiple_topics.bag' 开始时间:201.3400结束时间:231.3200 NumMessages:2997个AvailableTopics:[1×3表] AvailableFrames:{为0x1细胞} MessageList中:[表2997x4]

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

bagselect3 =选择(bagselect2,'时间'[205 206])
bagselect3 = BagSelection与属性:文件路径: '/tmp/Bdoc20a_1326390_189878/tpbf9c0fc7/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],“消息类型”{'sensor_msgs /激光扫描''nav_msgs /里程计'}};bagselect4 =选择(袋,selectOptions {:})
bagselect4 = BagSelection与属性:文件路径: '/tmp/Bdoc20a_1326390_189878/tpbf9c0fc7/ros-ex71482057/ex_multiple_topics.bag' 开始时间:201.3400结束时间:207.3300 NumMessages:209个AvailableTopics:[2×3表] AvailableFrames:{为0x1细胞} MessageList中:[表209x4]

阅读选择的消息数据

当你缩小你的消息选择,你可能想读的实际消息数据到MATLAB。根据您选择的尺寸,这可能需要很长的时间,消耗了大量的计算机内存中。

若要以单元格数组的形式检索所选内容中的消息,请使用readMessages功能:

封邮件= readMessages(bagselect3);大小(消息)
ans =1×2101年1

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

在阅读信息数据,还可以更有选择性,只检索特定指数的消息。以下是检索4个的消息的示例:

封邮件= readMessages(bagselect3,[1 2 3 7])
公司=4×1单元阵列{1x1 Odometry} {1x1 Odometry} {1x1 Odometry} {1x1 Odometry}
封邮件{2}
ANS =具有属性ROS里程计信息:消息类型: 'nav_msgs /里程计' 部首:[1x1的头] ChildFrameId: 'base_footprint' 姿势:[1x1的PoseWithCovariance]扭:[1x1的TwistWithCovariance]使用showdetails来显示消息的内容

在单元阵列中的每个消息是一个标准的MATLAB ROS消息对象。有关消息的详细信息,请参阅与基本ROS信息工作的例子。

将消息数据提取为时间序列

有时,您对完整的消息不感兴趣,而只对选择中的所有消息所共有的特定属性感兴趣。在这种情况下,将消息数据检索为时间序列是很有帮助的。时间序列是一个随时间采样的数据向量,表示一个或多个动态特性的时间演化。有关MATLAB时间序列支持的更多信息,请参阅相关文档金宝app时间序列(MATLAB)。

在一个rosbag内ROS消息的情况下,时间序列可帮助表示通过时间在特定消息元素的变化。您可以提取通过此信息时间序列功能。这是内存效率,因为完整的消息没有被存储在内存中。

使用相同的选择,但使用时间序列函数只提取x轴位置和z轴角速度的属性:

TS =时间序列(bagselect3,'Pose.Pose.Position.X'“Twist.Twist.Angular.Z”
时间序列时间序列包含重复多次。通用属性:名称: '/奥多姆属性' 时间:101x1双] TimeInfo:tsdata.timemetadata数据:101x2双] DataInfo:tsdata.datametadata

此调用的返回是一个时间序列对象,可用于进一步分析或处理。

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

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

ts.Data
ans =101×20.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⋮

使用时间序列数据还有许多其他可能的方法。计算数据列的均值:

意思是(ts)
ans =1×210-3×0.3213 - -0.4616

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

图图(TS,“线宽”3)