ROS2-5-ROS2bag包

Catalogue
  1. 1. ROS2 bag----录制和回放
  2. 2. 安装ROS2bag
  3. 3. ROS2bag的使用
    1. 3.1. 选择一个话题来记录
    2. 3.2. 录制多个Topic
    3. 3.3. 查看bag信息
  4. 4. bag回放
  5. 5. 扩展:ROS2bag 设计理念
    1. 5.1. 动机
    2. 5.2. ROSbag在ROS2中的实现
    3. 5.3. rosbag存储API
      1. 5.3.1. 资料格式
      2. 5.3.2. 数据存储
      3. 5.3.3. 查询格式
    4. 5.4. rosbag API

ROS2 bag----录制和回放

ros2 bag是用于记录系统中有关主题发布的数据的命令行工具。它累积在任何数量的主题上传递的数据,并将其保存在数据库中。然后,您可以重播数据以重现测试和实验的结果。录制主题也是共享您的作品并允许其他人重新创建作品的一种好方法。

安装ROS2bag

1
sudo apt-get install ros-eloquent-ros2bag ros-eloquent-rosbag2*

ROS2bag的使用

您将在turtlesim系统中记录键盘输入,以供以后保存和重播,因此首先要启动/turtlesimand /teleop_turtle节点。

打开一个新终端并运行:

1
ros2 run turtlesim turtlesim_node

打开另一个终端并运行:

1
ros2 run turtlesim turtle_teleop_key

同样,让我们创建一个新目录来存储保存的录音,这是一种很好的做法:

1
mkdir bag_files

选择一个话题来记录

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

1
ros2 topic list

将返回:

1
2
3
4
5
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

在主题教程中,您了解到/turtle_teleop节点在该/turtle1/cmd_vel主题上发布了命令,以使乌龟在turtlesim中移动。

要查看/turtle1/cmd_vel正在发布的数据,请运行以下命令:

1
ros2 topic echo /turtle1/cmd_vel

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

1
ros2 bag record <topic_name>

在您选择的主题上运行此命令之前,请打开一个新的终端并移至bag_files您先前创建的目录中,因为rosbag文件将保存在运行它的目录中。

运行命令:

1
ros2 bag record /turtle1/cmd_vel

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

