本教程教你如何使用rosbag record工具来录制ros通信数据。之后在通过rosbag play形式回放录制的数据包
此教程不详细解读,仅将rosbag record对应的help文档列出,并给出具体录制例子
rosbag
bag包是存储ROS消息数据的文件格式,rosbag命令可以录制,回放,操作bag包。
rosbag用法是
rosbag [子命令] [选项] [参数]
- check:判断一个bag包在当前系统中是否可用,或者是否可迁移
- compress:压缩一个或多个bag文件
- decompress:解压bag包
- decrypt:解密bag包
- encrypt:解密bag包
- filter:过滤bag包中的内容
- fix:修复bagz中的消息,让此bag包在当前系统可用
- info:显示bag的内容的总结性信息
- play:以时间同步的方式回放一个或多个bag中的内容
- record:将指定的topic录制为一个bag进行存储
- reindex:对一个bag包重建索引。
rosbag更信息的文档可参考
rosbag record
rosbga record用于录制指定topic的数据为一个bag包进行存储。
用法是:rosbag record TOPIC1 [TOPIC2 TOPIC3 …]
可用选项有:
- -a,–all:录制此系统中的所有topic的数据
- -e,–regex:录制与对应正则表达式相匹配的topic的数据
- -p,–publish:在开始录制的时候publish一个消息
- -x EXCLUDE_REGEX,–exclude=EXCLUDE_REGEX:与对应正则表达式相匹配的topic的数据不录制
- -q,–quiet:隐藏控制台输出
- -o PREFIX,–output-prefix=PREFIX:设置录制数据包的包名前缀,注意包名始终带有时间戳
- -O Name,–output-name=name:录制一个名为Name.bag的包
- –split:当包的大小达到maximum或者录制时间到达duration时进行分包
- –max-splits=MAX_SPLITS:保持最多N包数据,当达到MAX_SPLITS时会删除最老的数据以保持数据包的个数稳定
- –size=SIZE:录制数据包的最大大小是SIZE MB,默认是无限大小
- -d,–duration=DURATION:确定录制数据包的最长时长duration.默认单位是s,除非DURATION以m或者h结尾表示分钟和小时
- -b SIZE,–buffersize=SIZE:使用SIZE MB的内部缓存,默认是256MB,设置0表示无限使用内部缓存
- –chunksize=SIZE:高级选项:记录大小为SIZE KB的块,默认是768
- -l NUM,–limit=NUM:在每个topic上只录制NUM个数据包
- –node=NODE:录制特定节点订阅的所有topic数据
- -j,–bz2:使用BZ2压缩算法进行数据压缩
- –lz4:使用LZ4压缩算法进行数据压缩
- –tcpnodelay:订阅topic时使用TCP_NODELAY传输提示
- –udp:订阅topic时使用UDP传输提示
- –repeat-latched:在每个数据包的开始重复所存的msg
示例
rosbag record -a -d=120s --split --max-splits=100
以每个bag录制120s的数据,录制系统内所有topic的数据,最多保存100个bag 包
rosbag play
以时间同步的方式回放数据包的内容。
用法:rosbag play BAGFILE1 [BAGFILE2 BAGFILE3 …]
可用选项
- -p,PREFIX,–prefix=PREFIX:为所有输出的topic增加前缀PREFIX
- -q,–quiet:抑制终端输出打印
- -i,–immediate:无延时的回放所有数据
- –pause:在暂停模式开始回放
- –queue=SIZE:使用大小为SIZE的输出队列,默认是100
- –clock:publish时钟时间
- –hz=HZ:当发布时钟时间时以HZ的频率进行发布,默认是100
- -d SEC,–delay=SEC:休眠SEC秒后,再进行广播
- -r FACTOR --rate=FACTOR:将数据包的发布频率乘以FACTOR系数
- -s SEC,–start=SEC:启动后SEC s后开始读取文件包
- -u SEC,–duration=SEC:仅仅回放bag文件的SEC秒数据
- –skip-empty=SEC:跳过包中没有消息超过SEC秒的区域
- -l,–loop:循环回放
- -k,–keep-alive:keep alive past end of bag (useful for publishing latched topics)
- –try-future-version:即使bag的版本无法获取,也尝试打开bag包
- –topics:仅回放对应topic的数据
- –pause-topics:在播放过程中需要暂停的topic
- –bags=BAGS:待回放的bag列表
- –wait-for-subscribers:在回放数据发布前,每个主题至少有一个订阅者
- –rate-control-topic=RATE_CONTROL_TOPIC:观察给定的topic,如果上次发布的数据内容大于,则等到topic下次发布时才继续播放
- –rate-control-max-delay=RATE_CONTROL_MAX_DELAY:<rate_control_max_delay>暂停前的最大时间差
示例:rosbag play xx.bag
rosbag decompress
用法:rosbag decompress [选项] BAGFILE1 [BAGFILE2 BAGFILE3 …]
- –output-dir=DIR:将解压后的数据输出到DIR目录
- -f,–force:如果解压文件已经存在,直接覆盖写入
本教程主要介绍如何解析一个录制好的bag包
下面这部分主要是bag包的解析。
bag包生成
运行小乌龟例程,自行录制一个bag包。
rosbag record -a --duration=60s -o turtele
# 可以看到生成一个前缀是turtele的bag包
ls
turtele_2022-09-09-16-36-49.bag
需要注意的是,在进行下面的示例时,可以使用time命令来简单监控下各个命令的运行时间。如果你不希望获取各个命令的运行时间
,下面的示例命令中你把开头的time去掉即可。
回放数据,并在多个终端中查看输出
你需要知道要从bag包中读取的消息的具体的topic。可以使用rosbag info 获取bag中的所录制的topic,以及各个topic上录制了多少条数据。
time rosbag info turtele_2022-09-09-16-36-49.bag
path: turtele_2022-09-09-16-36-49.bag
version: 2.0
duration: 23.5s
start: Sep 09 2022 16:36:49.84 (1662712609.84)
end: Sep 09 2022 16:37:13.35 (1662712633.35)
size: 234.2 KB
messages: 3139
compression: none [1/1 chunks]
types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
rosgraph_msgs/Log [acffd30cd6b6de30f120938c17c593fb]
turtlesim/Color [353891e354491c51aabe32df673fb446]
turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics: /rosout 4 msgs : rosgraph_msgs/Log (2 connections)
/turtle1/cmd_vel 225 msgs : geometry_msgs/Twist
/turtle1/color_sensor 1455 msgs : turtlesim/Color
/turtle1/pose 1455 msgs : turtlesim/Pose
real 0m0.507s
user 0m0.283s
sys 0m0.126s
从上面的rosbag info的结果可以看出,在/turtle1/cmd_vel 上有225条消息。
下面我们开始提取这部分数据。
- 在终端1我们启动ros master节点
# 终端1
reocore
- 打开另外一个终端。在此终端订阅/turtle1/cmd_vel 消息,并打印此topic上的所有输出。同时将这些数据存储到yaml文件中
# 终端2
rostopic echo /turtle1/cmd_vel | tee cmd_vel.yaml
- 打开另外一个终端回放刚才录制的数据包。可以使用–immediate选项尽快的开始数据回放。此处我们仅仅回放./turtle1/cmd_vel的数据
# 终端3
time rosbag play --immediate turtele_2022-09-09-16-36-49.bag --topics /turtle1/cmd_vel
[ INFO] [1662714541.935355856]: Opening turtele_2022-09-09-16-36-49.bag
Waiting 0.2 seconds after advertising topics... done.
Hit space to toggle paused, or 's' to step.
[RUNNING] Bag Time: 1662712628.852830 Duration: 16.519400 / 16.519400
Done.
real 0m1.021s
user 0m0.319s
sys 0m0.165s
- 现在我们可以在终端2看到/turtle1/cmd_vel主题消息的打印。同时也可以从cmd_vel.yaml中找到此topic的具体数据。部分数据如下
head cmd_vel.yaml
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -2.0
---
linear: