ROS 2 Iron 教程 第一章 CLI Tools 第十节 记录并回放数据
前言
本系列文章是由笔者翻译自ROS 2 官方教程。笔者水平有限,如有错误,还请读者指正。
本节教程中部分代码为 Liunx下,请使用其他操作系统的读者前往原文查看。
背景
ros2 bag
是用于记录系统上话题上发布的数据的命令行工具。它记录任何话题上传递的数据,并将它们保存在数据库中。然后,你可以回放数据以重现测试和实验的结果。记录话题也是分享你的工程并允许他人重构的好方法。
先决条件
你在安装 ROS 2 时应该已经将ros2 bag
安装完成了。
如果你需要安装 ROS 2 ,详见安装教程。
本节教程讨论过去教程中已经介绍过的概念,例如:节点和话题。同时,本节教程依旧使用 turtlesim 包。
任务
1 Setup (设置)
你将会记录你在turtlesim
系统中的键盘输入,并在随后回放,所以首先启动/turtlesim
和/teleop_turtle
节点。
打开一个新终端并运行:
ros2 run turtlesim turtlesim_node
打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
让我们新建一个用于存放我们记录的数据的目录(Linux):
mkdir bag_files
cd bag_files
2 Choose a topic (选择一个话题)
ros2 bag
只能记录话题中发布的信息。为了查看系统中的话题列表,打开一个新终端并运行命令:
ros2 topic list
它将会返回:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
在理解话题教程中,你了解到/turtle_teleop
节点在/turtle1/cmd_vel
话题上发布使海龟运动的命令。
为了查看/turtle1/cmd_vel
上发布的数据,运行命令:
ros2 topic echo /turtle1/cmd_vel
起初将不会有任何数据出现,这是因为 teleop 节点没有发布任何数据。回到你运行 teleop 节点的终端并选中它,这时它是活跃状态的。使用方向键来移动海龟,然后你将会看到运行ros2 topic echo
的终端中出现数据:
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
3 ros2 bag record (ROS 2 包记录 )
3.1 Record a singal topic (记录单个话题)
为了记录话题上发布的数据,使用如下命令参数:
ros2 bag record <topic_name>
在你选择的话题上运行该命令之前,打开一个新终端并移动到你先前创建的bag_files
目录,这是因为 rosbag 文件将会被保存到你运行命令的目录。
运行如下命令:
ros2 bag record /turtle1/cmd_vel
你将会在终端中看到如下信息(日期与时间将会不同):
[INFO] [rosbag2_storage]: Opened database 'rosbag2_2019_10_11-05_18_45'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...
现在ros2 bag
正记录发布在/turtle1/cmd_vel
话题上的数据。回到 teleop 终端并再次移动海龟。移动路径不限,但尝试移动一个可辨认的路径以便于后续回放。
按下Ctrl + C
来停止记录。
记录下数据将会被一起保存到命名规律为:rosbag2_year_month_day-hour_minute_second
的目录。这个目录将会被包含 bag文件以及一个metedata.yaml
文件。
3.2 Record multiple topics (记录多个话题)
你不仅可以记录多个话题,也可以更改ros2 bag
储存的文件名。
运行如下命令:
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
-o
选项允许你选择一个 bag 文件唯一的名字。后面跟着字符串,在本例子中是subset
,这是文件名。
为了同时记录多个话题,加入多个话题名,并使用空格分隔。
你将会看到如下信息,确认两个话题同时被记录:
[INFO] [rosbag2_storage]: Opened database 'subset'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/pose'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...
你可以将海龟到处移动并在完成后按下Ctrl + C
。
提示:
还有另一个选项可被添加到命令中,-a
可记录系统中所有话题。
4 ros2 bag info (ROS 2 包信息)
你可以查看你记录包的详细信息,运行:
ros2 bag info <bag_file_name>
在subset
包文件上运行这个命令,它将会返回文件信息的列表:
ros2 bag info subset
Files: subset.mcap
Bag size: 228.5 KiB
Storage id: mcap
Duration: 48.47s
Start: Oct 11 2019 06:09:09.12 (1570799349.12)
End Oct 11 2019 06:09:57.60 (1570799397.60)
Messages: 3013
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 9 | Serialization Format: cdr
Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3004 | Serialization Format: cdr
5 ros2 bag play (ROS 2 包回放)
在回放包文件之前,在你运行 teleop 的终端按下Ctrl + C
键。然后确保你可以看到海龟窗口,这样你就可以看到包文件回放的效果。
运行如下命令:
ros2 bag play subset
终端将会返回:
[INFO] [rosbag2_storage]: Opened database 'subset'.
你的海龟将会重复你记录时的运动路径(尽管不是百分百准确;海龟对于系统时基的小变化十分敏感)。
因为subset
文件记录/turtle1/pose
话题,ros2 bag play
命令在 turtlesim 运行时不会退出,即使不在移动海龟。
这是因为只要/turtlesim
节点处于活跃状态,它在/turtle1/pose
话题上以固定间隔发布数据。你可能注意到ros2 bag info
例子中/turtle1/cmd_vel
话题的Count
是 9 ;这是当记录时我们按下多少次按键。
而/turtle1/pose
话题的Count
的值超过 3000 ;当我们记录时,数据被发布在话题上超过 3000 次。
为了得知位置数据发布的频率,可以运行如下命令:
ros2 topic hz /turtle1/pose
总结
你可以使用ros2 bag
命令来记录 ROS 2 系统中话题上传输的数据。不论是将你的工程分享给他人或是检验自己的实验成果,这是一个很好的工具。