15-bag的录制,回放与解析

本教程教你如何使用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: 
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值