目录
获取当前工作目录下bag文件的信息
1. 以列表的方式显示bag文件的信息:
指令格式:rosbag info BagFileName.bag
结果如下所示:
在这个信息列表中包含了“参与通信的消息类型types、话题名称topics以及两者的对应关系(topics:types)”。
2. 以yaml格式显示bag文件的信息:
指令格式:rosbag info -y BagFileName.bag
结果如下所示:
YAML 的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。
3. 基于yaml信息表示形式,提取bag文件的某类信息:
指令格式:rosbag info -y -k info_type BagFileName.bag
结果如下所示:
可提取的信息类型为:消息的类型types、话题相关信息topics、bag文件存放路径path、ROS的版本信息vision、录制持续时长duration、录制开始时间start/停止时间end、bag文件大小(以byte为单位)、录制消息总数量messages、文件的压缩格式compression、是否添加至索引列表indexed。
在当前工作目录下创建bag文件
1. 文件以“NAME_开始录制时的时间戳“的名称命名
指令格式:rosbag record -o base_name
执行结果:
2. 文件以“指定名称”的名称命名
指令格式:rosbag record -O name
执行结果:
对指定话题进行录制
1. 对指定话题进行录制
指令格式:rosbag record topic_name1 topic_name2…
2. 对所有话题进行录制
指令格式:rosbag record -a
3. 对符合要求的topic进行录制
指令格式:rosbag record -e –regex
其中–regex表示正则表达式,表征着我们想要匹配的条件,简单示例:
ROS中正则表达式的使用规则:
指令格式:rosbag record -e –regex -x –regex
我们对比发现:-x指令意味着从-e指令筛选出的topic中排除一些符合条件的topic。
4. 当开始录制时,发布一条通知消息
当我们查看topic列表,会发现:
当开始录制bag文件时,会产生一个节点专门记录订阅主题,并将在这些主题上发布的所有消息的内容写入一个包文件:
并且在开始录制时,监听节点会向/begin_write全局消息发送一条string类型的消息。
5. 录制指定时间
--duration数值 | 录制时长 |
--duration=0 | 无限长时间录制 |
--duration=5s | 录制5s |
--duration=5m | 录制5min |
--duration=5h | 录制5hour |
使用rosbag record指令时,指定录制时间使用—duration开头,以“—duration=time_value”的形式输入,主要形式有以下几种:
命令 | 单位 |
—duration=5s | s |
—duration=5m | min |
—duration=5h | hour |
当然,也可以对某一个特定的topic进行指定时间的录制:
虽然—duration=time_value topic_name可以对指定topic话题发布的消息录制指定的时长,但是当-a -e与其同时存在时,情况如下所示:
无论使用什么topic匹配指令,最后录制的话题都是所有录制话题的“并集“。
6. 创建bag文件
7. 按照指定条件拆分bag文件
指令格式:--split –duration=time_value 或者 —size=size_value
由于文件的输出有两种(-o和-O),一种是base_name加时间戳后缀的,一种是指定base_name,这两种文件名格式生成的拆分bag文件如下所示:
--duration和--size只能存在一个,两者不可共存!
8. 指定最大生成文件拆分次数
指令格式:–max-split=max_split_number
我们一定要将最大文件拆分次数和最大生成文件总是区分开来,文件拆分次数与文件总数关系如下所示:
文件拆分次数 | 文件总数 | 备注 |
1 | 2 | 一刀两块 |
2 | 3 | 两刀三块 |
3 | 4 | 三刀四块 |
N | N+1 | N刀(N+1)块 |
从上面的关系表格就可以得出–max-split数值与文件总数的关系:
–max-split | 文件总数 | 备注 |
0 | ∞ | 最多可以得到无穷多个文件 |
N | N+1 | 最多可以得到(N+1)个文件 |
9. 消息缓冲队列的大小
--buffsize数值 | 录制文件大小 |
--buffsize=0 | 无穷大 |
--buffsize=5 | 消息队列缓冲区的大小为5MB |
命令示例:
下面这个命令也是开辟缓冲区,但是比起—buffsize更加先进:
--chunksize数值 | 录制文件大小 |
--chunksize=0 | 无穷大 |
--chunksize=5 | 消息队列缓冲区的大小为5KB |
命令示例:
对于chunksize和buffsize的区别,我着实没有理解,如果大家有新的见解,敬请回复,在ROS wiki上两者的区别如下:
我这里只知道:消息队列是协调消息收发双方速度不匹配而分配的缓冲区。关于文件缓冲区,详见:[Linux]——文件缓冲区_lucky52529的博客-CSDN博客_文件缓冲区https://blog.csdn.net/lucky52529/article/details/90546674
10. 针对于topic录制指定数量的消息
对于全部topic进行指定消息数量的录制:
对于特定topic进行指定消息数量的录制:
我们可以使用rosbag info bag_file_name.bag来查看:
11. 记录特定节点接受的消息
其中/turtlesim_node节点所在的节点图如下所示:
其中/turtlesim_node节点订阅的话题也就两个“/turtle2/cmd_vel“和”/turtle1/cmd_vel“。
12. bag文件的压缩
BZ2压缩格式:
LZ4压缩格式: