主要内容

一起工作rosbag日志

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

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

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

加载一个rosbag

方法加载示例文件rosbag命令。

袋子= rosbag(“ex_multiple_topics.bag”
FilePath: '/tmp/Bdoc22b_2054784_2445215/tp93f2a89c/ros-ex71482057/ex_multiple_topics. bag = BagSelection with properties: FilePath: '/tmp/Bdoc22b_2054784_2445215/tp93f2a89c/ros-ex71482057袋' 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 /时钟的时间时钟……'} / gazebo_msgs/LinkStates 11999 gazebo_msgs/LinkStates {'char[]名称…'} /odom 11998 nav_msgs/Odometry {'std_msgs/Header Header…'} /scan 965 sensor_msgs/LaserScan {'std_msgs/Header Header…'}

AvailableTopics表包含了rosbag中包含的主题的排序列表。该表存储消息数量、消息类型和主题的消息定义。有关MATLAB表数据类型以及可以对其执行哪些操作的更多信息,请参阅相关文档

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

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

选择消息

在检索任何消息数据之前,必须根据时间戳、主题名称和消息类型等标准选择一组消息。

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

袋里。MessageList
ans =36963×4表时间主题消息类型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 / gazestates gazebo_msgs/LinkStates 16758 201.38 /odom nav_msgs/Odometry 17854 201.39 / gazeobo /LinkStates gazebo_msgs/LinkStates 18672

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

由于列表非常大,您还可以使用熟悉的行和列选择语法显示一行的选择:

bag.MessageList (500:505:)
ans =6×4表时间主题MessageType FileOffset ____ ___________________ ______________________ __________ 203 /clock rosgraph_msgs/ clock 339384 203 /gazebo/link_states gazebo_msgs/LinkStates 333040 203 /gazebo/link_states gazebo_msgs/LinkStates 334136 203 /gazebo/ LinkStates gazebo_msgs/LinkStates 335232 203 /odom nav_msgs/Odometry 336328

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

您可以按时间、主题名称、消息类型或三者的任意组合筛选消息列表。

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

Bagselect1 = select(包,“主题”“/”奥多姆
bagselect1 = BagSelection with properties: FilePath: '/tmp/Bdoc22b_2054784_2445215/tp93f2a89c/ros-ex71482057/ex_multiple_topics。袋' StartTime: 201.3400 EndTime: 321.3300 NumMessages: 11998 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [11998x4 table]

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

您可以结合两个标准进行不同的选择。获取在rosbag的前30秒内记录并发布到/奥多姆主题,输入以下命令:

开始=包。开始时间
Start = 201.3400
Bagselect2 = select(包,“时间”,[start start + 30],“主题”“/”奥多姆
bagselect2 = BagSelection with properties: FilePath: '/tmp/Bdoc22b_2054784_2445215/tp93f2a89c/ros-ex71482057/ex_multiple_topics。袋' StartTime: 201.3400 EndTime: 231.3200 NumMessages: 2997 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [2997x4 table]

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

bagselect2 = select(bagselect2,“时间”206年[205])
bagselect3 = BagSelection with properties: FilePath: '/tmp/Bdoc22b_2054784_2445215/tp93f2a89c/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 = select(包,selectOptions{:})
bagselect4 = BagSelection with properties: FilePath: '/tmp/Bdoc22b_2054784_2445215/tp93f2a89c/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功能:

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

单元格数组中包含的元素数量与NumMessages属性。

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

msgs = readMessages(bagselect3,[1 2 3 7],“DataFormat”“结构”
公司=4×1单元格数组{1x1 struct} {1x1 struct} {1x1 struct}
公司{2}
ans =带字段的结构:MessageType: 'nav_msgs/Odometry'头:[1x1 struct] ChildFrameId: 'base_footprint'姿势:[1x1 struct]扭转:[1x1 struct]

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

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

有时,您对完整的消息不感兴趣,而只对选定的所有消息所共有的特定属性感兴趣。在这种情况下,以时间序列的形式检索消息数据是有帮助的。时间序列是随时间采样的数据向量,表示一个或多个动态属性的时间演变。有关MATLAB时间序列支持的更多信息,请参阅的文档万博1manbetx时间序列

对于rosbag中的ROS消息,时间序列可以帮助表示特定消息元素随时间的变化。方法提取此信息timeseries函数。这是内存效率高的,因为完整的消息不必存储在内存中。

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

Ts =时间序列(bagselect3,“Pose.Pose.Position.X”“Twist.Twist.Angular.Z”
timeseries timeseries包含重复的时间。Common Properties: Name: '/odom Properties' Time: [101x1 double] TimeInfo: tsdata。timemetadata Data: [101x2 double] DataInfo: tsdata.datametadata

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

请注意,这种提取数据的方法仅在当前选择包含具有单一消息类型的单个主题时才受支持。万博1manbetx

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

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)

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