在 ROS 系统中,可使用 bag 文件来保存和恢复系统的运行状态,好比录制雷达和相机话题的 bag 包,而后回放用来进行联合外参标定。算法
这里记录下我学习官方的 rosbag 教程的笔记:ROS rosbagshell
虽然命令不少,可是我目前在工做中经常使用的命令就以下几个:session
录制全部话题:工具
rosbag record -a
录制指定话题,设置 bag 包名:学习
rosbag record -O bag_name.bag /topic1_name /topic2_name /xxx
有时候我录制包不设置名称,默认按照录制结束时间命名:spa
rosbag record /topic1_name /topic2_name /xxx
我经常使用的是以暂停的方式启动,防止跑掉数据:code
rosbag play --pause record.bag
你也能够直接回放:教程
rosbag play record.bag
我建图过程当中有时会设置以 0.5 倍速回放,也就是以录制频率的一半回放:索引
rosbag play -r 0.5 record.bag
回放完后,我通常会用 rostopic list
查看下发布的主题,确保是我须要的:rem
rostopic list
以前在咱们小车的 Intel NUC 上录包拷到台式机上回放会报错,提示须要 reindex,执行一下便可,不过数据好像会少一些:
rosbag reindex xxx.bag
下面是完整的 rosbag 用法,须要的能够查找下。
rosbag 工具能够录制一个包、从一个或多个包中从新发布消息、查看一个包的基本信息、检查一个包的消息定义,基于 Python 表达式过滤一个包的消息,压缩和解压缩一个包以及重建一个包的索引。
rosbag 目前经常使用的命令以下(fix 和 filter 暂时没有用到):
record
:用指定的话题录制一个 bag 包info
:显示一个 bag 包的基本信息,好比包含哪些话题play
:回放一个或者多个 bag 包check
:检查一个 bag 包在当前的系统中是否能够回放和迁移compress
:压缩一个或多个 bag 包decompress
:解压缩一个或多个 bag 包reindex
:从新索引一个或多个损坏 bag 包我在目前项目的使用中,用的最多的就是 record、info 以及 play 功能,先录制想要的话题包,录制完毕检查下包的信息,最后再回放做为算法的输入,下面就详细学习下上面命令的用法。
使用 record 订阅指定主题并生成一个 bag 文件,其中包含有关这些主题的全部消息,常见用法以下。
用指定的话题 topic_names 来录制 bag 包:
rosbag record <topic_names>
好比录制 rosout
、tf
、cmd_vel
3 个话题,录制的 bag 包以时间命名:
rosbag recoed rosout tf cmd_vel
录制完保存 bag 包名称为 session1 + 时间戳.bag
格式:
rosbag record -o session1 /chatter
录制完保存为指定文件名 session2_090210.bag
:
rosbag record -O session2_090210.bag /chatter
录制系统中全部的话题:
rosbag record -a
使用 -h
查看 record 使用方法,不少命令均可以用这个:
rosbag record -h
rosbag info 显示包文件内容的可读摘要,包括开始和结束时间,主题及其类型,消息计数、频率以及压缩统计信息,常见用法以下:
显示一个 bag 包的信息:
rosbag info name.bag
$ rosbag info foo.bag path: foo.bag version: 2.0 duration: 1.2s start: Jun 17 2010 14:24:58.83 (1276809898.83) end: Jun 17 2010 14:25:00.01 (1276809900.01) size: 14.2 KB messages: 119 compression: none [1/1 chunks] types: geometry_msgs/Point [4a842b65f413084dc2b10fb484ea7f17] topics: /points 119 msgs @ 100.0 Hz : geometry_msgs/Point
查看经常使用命令:
rosbag info -h
输出 YAML 格式的信息:
rosbag info -y name.bag
输出 bag 中指定域的信息,好比只显示持续时间:
rosbag info -y -k duration name.bag
rosbag play 读取一个或多个 bag 文件的内容,并以时间同步的方式回放,时间同步基于接收消息的全局时间。回放开始后,会根据相对偏移时间发布消息。
若是同时回放两个单独的 bag 文件,则根据时间戳的间隔来播放。好比我先录制一个 bag1 包,等待一个小时,而后录制另外一个 bag2 包,那我在一块儿回放 bag1 和 bag2 时,在回放的中间会有 1 个小时的停滞期,也就是先回放 bag1,而后须要等待 1 个小时才能回放 bag2。
在回放过程当中按空格暂停,常见用法以下,回放单个 bag:
rosbag play record.bag
回放多个 bag,基于全局时间间隔播放:
rosbag play record1.bag record2.bag
开始播放马上暂停,按空格继续:
rosbag play --pause record.bag
以录制的一半频率回放:
rosbag play -r 0.5 --pause record.bag
指定回放频率,默认 100HZ:
rosbag play --clock --hz=200 record.bag
循环播放:
rosbag play -l record.bag
检查一个 bag 在当前系统中是否能够回放:
rosbag check xxx.bag
若是录制的 bag 很大,咱们能够压缩它,默认的压缩格式是 bz2:
rosbag compress xxx.bag
你也能够添加 -j
手动指定压缩格式为 bz2:
rosbag compress -j xxx.bag
也可使用 LZ4 来压缩数据:
rosbag compress --lz4 xxx.bag
压缩完后,使用须要解压缩:
rosbag decompress xxx.bag
若是回放遇到问题,提示 reindex 的话,直接执行便可,这个会自动生成一个原 bag 的备份:
rosbag reindex xxx.bag