主要内容

合作Rosbag.日志

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

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

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

加载A.Rosbag.

使用使用的加载示例文件Rosbag.命令。

bag = rosbag(“ex_multiple_topics.bag”
/tmp/Bdoc21a_1622859_210281/tpba7e879f/ os-ex71482057/ex_multiple_topics. /tmp/Bdoc21a_1622859_210281包' StartTime: 201.3400 EndTime: 321.3400 NumMessages: 36963 AvailableTopics: [4x3 table] AvailableFrames: {0x1 cell} MessageList: [36963x4 table]

对象返回的对象Rosbag.电话是一个BagSelection对象,它表示rosbag中的所有消息。

对象显示显示文件中包含多少消息的详细信息(nummessages)和第一个(开始时间)和最后一次(EndTime)记录消息。

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

袋.availableTopics.
ans =4×3表nummessages messageType MessageFeminition ___________ _______________________________ /时钟12001 rosgraph_msgs / clize {0x0 char} / clockbo / link_states 11999 gazebo_msgs / linkstates {geometry_msgs / pose [] pose ...'} / oveom 11998 nav_msgs / odom 11998 nav_msgs / odometry {'uint32 seq ...'} /扫描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:包' StartTime: 201.3400 EndTime: 321.3300 NumMessages: 11998 AvailableTopics: [1x3 table] AvailableFrames: {0x1 cell} MessageList: [11998x4 table]

调用选择功能返回另一个BagSelection对象,可用于进行进一步选择或检索消息数据。所有选择对象都彼此独立,因此您可以从工作区中清除它们后完成。

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

开始=包。开始时间
开始= 201.3400
BAGSELECT2 =选择(包,'时间', [start start + 30],“主题”' /奥多姆'
BAGSELECT2 =具有属性的BAGSELECT:'/tmp/bdoc21a_1622859_210281/tpba7e879f/ros-ex71482057/ ros-ex71482057/ ros-ex71482057/ ex_multiple_topics.bag'starttime:201.3400 ENDIME:231.3200 NumMessages:2997 VailableTopics:[1x3表]可用框架:{0x1 Cell} MessageList:[2997x4表]

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

bagselect3 =选择(bagselect2,'时间',[205 206])
Bagselect3 = BackSelection具有属性:'/tmp/bdoc21a_1622859_210281/tpba7e879f/ros-ex71482057/ ros-ex71482057/ ex_multiple_topics.bag'starttime:205.0200 Endtime:205.9900 NumMessages:101 avableableTopics:[1x3表]可用框架:{0x1 Cell} MessageList:[101x4表]

最后一步中的选择操作于现有的Bagselect2.选择并返回一个新的Bagselect3.对象。

如果您想保存一组选择选项,请将选择元素存储在单元格数组中,然后稍后将其作为选择功能:

SelectOptions = {'时间',[开始,开始+ 1;开始+ 5,开始+ 6],'messageType', {“sensor_msgs /提升”'nav_msgs / odometry'}};bagselect4 = select(bag, selectOptions{:})
Bagselect4 =具有属性的Backsection:'/tmp/bdoc21a_1622859_210281/tpba7e879f/ros-ex71482057/ ros-ex71482057/ros-ex71482057/ ros-ex71482057/ ros-ex71482057/ ex_multiprepr_topics.bag'starttime:201.3400 Endtime:207.3300 Nummessages:209 avableableopics:[2x3表]可用框架:{0x1 Cell} MessageList:[209x4表]

读取选定消息数据

在缩小消息选择之后,您可能希望将实际消息数据读入MATLAB。根据您选择的大小,这可能会花费很长时间并消耗大量计算机内存。

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

msgs = ReadMessages(Bagselect3);尺寸(msgs)
ans =1×2101年1

的结果单元格数组包含尽可能多的元素nummessages属性。

在阅读消息数据时,您也可以更具选择性,并且只能在特定索引中检索邮件。以下是检索4条消息的示例:

msgs = ReadMessages(BAGSELECT3,[1 2 3 7])
公司=4×1个单元阵列{1x1 Odometry} {1x1 Odometry} {1x1 Odometry} {1x1 Odometry}
公司{2}
ans = ROS Odometry message with properties: MessageType: 'nav_msgs/Odometry' Header: [1x1 Header] Pose: [1x1 PoseWithCovariance] Twist: [1x1 TwistWithCovariance] ChildFrameId: 'base_footprint

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

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

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

在ROSBAG中的ROS消息的情况下,时间序列可以帮助通过时间表达特定消息元素的变化。您可以通过以下方式提取此信息时间序列功能。这是内存有效的,因为完整的消息不必存储在内存中。

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

ts = timeeries(bagselect3,“Pose.Pose.Position.X”“Twist.Twist.Angular.Z”
TimeSeries TimeSeries包含重复时间。公共属性:名称:'/ odom属性'时间:[101x1 double] timeinfo:tsdata.timemetadata数据:[101x2 double] datainfo:tsdata.datametadata

这个电话的回归是一个时间序列可用于进一步分析或处理的对象。

请注意,只有当当前选择包含带有单个消息类型的单个主题时,才支持这种提取数据的方法。金宝app

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

ts.Data
ans =101×20.0003 0.0003 0.0003 0.0003 0.0003 -0.0006 0.0003 -0.000 0.0003 -0.0010 0.0003 -0.0010 0.0003 -0.0003 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)

图包含轴。具有标题时间序列图的轴:/ ODOM属性包含2个类型的对象。