【ROS】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简介

【ROS】rosbag使用_第1张图片
rosbag 既可以指命令行中数据包相关命令,也可以指 c++/pythonrosbag 库。这里的 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 
# 是bag文件,为数据所在的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

你可能感兴趣的:(自动驾驶,人工智能,ros)