记录和回放数据

目标:记录在主题和服务上发布的数据,以便您可以随时回放和检查。

教程级别:初学者

时间:15 分钟

背景

ros2 bag 是一个命令行工具,用于记录 ROS 2 系统中发布在主题和服务上的数据。 它会累积在任意数量的主题和服务上传递的数据,然后将其保存在数据库中。 然后,您可以重放数据以重现测试和实验的结果。 记录主题和服务也是分享您的工作并允许其他人重新创建它的好方法。

先决条件

您应该将 ros2 bag 作为常规 ROS 2 设置的一部分进行安装。

如果您需要安装 ROS 2,请参阅 安装说明

本教程讨论了之前教程中涵盖的概念,例如 nodestopicsservices

它还使用了 turtlesim 包Service Introspection Demo

与往常一样,不要忘记在 每次打开新终端 中获取 ROS 2。

管理主题数据

1 设置

您将在“turtlesim”系统中记录键盘输入,以便稍后保存和重放,因此首先启动“/turtlesim”和“/teleop_turtle”节点。

打开一个新终端并运行:

ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

我们还创建一个新目录来存储我们保存的录音,这只是一个好的做法:

mkdir 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 记录主题

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 终端并再次移动海龟。 移动并不重要,但尝试制作一个可识别的模式,以便在稍后重放数据时查看。

../../../_images/record.png

按``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”。

Note

您还可以向命令添加另一个选项“-a”,它会记录系统上的所有主题。

4 检查主题数据

您可以通过运行以下命令查看有关录音的详细信息:

ros2 bag info <bag_file_name>

在“子集”包文件上运行此命令将返回有关该文件的信息列表:

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 播放主题数据

在重放 bag 文件之前,在 teleop 运行的终端中输入“Ctrl+C”。

然后确保您的 turtlesim 窗口可见,以便您可以看到 bag 文件在运行。

输入命令:

ros2 bag play subset

终端会返回如下信息:

[INFO] [rosbag2_storage]: Opened database 'subset'.

你的乌龟会沿着你在记录时输入的路径前进(虽然不是 100% 完全一致;turtlesim 对系统时间的细微变化很敏感)。

../../../_images/playback.png

因为 subset 文件记录了 /turtle1/pose 主题,所以只要 turtlesim 正在运行,ros2 bag play 命令就不会退出,即使你没有移动。

这是因为只要 /turtlesim 节点处于活动状态,它就会定期在 /turtle1/pose 主题上发布数据。

您可能已经在上面的 ros2 bag info 示例结果中注意到,/turtle1/cmd_vel 主题的 Count 信息只有 9;这就是我们在录制时按下箭头键的次数。

请注意,/turtle1/poseCount 值超过 3000;在我们录制时,该主题上发布了 3000 次数据。

要了解位置数据的发布频率,您可以运行以下命令:

ros2 topic hz /turtle1/pose

管理服务数据

1 设置

您将在“introspection_client”和“introspection_service”之间记录服务数据,然后在稍后显示并重放相同的数据。

要记录服务客户端和服务器之间的服务数据,必须在节点上启用“服务自检”。

让我们启动“introspection_client”和“introspection_service”节点并启用“服务自检”。 您可以在 :doc:“服务自检演示 <../../Demos/Service-Introspection>”中查看更多详细信息。

打开一个新终端并运行“introspection_service”,启用“服务自检”:

ros2 run demo_nodes_cpp introspection_service --ros-args -p service_configure_introspection:=contents

打开另一个终端并运行“introspection_client”,启用“服务自检”:

ros2 run demo_nodes_cpp introspection_client --ros-args -p client_configure_introspection:=contents

2 检查服务可用性

ros2 bag 只能记录可用服务的数据。 要查看系统服务列表,请打开一个新终端并运行以下命令:

ros2 service list

它将返回:

/add_two_ints
/introspection_client/describe_parameters
/introspection_client/get_parameter_types
/introspection_client/get_parameters
/introspection_client/get_type_description
/introspection_client/list_parameters
/introspection_client/set_parameters
/introspection_client/set_parameters_atomically
/introspection_service/describe_parameters
/introspection_service/get_parameter_types
/introspection_service/get_parameters
/introspection_service/get_type_description
/introspection_service/list_parameters
/introspection_service/set_parameters
/introspection_service/set_parameters_atomically

要检查客户端和服务上是否启用了“服务自检”,请运行以下命令:

ros2 service echo --flow-style /add_two_ints

您应该看到如下所示的服务通信:

info:
  event_type: REQUEST_SENT
  stamp:
    sec: 1713995389
    nanosec: 386809259
  client_gid: [1, 15, 96, 219, 162, 1, 108, 201, 0, 0, 0, 0, 0, 0, 21, 3]
  sequence_number: 133
request: [{a: 2, b: 3}]
response: []
---

3 记录服务

要记录服务数据,支持以下选项。 服务数据可以与主题同时记录。

