主要内容

一起工作rosbag日志文件

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

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

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

加载一个rosbag

控件加载一个示例文件rosbag命令。

袋= rosbag ('ex_multiple_topics.bag')
BAG = BAGSELECTITE:FILEPATH:'/tmp/bdoc20b_1498024_121833/tpfbcf0f9a/ros-ex71482057/ex_multipre_topics.bag'starttime:201.3400 ENDIME:321.3400 NumMessages:36963 VailableTopics:[4x3表]可用框架:{0x1 Cell} MessageList:[36963x4表]

从中返回的对象rosbag呼叫是A.袋式选择对象,它是ROSBAG中所有消息的表示。

对象显示显示文件中包含多少消息的详细信息(NumMessages)和第一次(开始时间),最后(时间结束)的留言被录了下来。

评估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...' }

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

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

在任何邮件加载到MATLAB存储器之前,您可能希望根据此索引过滤并缩小邮件的选择。

选择消息

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

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

袋子
ans =.36963×4表时间主题消息类型的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 /odometry 12112 201.35 / gazebo / link_states 11016 2016 2016/16 / gazebo / link_states gazebo_msgs / linkstates 12930 201.36 201.37 / odom nav_msgs / odometry 14844 201.37 / gazebo / link_states gazebo_msgs / linkstates 15608 201.37 / clock rickstates 15608 201.37 / clock rothral_msgs / clock 14790201.38 /时钟ROSGraph_MSGS /时钟16704 201.38 /凉亭/链接_States Gazebo_MSGS / LinkStates 16758 201.38 / ODOM NAV_MSGS / ODOMORY 17854 201.39 / GAZEBO / LINK_STATES GAZEBO_MSGS / LinkStates 18672

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

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

Bag..Messagelist(500:505,:)
ans =.6×4表时间主题MessageType FileOffset _______________________________________时钟rosgraph_msgs / clock 339384 203 / gazebo / link_states gazebo_msgs / linkstates obazebbo_msgs / linkstates gazebo_msgs / linkstates 334136 203 / gazebo / linkstates gazebo_msgs / linkstates335232 203 / ODOM NAV_MSGS / ODOMORY 336328

使用选择功能缩小信息的选择。的选择功能运行目的。

您可以按时间,主题名称,消息类型或三个组合过滤消息列表。

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

bagselect1 =选择(包,'话题','/ odom')
BAGSELECT1 =具有属性的BAGSELECTE:'/tmp/bdoc20b_1498024_121833/tpfbcf0f9a/ros-ex71482057/ex_multipre_topics.bag'starttime:201.3400 ENDIME:321.3300 NumMessages:11998 VailableTopics:[1x3表]可用框架:{0x1 Cell} MessageList:[11998x4表]

打电话给选择函数返回一个袋式选择对象,该对象可用于进行进一步选择或检索消息数据。所有的选择对象都是相互独立的,因此您可以在完成之后将它们从工作空间中清除。

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

start = bag.starttime.
start = 201.3400.
bagselect2 =选择(包,“时间”,[开始启动+ 30],'话题','/ odom')
BAGSELECT2 = BAGSELECTET属性:FILEPATH:'/tmp/bdoc20b_1498024_121833/tpfbcf0f9a/ros-ex71482057/ex71482057/ex71482057/ex71482057/ex71482057/ex71482057/ex71482057/ex71482057/ex71482057/ex_multipre_topics.bag'starttime:201.3400 Endtime:231.3200 Nummessages:2997 VailableTopics:[1x3表]可用框架:{0x1 Cell} MessageList:[2997x4表]

使用最后一个选择缩短时间窗口,更进一步:

bagselect3 =选择(bagselect2,“时间”206年[205])
Backsect3 =具有属性的Backsection:'/tmp/bdoc20b_1498024_121833/tpfbcf0f9a/ros-ex71482057/ex_multiple_topics.bag'starttime:205.0200 Endime:205.9900 NumMessages:101 avableableTopics:[1x3表]可用框架:{0x1 Cell} MessageList:[101x4表]

在现有的最后一步中的选择bagselect2选择并返回一个新的bagselect3目的。

如果要保存一组选择选项,请将选择元素存储在单元格数组中,然后将其作为输入作为输入重新使用选择功能:

selectOptions = {“时间”开始,开始+ 1;开始+ 5 + 6)开始,“MessageType”,{'sensor_msgs / laserscan',“nav_msgs /测程法”}};BAGSELECT4 = SELECT(BAG,SELECTOPTIONS {:})
BAGSELECT4 =具有属性的BAGSELECTET:'/tmp/bdoc20b_1498024_121833/tpfbcf0f9a/ros-ex71482057/ex71482057/ex_multipre_topics.bag'starttime:201.3400 ENDINE:207 3400 NumMessages:209 VailableTopics:[2x3表]可用框架:{0x1 Cell} MessageList:[209x4表]

读取所选消息数据

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

要将所选消息检索为单元格数组,请使用阅读员功能:

公司= readMessages (bagselect3);大小(公司)
ans =.1×2101 1

得到的单元阵列包含如此多的元素NumMessages属性选择对象的。

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

msgs = readMessages(bagselect3, [1 2 3 7])
msgs =.4×1单元阵列{1x1 odometry} {1x1 odometry} {1x1 odometry} {1x1 odometry}
msgs {2}
ans = ROS odometry邮件与属性:messageType:'nav_msgs / odometry'标题:[1x1 header]姿势:[1x1 posewithcovariance] twist:[1x1 twistwithcovariance] childframeid:'base_footprint'使用showdetails来显示消息的内容

单元阵列中的每个消息都是一个标准的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' Time: [101x1 double]timemetdata数据:[101x2 double] DataInfo: tsdata. datametdata

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

请注意,只有当前选择包含单个消息类型的单个主题时,才会支持该提取数据的方法。万博1manbetx

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

ts.Data
ans =.101×20.0003 0.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 -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)