I、简述
本章将介绍一个rosbag工具,通过它能够将发布在一个或者多个话题上的消息录制到一个包文件里,然后回放可以重现相似过程。
II、录制与回放
1、准备工作
这里用到turtle自带的让小乌龟走矩形的节点(turtlesim_node 和 draw_square 两个节点)。
依次打开roscore,turtlesim_node节点和drwa_square节点。
2、包的录制
另起一个命令行,键入代码(默认包文件在当前命令行目录下):
//记录特殊节点
rosbag record -O 包文件名.bag 话题名1 话题名2 ...
//记录所有话题(不推荐,会很卡)
rosbag record -a 包文件名.bag
//启用包文件的压缩
rosbag record -j 包文件名.bag ...
我们记录小乌龟的速度和位姿信息:
rosbag record -O square.bag /turtle1/cmd_vel /turtle1/pose
此时查看系统的计算图如下:
Ctr-C停止录制,此时小乌龟如下运动,且当前工作空间下多了一个square.bag的文件:
另外说一点,rosbag在录制的时候创建了节点去订阅需要录制的话题,通过rosbag创建的节点通常使用匿名名称。意味着如果需要的话,可以同时录制多个包。
3、包的回放
确认turtlesim_node和roscore在执行,后如下代码实现回放
rosbag play 包名.bag
运行如下代码:
rosbag play square.bag
此时查看系统计算图如下:
运行完毕后,界面提示done,此时小乌龟的图像如下:
– 包的详细信息
rosbag info 包名.bag
输入如下指令:
rosbag info squre.bag
可以看到如下详细信息,持续时间、消息计数、话题列表都是我们关心的:
$ rosbag info square.bag
path: square.bag
version: 2.0
duration: 59.2s
start: Dec 26 2021 00:27:38.04 (1640449658.04)
end: Dec 26 2021 00:28:37.25 (1640449717.25)
size: 660.5 KB
messages: 7292
compression: none [1/1 chunks]
types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics: /turtle1/cmd_vel 3607 msgs : geometry_msgs/Twist
/turtle1/pose 3685 msgs : turtlesim/Pose
– 疑问?
- 回放和录制时为什么画得正方形不再一个地方?
- 因为rosbag中只记录了消息序列的副本,
- 初始位置属于服务(上一章的/spawn服务大家还有印象吧)
- 包文件明明录制了/turtle1/pose话题(含有位置信息的),但是draw square和rosbag play仍然我行我素地将海龟放在了不同位置?
- 事实上回到我们的回放计算图就可以明显看到,虽然记录了位姿/pose,但是没有订阅哦,以此可以不同。
- 事实上当turtlesim_node和包回放同时运行时,话题pose信息是冲突的,会看到坐标突变,所幸并没有被订阅。(这种情况要尽量避免)。
另外服务并不会被rosbag所记录下来,否则包文件里应该记录了/reset的服务。
III、启动文件中的包文件
除了前文的命令,rosbag还为我们提供了record和paly的可执行文件工具也可以实现前文所述功能。
尽管命令可能冗长:
rosrun rosbag record -O 文件名.bag 话题1 话题2 ...
rosrun rosbag play 文件名.bag
其实它的意义在于让我们的启动文件包含
例如记录一个节点:
<node pkg="rosbag" name="record" type="record" args="-O 文件名.bag 话题名1 话题名2 ..." />
或者回放一个节点
<node pkg="rosbag" name="play" type="play" args="文件名.bag " />
IV、C++中的包操作
存在读取和写入包文件的API,但是应用场合非常特殊,这里略。
V、展望
就此大概内容已经结束,下一章看一下展望。
现在是2021.12.26凌晨1点,还是那句话,西安加油,我也加油!