要记录特定服务:

ros2 bag record --service <service_names>

记录所有服务:

ros2 bag record --all-services

运行命令:

ros2 bag record --service /add_two_ints

您将在终端中看到以下消息(日期和时间会有所不同):

[INFO] [1713995957.643573503] [rosbag2_recorder]: Press SPACE for pausing/resuming
[INFO] [1713995957.662067587] [rosbag2_recorder]: Event publisher thread: Starting
[INFO] [1713995957.662067614] [rosbag2_recorder]: Listening for topics...
[INFO] [1713995957.666048323] [rosbag2_recorder]: Subscribed to topic '/add_two_ints/_service_event'
[INFO] [1713995957.666092458] [rosbag2_recorder]: Recording...

现在“ros2 bag”正在记录在“/add_two_ints”服务上发布的服务数据。 要停止记录,请在终端中输入“Ctrl+C”。

数据将累积在一个新的 bag 目录中,其名称格式为“rosbag2_year_month_day-hour_minute_second”。 此目录将包含一个“metadata.yaml”以及记录格式的 bag 文件。

4 检查服务数据

您可以通过运行以下命令查看有关录音的详细信息:

ros2 bag info <bag_file_name>

运行此命令将返回有关该文件的信息列表:

Files:             rosbag2_2024_04_24-14_59_17_0.mcap
Bag size:          15.1 KiB
Storage id:        mcap
ROS Distro:        rolling
Duration:          9.211s
Start:             Apr 24 2024 14:59:17.676 (1713995957.676)
End:               Apr 24 2024 14:59:26.888 (1713995966.888)
Messages:          0
Topic information:
Service:           1
Service information: Service: /add_two_ints | Type: example_interfaces/srv/AddTwoInts | Event Count: 78 | Serialization Format: cdr

5 播放服务数据

在重放 bag 文件之前,在运行“introspection_client”的终端中输入“Ctrl+C”。

当“introspection_client”停止运行时,“introspection_service”也会停止打印结果,因为没有传入请求。

从 bag 文件中重放服务数据将开始将请求发送到“introspection_service”。

输入命令:

ros2 bag play --publish-service-requests <bag_file_name>

终端会返回如下信息:

[INFO] [1713997477.870856190] [rosbag2_player]: Set rate to 1
[INFO] [1713997477.877417477] [rosbag2_player]: Adding keyboard callbacks.
[INFO] [1713997477.877442404] [rosbag2_player]: Press SPACE for Pause/Resume
[INFO] [1713997477.877447855] [rosbag2_player]: Press CURSOR_RIGHT for Play Next Message
[INFO] [1713997477.877452655] [rosbag2_player]: Press CURSOR_UP for Increase Rate 10%
[INFO] [1713997477.877456954] [rosbag2_player]: Press CURSOR_DOWN for Decrease Rate 10%
[INFO] [1713997477.877573647] [rosbag2_player]: Playback until timestamp: -1

您的“introspection_service”终端将再次开始打印以下服务消息:

[INFO] [1713997478.090466075] [introspection_service]: Incoming request
a: 2 b: 3

这是因为“ros2 bag play”将服务请求数据从 bag 文件发送到“/add_two_ints”服务。

我们还可以在“ros2 bag play”回放服务通信时对其进行自省,以验证“introspection_service”。

在“ros2 bag play”之前运行此命令以查看“introspection_service”:

ros2 service echo --flow-style /add_two_ints

您可以从包文件中看到服务请求,并从“introspection_service”中看到服务响应。

info:
  event_type: REQUEST_RECEIVED
  stamp:
    sec: 1713998176
    nanosec: 372700698
  client_gid: [1, 15, 96, 219, 80, 2, 158, 123, 0, 0, 0, 0, 0, 0, 20, 4]
  sequence_number: 1
request: [{a: 2, b: 3}]
response: []
---
info:
  event_type: RESPONSE_SENT
  stamp:
    sec: 1713998176
    nanosec: 373016882
  client_gid: [1, 15, 96, 219, 80, 2, 158, 123, 0, 0, 0, 0, 0, 0, 20, 4]
  sequence_number: 1
request: []
response: [{sum: 5}]

摘要

您可以使用 ros2 bag 命令记录 ROS 2 系统中传递的主题和服务数据。 无论您是与他人分享您的工作还是自省自己的实验,它都是一个很好的工具。

下一步

您已完成“初学者:CLI 工具”教程! 下一步是解决“初学者:客户端库”教程,从 创建工作区 开始。

相关内容

可以在 README here 中找到有关 ros2 bag 的更详尽解释。 有关服务录制和回放的更多信息,请参阅设计文档`此处<https://github.com/ros2/rosbag2/blob/rolling/docs/design/rosbag2_record_replay_service.md>`__。 有关 QoS 兼容性和``ros2 bag`` 的更多信息,请参阅:doc:rosbag2:覆盖 QoS 策略