【ROS】rosbag使用
参考:1.https://blog.csdn.net/weixin_42905141/article/details/1000573232.https://www.cnblogs.com/long5683/p/14284272.html一、rosbag简介rosbag 既可以指命令行中数据包相关命令,也可以指 c++/python 的 rosbag 库。这里的 rosbag 是指前者。rosbag
参考:
1.https://blog.csdn.net/weixin_42905141/article/details/100057323
2.https://www.cnblogs.com/long5683/p/14284272.html
3.https://www.cnblogs.com/lizhensheng/p/11117687.html
4.https://www.cnblogs.com/chrislzy/p/14934366.html
一、rosbag简介
rosbag
既可以指命令行中数据包相关命令,也可以指 c++/python
的 rosbag
库。这里的 rosbag
是指前者。
rosbag
主要用于记录、回放、分析 rostopic
中的数据。它可以将指定 rostopic
中的数据记录到 .bag
后缀的数据包中,便于对其中的数据进行离线分析和处理。
对于 subscribe
某个 topic
的节点来说,它无法区分这个 topic
中的数据到底是实时获取的数据还是从 rosbag
中回放的数据。这就有助于我们基于离线数据快速重现曾经的实际场景,进行可重复、低成本的分析和调试。
二、rosbag record
首先,启动与 turtlesim
相关的两个 ros node
:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
- 录制所有话题:
cd ~/bagfiles
rosbag record -a
-a
选项表示将当前发布的所有 topic
数据都录制保存到一个 rosbag
文件中,录制的数据包名字为日期加时间。
- 也可以只记录某些感兴趣的
topic
:
rosbag record /topic_name1 /topic_name2 /topic_name3
- 如果要指定生成数据包的名字,则用
-O /-o
参数,如下:
rosbag record -O bag_name.bag /topic_name #为文件命名
rosbag record -o bag_name /topic_name #为文件名字做前缀
- 其他录制信息:
rosbag record --duration=30 /topic_name #持续30s录制,还可以指定m,h,和--split类似
rosbag record --split --size=1024 /topic_name1 #空间达到1024M后分文件存储
rosbag record --split --duration=30 /topic_name1 #持续时间到30s后分文件存储
rosbag record --split --duration=5m /topic_name1 #持续时间到5m后分文件存储
rosbag record --split --duration=2h /topic_name1#持续时间到2h后分文件存储
rosbag record -l 1000 /topic_name1 # 录制该主题1000个消息限制
- 如果在
launch
文件中使用rosbag record
命令,如下:
<node pkg="rosbag" type="record" name="bag_record" args="/topic1 /topic2"/>
三、rosbag info
- 显示数据包中的信息:
rosbag info filename.bag
显示类似下边的信息:
$ rosbag info 1.bag
path: 1.bag
version: 2.0
duration: 3.3s
start: Aug 24 2019 21:37:53.35 (1566653873.35)
end: Aug 24 2019 21:37:56.65 (1566653876.65)
size: 7.9 KB
messages: 20
compression: none [1/1 chunks]
types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
topics: /turtle1/cmd_vel 20 msgs : geometry_msgs/Twist
- 以yaml形式显示话题信息:
rosbag info bag_name.bag -y
#或者
rosbag info bag_name.bag --yaml
$ rosbag info -y 1.bag
path: 1.bag
version: 2.0
duration: 3.295966
start: 1566653873.351150
end: 1566653876.647117
size: 8103
messages: 20
indexed: True
compression: none
types:
- type: geometry_msgs/Twist
md5: 9f195f881246fdfa2798d1d3eebca84a
topics:
- topic: /turtle1/cmd_vel
type: geometry_msgs/Twist
messages: 20
- 以频率形式显示包中的话题信息:
rosbag info bag_name.bag --freq
四、rosbag play
- 回放数据包中的
topic
:
rosbag play <bagfile>
- 开始播放立刻暂停,按空格继续:
rosbag play --pause bag_name.bag
- 如果想改变消息的发布速率,可以用下面的命令,
-r
后面的数字对应播放速率:
rosbag play -r 2 <bagfile>
- 如果希望
rosbag
循环播放,可以用命令:
rosbag play -l <bagfile> # -l== --loop
- 如果只播放感兴趣的
topic
,则用命令:
rosbag play <bagfile> --topic /topic_name1
#或者
rosbag play bag_name.bag --topics /topic_name1 /topic_name2
在上述播放命令执行期间,空格键可以暂停播放。
- 指定播放起始点
rosbag play bag_name.bag -s 5 #从5s的地方开始播放
- 指定播放时长
rosbag play bag_name.bag -u 250 #播放250s信息
- 发布时钟
默认/clock
话题是没有消息的。
rosbag play --clock bag_name.bag #默认/clock的话题频率100hz
rosbag play --clock --hz 200 bag_name.bag #指定/clock的时钟为200hz
五、重新录制rostopic filter
过滤时可以使用或(or
)和与(and
)操作。
过滤单个topic
:
rosbag filter input.bag only-tf.bag "topic == '/tf'"
#生成的tf.bag仅包含‘/tf’这一个topic
过滤多个topic
:
rosbag filter input.bag output.bag "topic == '/velodyne_point_cloud' or topic =='/visensor/imu' or topic == '/visensor/left/image_raw'"
#生成的output.bag包含‘/velodyne_point_cloud、/visensor/imu、/visensor/left/image_raw‘这三个topic
根据时间过滤:
rosbag filter input.bag output.bag "t.to_sec() <= 1284703931.86"
同时过滤topic
和时间:
rosbag filter input.bag output.bag "topic == '/odometry/gps' and t.to_sec() <= 1284703931.86"
同时过滤多个topic
和时间:
rosbag filter input.bag output.bag "(topic == '/velodyne_point_cloud' or topic =='/visensor/imu' or topic == '/visensor/left/image_raw') and (t.to_sec() >= 1506117983.884751 and t.to_sec() <= 1506118069.884751)"
六、压缩和解压缩命令:compress&decompress
- 压缩
使用压缩命令,会将原来的bag备份并重命名为.orig.bag
。
#默认bz2格式压缩,特点:压缩数据小,但是慢
rosbag compress bag_name.bag
rosbag compress -j bag_name.bag
#lz4格式压缩,特点:压缩快,但是被压缩后的文件稍大
rosbag compress --lz4 bag_name.bag
- 解压缩
rosbag decompress bag_name.bag
七、rosbag check
Determine whether or not a bag is playable in the current system. 确定一个包在当前系统中是否可以播放
rosbag check old.bag
rosbag check -g diagnostics.bmr diag.bag #生成一个移植规则文件migration rule file
八、rosbag reindex
Rosbag 重新索引是一个命令行工具,用于修复破损的袋文件(或记录在 ROS 版本0.11之前的袋文件)如果某个包由于任何原因没有清洁地关闭,则索引信息可能已损坏。使用此工具重新读取消息数据并重新生成索引。
$ rosbag reindex old.bag
九、用rostopic echo命令转换格式
提取bag文件中的数据并保存为csv格式,提取topic的标准格式为:
rostopic echo -b <BAGFILE> -p <TOPIC> > <output>.csv
# <BAGFILE>是bag文件,<TOPIC>为数据所在的topic
rostopic echo
命令一次只能提取一个topic
。
# save into .csv files
rostopic echo -b rosbag.bag -p /topic/sub_topic1 > topic1.csv
# save into .txt files
rostopic echo -b rosbag.bag -p /topic/sub_topic1 > topic1.txt
十、rosbag fix
rosbag fix old.bag repaired.bag myrules.bmr #使用规则文件恢复包文件内容
十一、可视化显示工具:rqt_bag
提供全方位的图形化界面,具有录制,播放,显示,保存,加载文件,暂停等功能:
rqt_bag bag_name.bag
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)