ROS Bag 数据裁剪教程
ROS Bag 数据裁剪教程
文章目录
- ROS Bag 数据裁剪教程
- 1. Bag 数据显示
- 2. Bag 数据裁剪
- 2.1 基本命令
- 2.2 过滤更多条件
- 2.3 注意事项
在使用 ROS 进行机器人开发和调试时,我们经常需要使用 rosbag 工具来记录和回放传感器数据、日志等信息。本文将介绍如何使用
rosbag info
查看 bag 文件的信息,以及如何使用
rosbag filter
对 bag 数据进行裁剪,以便只保留感兴趣时间段内的数据。
1. Bag 数据显示
在实际工作中,我们有时需要先了解一个 bag 文件中包含哪些话题(topic)、消息数量、时长等基本信息。ROS 提供了 rosbag info
命令来方便地获取这些信息。具体使用方法如下:
rosbag info xxx.bag
执行后,你会看到类似如下的输出:
- 路径和文件大小:显示 bag 文件的存储路径以及占用的磁盘空间。
- 时长:记录了从第一个消息到最后一个消息的时间间隔。
- 消息总数:展示文件中记录的总消息数量。
- 话题列表:列出所有包含的 ROS 话题及每个话题对应的消息数和数据类型。
通过这些信息,你可以快速了解该 bag 文件的数据规模及其用途,从而为后续的数据处理做好准备。
2. Bag 数据裁剪
在很多场景下,我们只需要分析或回放某个时间段内的数据,而不必加载整个 bag 文件。ROS 的 rosbag filter
命令可以根据条件过滤消息,生成一个新的 bag 文件。
2.1 基本命令
以下命令将原始的 bus_out_loop_w_cam_info.bag
裁剪,并将结果保存到 bus_out_loop_w_cam_info_60s.bag
中:
rosbag filter bus_out_loop_w_cam_info.bag bus_out_loop_w_cam_info_60s.bag "t.to_sec() >= 1494876479.72 and t.to_sec() <= 1494876509.72"
说明:
- 输入文件:
bus_out_loop_w_cam_info.bag
是原始的 bag 文件。 - 输出文件:
bus_out_loop_w_cam_info_60s.bag
为生成的裁剪后的 bag 文件。 - 过滤条件:表达式
"t.to_sec() >= 1494876479.72 and t.to_sec() <= 1494876509.72"
表示只保留消息时间戳在指定区间内的消息。这里的例子只选择了 30 秒内的数据(后面的时间戳可根据需要调整)。
2.2 过滤更多条件
除了按时间裁剪之外,你还可以结合其他条件进行过滤,例如只保留特定话题的数据。下面是一个示例,假设你只想保留 /camera_info
话题的数据:
rosbag filter bus_out_loop_w_cam_info.bag bus_out_loop_w_cam_info_60s.bag "t.to_sec() >= 1494876479.72 and t.to_sec() <= 1494876509.72 and topic == '/camera_info'"
在这个命令中,过滤条件多了 and topic == '/camera_info'
,这样仅会选取满足时间条件且话题名称为 /camera_info
的消息。
2.3 注意事项
- 时间戳的使用:ROS 中所有时间戳通常采用
ros::Time
类型。使用t.to_sec()
方法可以将时间戳转换为浮点数(秒),从而方便进行比较。 - 命令格式:确保过滤条件放在双引号内,以防止命令行解释器对特殊字符进行错误解析。
- 数据量问题:过滤大型 bag 文件时,可能需要较长时间来处理数据。建议在裁剪前先用
rosbag info
查看文件信息,以估算处理时间。