概念
通过将ROS执行过程中的主题数据持续记录下来(到一个数据库中),后期我们就可以重复该过程,同时也能分享给其他同事和朋友,以帮助分析问题或纯粹分享喜悦(独乐乐不如众乐乐嘛)。我们今天的主角ros2 bag就是能提供记录和回放功能的这么一个命令行工具。
动动手
启动小海龟
没错,还是它:
$ros2 run turtlesim turtlesim_node
$ros2 run turtlesim turtle_teleop_key
分别启动完成后,找个路径创建一个文件夹(不要root权限创建啊)用来放置记录的结果:
$mkdir bag_record
$cd bag_record
选择目标主题数据
我们可以同时记录所有主题的数据(除非必要),但是我们当前只记录我们感兴趣的主题(也不怎么占用地方嘛),通过前面的学习,我们再来温故一下如何查看主题以及其对应的数据结构类型:
$ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
返回了5个主题,我们选哪个呢,公平点我们折中就选/turtle1/cmd_vel,其实这个主题发布的数据就是控制小海龟游动的数据,我们可以通过ros2 echo看看(记得要在teleop_turtle终端控制小海龟游动啊,不然看不到数据的):
$ros2 echo /turtle1/cmd_vel
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
类似于返回上面的数据内容,我们记录的数据也会按照这样的格式进行记录。
记录数据
记录单个主题
首先我们得切换到我们刚创建的记录路径下面那个文件夹内,因为我们在执行记录命令后记录文件是会保存到该命令运行的当前路径下的:
$ros2 bag record <topic_name>
对应于我们选择的/turtle1/cmd_vel命令是这样的:
$ros2 bag record /turtle1/cmd_vel
如果出现提示创建包目录失败,
原因是这个bag_record文件夹是通过sudo mkdir bag_record生成的,如果你说没关系,我们切换到root用户下执行记录不就一样了吗,额,的确,看起来过程都挺正常的,记录包文件什么的也都生成了,但是你会发现记录包的某些信息不对,比如时长为0s(原因是个啥,此处标个记号),如下图所示。
然后我们切换到控制节点那个终端,控制小海龟游动,游出一个不同一般的轨迹,觉得差不多了就可以CTRL+C停止记录,我们再来看看记录的文件夹内有啥东西:
在我们创建的bag_record路径下,ROS 2自动创建了以日期命名的文件夹,并在里面生成了最终的记录数据,metadata.yaml保存了这次记录包的信息,实际的主题数据存在了.mcap文件里。
记录多个主题
如果你胃口够大(实际需要),我们可以通过类似下面的命令同时记录多个主题发布的数据(如果还需要其他主题数据,可以在后面以空格间隔各个主题名称即可):
$ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
简单解释一下上面的-o subset的意思,-o是取一个独特的名字替代默认记录文件名称(默认名称是rosbag2_year_month_day-hour_minute_second)。
如果要记录所有主题的数据,那就简单了,如下:
$ros2 bag record -o all_set -a
当需要停止记录时,我们在记录终端CTRL + C。
当记录所有主题时,有提示隐藏的主题不会被记录,如果记录隐藏的主题可以增加--include-hidden-topics命令(隐藏的主题?我暂时还不清楚,后面估计会再次碰见,到时再解释下)。
记录包详情
当记录文件生成完毕后,我们可以通过如下命令对该文件的相关信息进行查看:
$ros2 bag info <bag_file_name>
我们看看subset的信息:
$ros2 bag info subset
可以看出,返回了包含文件大小、存储ID、时长、起止时间、消息数、主题数据等相关信息,其中有两个Count,第一个是主题/turtle1/cmd_vel的Count=7,它代表我们摁了7次键来控制小海龟(发布消息),第二个是主题/turtle1/pose的Count=2253,相较于第一个Count,此处的值比较大,它代表记录周期内,该主题发布了2253次。
如果要查看某主题的消息发布频率,我们可以通过ros2 hz命令进行查看:
$ros2 topic hz /turtle1/pose
回放数据
终于到了我们的重头戏啦,开始之前我们得先停止掉控制节点(/teleop_turtle),然后show time:
$ros2 bag play subset
小海龟开始在按照记录的数据画画了,直到记录文件的数据播放完成(此时只要turtlesim节点还活着播放终端就不会自动退出,这是因为/turtlesim节点会周期发布/turtle1/pose主题消息)。
看画出的轨迹,丢帧了(后面的拐弯游动没有记录上,据一些资料解释,可能与DDS有关,这也是官方还未解决的bug)或者是小海龟撞到墙了触发了某些机制影响后续的动作(个人猜测,未作验证)。
本篇留有好几个问题还需我们在后面去找答案,此刻不必硬刚(非找到原因不可),先往后看,不急于一时。
那么到此,基于小白的《CLI工具》系列就告一段落了,同时后天就开始我们的清明假期了,大家休息好,我们再继续冲往下个阶段的学习。
本篇完。