记录和播放数据

目标 记录就某个主题和服务发布的数据,以便随时重放和检查。

辅导水平: 初学者

时间 15 分钟

背景介绍

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

先决条件

您应该 玫瑰2 背包 作为 ROS 2 常规设置的一部分进行安装。

如果需要安装 ROS 2,请参见 安装说明.

本教程将讨论之前教程中涉及的概念,例如 结点, 主题服务.它还使用 海龟模拟软件包服务自省演示.

与往常一样,别忘了在 您打开的每个新终端.

管理主题数据

1 设置

您将把键盘输入记录在 海龟 系统进行保存和重放。 /turtlesim/teleop_turtle 节点。

打开一个新终端并运行

ros2 运行 turtlesim turtlesim_node

打开另一个终端并运行:

ros2 run turtlesim turtle_teleop_key

我们还可以新建一个目录来存储已保存的录音,以备不时之需:

mkdir bag_files
cd bag_files

2 选择主题

玫瑰2 背包 可以记录发布到主题中的信息数据。要查看系统的主题列表,请打开一个新终端并运行以下命令:

ros2 主题列表

哪个会回来?

/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

一开始什么都不会显示,因为远程操作没有发布数据。返回运行远程操作的终端,选择它,使其处于激活状态。使用方向键移动乌龟,你就会看到终端上运行的数据正在发布。 玫瑰2 主题 回响.

线性
  x: 2.0
  y:0.0
  z: 0.0

  x: 0.0
  y:0.0
  z: 0.0
  ---

3 记录主题

3.1 记录单一主题

要记录发布到主题的数据,请使用命令语法:

ros2 bag record <topic_name>;

在所选主题上运行此命令之前,请打开一个新终端,进入 文件袋 目录,因为 rosbag 文件会保存在运行它的目录中。

运行该命令:

ros2 bag record /turtle1/cmd_vel

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

[INFO] [rosbag2_storage]:已打开数据库 'rosbag2_2019_10_11-05_18_45'。
[INFO] [rosbag2_transport]:监听主题...
[INFO] [rosbag2_transport]:已订阅主题 '/turtle1/cmd_vel';
[INFO] [rosbag2_transport]:所有请求的主题都已订阅。停止发现...

现在 玫瑰2 背包 记录在 /turtle1/cmd_vel 主题。返回远程操作终端,再次移动乌龟。移动的幅度并不重要,但要尽量做出可识别的模式,以便稍后重放数据时查看。

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

新闻 Ctrl+C 停止录制。

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

3.2 记录多个主题

您还可以录制多个主题,以及更改文件名 玫瑰2 背包 保存到

运行以下命令

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

"(《世界人权宣言》) -o 选项可以为 bag 文件选择一个唯一的名称。本例中使用以下字符串 子集是文件名。

要同时记录多个主题,只需列出每个主题,中间用空格隔开。

您将看到以下信息,确认正在录制两个主题。

[INFO] [rosbag2_storage]:已打开数据库 'subset'。
[INFO] [rosbag2_transport]:监听主题...
[INFO] [rosbag2_transport]:已订阅主题 '/turtle1/cmd_vel';
[INFO] [rosbag2_transport]:已订阅主题 '/turtle1/pose';
[INFO] [rosbag2_transport]:所有请求的主题都已订阅。停止发现...

您可以移动乌龟,然后按 Ctrl+C 完成后

备注

您还可以在命令中添加另一个选项、 -a记录系统中的所有主题。

4 检查主题数据

运行 "查看 "可以查看录音的详细信息:

ros2 bag info <bag_file_name>;

子集 bag file 将返回该文件的信息列表:

ros2 袋信息子集
文件: subset.mcap
包大小: 228.5 KiB
存储 ID:mcap
持续时间48.47s
开始2019 年 10 月 11 日 06:09:09.12 (1570799349.12)
结束 2019 年 10 月 11 日 06:09:57.60 (1570799397.60)
留言3013
主题信息:主题:/turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count:9 | 序列化格式:cdr
                 Topic:/turtle1/pose | Type: turtlesim/msg/Pose | Count:3004 | 序列化格式:cdr

5 播放主题数据

在重新播放袋文件之前,输入 Ctrl+C 在运行远程操作的终端中执行。然后确保 "turtlesim "窗口可见,这样就能看到包文件的运行情况。

输入命令:

ROS2 袋戏子集

终端将返回信息:

[INFO] [rosbag2_storage]:已打开数据库 'subset'。

您的乌龟将按照您在录制时输入的相同路径运行(尽管不是 100% 精确;turtlesim 对系统时间上的微小变化很敏感)。

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

因为 子集 文件记录了 /turtle1/pose 主题 玫瑰2 背包 游戏 只要你还在运行 turtlesim,即使你没有移动,命令也不会退出。

这是因为只要 /turtlesim 节点处于活动状态时,它会在 /turtle1/pose 定期专题。您可能已经注意到 玫瑰2 背包 信息 上述示例结果表明 /turtle1/cmd_vel 主题的 计数 信息只有 9 个;这是我们在录音时按箭头键的次数。

