主要内容

一起工作rosbag日志

一个rosbag或袋是ROS的文件格式来存储消息数据。这些包通常是由订阅一个或多个ROS的话题,并将接收到的消息数据存储在一个有效的文件结构。MATLAB®可以阅读这些rosbag文件和帮助筛选和提取消息数据。看到ROS日志文件(rosbags)更多信息在MATLAB rosbag支持。金宝app

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

先决条件:处理基本的ROS消息

加载一个rosbag

加载一个例子文件使用rosbag命令。

袋= rosbag (“ex_multiple_topics.bag”)
袋= BagSelection属性:FilePath:“/ tmp / Bdoc21b_1757077_5950 / tp4a369ca5 ros-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 MessageType MessageDefinition ___________ ______________________ ________________________________ /时钟12001 rosgraph_msgs /时钟{0 x0 char} /露台/ link_states 11999 gazebo_msgs / LinkStates {geometry_msgs /体式[]…'}/奥多姆11998 nav_msgs /测程法{uint32 Seq……'}/scan 965 sensor_msgs/LaserScan {' uint32 Seq...' }

AvailableTopics表包含主题的排序列表中包含rosbag。表存储的消息数量、消息类型和消息定义的主题。关于MATLAB的更多信息表数据类型和操作可以执行什么,看到的文档

最初由MATLAB rosbag只索引,没有实际消息读取数据。

您可能想要过滤和狭窄的信息尽可能的选择基于此索引任何消息之前加载到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 12930 201.36 /奥多姆nav_msgs /测程法14026 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表包含一行的每条消息包(有超过30000行袋在这个例子)。行按时间戳排序在第一列,代表的时间(以秒为单位),消息记录。

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

bag.MessageList (500:505:)
ans =6×4表时间主题MessageType 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 / LinkStates 335232 203 /奥多姆nav_msgs /测程法336328年

使用选择函数来缩小选择的消息。的选择函数作用于对象。

你可以过滤消息列表的时间,主题名称、消息类型,或任何组合的三个。

选择发布的所有消息/奥多姆话题,使用以下选择命令:

bagselect1 =选择(包,“主题”,“/”奥多姆)
bagselect1 = BagSelection属性:FilePath:“/ tmp / Bdoc21b_1757077_5950 / tp4a369ca5 ros-ex71482057 / ex_multiple_topics。袋' StartTime: 201.3400 EndTime: 321.3300 NumMessages: 11998 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [11998x4 table]

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

你可以做出不同的选择,结合了两种标准。得到消息的列表中记录的第一个30秒rosbag和发表/奥多姆话题,输入以下命令:

开始= bag.StartTime
开始= 201.3400
bagselect2 =选择(包,“时间”(开始开始+ 30),“主题”,“/”奥多姆)
bagselect2 = BagSelection属性:FilePath:“/ tmp / Bdoc21b_1757077_5950 / tp4a369ca5 ros-ex71482057 / ex_multiple_topics。袋' StartTime: 201.3400 EndTime: 231.3200 NumMessages: 2997 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [2997x4 table]

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

bagselect3 =选择(bagselect2,“时间”206年[205])
bagselect3 = BagSelection属性:FilePath:“/ tmp / Bdoc21b_1757077_5950 / tp4a369ca5 ros-ex71482057 / ex_multiple_topics。袋' StartTime: 205.0200 EndTime: 205.9900 NumMessages: 101 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [101x4 table]

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

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

selectOptions = {“时间”开始,开始+ 1;开始+ 5 + 6)开始,“MessageType”,(“sensor_msgs /提升”,“nav_msgs /测程法”]};bagselect4 =选择(袋、selectOptions {:})
bagselect4 = BagSelection属性:FilePath:“/ tmp / Bdoc21b_1757077_5950 / tp4a369ca5 ros-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选择对象的属性。

在阅读消息数据,你也可以更有选择性,只有在特定的索引检索消息。下面是一个示例检索4的消息:

公司= readMessages (bagselect3 [1 2 3 7],“DataFormat”,“结构”)
公司=4×1单元阵列{1 x1 struct} {1 x1 struct} {1 x1 struct} {1 x1 struct}
公司{2}
ans =结构体字段:MessageType:“nav_msgs /测程法”标题:[1 x1 struct] ChildFrameId: base_footprint的姿势:[1 x1 struct]: [1 x1 struct]

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

提取消息数据时间序列

有时你完整的信息不感兴趣,但只有在特定的属性,是常见的所有消息的选择。在这种情况下,它有助于检索消息数据的时间序列。时间序列是一个数据向量采样时间和代表一个或多个的时间演化动态属性。在MATLAB时间序列支持的更多信息,见文档金宝app时间序列

rosbag内ROS的消息,一个时间序列可以帮助表达特定的消息元素的变化。你可以通过提取这些信息timeseries函数。这是节约内存,因为没有完整的消息存储在内存中。

使用相同的选择,但使用timeseries函数只提取属性的坐标和z轴角速度:

ts = timeseries (bagselect3,“Pose.Pose.Position.X”,“Twist.Twist.Angular.Z”)
timeseries timeseries包含重复的时代。共同的属性:名称:“/奥多姆属性”:把TimeInfo设为[101 x1双]:tsdata。timemetadata数据:[101 x2双]DataInfo: tsdata.datametadata

这个调用是一个的回归timeseries对象,可以用于进一步分析或处理。

注意,这种方法提取数据仅支持如果当前选择包含一个主题,一个消息类型。金宝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×2103×0.3213 - -0.4616

你也可以画出时间序列的数据:

图绘制(ts,“线宽”3)

图包含一个坐标轴对象。坐标轴对象与时间序列图标题:/奥多姆属性包含2线类型的对象。