1
2
3
4
[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...

现在正在记录有关该主题的数据。返回到Teleop终端,然后再次移动乌龟

Ctrl+C停止录制。

数据将被存储在一个具有以下格式的名称的bag文件中 rosbag2_year_month_day-hour_minute_second

录制多个Topic

您还可以记录多个主题,以及更改保存文件的名称。ros2 bag

运行以下命令:

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

-o选项允许您为包文件选择唯一的名称。在此情况下subset,以下字符串是文件名。

要一次记录一个以上的主题,只需列出每个主题并用空格分隔即可。

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

1
2
3
[INFO] [rosbag2_storage]:打开了数据库“子集”。
[INFO] [rosbag2_transport]:正在听主题…
[INFO] [rosbag2_transport]:已订阅主题'/ turtle1 / cmd_vel'[INFO] [rosbag2_transport]:已订阅主题'/ turtle1 / pose'[INFO] [rosbag2_transport]:所有请求的主题都已订阅。停止发现…

完成后,您可以移动乌龟并按Ctrl+C停止录制。

注意

您可以向命令添加另一个选项,该命令-a记录系统上的所有主题。但是,这可能会导致循环依赖关系并使系统崩溃。最好选择所需主题的子集。

查看bag信息

1
ros2 bag info <bag_file_name>

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

1
2
3
4
5
6
7
8
9
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

该主题的信息仅为9, 这就是我们在录制时按箭头键的次数。

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

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

1
ros2 topic echo /turtle1/pose

要查看单个消息,您必须打开数据库(在本例中为sqlite3)进行检查,这超出了ROS 2的范围。

bag回放

在重播bag文件之前,请输入Ctrl+C运行Teleop的终端。然后,确保您的turtlesim窗口可见,以便您可以查看运行中的bag文件。

输入命令:

1
ros2 bag play subset

终端将返回以下消息:

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

扩展:ROS2bag 设计理念

ROS2 Design

ROS2-Bag Design

动机

ROS1的最关键和必要组成部分之一是其持久的数据记录机制,称为rosbags。它已被证明是ROS1的核心和必要组成部分,因为记录和重播所有类型的系统数据的能力对于数据分析和调试目的至关重要。给定此数据记录的各种使用情况,rosbag可以包含非常简单的数据(例如机器人末端执行器的轨迹),也可以包含高度复杂的数据(例如具有多个冗余高分辨率传感器的自动驾驶汽车)。因此,它们的文件大小范围可以从只有几千字节的仅几条消息到几TB以及存储的数百万个消息实例。为了在记录时保持高性能,rosbag避免了已记录消息的序列化和反序列化。

在设计ROS2时,还必须具备高性能数据记录功能。

ROSbag在ROS2中的实现

下面将介绍在ROS2中实施rosbag的总体建议。与在ROS1中实现类似,该想法是将体系结构拆分为多个独立的程序包。

从下至上,我们定义了三层抽象:rosbag存储API,rosbag API,rosbag命令行界面。rosbag storage API在某种意义上是与ROS2无关的,因为它只能读写抽象的二进制消息,这些消息在某些元信息的基础上定义得很好。第二层是rosbag API,负责获取ROS2消息,对其进行序列化并充分订阅以供存储API编写。相反,它从存储API接收二进制表示并将其转换为完全定义的ROS2消息。最后,命令行工具提供了一个用户友好的入口点,用于操纵记录和重放rosbag。

下图描述了此体系结构。

rosbag2 system diagram

rosbag存储API

我们将数据存储定义为以二进制格式存储传入的ros消息的基本方法。数据存储负责持久保存ros消息以及足够的元信息,以在加载时恢复其完整上下文。虽然其主要目的是存储ros消息,但抽象层应与ROS2无关,并且实际上仅处理二进制数据和通用元信息。如果有合适的元信息可用,这允许手动插入自定义数据,例如pcap记录。

资料格式

我们将数据格式定义为ros消息以二进制形式表示的格式。该格式必须唯一地描述,并链接到数据存储中的二进制表示形式,以便能够解释其二进制表示形式,从而恢复ros消息。

如动机部分所述,ROS2中可以支持多种表示形式。因此,rosbag存储API的要求是它可以处理多种数据格式。

数据存储

我们引入了单独的API层,用于与基础数据存储接口。为了编写消息,必须给出消息的抽象表示作为输入。这样的表示包括实际消息的二进制blob和元数据的键值对。数据格式描述是此元数据的一部分。

我们决定为此选择第三方技术,而不再使用ROS1中的自定义rosbag存储。在研究了现有的解决方案之后,我们决定为该API层实现可扩展的插件体系结构,该体系结构能够连接各种数据存储解决方案,因此使用户有机会根据其用例优化其数据存储。

鉴于经过广泛测试,积极维护并拥有广泛用户群,我们选择SQLite作为此实现的默认解决方案。// TODO(karsten1987):基准和合格的评估结果为何我们选择sqlite

但是,考虑与现有ROS1 rosbag的集成或兼容性时,此插件体系结构已成为必需。由于ROS1 rosbag中存储了大量数据,因此ROS2的rosbag工具必须能够轻松应对旧版rosbag。这可以通过使用ROS1插件来完成,该插件可以读取现有的ROS1消息并将其桥接为ROS2消息格式,例如使用静态桥。请注意,此插件很可能将以只读方式实现,这意味着完全有可能读取现有的ROS1消息并将其填充到ROS2生态系统中,但是将不支持其他方法。

对于每个受支持的数据存储(例如SQLite或ROSbag格式2),必须正确解释这些键值对以正确存储消息。

查询格式

// TODO(karsten1987):描述如何从数据存储中获取/查询数据

rosbag API

rosbag API描述了将ros消息读写到bag文件中的必要接口。它负责将具有正确数据格式的传入消息存储在数据存储中。同样,API必须从数据存储中的二进制表示中恢复具有给定数据格式的ros消息。

该rosbag API对ROS2的rosidl typesupport包一个很强的依赖性,一般性的描述在这里 这个包的主要目的是向存储API发出查询,接收二进制数据和相应的元信息和消息转换成其相应的ROS2消息类型。