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...' }
的AvailableTopics
Table包含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)