rosbag
日志一个rosbag或bag是ROS中用于存储消息数据的文件格式。这些包通常是通过订阅一个或多个ROS主题创建的,并将接收到的消息数据存储在一个有效的文件结构中。MATLAB®可以读取这些rosbag文件,并帮助过滤和提取消息数据。看到ROS日志文件(rosbags),以获取更多关于MATLAB中支持rosbag的信息。万博1manbetx
在本例中,您将加载一个rosbag,并学习如何选择和检索所包含的消息。
先决条件:使用基本的ROS消息
rosbag
使用。加载示例文件rosbag
命令。
袋= rosbag (“ex_multiple_topics.bag”)
/tmp/Bdoc21b_1757077_5950/tp4a369ca5/ os-ex71482057/ex_multiple_topics. /tmp/Bdoc21b_1757077_5950/袋' StartTime: 201.3400 EndTime: 321.3400 NumMessages: 36963 AvailableTopics: [4x3 table] AvailableFrames: {0x1 cell} MessageList: [36963x4 table]
对象返回的对象rosbag
电话是一个BagSelection
对象,它表示rosbag中的所有消息。
对象显示显示文件中包含多少消息的详细信息(NumMessages
)和第一次(开始时间
),最后(EndTime
)信息被记录下来。
评估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内存之前,您可能希望根据这个索引尽可能地筛选和缩小消息的选择范围。
在检索任何消息数据之前,必须根据时间戳、主题名称和消息类型等条件选择一组消息。
您可以检查当前选择中的所有消息:
袋里。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 /时钟/奥多姆nav_msgs /测程法12112 201.35 12876 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 /时钟201.38 14790 201.38 /时钟rosgraph_msgs /时钟16704 /露台/ link_statesgazebo_msgs/LinkStates 16758 201.38 /odom nav_msgs/Odometry 17854 201.39 /gazebo/link_states gazebo_msgs/LinkStates 18672⋮
的MessageList
表为包中的每个消息包含一行(在本例中,包有超过30,000行)。行按第一列中的时间戳排序,这表示记录消息的时间(以秒为单位)。
由于列表非常大,您还可以使用熟悉的行和列选择语法显示行选择:
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/Odometry 336328
使用选择
函数以缩小消息的选择范围。的选择
函数作用于袋
对象。
您可以按时间、主题名称、消息类型或三者的任意组合来筛选消息列表。
选择在。上发布的所有消息/奥多姆
主题,使用下面的选择
命令:
bagselect1 =选择(包,“主题”,“/”奥多姆)
bagselect1 = BagSelection with properties: FilePath: '/tmp/Bdoc21b_1757077_5950/tp4a369ca5/ os-ex71482057/ex_multiple_topics. /tmp/Bdoc21b_1757077_5950/袋' StartTime: 201.3400 EndTime: 321.3300 NumMessages: 11998 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [11998x4 table]
调用选择
函数返回一个BagSelection
对象,该对象可用于进行进一步选择或检索消息数据。所有的选择对象都是相互独立的,所以您可以在完成之后将它们从工作区中清除。
您可以结合两个条件进行不同的选择。获取在rosbag的前30秒内记录并发布在/奥多姆
Topic,输入以下命令:
开始=包。开始时间
开始= 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 with properties: FilePath: '/tmp/Bdoc21b_1757077_5950/tp4a369ca5/ os-ex71482057/ex_multiple_topics. /tmp/Bdoc21b_1757077_5950/袋' 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 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
属性。
在读取消息数据时,还可以更有选择性,只在特定的索引中检索消息。下面是一个检索消息的例子:
msgs = readMessages(bagselect3,[1 2 3 7],),“DataFormat”,“结构”)
公司=4×1单元阵列{1x1 struct} {1x1 struct} {1x1 struct}
公司{2}
ans =结构体字段:message: 'nav_msgs/Odometry' Header: [1x1 struct] ChildFrameId: 'base_footprint' Pose: [1x1 struct] Twist: [1x1 struct]
单元阵列中的每个消息都是一个标准的MATLAB ROS消息结构。有关消息的更多信息,请参见使用基本的ROS消息的例子。
有时,您对完整的消息不感兴趣,而只对选择中的所有消息共有的特定属性感兴趣。在这种情况下,将消息数据作为时间序列检索会很有帮助。时间序列是随时间采样的数据向量,表示一个或多个动态属性的时间演化。有关MATLAB时间序列支持的更多信息,请参阅文档万博1manbetx时间序列.
在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
可用于进一步分析或处理的对象。
请注意,只有当当前选择包含带有单个消息类型的单个主题时,才支持这种提取数据的方法。万博1manbetx
要查看包含在时间序列中的数据,请访问数据
属性:
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)