记录和回放数据
目标:记录某个主题上发布的数据,以便您可以随时重播和检查。
教程级别:初学者
时间:10 分钟
背景
“ros2 bag” 是一个命令行工具,用于记录系统中发布在主题上的数据。 它会累积在任意数量的主题上传递的数据并将其保存在数据库中。 然后,您可以重放数据以重现测试和实验的结果。 记录主题也是分享您的工作并允许其他人重现它的好方法。
先决条件
您应该将“ros2 bag”作为常规 ROS 2 设置的一部分进行安装。
如果您需要安装 ROS 2,请参阅:doc:安装说明。
本教程讨论了以前教程中涵盖的概念,例如:doc:节点 和:doc:主题。
它还使用了:doc:turtlesim 包。
与往常一样,不要忘记在:doc:每次打开新终端 中获取 ROS 2。
任务
1 设置
您将在“turtlesim”系统中记录您的键盘输入,以便稍后保存和重播,因此首先启动“/turtlesim”和“/teleop_turtle”节点。
打开一个新终端并运行:
ros2 run turtlesim turtlesim_node
打开另一个终端并运行:
ros2 run turtlesim turtle_teleop_key
我们还创建一个新目录来存储我们保存的录音,这只是一个好的做法:
mkdir bag_files
cd bag_files
mkdir bag_files
cd bag_files
md bag_files
cd bag_files
2 选择主题
ros2 bag
只能记录主题中已发布消息的数据。
要查看系统主题列表,请打开新终端并运行以下命令:
ros2 topic list
它将返回:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
在主题教程中,您了解到“/turtle_teleop”节点在“/turtle1/cmd_vel”主题上发布命令,以使海龟在 turtlesim 中移动。
要查看“/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 包记录
3.1 记录单个主题
要记录发布到主题的数据,请使用以下命令语法:
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``的模式。
此目录将包含``metadata.yaml``以及录制格式的包文件。
3.2 录制多个主题
您还可以录制多个主题,以及更改``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
您可以通过运行以下命令查看有关录音的详细信息:
ros2 bag info <bag_file_name>
在“子集”包文件上运行此命令将返回有关该文件的信息列表:
ros2 bag info subset
Files: subset.db3
Bag size: 228.5 KiB
Storage id: sqlite3
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
在重放 bag 文件之前,请在运行 teleop 的终端中输入“Ctrl+C”。 然后确保您的 turtlesim 窗口可见,以便您可以看到 bag 文件的实际运行情况。
输入命令:
ros2 bag play subset
终端会返回如下信息:
[INFO] [rosbag2_storage]: Opened database 'subset'.
你的乌龟会沿着你在记录时输入的路径前进(虽然不是 100% 完全一致;turtlesim 对系统时间的细微变化很敏感)。
因为 subset
文件记录了 /turtle1/pose
主题,所以只要 turtlesim 还在运行,ros2 bag play
命令就不会退出,即使你没有移动。
这是因为只要 /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 系统中传递的主题数据。
无论您是与他人分享您的工作还是自省自己的实验,它都是一个很好的工具。
下一步
您已完成“初学者:CLI 工具”教程! 下一步是解决“初学者:客户端库”教程,从 创建工作区 开始。
相关内容
可以在 README here 中找到有关 ros2 bag
的更详尽解释。
有关 QoS 兼容性和“ros2 bag”的更多信息,请参阅:doc:“../../../How-To-Guides/Overriding-QoS-Policies-For-Recording-And-Playback”。