注意到 /turtle1/pose 有一个 计数 值超过 3000;在我们记录期间,有关该主题的数据已发布 3000 次。

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

ros2 topic hz /turtle1/pose

管理服务数据

1 设置

您将记录以下时间段的服务数据 反省客户端反省服务然后再显示和重放相同的数据。记录服务客户端和服务器之间的服务数据、 服务 自省 必须在节点上启用。

开始吧 反省客户端反省服务 节点,并启用 服务 自省.您可以查看以下内容的详细信息 服务自省演示.

打开一个新终端,运行 反省服务使 服务 自省:

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

打开另一个终端,运行 反省客户端使 服务 自省:

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

2 检查服务可用性

玫瑰2 背包 只能记录可用服务的数据。要查看系统服务列表,请打开一个新终端并运行命令:

ros2 服务列表

哪个会回来?

/add_twoo_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_twoo_ints

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

信息
  事件类型:REQUEST_SENT
  盖章:
    sec: 1713995389
    Nanosec: 386809259
  client_gid: [1, 15, 96, 219, 162, 1, 108, 201, 0, 0, 0, 0, 0, 0, 21, 3]
  序列号: 133
请求:[{a:2,b:3}]
回应:[]
---

3 记录服务

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

记录特定服务:

ros2 bag record --service <service_names>;

记录所有服务:

ros2 bag record --all-services

运行该命令:

ros2 bag record --service /add_twoo_ints

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

[INFO] [1713995957.643573503] [rosbag2_recorder]:按空格键暂停/继续
[INFO] [1713995957.662067587] [rosbag2_recorder]:事件发布线程:开始
[INFO] [1713995957.662067614] [rosbag2_recorder]:监听主题...
[INFO] [1713995957.666048323] [rosbag2_recorder]:订阅主题 '/add_two_ints/_service_event';
[INFO] [1713995957.666092458] [rosbag2_recorder]:记录...

现在 玫瑰2 背包 记录在 /add_twoo_ints 服务。要停止记录,请输入 Ctrl+C 在终端中。

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

4 检查服务数据

运行 "查看 "可以查看录音的详细信息:

ros2 bag info <bag_file_name>;

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

Files: rosbag2_2024_04_24-14_59_17_0.mcap
袋大小: 15.1 KiB
存储 ID:mcap
ROS 发行版:滚动
持续时间:9.211 秒
开始:Apr 24 2024 14:59:17.676 (1713995957.676)
结束:Apr 24 2024 14:59:26.888 (1713995966.888)
消息0
主题信息:
服务:1
服务信息:服务:/add_twoo_ints | 类型:example_interfaces/srv/AddTwoInts | 事件计数:78 | 序列化格式:cdr

5 播放服务数据

在重新播放袋文件之前,输入 Ctrl+C 的终端 反省客户端 正在运行。当 反省客户端 停止运行、 反省服务 也会停止打印结果,因为没有输入请求。

从数据包文件重放服务数据将开始向以下设备发送请求 反省服务.

输入命令:

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

终端将返回信息:

[INFO] [1713997477.870856190] [rosbag2_player]:设置速率为 1
[INFO] [1713997477.877417477] [rosbag2_player]:添加键盘回调。
[INFO] [1713997477.877442404] [rosbag2_player]:按空格键暂停/继续
[INFO] [1713997477.877447855] [rosbag2_player]:按 CURSOR_RIGHT 键播放下一条信息
[INFO] [1713997477.877452655] [rosbag2_player]:按CURSOR_UP键增加10%的速率
[INFO] [1713997477.877456954] [rosbag2_player]:按CURSOR_DOWN键,下降率为10%。
[INFO] [1713997477.877573647] [rosbag2_player]:播放至时间戳:-1

您的 反省服务 终端将再次开始打印以下服务信息:

[INFO] [1713997478.090466075] [introspection_service]:收到请求
a: 2 b: 3

这是因为 玫瑰2 背包 游戏 将包文件中的服务请求数据发送到 /add_twoo_ints 服务。

我们还可以将服务交流内省为 玫瑰2 背包 游戏 正在回放,以验证 反省服务.

玫瑰2 背包 游戏 看到 反省服务:

ros2 service echo --flow-style /add_twoo_ints

您可从包文件中看到服务请求,从 反省服务.

信息
  事件类型:request_received
  盖章:
    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
请求:[{a:2,b:3}]
回应:[]
---
信息
  事件类型:事件类型: RESPONSE_SENT
  盖章:
    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
要求:[]
回复:{总和:5}]

摘要

您可以在 ROS 2 系统中使用 玫瑰2 背包 命令。无论是与他人分享自己的作品,还是反省自己的实验,它都是一个值得了解的好工具。

下一步工作

您已完成 "初学者:CLI 工具 "教程!下一步是学习 "初学者:客户端库 "教程:客户端库 "教程,首先是 创建工作区.